Пример #1
0
class ContextSerializer(PbNestedSerializer):
    def __init__(self, obj=None, is_utc=False, *args, **kwargs):
        super(ContextSerializer, self).__init__(obj, *args, **kwargs)
        self.is_utc = is_utc

    car_direct_path = MethodField(schema_type=CO2Serializer(),
                                  display_none=False)
    current_datetime = MethodField(
        schema_type=str,
        display_none=False,
        description='The datetime of the request (considered as "now")')
    timezone = MethodField(
        schema_type=str,
        display_none=False,
        description='Timezone of any datetime in the response, '
        'default value Africa/Abidjan (UTC)',
    )

    def get_car_direct_path(self, obj):
        from navitiacommon import response_pb2

        if isinstance(obj, response_pb2.Response) and obj.HasField(
                str('car_co2_emission')):
            return CO2Serializer(obj, display_none=False).data
        return None

    def get_current_datetime(self, _):
        return get_current_datetime_str(is_utc=self.is_utc)

    def get_timezone(self, _):
        return 'Africa/Abidjan' if self.is_utc else get_timezone_str()
Пример #2
0
class UserSerializer(serpy.Serializer):
    authorizations = MethodField(schema_type=AuthorizationSerializer(), display_none=False)
    shape_scope = Field(schema_type=list, description='The scope shape on data to search')
    shape = Field(schema_type=str, display_none=False, description='GeoJSON of the shape of the user')
    type = Field(schema_type=str)
    billing_plan = MethodField(schema_type=BillingPlanSerializer(), display_none=False)
    end_point = MethodField(schema_type=EndPointSerializer(), display_none=False)
    coord = MethodField(display_none=False, description='Default coord of user')
    context = MethodField(schema_type=ContextSerializer(), display_none=False)
    block_until = DateTimeDbField(schema_type=DateTimeDictField, display_none=False)

    def get_end_point(self, obj):
        if obj.end_point:
            return EndPointSerializer(obj.end_point, display_none=False).data
        return None

    def get_billing_plan(self, obj):
        if obj.billing_plan:
            return BillingPlanSerializer(obj.billing_plan, display_none=False).data
        return None

    def get_context(self, obj):
        return ContextSerializer(obj, is_utc=True, display_none=False).data

    def get_authorizations(self, obj):
        if obj.authorizations:
            return [AuthorizationSerializer(auto, display_none=False).data for auto in obj.authorizations]
        return None

    def get_coord(self, obj):
        if obj.default_coord:
            default_coord = obj.default_coord.split(";")
            if len(default_coord) == 2:
                return {"lon": default_coord[0], "lat": default_coord[1]}
        return None
Пример #3
0
class AuthorizationSerializer(serpy.Serializer):
    instance = MethodField(display_none=False)
    api = MethodField(display_none=True)

    def get_api(self, obj):
        if obj.api:
            return obj.api.name
        return None

    def get_instance(self, obj):
        if obj.instance:
            return obj.instance.name
        return None
Пример #4
0
class DictAddressesSerializer(serpy.DictSerializer):
    address = MethodField(schema_type=AddressSerializer(many=False, display_none=False))
    context = MethodField(schema_type=ContextSerializer(), display_none=False)
    regions = jsonschema.Field(schema_type=str, display_none=True, many=True)
    message = MethodField(schema_type=str)

    def get_context(self, obj):
        return ContextSerializer(obj, display_none=False).data

    def get_address(self, obj):
        return obj.get('address', None)

    def get_message(self, obj):
        return obj.get('message')
Пример #5
0
class JourneysCommon(PbNestedSerializer):
    error = ErrorSerializer(display_none=False)
    feed_publishers = FeedPublisherSerializer(many=True, display_none=True)
    links = MethodField(schema_type=LinkSchema(many=True), display_none=True)

    def get_links(self, obj):
        # note: some request args can be there several times,
        # but when there is only one elt, flask does not want lists
        response = []
        for value in obj.links:
            args = {}
            for e in value.kwargs:
                if len(e.values) > 1:
                    args[e.key] = [v for v in e.values]
                else:
                    args[e.key] = e.values[0]

            args["_type"] = value.type
            args["templated"] = value.is_templated
            args["description"] = value.description
            args["rel"] = value.rel
            response.append(
                create_external_link('v1.{}'.format(value.ressource_name),
                                     **args))
        return response
Пример #6
0
class HeatMapSerializer(JourneysCommon):
    heat_maps = heat_map.HeatMapSerializer(many=True)
    warnings = base.BetaEndpointsSerializer()
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, display_none=False).data
Пример #7
0
class CoveragesSerializer(serpy.DictSerializer):
    regions = CoverageSerializer(many=True)
    links = DescribedField(schema_type=LinkSchema(many=True))
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, is_utc=True, display_none=False).data
Пример #8
0
class GraphicalIsrochoneSerializer(JourneysCommon):
    isochrones = graphical_isochron.GraphicalIsrochoneSerializer(attr='graphical_isochrones', many=True)
    warnings = base.BetaEndpointsSerializer()
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, display_none=False).data
Пример #9
0
class StatusSerializer(serpy.DictSerializer):
    status = status.StatusSerializer()
    context = MethodField(schema_type=ContextSerializer(), display_none=False)
    warnings = base.BetaEndpointsSerializer()

    def get_context(self, obj):
        return ContextSerializer(obj, is_utc=True, display_none=False).data
Пример #10
0
class JourneysSerializer(PbNestedSerializer):
    journeys = JourneySerializer(many=True)
    error = ErrorSerializer(display_none=False, attr='error')
    tickets = TicketSerializer(many=True, display_none=True)
    disruptions = pt.DisruptionSerializer(attr='impacts',
                                          many=True,
                                          display_none=True)
    feed_publishers = FeedPublisherSerializer(many=True, display_none=True)
    links = MethodField(schema_type=LinkSchema(many=True), display_none=True)
    context = MethodField(schema_type=ContextSerializer(), display_none=True)
    notes = DescribedField(schema_type=NoteSerializer(many=True))
    exceptions = DescribedField(schema_type=ExceptionSerializer(many=True))

    def get_context(self, obj):
        if obj.HasField(str('car_co2_emission')):
            return ContextSerializer(obj, display_none=False).data
        else:
            return {
                'car_direct_path': {
                    'co2_emission': {
                        'unit': '',
                        'value': 0.0
                    }
                }
            }

    def get_links(self, obj):
        # note: some request args can be there several times,
        # but when there is only one elt, flask does not want lists
        response = []
        for value in obj.links:
            args = {}
            for e in value.kwargs:
                if len(e.values) > 1:
                    args[e.key] = [v for v in e.values]
                else:
                    args[e.key] = e.values[0]

            response.append(
                create_external_link('v1.{}'.format(value.ressource_name),
                                     rel=value.rel,
                                     _type=value.type,
                                     templated=value.is_templated,
                                     description=value.description,
                                     **args))
        return response
Пример #11
0
class TechnicalStatusSerializer(serpy.DictSerializer):
    regions = status.CommonStatusSerializer(many=True, display_none=False)
    jormungandr_version = Field(schema_type=str, display_none=True)
    bss_providers = status.BssProviderSerializer(many=True, display_none=False)
    context = MethodField(schema_type=ContextSerializer(), display_none=False)
    warnings = base.BetaEndpointsSerializer()

    def get_context(self, obj):
        return ContextSerializer(obj, is_utc=True, display_none=False).data
Пример #12
0
class PtObjectsSerializer(serpy.Serializer):
    error = ErrorSerializer(display_none=False)
    feed_publishers = FeedPublisherSerializer(many=True, display_none=True)
    disruptions = pt.DisruptionSerializer(attr='impacts', many=True, display_none=True)
    pt_objects = pt.PtObjectSerializer(many=True, attr='places')
    links = DescribedField(schema_type=LinkSchema(many=True))
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, False, display_none=False).data
Пример #13
0
class JourneysSerializer(JourneysCommon):
    journeys = JourneySerializer(many=True)
    tickets = TicketSerializer(many=True, display_none=True)
    disruptions = pt.DisruptionSerializer(attr='impacts', many=True, display_none=True)
    context = MethodField(schema_type=ContextSerializer(), display_none=False)
    notes = DescribedField(schema_type=NoteSerializer(many=True))
    exceptions = DescribedField(schema_type=ExceptionSerializer(many=True))

    def get_context(self, obj):
        return ContextSerializer(obj, display_none=False).data
Пример #14
0
class PlacesSerializer(serpy.Serializer):
    error = ErrorSerializer(display_none=False)
    feed_publishers = FeedPublisherSerializer(many=True, display_none=True)
    disruptions = pt.DisruptionSerializer(attr='impacts',
                                          many=True,
                                          display_none=True)
    places = pt.PlaceSerializer(many=True)
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, display_none=False).data
Пример #15
0
    class JsonchemaSupportedType(serpy.Serializer):
        jsonschemaStrField = StrField(required=False)
        jsonschemaBoolField = BoolField(required=True, display_none=True)
        jsonschemaFloatField = FloatField(required=True, display_none=True)
        jsonschemaIntField = IntField()
        jsonschemaField = Field(schema_type=int)
        jsonschemaMethodField = MethodField(schema_type=str)
        lambda_schema = LambdaField(method=lambda **kw: None, schema_type=Custom())
        list_lambda_schema = LambdaField(method=lambda **kw: None,
                                         schema_type=Custom(many=True))

        def get_jsonschemaMethodField(self, obj):
            pass
Пример #16
0
class GeocodePlacesSerializer(serpy.DictSerializer):
    places = jsonschema.MethodField(display_none=True)
    warnings = BetaEndpointsSerializer()
    feed_publishers = jsonschema.MethodField()
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, display_none=False).data

    def get_places(self, obj):
        map_serializer = {
            'city': GeocodeAdminSerializer,
            'administrative_region': GeocodeAdminSerializer,
            'zone': GeocodeAdminSerializer,
            'street': GeocodeAddressSerializer,
            'house': GeocodeAddressSerializer,
            'poi': GeocodePoiSerializer,
            'public_transport:stop_area': GeocodeStopAreaSerializer,
        }
        res = []
        for feature in obj.get('features', []):
            geocoding = feature.get('properties', {}).get('geocoding', {})
            type_ = geocoding.get('type')
            if not type_ or type_ not in map_serializer:
                logging.getLogger(__name__).error(
                    'Place not serialized (unknown type): {}'.format(feature))
                continue
            zone_type = geocoding.get('zone_type')
            # TODO: do something smart with other zone type
            if type_ == 'zone' and zone_type != 'city':
                logging.getLogger(__name__).error(
                    'Place not serialized (invalid zone type): {}'.format(
                        feature))
                continue
            res.append(map_serializer[type_](feature).data)
        return res

    def get_feed_publishers(self, obj):
        fp = []
        for feature in obj.get('features', []):
            feed_pubs = feature.get('properties',
                                    {}).get('geocoding',
                                            {}).get('feed_publishers')
            if feed_pubs:
                [fp.append(x) for x in feed_pubs if x not in fp]
        # By default, keep BANO & OSM as feed publishers
        fp.extend([raw_feed_publisher_bano, raw_feed_publisher_osm])
        return fp
Пример #17
0
class JourneysSerializer(JourneysCommon):
    journeys = JourneySerializer(many=True)
    tickets = TicketSerializer(many=True, display_none=True)
    disruptions = pt.DisruptionSerializer(attr='impacts', many=True, display_none=True)
    context = MethodField(schema_type=ContextSerializer(), display_none=True)
    notes = DescribedField(schema_type=NoteSerializer(many=True))
    exceptions = DescribedField(schema_type=ExceptionSerializer(many=True))

    def get_context(self, obj):
        if obj.HasField(str('car_co2_emission')):
            return ContextSerializer(obj, display_none=False).data
        else:
            return {
                'car_direct_path': {
                    'co2_emission': {
                        'unit': '',
                        'value': 0.0
                    }
                }
            }
Пример #18
0
    class SerpyUnsupportedMethodFieldType(serpy.Serializer):
        serpyMethodField = MethodField()

        def get_serpyMethodField(self, obj):
            pass
Пример #19
0
class DatasetsSerializer(PTReferentialSerializerNoContext):
    datasets = pt.DatasetSerializer(many=True)
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, is_utc=True, display_none=False).data
Пример #20
0
class PTReferentialSerializer(PTReferentialSerializerNoContext):
    # ContextSerializer can not be used directly because context does not exist in protobuf
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, display_none=False).data
Пример #21
0
class GeoStatusSerializer(serpy.DictSerializer):
    geo_status = geo_status.GeoStatusSerializer()
    context = MethodField(schema_type=ContextSerializer(), display_none=False)

    def get_context(self, obj):
        return ContextSerializer(obj, is_utc=True, display_none=False).data