class PizzaSerializer(DynamicModelSerializer): cost = SerializerMethodField() toppings = DynamicRelationField(ToppingSerializer, many=True, required=False) groups = DynamicRelationField('PizzaGroupSerializer', many=True, required=False) menu = DynamicRelationField(MenuSerializer, many=False, required=False) class Meta: model = Pizza name = 'pizza' fields = ( 'id', 'name', 'price', 'from_date', 'to_date', 'cost', 'toppings', 'menu', 'groups', ) defered_fields = ( 'toppings', 'groups', 'menu', ) def get_cost(self, obj): return obj.toppings.aggregate(cost=Sum('cost'))['cost']
class MapLayerDatasetSerializer(ResourceBaseToRepresentationSerializerMixin): default_style = DynamicRelationField(StyleSerializer, embed=True, many=False, read_only=True) styles = DynamicRelationField(StyleSerializer, embed=True, many=True, read_only=True) featureinfo_custom_template = FeatureInfoTemplateField() class Meta: model = Dataset name = "dataset" fields = ( "alternate", "featureinfo_custom_template", "title", "perms", "pk", "has_time", "default_style", "styles", "ptype", )
class LayerSerializer(ResourceBaseSerializer): def __init__(self, *args, **kwargs): # Instantiate the superclass normally super(LayerSerializer, self).__init__(*args, **kwargs) class Meta: model = Layer name = 'layer' view_name = 'layers-list' fields = ( 'pk', 'uuid', 'name', 'workspace', 'store', 'storeType', 'charset', 'is_mosaic', 'has_time', 'has_elevation', 'time_regex', 'elevation_regex', 'use_featureinfo_custom_template', 'featureinfo_custom_template', 'default_style', 'styles', 'attribute_set', 'ptype', 'ows_url' ) name = serializers.CharField(read_only=True) workspace = serializers.CharField(read_only=True) store = serializers.CharField(read_only=True) storeType = serializers.CharField(read_only=True) charset = serializers.CharField(read_only=True) default_style = DynamicRelationField(StyleSerializer, embed=True, many=False, read_only=True) styles = DynamicRelationField(StyleSerializer, embed=True, many=True, read_only=True) attribute_set = DynamicRelationField(AttributeSerializer, embed=True, many=True, read_only=True)
class BBSerializer(DynamicModelSerializer): b = DynamicRelationField(BSerializer, many=True) a = DynamicRelationField(ASerializer, many=False) class Meta: model = BB name = 'bb' fields = ('id', 'name', 'b', 'a')
class PizzaToppingsSerializer(DynamicModelSerializer): class Meta: model = Pizza._meta.get_field('toppings').rel.through name = 'Pizza_topping' fields = ('id', 'pizza', 'topping',) topping = DynamicRelationField('ToppingSerializer', many=False, required=False) pizza = DynamicRelationField('PizzaSerializer', many=False, required=False)
class PizzaGroupSerializer(DynamicModelSerializer): pizzas = DynamicRelationField(PizzaSerializer, many=True) children = DynamicRelationField('PizzaGroupSerializer', many=True) parent = DynamicRelationField('PizzaGroupSerializer', many=False) class Meta: model = PizzaGroup name = 'pizzagroup' fields = ('id', 'name', 'pizzas', 'children', 'parent')
def __init__(self, *args, **kwargs): # Instantiate the superclass normally super(ResourceBaseSerializer, self).__init__(*args, **kwargs) self.fields['pk'] = serializers.CharField(read_only=True) self.fields['uuid'] = serializers.CharField(read_only=True) self.fields['resource_type'] = serializers.CharField(read_only=True) self.fields['polymorphic_ctype_id'] = serializers.CharField(read_only=True) self.fields['owner'] = DynamicRelationField(UserSerializer, embed=True, many=False, read_only=True) self.fields['poc'] = ContactRoleField('poc', read_only=True) self.fields['metadata_author'] = ContactRoleField('metadata_author', read_only=True) self.fields['title'] = serializers.CharField() self.fields['abstract'] = serializers.CharField() self.fields['attribution'] = serializers.CharField() self.fields['doi'] = serializers.CharField() self.fields['alternate'] = serializers.CharField(read_only=True) self.fields['date'] = serializers.DateTimeField() self.fields['date_type'] = serializers.CharField() self.fields['temporal_extent_start'] = serializers.DateTimeField() self.fields['temporal_extent_end'] = serializers.DateTimeField() self.fields['edition'] = serializers.CharField() self.fields['purpose'] = serializers.CharField() self.fields['maintenance_frequency'] = serializers.CharField() self.fields['constraints_other'] = serializers.CharField() self.fields['language'] = serializers.CharField() self.fields['supplemental_information'] = serializers.CharField() self.fields['data_quality_statement'] = serializers.CharField() self.fields['bbox_polygon'] = fields.GeometryField() self.fields['srid'] = serializers.CharField() self.fields['group'] = DynamicRelationField(GroupSerializer, embed=True, many=False) self.fields['popular_count'] = serializers.CharField() self.fields['share_count'] = serializers.CharField() self.fields['rating'] = serializers.CharField() self.fields['featured'] = serializers.BooleanField() self.fields['is_published'] = serializers.BooleanField() self.fields['is_approved'] = serializers.BooleanField() self.fields['detail_url'] = serializers.CharField(read_only=True) self.fields['created'] = serializers.DateTimeField(read_only=True) self.fields['last_updated'] = serializers.DateTimeField(read_only=True) self.fields['raw_abstract'] = serializers.CharField(read_only=True) self.fields['raw_purpose'] = serializers.CharField(read_only=True) self.fields['raw_constraints_other'] = serializers.CharField(read_only=True) self.fields['raw_supplemental_information'] = serializers.CharField(read_only=True) self.fields['raw_data_quality_statement'] = serializers.CharField(read_only=True) self.fields['embed_url'] = EmbedUrlField() self.fields['thumbnail_url'] = ThumbnailUrlField() self.fields['keywords'] = DynamicRelationField( HierarchicalKeywordSerializer, embed=False, many=True) self.fields['regions'] = DynamicRelationField( RegionSerializer, embed=True, many=True, read_only=True) self.fields['category'] = DynamicRelationField( TopicCategorySerializer, embed=True, many=False) self.fields['restriction_code_type'] = DynamicRelationField( RestrictionCodeTypeSerializer, embed=True, many=False) self.fields['license'] = DynamicRelationField( LicenseSerializer, embed=True, many=False) self.fields['spatial_representation_type'] = DynamicRelationField( SpatialRepresentationTypeSerializer, embed=True, many=False)
class UploadSerializer(DynamicModelSerializer): def __init__(self, *args, **kwargs): # Instantiate the superclass normally super(UploadSerializer, self).__init__(*args, **kwargs) if 'request' in self.context and \ self.context['request'].query_params.get('full'): self.fields['layer'] = DynamicRelationField(LayerSerializer, embed=True, many=False, read_only=True) self.fields['session'] = SessionSerializer(source='get_session', read_only=True) class Meta: model = Upload name = 'upload' fields = ('id', 'name', 'date', 'create_date', 'user', 'state', 'progress', 'complete', 'import_id', 'uploadfile_set', 'resume_url', 'delete_url', 'import_url', 'detail_url') progress = ProgressField(read_only=True) resume_url = ProgressUrlField('resume', read_only=True) delete_url = ProgressUrlField('delete', read_only=True) import_url = ProgressUrlField('import', read_only=True) detail_url = ProgressUrlField('detail', read_only=True) uploadfile_set = DynamicRelationField(UploadFileSerializer, embed=True, many=True, read_only=True)
class ASerializer(DynamicModelSerializer): bb = DynamicRelationField('BBSerializer', many=True) class Meta: model = A name = 'a' fields = ('id', 'name', 'bb')
class AASerializer(DynamicModelSerializer): a = DynamicRelationField(ASerializer, many=False) class Meta: model = AA name = 'aa' fields = ('id', 'name', 'a')
class QuestionSerializer(DynamicModelSerializer): choices = DynamicRelationField('ChoiceSerializer', many=True, required=False) class Meta: model = Question name = 'question' fields = ('id', 'question_text', 'pub_date', 'choices') deferred_fields = ('choices', )
class MenuSerializer(DynamicModelSerializer): pizzas = DynamicRelationField('PizzaSerializer', many=True) class Meta: model = Menu name = 'menu' fields = ('id', 'code', 'name', 'pizzas') deferred_fields = ('pizza_set', )
class ChoiceSerializer(DynamicModelSerializer): question = DynamicRelationField( QuestionSerializer, many=False, required=False) class Meta: model = Choice name = 'choice' fields = ('id', 'choice_text', 'votes', 'question') defered_fields = ('question')
class ToppingSerializer(DynamicModelSerializer): class Meta: model = Topping name = 'topping' fields = ('id', 'name', 'taxed_cost', 'pizzas',) defered_fields = ('pizzas',) pizzas = DynamicRelationField('PizzaSerializer', many=True, required=False) taxed_cost = IntegerField(source='cost')
class GroupProfileSerializer(DynamicModelSerializer): class Meta: model = GroupProfile name = 'group_profile' fields = ('pk', 'title', 'group', 'slug', 'logo', 'description', 'email', 'keywords', 'access', 'categories') group = DynamicRelationField(GroupSerializer, embed=True, many=False) keywords = serializers.SlugRelatedField(many=True, slug_field='slug', read_only=True) categories = serializers.SlugRelatedField( many=True, slug_field='slug', queryset=GroupCategory.objects.all())
def __init__(self, *args, **kwargs): # Instantiate the superclass normally super().__init__(*args, **kwargs) if 'request' in self.context and \ self.context['request'].query_params.get('full'): self.fields['resource'] = DynamicRelationField(DatasetSerializer, embed=True, many=False, read_only=True) self.fields['session'] = SessionSerializer(source='get_session', read_only=True)
class MapLayerSerializer(DynamicModelSerializer): dataset = DynamicRelationField(MapLayerDatasetSerializer, embed=True) class Meta: model = MapLayer name = "maplayer" fields = ( "pk", "extra_params", "current_style", "dataset", "name", )
class MapSerializer(ResourceBaseSerializer): maplayers = DynamicRelationField(MapLayerSerializer, source="dataset_set", embed=True, many=True) class Meta: model = Map name = "map" view_name = "maps-list" fields = ( "pk", "uuid", "zoom", "projection", "center_x", "center_y", "urlsuffix", "featuredurl", "data", "maplayers", )
class ResourceBaseSerializer( ResourceBaseToRepresentationSerializerMixin, BaseDynamicModelSerializer, ): def __init__(self, *args, **kwargs): # Instantiate the superclass normally super().__init__(*args, **kwargs) self.fields['pk'] = serializers.CharField(read_only=True) self.fields['uuid'] = serializers.CharField(read_only=True) self.fields['resource_type'] = serializers.CharField(required=False) self.fields['polymorphic_ctype_id'] = serializers.CharField( read_only=True) self.fields['owner'] = DynamicRelationField(UserSerializer, embed=True, many=False, read_only=True, required=False) self.fields['poc'] = ContactRoleField('poc', read_only=True) self.fields['metadata_author'] = ContactRoleField('metadata_author', read_only=True) self.fields['title'] = serializers.CharField() self.fields['abstract'] = serializers.CharField(required=False) self.fields['attribution'] = serializers.CharField(required=False) self.fields['doi'] = serializers.CharField(required=False) self.fields['alternate'] = serializers.CharField(read_only=True) self.fields['date'] = serializers.DateTimeField(required=False) self.fields['date_type'] = serializers.CharField(required=False) self.fields['temporal_extent_start'] = serializers.DateTimeField( required=False) self.fields['temporal_extent_end'] = serializers.DateTimeField( required=False) self.fields['edition'] = serializers.CharField(required=False) self.fields['purpose'] = serializers.CharField(required=False) self.fields['maintenance_frequency'] = serializers.CharField( required=False) self.fields['constraints_other'] = serializers.CharField( required=False) self.fields['language'] = serializers.CharField(required=False) self.fields['supplemental_information'] = serializers.CharField( required=False) self.fields['data_quality_statement'] = serializers.CharField( required=False) self.fields['bbox_polygon'] = fields.GeometryField(required=False) self.fields['ll_bbox_polygon'] = fields.GeometryField(required=False) self.fields['srid'] = serializers.CharField(required=False) self.fields['group'] = DynamicRelationField(GroupSerializer, embed=True, many=False) self.fields['popular_count'] = serializers.CharField(required=False) self.fields['share_count'] = serializers.CharField(required=False) self.fields['rating'] = serializers.CharField(required=False) self.fields['featured'] = serializers.BooleanField(required=False) self.fields['is_published'] = serializers.BooleanField(required=False) self.fields['is_approved'] = serializers.BooleanField(required=False) self.fields['detail_url'] = DetailUrlField(read_only=True) self.fields['created'] = serializers.DateTimeField(read_only=True) self.fields['last_updated'] = serializers.DateTimeField(read_only=True) self.fields['raw_abstract'] = serializers.CharField(read_only=True) self.fields['raw_purpose'] = serializers.CharField(read_only=True) self.fields['raw_constraints_other'] = serializers.CharField( read_only=True) self.fields['raw_supplemental_information'] = serializers.CharField( read_only=True) self.fields['raw_data_quality_statement'] = serializers.CharField( read_only=True) self.fields['metadata_only'] = serializers.BooleanField(required=False) self.fields['processed'] = serializers.BooleanField(read_only=True) self.fields['state'] = serializers.CharField(read_only=True) self.fields['sourcetype'] = serializers.CharField(read_only=True) self.fields['embed_url'] = EmbedUrlField(required=False) self.fields['thumbnail_url'] = ThumbnailUrlField(read_only=True) self.fields['keywords'] = DynamicRelationField( SimpleHierarchicalKeywordSerializer, embed=False, many=True) self.fields['tkeywords'] = DynamicRelationField( SimpleThesaurusKeywordSerializer, embed=False, many=True) self.fields['regions'] = DynamicRelationField(SimpleRegionSerializer, embed=True, many=True, read_only=True) self.fields['category'] = DynamicRelationField( SimpleTopicCategorySerializer, embed=True, many=False) self.fields['restriction_code_type'] = DynamicRelationField( RestrictionCodeTypeSerializer, embed=True, many=False) self.fields['license'] = DynamicRelationField(LicenseSerializer, embed=True, many=False) self.fields['spatial_representation_type'] = DynamicRelationField( SpatialRepresentationTypeSerializer, embed=True, many=False) self.fields['blob'] = serializers.JSONField(required=False, write_only=True) self.fields['is_copyable'] = serializers.BooleanField(read_only=True) self.fields['download_url'] = DownloadLinkField(read_only=True) metadata = DynamicRelationField(ExtraMetadataSerializer, embed=False, many=True, deferred=True) class Meta: model = ResourceBase name = 'resource' view_name = 'base-resources-list' fields = ( 'pk', 'uuid', 'resource_type', 'polymorphic_ctype_id', 'perms', 'owner', 'poc', 'metadata_author', 'keywords', 'tkeywords', 'regions', 'category', 'title', 'abstract', 'attribution', 'alternate', 'doi', 'bbox_polygon', 'll_bbox_polygon', 'srid', 'date', 'date_type', 'edition', 'purpose', 'maintenance_frequency', 'restriction_code_type', 'constraints_other', 'license', 'language', 'spatial_representation_type', 'temporal_extent_start', 'temporal_extent_end', 'supplemental_information', 'data_quality_statement', 'group', 'popular_count', 'share_count', 'rating', 'featured', 'is_published', 'is_approved', 'detail_url', 'embed_url', 'created', 'last_updated', 'raw_abstract', 'raw_purpose', 'raw_constraints_other', 'raw_supplemental_information', 'raw_data_quality_statement', 'metadata_only', 'processed', 'state', 'data', 'subtype', 'sourcetype', 'is_copyable', 'blob', "metadata", 'executions' # TODO # csw_typename, csw_schema, csw_mdsource, csw_insert_date, csw_type, csw_anytext, csw_wkt_geometry, # metadata_uploaded, metadata_uploaded_preserve, metadata_xml, # users_geolimits, groups_geolimits ) extra_kwargs = { "abstract": { "required": False }, "attribution": { "required": False }, "doi": { "required": False }, "date": { "required": False }, "date_type": { "required": False }, "temporal_extent_start": { "required": False }, "temporal_extent_end": { "required": False }, "edition": { "required": False }, "purpose": { "required": False }, "maintenance_frequency": { "required": False }, "constraints_other": { "required": False }, "language": { "required": False }, "supplemental_information": { "required": False }, "data_quality_statement": { "required": False }, "bbox_polygon": { "required": False }, "ll_bbox_polygon": { "required": False }, "srid": { "required": False }, "popular_count": { "required": False }, "share_count": { "required": False }, "rating": { "required": False }, "featured": { "required": False }, "is_published": { "required": False }, "is_approved": { "required": False }, "metadata_only": { "required": False }, "embed_url": { "required": False }, "thumbnail_url": { "required": False }, "blob": { "required": False, "write_only": True }, "executions": { "required": False, "embed": False, "deferred": True, "read_only": True }, "owner": { "required": False }, "resource_type": { "required": False }, "download_url": { "required": False }, "is_copyable": { "required": False }, } def to_internal_value(self, data): if isinstance(data, str): data = json.loads(data) if 'data' in data: data['blob'] = data.pop('data') data = super(ResourceBaseSerializer, self).to_internal_value(data) return data """ - Deferred / not Embedded --> ?include[]=data """ data = DataBlobField( DataBlobSerializer, source='id', many=False, embed=False, deferred=True, required=False, ) """ - Deferred / not Embedded --> ?include[]=executions """ executions = DynamicRelationField( ResourceExecutionRequestSerializer, source='id', embed=False, deferred=True, required=False, read_only=True, )