class ResourceApiAttrs(ObjectAttrs, HighlightObjectMixin): title = TranslatedStr() description = TranslatedStr() category = fields.Str() format = fields.Str() media_type = fields.Str( attribute='type' ) # https://jsonapi.org/format/#document-resource-object-fields visualization_types = ListWithoutNoneStrElement(fields.Str()) downloads_count =\ fields.Function( lambda obj: obj.computed_downloads_count if is_enabled('S16_new_date_counters.be') else obj.downloads_count) openness_score = fields.Integer() views_count =\ fields.Function( lambda obj: obj.computed_views_count if is_enabled('S16_new_date_counters.be') else obj.views_count) modified = fields.DateTime() created = fields.DateTime() verified = fields.DateTime() data_date = fields.Date() file_url = fields.Str() file_size = fields.Integer() csv_file_url = fields.Str() csv_file_size = fields.Integer() jsonld_file_url = fields.Str() jsonld_file_size = fields.Integer() jsonld_download_url = fields.Str() download_url = fields.Str() csv_download_url = fields.Str() link = fields.Str() data_special_signs = fields.Nested(SpecialSignSchema, data_key='special_signs', many=True) is_chart_creation_blocked = fields.Bool() if is_enabled('S35_high_value_data.be'): has_high_value_data = fields.Boolean() if is_enabled('S37_resources_admin_region_data.be'): regions = fields.Method('get_regions') if is_enabled('S40_new_file_model.be'): files = fields.Method('get_files') class Meta: relationships_schema = ResourceApiRelationships object_type = 'resource' api_path = 'resources' url_template = '{api_url}/resources/{ident}' model = 'resources.Resource' def get_regions(self, res): return RegionSchema(many=True).dump( getattr(res, 'all_regions', res.regions)) def get_files(self, res): return ResourceFileSchema(many=True).dump( getattr(res, 'all_files', res.files))
class ResourceCSVSchema(CSVSerializer): id = fields.Integer(data_key=_('id'), required=True) uuid = fields.Str(data_key=_("uuid"), default='') title = fields.Str(data_key=_("title"), default='') description = fields.Str(data_key=_("description"), default='') link = fields.Str(data_key=_("link"), default='') link_is_valid = fields.Str(data_key=_("link_is_valid"), default='') file_is_valid = fields.Str(data_key=_("file_is_valid"), default='') data_is_valid = fields.Str(data_key=_("data_is_valid"), default='') format = fields.Str(data_key=_("format"), default='') dataset = fields.Str(attribute='dataset.title', data_key=_("dataset"), default='') status = fields.Str(data_key=_("status"), default='') created_by = fields.Int(attribute='created_by.id', data_key=_("created_by"), default=None) created = fields.DateTime(data_key=_("created"), default=None) modified_by = fields.Int(attribute='modified_by.id', data_key=_("modified_by"), default=None) modified = fields.DateTime(data_key=_("modified"), default=None) resource_type = fields.Str(attribute='type', data_key=_("type"), default='') openness_score = fields.Int(data_key=_("openness_score"), default=None) views_count = fields.Int(data_key=_("views_count"), default=None) downloads_count = fields.Int(data_key=_("downloads_count"), default=None) class Meta: ordered = True model = 'resources.Resource'
class ApplicationApiAttrs(ObjectAttrs, HighlightObjectMixin): slug = TranslatedStr() title = TranslatedStr() notes = TranslatedStr() author = fields.Str(faker_type='firstname') url = fields.Str(faker_type='url') image_url = fields.Str(faker_type='image_url') image_thumb_url = fields.Str(faker_type='image_thumb_url') image_alt = TranslatedStr() illustrative_graphics_url = fields.Str() illustrative_graphics_alt = TranslatedStr() followed = fields.Boolean(faker_type='boolean') keywords = KeywordsList(TranslatedStr(), faker_type='tagslist') views_count = fields.Integer(faker_type='integer') modified = fields.Str(faker_type='datetime') created = fields.Str(faker_type='datetime') has_image_thumb = fields.Bool() main_page_position = fields.Int() external_datasets = fields.Nested(ExternalDataset, many=True) class Meta: relationships_schema = ApplicationApiRelationships object_type = 'application' url_template = '{api_url}/applications/{ident}' model = 'applications.Application'
class TopLevelMeta(schemas.ExtSchema): language = fields.String() params = fields.Raw() path = fields.String() count = fields.Integer() relative_uri = fields.String() aggregations = fields.Raw() server_time = fields.DateTime(default=now)
class SearchCounterAggregation(ExtSchema): datasets = fields.Integer() resources = fields.Integer() showcases = fields.Integer() applications = fields.Integer() institutions = fields.Integer() articles = fields.Integer() knowledge_base = fields.Integer()
class InstitutionCSVSchema(CSVSerializer): id = fields.Integer(data_key=_('id'), required=True) title = fields.Str(data_key=_("Title"), default='') institution_type = fields.Str(data_key=_("Institution type"), default='') datasets_count = fields.Int(data_key=_("The number of datasets"), default=None) class Meta: ordered = True model = 'organizations.Organization'
class ShowcaseApiAttrs(ObjectAttrs, HighlightObjectMixin): category = fields.Str() category_name = fields.Method('get_category_name') slug = TranslatedStr() title = TranslatedStr() notes = TranslatedStr() author = fields.Str(faker_type='firstname') url = fields.Str(faker_type='url') image_url = fields.Str(faker_type='image_url') image_thumb_url = fields.Str(faker_type='image_thumb_url') image_alt = TranslatedStr() illustrative_graphics_url = fields.Str() illustrative_graphics_alt = TranslatedStr() followed = fields.Boolean(faker_type='boolean') keywords = KeywordsList(TranslatedStr(), faker_type='tagslist') views_count = fields.Integer(faker_type='integer') modified = fields.Str(faker_type='datetime') created = fields.Str(faker_type='datetime') has_image_thumb = fields.Bool() main_page_position = fields.Int() external_datasets = fields.Nested(ExternalDataset, many=True) # application showcase fields: is_mobile_app = fields.Bool() is_mobile_app_name = fields.Method('get_is_mobile_app_name') is_desktop_app = fields.Bool() is_desktop_app_name = fields.Method('get_is_desktop_app_name') mobile_apple_url = fields.URL() mobile_google_url = fields.URL() desktop_linux_url = fields.URL() desktop_macos_url = fields.URL() desktop_windows_url = fields.URL() license_type = fields.Str() license_type_name = fields.Method('get_license_type_name') # api use showcase fields: file_url = fields.Str() class Meta: relationships_schema = ShowcaseApiRelationships object_type = 'showcase' url_template = '{api_url}/showcases/{ident}' model = 'showcases.Showcase' ordered = True def get_is_desktop_app_name(self, obj): return str(_('Desktop App')) if obj.is_desktop_app else '' def get_is_mobile_app_name(self, obj): return str(_('Mobile App')) if obj.is_mobile_app else '' def get_category_name(self, obj): return str(Showcase.CATEGORY_NAMES.get(obj.showcase_category, '')) def get_license_type_name(self, obj): return str(Showcase.LICENSE_TYPE_NAMES.get(obj.license_type, ''))
class UpdateFrequencyAggregation(schemas.ExtSchema): id = fields.String(attribute='key') title = fields.String() doc_count = fields.Integer() @ma.pre_dump(pass_many=True) def prepare_data(self, data, many, **kwargs): if many: for item in data: item['title'] = _UPDATE_FREQUENCY.get(item.key) return data
class LicenseAggregation(schemas.ExtSchema): id = fields.String(attribute='key') title = fields.String() doc_count = fields.Integer() @ma.pre_dump(pass_many=True) def prepare_data(self, data, many, **kwargs): if many: for item in data: item['title'] = Dataset.LICENSE_CODE_TO_NAME.get(item.key) return data
class ResourceXMLSerializer(schemas.ExtSchema): id = fields.Integer() access_url = fields.Url(attribute='frontend_absolute_url') title = TranslatedStr() description = TranslatedStr() openness_score = fields.Integer() format = fields.Str() views_count = fields.Int(attribute='computed_views_count') downloads_count = fields.Int(attribute='computed_downloads_count') created = fields.DateTime(format='iso8601') data_date = fields.Date() type = fields.Function(lambda resource: resource.get_type_display()) file_size = fields.Function(lambda obj: sizeof_fmt(obj.file_size) if obj.file_size else '') visualization_types = ListWithoutNoneStrElement(fields.Str()) download_url = fields.Str() data_special_signs = fields.Nested(SpecialSignSchema, data_key='special_signs', many=True)
class DatasetXMLSerializer(ExtSchema): id = fields.Integer() url = fields.Url(attribute='frontend_absolute_url') title = TranslatedStr() notes = TranslatedStr() keywords = fields.Function(lambda dataset: ( tag.name for tag in getattr(dataset, f'tags_{get_language()}'))) categories = fields.Nested(DatasetCategoryAttr, many=True) update_frequency = TransUpdateFreqField() created = fields.DateTime() verified = fields.DateTime() views_count = fields.Int(attribute='computed_views_count') downloads_count = fields.Int(attribute='computed_downloads_count') published_resources_count = fields.Int( attribute='published_resources__count') license = fields.Str(attribute='license_name') conditions = fields.Method('get_conditions') organization = fields.Method('get_organization') resources = fields.Method('get_resources') source = fields.Nested(SourceXMLSchema) def get_conditions(self, dataset): conditions = _( 'This dataset is public information, it can be reused under the following conditions: ' ) terms = [ str( dataset._meta.get_field( 'license_condition_modification').verbose_name) if dataset.license_condition_modification else '', str( dataset._meta.get_field('license_condition_source'). verbose_name) if dataset.license_condition_source else '', dataset.license_condition_db_or_copyrighted, dataset.license_condition_personal_data ] return conditions + '\n'.join([term for term in terms if term]) def get_organization(self, dataset): context = { 'published_datasets_count': dataset.organization_published_datasets__count, 'published_resources_count': dataset.organization_published_resources__count, } return InstitutionXMLSerializer(many=False, context=context).dump( dataset.organization) def get_resources(self, dataset): return ResourceXMLSerializer(many=True).dump( dataset.published_resources)
class ResourceApiAttrs(ObjectAttrs): title = TranslatedStr() description = TranslatedStr() category = fields.Str() format = fields.Str() media_type = fields.Str() downloads_count = fields.Integer() openness_score = fields.Integer() views_count = fields.Integer() modified = fields.DateTime() created = fields.DateTime() verified = fields.DateTime() data_date = fields.Date() file_url = fields.Str() download_url = fields.Str() link = fields.Str() file_size = fields.Integer() class Meta: relationships_schema = ResourceApiRelationships object_type = 'resource' api_path = 'resources' url_template = '{api_url}/resources/{ident}'
class HighValueDataAggregation(schemas.ExtSchema): id = fields.String(attribute='key_as_string') title = fields.String() doc_count = fields.Integer() @ma.post_dump(pass_many=True) def ensure_keys(self, data, many, **kwargs): val_dict = {'false': _('No'), 'true': _('Yes')} if many: values = [x['id'] for x in data] if 'true' not in values: data.append({'id': 'true', 'doc_count': 0}) for item in data: item['title'] = str(val_dict.get(item['id'])) return data
class DatasetApiAttrs(ObjectAttrs, HighlightObjectMixin): title = TranslatedStr() slug = TranslatedStr() notes = TranslatedStr() categories = fields.Nested(DatasetCategoryAttr, many=True) category = fields.Nested(DatasetCategoryAttr, many=False) formats = fields.List(fields.String()) types = fields.List(fields.String()) keywords = KeywordsList(TranslatedStr()) openness_scores = fields.List(fields.Int()) license_chosen = fields.Integer() license_condition_db_or_copyrighted = fields.String() license_condition_personal_data = fields.String() license_condition_modification = fields.Boolean() license_condition_original = fields.Boolean() license_condition_responsibilities = fields.String() license_condition_source = fields.Boolean() license_condition_timestamp = fields.Boolean() license_name = fields.String() license_description = fields.String() update_frequency = TransUpdateFreqField() views_count =\ fields.Function( lambda obj: obj.computed_views_count if is_enabled('S16_new_date_counters.be') else obj.views_count) downloads_count =\ fields.Function( lambda obj: obj.computed_downloads_count if is_enabled('S16_new_date_counters.be') else obj.downloads_count) url = fields.String() followed = fields.Boolean() modified = fields.DateTime() resource_modified = fields.DateTime() created = fields.DateTime() verified = fields.DateTime() visualization_types = ListWithoutNoneStrElement(fields.Str()) source = fields.Nested(SourceSchema) image_url = fields.Str() image_alt = TranslatedStr() if is_enabled('S35_high_value_data.be'): has_high_value_data = fields.Boolean() if is_enabled('S37_resources_admin_region_data.be'): regions = fields.Nested(RegionSchema, many=True) class Meta: relationships_schema = DatasetApiRelationships object_type = 'dataset' url_template = '{api_url}/datasets/{ident}' model = 'datasets.Dataset'
class ArticleApiAttrs(ObjectAttrs, HighlightObjectMixin): slug = TranslatedStr() title = TranslatedStr() notes = TranslatedStr() author = fields.Str(faker_type='firstname') keywords = KeywordsList(TranslatedStr(), faker_type='tagslist') views_count = fields.Integer(faker_type='integer') followed = fields.Boolean() modified = fields.Str(faker_type='datetime') created = fields.Str(faker_type='datetime') license = fields.Nested(ArticleLicense, many=False) category = fields.Nested(ArticleCategory, many=False) class Meta: relationships_schema = ArticleApiRelationships object_type = 'article' url_template = '{api_url}/articles/{ident}' model = 'articles.Article'
class ResponseMeta(schemas.ExtSchema): server_time = fields.DateTime(missing=datetime.now(), default=datetime.now()) language = fields.Str(required=True, missing='en', default='en') # params = fields.Dict(required=True, nullable=True) path = fields.Str(required=True) relative_uri = fields.Str(required=True) count = fields.Integer() def __init__( self, only=None, exclude=(), many=False, context=None, load_only=(), dump_only=(), partial=False, unknown=None, ): super().__init__(only=only, exclude=exclude, many=many, context=context, load_only=load_only, dump_only=dump_only, partial=partial, unknown=unknown) many = self.context.get('many', False) if many: self.fields['count'] = fields.Int(required=True, missing=0, default=0) _meta = getattr(self, 'Meta', None) aggs_cls = getattr(_meta, 'aggregations_cls', None) self.fields['aggregations'] = fields.Nested(aggs_cls, name='aggregations', required=False) if aggs_cls else fields.Dict(nullable=True)
class GeoTileAggregation(schemas.ExtSchema): tile_name = fields.String() doc_count = fields.Integer() shapes = fields.Nested(GeoShapeObject, many=True) centroid = fields.List(fields.Float)
class ExtLinksMeta(schemas.ExtSchema): count = fields.Integer() class Meta: nullable = True
class Aggregation(schemas.ExtSchema): key = fields.Raw() title = fields.String() doc_count = fields.Integer()
class ResourceFileSchema(ExtSchema): file_size = fields.Integer() download_url = fields.Str() format = fields.Str() openness_score = fields.Integer()
class TableApiAttrsMeta(ObjectAttrsMeta): updated_at = fields.DateTime() row_no = fields.Integer()
class ShowcaseAggregationMixin(ExtSchema): id = fields.String(attribute='key') title = fields.String() doc_count = fields.Integer()