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)
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")