Beispiel #1
0
# 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":
Beispiel #2
0
    "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
Beispiel #3
0
        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