# www.navitia.io from __future__ import absolute_import, print_function, unicode_literals, division from flask.ext.restful import fields from jormungandr import i_manager from jormungandr.interfaces.v1.StatedResource import StatedResource from jormungandr.interfaces.v1.decorators import get_serializer from jormungandr.interfaces.v1.make_links import add_coverage_link, add_collection_links, clean_links from jormungandr.interfaces.v1.converters_collection_type import collections_to_resource_type from jormungandr.interfaces.v1.fields import NonNullNested, FieldDateTime from jormungandr.interfaces.v1.serializer import api from jormungandr.interfaces.v1.serializer.api import CoveragesSerializer from navitiacommon.parser_args_type import BooleanType from jormungandr.interfaces.v1.fields import context_utc collections = list(collections_to_resource_type.keys()) coverage_marshall_fields = [("regions", fields.List( NonNullNested({ "id": fields.String(attribute="region_id"), "start_production_date": fields.String, "end_production_date": fields.String, "last_load_at": FieldDateTime(), "name": fields.String, "status":
"id": fields.String(attribute="region_id"), "start_production_date": fields.String, "end_production_date": fields.String, "last_load_at": FieldDateTime(), "name": fields.String, "status": fields.String, "shape": fields.String, "error": NonNullNested({ "code": fields.String, "value": fields.String }) } regions_fields = OrderedDict([("regions", fields.List(fields.Nested(region_fields)))]) collections = collections_to_resource_type.keys() class Coverage(StatedResource): @clean_links() @add_coverage_link() @add_collection_links(collections) @marshal_with(regions_fields) def get(self, region=None, lon=None, lat=None): resp = i_manager.regions(region, lon, lat) if 'region' in resp: resp['regions'] = sorted( resp['regions'], cmp=lambda reg1, reg2: cmp(reg1.get('name'), reg2.get('name'))) return resp, 200
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects endpoint = None pagination = None if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects for key, value in data.items(): if endpoint is None and key == "regions": endpoint = "v1.coverage" elif pagination is None and key == "pagination": pagination = value elif endpoint is None and key in collections_to_resource_type.keys( ): endpoint = "v1." + key + "." endpoint += "id" if "id" in kwargs else "collection" elif endpoint is None and key in [ "journeys", "stop_schedules", "route_schedules", "departures", "arrivals", "places_nearby", "calendars" ]: endpoint = "v1." + key if pagination and endpoint and "region" in kwargs: pagination = data["pagination"] if "start_page" in pagination and \ "items_on_page" in pagination and \ "items_per_page" in pagination and \ "total_result" in pagination: if "links" not in data: data["links"] = [] start_page = int(pagination["start_page"]) items_per_page = int(pagination["items_per_page"]) items_on_page = int(pagination["items_on_page"]) total_result = int(pagination["total_result"]) kwargs["_external"] = True if start_page > 0: kwargs["start_page"] = start_page - 1 data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "previous", "templated": False }) nb_next_page = items_per_page * start_page nb_next_page += items_on_page if total_result > nb_next_page: kwargs["start_page"] = start_page + 1 data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "next", "templated": False }) if items_per_page == 0 or total_result == 0: kwargs["start_page"] = 0 else: nb_last_page = total_result - 1 nb_last_page = nb_last_page / items_per_page kwargs["start_page"] = nb_last_page data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "last", "templated": False }) del kwargs["start_page"] data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "first", "templated": False }) if isinstance(objects, tuple): return data, code, header else: return data