Beispiel #1
0
def make_query(d):
    subqueries = []

    if "lng" in d and "lat" in d:
        try:
            lat = float(d["lat"])
            lng = float(d["lng"])
            subqueries.append(Q(shape__contains=Point(lng, lat, srid=4326)))
        except ValueError as err:
            raise ErrorResponse(
                "Bad parameter",
                {"error": "Bad value for latitude or longitude."},
                err=err)

    if "loc_id" in d:
        subqueries.append(Q(loc_id=d["loc_id"]))

    if "street" in d:
        street = normalize_street(d["street"])
        subqueries.append(Q(full_street=street))

        if "number" in d:
            subqueries.append(Q(address_num=normalize_number(d["number"])))


    if "types" in d:
        types = [t.upper() for t in re.split(r"\s*,\s*", d["types"])]
        subqueries.append(Q(poly_type__in=types))
    elif "include_row" not in d:
        subqueries.append(~Q(poly_type="ROW"))

    return reduce(lambda q1, q2: q1 & q2, subqueries)
Beispiel #2
0
def make_query(d, reducer=operator.and_):
    subqueries = []

    if "id" in d:
        return Q(pk=d["id"])

    if "lng" in d and "lat" in d:
        try:
            lat = float(d["lat"])
            lng = float(d["lng"])
            subqueries.append(Q(shape__contains=Point(lng, lat, srid=4326)))
        except ValueError as err:
            raise ErrorResponse(
                "Bad parameter",
                {"error": "Bad value for latitude or longitude."},
                err=err)

    if "loc_id" in d:
        subqueries.append(Q(loc_id=d["loc_id"]))

    street = d.get("street")
    number = d.get("number")
    if not street and "address" in d:
        m = split_address(d["address"])
        if m:
            number, street = m

    if street:
        sq = {"full_street": normalize_street(street)}

        if number:
            sq["address_num"] = normalize_number(number)

        subqueries.append(Q(**sq))

    if d.get("mode") == "or":
        reducer = operator.or_

    q = reduce(reducer, subqueries)

    if "types" in d:
        types = [t.upper() for t in re.split(r"\s*,\s*", d["types"])]
        return q & Q(poly_type__in=types)
    elif "include_row" not in d:
        return q & ~Q(poly_type="ROW")
Beispiel #3
0
def make_query(d, reducer=operator.and_):
    subqueries = []

    if "id" in d:
        return Q(pk=d["id"])

    if "lng" in d and "lat" in d:
        try:
            lat = float(d["lat"])
            lng = float(d["lng"])
            subqueries.append(Q(shape__contains=Point(lng, lat, srid=4326)))
        except ValueError as err:
            raise ErrorResponse(
                "Bad parameter",
                {"error": "Bad value for latitude or longitude."},
                err=err)

    if "loc_id" in d:
        subqueries.append(Q(loc_id=d["loc_id"]))

    street = d.get("street")
    number = d.get("number")
    if not street and "address" in d:
        m = split_address(d["address"])
        if m:
            number, street = m

    if street:
        sq = {"full_street": normalize_street(street)}

        if number:
            sq["address_num"] = normalize_number(number)

        subqueries.append(Q(**sq))

    if d.get("mode") == "or":
        reducer = operator.or_

    q = reduce(reducer, subqueries)

    if "types" in d:
        types = [t.upper() for t in re.split(r"\s*,\s*", d["types"])]
        return q & Q(poly_type__in=types)
    elif "include_row" not in d:
        return q & ~Q(poly_type="ROW")