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