コード例 #1
0
ファイル: views.py プロジェクト: Code4SA/elections-api
def results_overall(event_type, year):
    """
    Return overall national results, with links to available areas.
    """

    event_type = validate_event_type(event_type)
    year = validate_year(year)
    out = {}

    item = Country.query.filter(Country.year == year).first()
    out['results'] = serialize_area(item, event_type)['results']

    for area in areas:
        if area != 'ward' or year >= 2009:
            out[area] = request.url_root + event_type + "/" + str(year) + "/" + area + "/"
    return send_api_response(out)
コード例 #2
0
def results_overall(event_type, year):
    """
    Return overall national results, with links to available areas.
    """

    event_type = validate_event_type(event_type)
    year = validate_year(year)
    out = {}

    item = Country.query.filter(Country.year == year).first()
    out['results'] = serialize_area(item, event_type)['results']

    for area in areas:
        if area != 'ward' or year >= 2009:
            out[area] = request.url_root + event_type + "/" + str(
                year) + "/" + area + "/"
    return send_api_response(out)
コード例 #3
0
def results_by_area(event_type, year, area, area_id=None):
    """
    Return results for the specified area, with links to available parent areas where applicable.
    """

    # validate endpoints
    event_type = validate_event_type(event_type)
    year = validate_year(year)
    area = validate_area(area)

    # validate filter parameters
    filter_area = None
    filter_id = None
    for tmp_area in reversed(areas):
        if request.args.get(tmp_area):
            filter_area = tmp_area
            filter_id = request.args.get(tmp_area)

            # throw an exception, if this is not a viable filter for the specified area
            if areas.index(filter_area) >= areas.index(area):
                raise ApiException(
                    422,
                    "The specified filter parameter cannot be used in this query."
                )
            break

    # validate paging parameters
    page = 0
    per_page = 50
    if request.args.get('page'):
        try:
            page = int(request.args.get('page'))
        except ValueError:
            raise ApiException(422, "Please specify a valid 'page'.")

    all_results = False
    if request.args.get('all_results'):
        all_results = True

    models = {
        "province": (Province, Province.province_id),
        "municipality": (Municipality, Municipality.municipality_id),
        "ward": (Ward, Ward.ward_id),
        "voting_district": (VotingDistrict, VotingDistrict.voting_district_id)
    }

    model_filters = {
        "municipality": {
            "province": Municipality.province,
        },
        "ward": {
            "province": Ward.province,
            "municipality": Ward.municipality,
        },
        "voting_district": {
            "province": VotingDistrict.province,
            "municipality": VotingDistrict.municipality,
            "ward": VotingDistrict.ward,
        },
    }

    if area_id:
        out = models[area][0].query.filter(models[area][1] == area_id).first()
        out = serialize_area(out, event_type)
    else:
        if filter_area and filter_id:
            logger.debug("filtering: " + filter_area + " - " + filter_id)
            # retrieve the entity that will be filtered on
            obj = models[filter_area][0].query.filter(
                models[filter_area][0].year == year,
                models[filter_area][1] == filter_id).first()
            if obj is None:
                raise ApiException(
                    404,
                    "Could not find the specified filter. Check that you have provided a valid ID, or remove the filter."
                )
            count = models[area][0].query.filter(
                models[area][0].year == year).filter(
                    model_filters[area][filter_area] == obj).count()
            if (all_results):
                items = models[area][0].query.filter(
                    models[area][0].year == year).filter(
                        model_filters[area][filter_area] == obj).order_by(
                            models[area][1]).all()
            else:
                items = models[area][0].query.filter(
                    models[area][0].year == year).filter(
                        model_filters[area][filter_area] == obj).order_by(
                            models[area][1]).limit(per_page).offset(
                                page * per_page).all()
        else:
            count = models[area][0].query.filter(
                models[area][0].year == year).count()
            if (all_results):
                items = models[area][0].query.filter(
                    models[area][0].year == year).order_by(
                        models[area][1]).all()
            else:
                items = models[area][0].query.filter(
                    models[area][0].year == year).order_by(
                        models[area][1]).limit(per_page).offset(
                            page * per_page).all()
        next = None
        if count > (page + 1) * per_page:
            next = request.url_root + event_type + "/" + str(
                year) + "/" + area + "/?page=" + str(page + 1)
        results = []
        for item in items:
            results.append(serialize_area(item, event_type))
        if len(results) == 0:
            raise ApiException(404, "Not Found")
        out = {'count': count, 'next': next, 'results': results}
    return send_api_response(out)
コード例 #4
0
ファイル: views.py プロジェクト: Code4SA/elections-api
def results_by_area(event_type, year, area, area_id=None):
    """
    Return results for the specified area, with links to available parent areas where applicable.
    """

    # validate endpoints
    event_type = validate_event_type(event_type)
    year = validate_year(year)
    area = validate_area(area)

    # validate filter parameters
    filter_area = None
    filter_id = None
    for tmp_area in reversed(areas):
        if request.args.get(tmp_area):
            filter_area = tmp_area
            filter_id = request.args.get(tmp_area)

            # throw an exception, if this is not a viable filter for the specified area
            if areas.index(filter_area) >= areas.index(area):
                raise ApiException(422, "The specified filter parameter cannot be used in this query.")
            break

    # validate paging parameters
    page = 0
    per_page = 50
    if request.args.get('page'):
        try:
            page = int(request.args.get('page'))
        except ValueError:
            raise ApiException(422, "Please specify a valid 'page'.")

    all_results = False
    if request.args.get('all_results'):
        all_results = True

    models = {
        "province": (Province, Province.province_id),
        "municipality": (Municipality, Municipality.municipality_id),
        "ward": (Ward, Ward.ward_id),
        "voting_district": (VotingDistrict, VotingDistrict.voting_district_id)
    }

    model_filters = {
        "municipality": {
            "province": Municipality.province,
        },
        "ward": {
            "province": Ward.province,
            "municipality": Ward.municipality,
        },
        "voting_district": {
            "province": VotingDistrict.province,
            "municipality": VotingDistrict.municipality,
            "ward": VotingDistrict.ward,
        },
    }

    if area_id:
        out = models[area][0].query.filter(models[area][1] == area_id).first()
        out = serialize_area(out, event_type)
    else:
        if filter_area and filter_id:
            logger.debug("filtering: " + filter_area + " - " + filter_id)
            # retrieve the entity that will be filtered on
            obj = models[filter_area][0].query.filter(models[filter_area][0].year == year, models[filter_area][1] == filter_id).first()
            if obj is None:
                raise ApiException(404, "Could not find the specified filter. Check that you have provided a valid ID, or remove the filter.")
            count = models[area][0].query.filter(models[area][0].year == year).filter(model_filters[area][filter_area] == obj).count()
            if (all_results):
                items = models[area][0].query.filter(models[area][0].year == year).filter(model_filters[area][filter_area] == obj).order_by(models[area][1]).all()
            else:
                items = models[area][0].query.filter(models[area][0].year == year).filter(model_filters[area][filter_area] == obj).order_by(models[area][1]).limit(per_page).offset(page * per_page).all()
        else:
            count = models[area][0].query.filter(models[area][0].year == year).count()
            if (all_results):
                items = models[area][0].query.filter(models[area][0].year == year).order_by(models[area][1]).all()
            else:
                items = models[area][0].query.filter(models[area][0].year == year).order_by(models[area][1]).limit(per_page).offset(page * per_page).all()
        next = None
        if count > (page + 1) * per_page:
            next = request.url_root + event_type + "/" + str(year) + "/" + area + "/?page=" + str(page + 1)
        results = []
        for item in items:
            results.append(serialize_area(item, event_type))
        if len(results) == 0:
            raise ApiException(404, "Not Found")
        out = {
            'count': count,
            'next': next,
            'results': results
        }
    return send_api_response(out)