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()
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
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
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')
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
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
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
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
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
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
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
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
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
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
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
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
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 } } }
class SerpyUnsupportedMethodFieldType(serpy.Serializer): serpyMethodField = MethodField() def get_serpyMethodField(self, obj): pass
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
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
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