Exemple #1
0
def parcels_for_multi_request(req):
    #
    # [{ "lat": <lat>,
    #    "lng": <lng>,
    #    "id": <id> }]
    try:
        print(req.GET["points"])
        points = json.loads(req.GET["points"])
    except KeyError as kerr:
        raise ErrorResponse("",
                            {"error": "Missing required key: {}".format(kerr)})
    except ValueError:
        raise ErrorResponse(
            "", {
                "error":
                "Malformed 'points' value; must be valid JSON array: {}".
                format(e)
            })

    query = None
    for point in points:
        q = Q(shape__contains=Point(point["lng"], point["lat"], srid=4326))
        if query:
            query |= q
        else:
            query = q

    return Parcel.objects.filter(query)
Exemple #2
0
def parcels_for_multi_request(req):
    """
    Find parcels using the "points" parameter of a GET request. The value
    should be a JSON-encoded array of dictionaries with "lat", "lng", and "id"
    values. UNUSED.
    """
    try:
        print(req.GET["points"])
        points = json.loads(req.GET["points"])
    except KeyError as kerr:
        raise ErrorResponse("",
                            {"error": "Missing required key: {}".format(kerr)})
    except ValueError:
        raise ErrorResponse(
            "", {
                "error":
                "Malformed 'points' value; must be valid JSON array: {}".
                format(e)
            })

    query = None
    for point in points:
        q = Q(shape__contains=Point(point["lng"], point["lat"], srid=4326))
        if query:
            query |= q
        else:
            query = qe

    return Parcel.objects.filter(query)
Exemple #3
0
def confirm(request):
    try:
        user = authenticate(pk=request.GET["uid"], token=request.GET["token"])

        if not user:
            raise ErrorResponse("Invalid user id or token")

        if "sub" in request.GET:
            subscription = user.subscriptions.get(pk=request.GET["sub"])
        else:
            subscription = user.subscriptions.all().order_by("-created")[0]
        subscription.confirm()
        return {
            "title":
            "Subscription confirmed",
            "text": ("Now that we know you are who you say you are, "
                     "we'll send you updates about projects in the "
                     "area you selected."),
            "tags":
            "success"
        }
    except KeyError as kwerr:
        raise ErrorResponse("Missing required param: " + kwerr.args[0])
    except Subscription.DoesNotExist:
        raise ErrorResponse("Invalid token or subscription id.")
    except IndexError:
        raise ErrorResponse("That user does not have a subscription")
Exemple #4
0
def do_resend_email(request):
    try:
        email = request.POST["email"]
        user = User.objects.get(email=email)
        tasks.resend_user_key.delay(user.id)
    except KeyError:
        raise ErrorResponse("Bad request", status=405)
    except User.DoesNotExist:
        raise ErrorResponse(
            "There is no registered user with that email address.",
            redirect_back=True)

    return {
        "status": "OK",
        "message": "We've sent a new login link to " + email
    }
Exemple #5
0
def list_proposals(req):
    proposals = _query(req)

    try:
        page = int(req.GET["page"])
    except (ValueError, KeyError):
        page = 1

    context = {}

    if page:
        try:
            per_page = int(req.GET.get("per_page", 50))
        except ValueError:
            per_page = 50
        paginator = Paginator(proposals, per_page=min(per_page, 50))
        proposals = paginator.page(page)
        try:
            query_params = req.GET.copy()

            def make_url(page):
                query_params["page"] = page
                return req.path + "?" + query_params.urlencode()

            context["paginator"] = paginator_context(proposals, make_url)
        except (PageNotAnInteger, EmptyPage) as err:
            raise ErrorResponse("No such page", {"page": page}, err=err)

    context["proposals"] = [
        proposal_json(proposal, include_images=1, include_events=True)
        for proposal in proposals
    ]

    return context
Exemple #6
0
def paginated_active_proposals(req):
    proposal_query = Proposal.objects.filter(build_proposal_query(req.GET))
    if "include_projects" in req.GET:
        proposal_query = proposal_query.select_related("project")
    paginator = Paginator(proposal_query, per_page=100)

    page = req.GET.get("page")
    try:
        proposals = paginator.page(page)
    except PageNotAnInteger:
        proposals = paginator.page(1)
    except EmptyPage as err:
        raise ErrorResponse("No such page", {"page": page}, err=err)

    pjson = [
        proposal_json(
            proposal, include_images=1) for proposal in proposals
    ]

    return {
        "proposals": pjson,
        # "count": proposals.paginator.count,
        "page": proposals.number,
        "total_pages": proposals.paginator.num_pages
    }
Exemple #7
0
def find_parcels(req):
    try:
        parcel = parcels_for_request(req)[0]

        include_attributes = req.GET.get("attributes", False)
    except IndexError:
        raise ErrorResponse("No matching parcels found", status=404)
    return make_parcel_data(parcel, include_attributes=include_attributes)
Exemple #8
0
def task_statuses(req):
    try:
        statuses = {
            task_id: task_status_dict(task_id)
            for task_id in req.GET["ids"].split(",")
        }
        return {"results": statuses}
    except KeyError:
        raise ErrorResponse("Missing parameter 'ids'", status=400)
Exemple #9
0
def parcels_for_request(req):
    """
    Helper function for retrieving the parcel(s) at a given latitude and
    longitude.
    """
    try:
        lng = float(req.GET["lng"])
        lat = float(req.GET["lat"])
    except KeyError as kerr:
        raise ErrorResponse(
            "Bad parameters",
            {"error": "Missing required key: {}".format(str(kerr))})
    except ValueError:
        raise ErrorResponse("Bad parameter",
                            {"error": "Bad value for latitude and longitude."})

    return Parcel.objects.\
        filter(shape__contains=Point(lng, lat, srid=4326)).\
        transform()
Exemple #10
0
def subscribe(request):
    """
    Set up a new subscription.
    """
    # Validate the request:
    if request.method != "POST":
        raise ErrorResponse("Request must use POST method.", status=405)

    try:
        query_dict = json.loads(request.POST["query"])
    except KeyError:
        raise ErrorResponse("Missing a 'query' field")
    except ValueError:
        raise ErrorResponse("Malformed JSON in 'query' field.")

    if query_dict != {}:
        query_dict = validate_query(query_dict)
        if not query_dict:
            raise ErrorResponse("Invalid filter options",
                                {"query": query_dict})

    user = request.user
    new_user = False
    has_subscriptions = False

    if user.is_anonymous():
        try:
            email = request.POST["email"]
            user = User.objects.get(email=email)
            has_subscriptions = user.subscriptions.filter(active=True).exists()
        except KeyError as kerr:
            raise ErrorResponse("Missing required key:" + kerr.args[0], {})
        except User.DoesNotExist:
            language = request.GET.get("language", "en-US")
            lang, _reg = language.split("-", 1)
            user = User.objects.create(
                is_active=False,
                username=email,
                email=email,
            )
            profile = UserProfile.objects.create(user=user, language=lang)
            profile.save()
            new_user = True

    try:
        subscription = Subscription()
        subscription.set_validated_query(query_dict)
        subscription.user = user
        subscription.save()
    except Exception as exc:
        raise ErrorResponse("Invalid subscription", {"exception": exc.args})

    return {
        "new_user": new_user,
        "active": user.is_active,
        "email": user.email,
        "has_subscriptions": has_subscriptions
    }
Exemple #11
0
def change_log(request):
    """
    Show a summary of changes based on criteria in the query string.
    """
    params = request.GET.copy()
    try:
        since = datetime.strptime(params["since"], "%Y%m%d")
        del params["since"]
    except KeyError as kerr:
        raise ErrorResponse("Missing required param: since")
    except ValueError as err:
        raise ErrorResponse("'since' should have the format YYYYmmdd")

    until = request.GET.get("until")

    if "sub_id" in request.GET:
        sub = get_object_or_404(Subscription, pk=request.GET["sub_id"])
        query = sub.query_dict
    else:
        query = Subscription.validate_query(params)

    summary = changes.summarize_query_updates(query, since)
    return {"since": since, "until": until, "changes": summary}
Exemple #12
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")
Exemple #13
0
def show_change_summary(request, user, sub_id, since, until=None):
    """
    Displays a summary of the changes recorded for a given subscription within
    a time period specified by `since` and `until`.
    """
    try:
        sub = Subscription.objects.get(user=user, pk=sub_id)
        summary = changes.summarize_subscription_updates(sub, since, until)
        return {
            "since": since,
            "until": until,
            "subscription": sub,
            "changes": summary
        }
    except Subscription.DoesNotExist:
        raise ErrorResponse("Invalid subscription ID",
                            status=404,
                            redirect_back=True)
Exemple #14
0
def subscribe(request):
    """
    Set up a new subscription. If the supplied
    """
    if request.method != "POST":
        raise ErrorResponse("Request must use POST method.", status=405)

    try:
        query_dict = json.loads(request.POST["query"])
    except KeyError:
        raise ErrorResponse("Missing a 'query' field")
    except ValueError:
        raise ErrorResponse("Malformed JSON in 'query' field.")

    if query_dict != {}:
        query_dict = validate_query(query_dict)
        if not query_dict:
            raise ErrorResponse("Invalid query", {"query": query_dict})

    user = request.user
    new_user = False

    if user.is_anonymous():
        try:
            email = request.POST["email"]
            user = User.objects.get(email=email)
        except KeyError as kerr:
            raise ErrorResponse("Missing required key:" + kerr.args[0], {})
        except User.DoesNotExist:
            user = User.objects.create(username=email, email=email)
            profile = UserProfile.objects.create(user=user)
            profile.save()
            new_user = True

    try:
        subscription = Subscription()
        subscription.set_validated_query(query_dict)
        user.subscriptions.add(subscription)
    except Exception as exc:
        raise ErrorResponse("Invalid subscription", {"exception": exc.args})

    return {
        "new_user": new_user,
        "active": user.is_active,
        "email": user.email
    }
Exemple #15
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 "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)
Exemple #16
0
def task_status(req):
    try:
        return task_status_dict(req.GET["id"])
    except KeyError:
        raise ErrorResponse("Missing parameter 'id'", status=400)
Exemple #17
0
def parcel_at_point(req):
    try:
        parcel = parcels_for_request(req)[0]
    except IndexError:
        raise ErrorResponse("No matching parcels found", status=404)
    return make_parcel_data(parcel)