Ejemplo n.º 1
0
def _process_location_single(request):
    """Procesa una request GET para obtener entidades en un punto.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        qs_params = params.PARAMS_LOCATION.parse_get_params(request.args)
    except params.ParameterParsingException as e:
        return formatter.create_param_error_response_single(e.errors, e.fmt)

    query, fmt = _build_location_query_format(qs_params)

    es = get_elasticsearch()
    result = location.run_location_queries(es, [query])[0]

    return formatter.create_ok_response(N.LOCATION, result, fmt)
Ejemplo n.º 2
0
def process_place_single(request):
    """Procesa una request GET para obtener entidades en un punto.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP
    """
    qs_params, errors = params.PARAMS_PLACE.parse_get_params(request.args)

    if errors:
        return formatter.create_param_error_response_single(errors)

    query, fmt = build_place_query_format(qs_params)

    es = get_elasticsearch()
    result = process_place_queries(es, [query])[0]

    return formatter.create_ok_response(PLACE, result, fmt,
                                        iterable_result=False)
Ejemplo n.º 3
0
def _process_street_single(request):
    """Procesa una request GET para consultar datos de calles.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        qs_params = params.PARAMS_STREETS.parse_get_params(request.args)
    except params.ParameterParsingException as e:
        return formatter.create_param_error_response_single(e.errors, e.fmt)

    query, fmt = _build_street_query_format(qs_params)

    if fmt[N.FORMAT] == 'shp':
        query['fields'] += (N.GEOM, )

    es = get_elasticsearch()
    search = data.StreetsSearch(query)
    data.ElasticsearchSearch.run_searches(es, [search])

    query_result = QueryResult.from_entity_list(search.result.hits,
                                                search.result.total,
                                                search.result.offset)

    return formatter.create_ok_response(N.STREETS, query_result, fmt)
Ejemplo n.º 4
0
def process_address_single(request):
    """Procesa una request GET para normalizar una dirección.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP
    """
    qs_params, errors = params.PARAMS_ADDRESSES.parse_get_params(request.args)

    if errors:
        return formatter.create_param_error_response_single(errors)

    query, fmt = build_address_query_format(qs_params)

    es = get_elasticsearch()
    result = data.search_streets(es, [query])[0]

    source = get_index_source(STREETS)
    build_addresses_result(result, query, source)

    return formatter.create_ok_response(ADDRESSES, result, fmt)
Ejemplo n.º 5
0
def process_street_single(request):
    """Procesa una request GET para consultar datos de calles.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP
    """
    qs_params, errors = params.PARAMS_STREETS.parse_get_params(request.args)

    if errors:
        return formatter.create_param_error_response_single(errors)

    query, fmt = build_street_query_format(qs_params)

    es = get_elasticsearch()
    result = data.search_streets(es, [query])[0]

    source = get_index_source(STREETS)
    for match in result:
        match[SOURCE] = source

    return formatter.create_ok_response(STREETS, result, fmt)
Ejemplo n.º 6
0
def _process_entity_single(request, name, param_parser, key_translations):
    """Procesa una request GET para consultar datos de una entidad.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET de flask.
        name (str): Nombre de la entidad.
        param_parser (ParameterSet): Objeto utilizado para parsear los
            parámetros.
        key_translations (dict): Traducciones de keys a utilizar para convertir
            el diccionario de parámetros del usuario a un diccionario
            representando una query a Elasticsearch.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        qs_params = param_parser.parse_get_params(request.args)
    except params.ParametersParseException as e:
        return formatter.create_param_error_response_single(e.errors, e.fmt)

    # Construir query a partir de parámetros
    query = utils.translate_keys(qs_params.values,
                                 key_translations,
                                 ignore=[N.FLATTEN, N.FORMAT])

    # Construir reglas de formato a partir de parámetros
    fmt = {
        key: qs_params.values[key]
        for key in [N.FLATTEN, N.FIELDS, N.FORMAT] if key in qs_params.values
    }

    if fmt[N.FORMAT] == 'shp':
        query['fields'] += (N.GEOM, )

    es = get_elasticsearch()
    search_class = data.entity_search_class(name)
    search = search_class(query)

    data.ElasticsearchSearch.run_searches(es, [search])

    query_result = QueryResult.from_entity_list(search.result.hits,
                                                qs_params.received_values(),
                                                search.result.total,
                                                search.result.offset)

    return formatter.create_ok_response(name, query_result, fmt)
Ejemplo n.º 7
0
def process_entity_single(request, name, param_parser, key_translations,
                          csv_fields):
    """Procesa una request GET para consultar datos de una entidad.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET de flask.
        name (str): Nombre de la entidad.
        param_parser (ParameterSet): Objeto utilizado para parsear los
            parámetros.
        key_translations (dict): Traducciones de keys a utilizar para convertir
            el diccionario de parámetros del usuario a un diccionario
            representando una query a Elasticsearch.
        csv_fields (dict): Diccionario a utilizar para modificar los campos
            cuando se utiliza el formato CSV.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP
    """
    try:
        qs_params = param_parser.parse_get_params(request.args)
    except params.ParameterParsingException as e:
        return formatter.create_param_error_response_single(e.errors)

    # Construir query a partir de parámetros
    query = translate_keys(qs_params, key_translations,
                           ignore=[N.FLATTEN, N.FORMAT])

    # Construir reglas de formato a partir de parámetros
    fmt = {
        key: qs_params[key]
        for key in [N.FLATTEN, N.FIELDS, N.FORMAT]
        if key in qs_params
    }
    fmt[N.CSV_FIELDS] = csv_fields

    es = get_elasticsearch()
    result = data.search_entities(es, name, [query])[0]

    source = get_index_source(name)
    for match in result:
        match[N.SOURCE] = source

    return formatter.create_ok_response(name, result, fmt)
Ejemplo n.º 8
0
def _process_street_single(request):
    """Procesa una request GET para consultar datos de calles.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        qs_params = params.PARAMS_STREETS.parse_get_params(request.args)
    except params.ParametersParseException as e:
        return formatter.create_param_error_response_single(e.errors, e.fmt)

    query_results, formats = _process_street_queries([qs_params])
    return formatter.create_ok_response(N.STREETS, query_results[0],
                                        formats[0])