class InstitutionXMLSerializer(ExtSchema): id = fields.Integer() url = fields.Url(attribute='frontend_absolute_url') type = fields.Function( lambda organization: organization.get_institution_type_display()) title = TranslatedStr() abbreviation = fields.Str() epuap = fields.Str() website = fields.Url() created = fields.DateTime(format='iso8601') modified = fields.DateTime(format='iso8601') postal_code = fields.Str() city = fields.Str() street = fields.Str() street_number = fields.Str() street_type = fields.Str() flat_number = fields.Str() email = fields.Str() tel = fields.Str(data_key='phone_number') regon = fields.Str() published_datasets_count = fields.Method('get_published_datasets_count') published_resources_count = fields.Method('get_published_resources_count') def get_published_datasets_count(self, organization): return self.context['published_datasets_count'] def get_published_resources_count(self, organization): return self.context['published_resources_count']
class DatasetCSVSchema(CSVSerializer): id = fields.Integer(data_key=_('id'), required=True) uuid = fields.Str(data_key=_("uuid"), default='') title = fields.Str(data_key=_("title"), default='') notes = fields.Str(data_key=_("notes"), default='') url = fields.Str(data_key=_("url"), default='') update_frequency = fields.Str(data_key=_("Update frequency"), default='') institution = fields.Str(data_key=_("Institution"), attribute='organization.id', default='') category = fields.Str(data_key=_("Category"), default='') status = fields.Str(data_key=_("Status"), default='') is_licence_set = fields.Boolean(data_key=_("Conditions for re-use"), default=None) 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) followers_count = fields.Str(data_key=_("The number of followers"), default=None) class Meta: ordered = True model = 'datasets.Dataset'
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 DatasetApiAttrs(ObjectAttrs): title = TranslatedStr() slug = TranslatedStr() notes = TranslatedStr() category = fields.Nested(DatasetCategoryAttr, many=False) formats = fields.List(fields.String) tags = TranslatedTagsList(TranslatedStr(), attr='tags_list') openness_scores = fields.List(fields.Int()) license_condition_db_or_copyrighted = 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.Integer() url = fields.String() followed = fields.Boolean() modified = fields.DateTime() resource_modified = fields.DateTime() created = fields.DateTime() verified = fields.DateTime() class Meta: relationships_schema = DatasetApiRelationships object_type = 'dataset' url_template = '{api_url}/datasets/{ident}'
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 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 InstitutionCSVMetadataSerializer(ExtSchema): organization_url = fields.Url(attribute='frontend_absolute_url', data_key=_('Organization URL')) organization_type = fields.Function( lambda obj: obj.get_institution_type_display(), data_key=_('Institution type')) organization_title = TranslatedStr(attribute='title', data_key=_('Name')) organization_abbr_title = TranslatedStr(attribute='abbreviation', data_key=_('Abbreviation'), default='') organization_regon = fields.Str(data_key=_('REGON'), attribute='regon') organization_epuap = fields.Str(attribute='epuap', data_key=_('EPUAP'), default='') organization_website = fields.Url(attribute='website', data_key=_('Website')) organization_created = fields.DateTime(attribute='created', data_key=_('Organization created'), format='iso8601') organization_modified = fields.DateTime( attribute='modified', data_key=_('Organization modified'), format='iso8601') organization_datasets_count = fields.Method( 'get_published_datasets_count', data_key=_('Number of datasets')) organization_resources_count = fields.Method( 'get_published_resources_count', data_key=_('Number of organization resources')) organization_postal_code = fields.Str(attribute='postal_code', data_key=_('Postal code')) organization_city = fields.Str(attribute='city', data_key=_('City')) organization_street_type = fields.Str(attribute='street_type', data_key=_('Street type')) organization_street = fields.Str(attribute='street', data_key=_('Street')) organization_street_number = fields.Str(attribute='street_number', data_key=_('Street number')) organization_flat_number = fields.Str(attribute='flat_number', data_key=_('Flat number')) organization_email = fields.Email(attribute='email', data_key=_('Email')) organization_phone_number = fields.Str(attribute='tel', data_key=_('Phone')) class Meta: ordered = True def get_published_datasets_count(self, organization): return self.context['published_datasets_count'] def get_published_resources_count(self, organization): return self.context['published_resources_count']
class SubscriptionAttrs(schemas.ExtSchema): enable_notifications = fields.Boolean() created = fields.DateTime() modified = fields.DateTime() name = fields.Str(attribute='display_name') object_name = fields.Str(attribute='watcher.object_name') object_url = fields.Method('get_object_url') customfields = fields.Dict() def get_object_url(self, obj): if obj.watcher.watcher_type == 'model': instance = obj.watcher.obj return instance.api_url return ''
class CommentApiAttrs(ObjectAttrs): text = fields.Str() created = fields.DateTime() author = fields.Email() modified = fields.DateTime() class Meta: relationships_schema = CommentApiRelationships object_type = 'comment' ordered = True model = 'schedules.Comment' @staticmethod def self_api_url(data): return None
class LogEntryApiAttrs(ObjectAttrs): action = fields.Str(attribute='action_name') change_timestamp = fields.DateTime() change_user_id = fields.Str() difference = fields.Method('get_difference') message = fields.Str() new_value = fields.Method('get_new_value') row_id = fields.Int() table_name = fields.Str() class Meta: strict = True ordered = True object_type = 'history' api_path = '/histories' url_template = '{api_url}/histories/{ident}' model = 'histories.LogEntry' def get_difference(self, obj): try: data = json.loads(obj.difference) except ValueError: data = {} if obj.action_name == 'INSERT': for key, val in data.items(): if isinstance(val, list) and len(val) == 2: data[key] = val[1] return data def get_new_value(self, obj): return self.get_difference(obj)
class HistoryApiAttrs(ObjectAttrs): action = fields.Str() change_timestamp = fields.DateTime() change_user_id = fields.Str() difference = fields.Method('get_difference') message = fields.Str() new_value = fields.Method('get_new_value') row_id = fields.Int() table_name = fields.Str() class Meta: strict = True ordered = True object_type = 'history' api_path = '/histories' url_template = '{api_url}/histories/{ident}' model = 'histories.History' def get_difference(self, obj): difference = json.loads(obj.difference) or {} if 'values_changed' in difference: if "root['password']" in difference['values_changed']: difference['values_changed']["root['password']"][ 'new_value'] = "********" difference['values_changed']["root['password']"][ 'old_value'] = "********" return difference def get_new_value(self, obj): new_value = obj.new_value if isinstance( obj.new_value, dict) else json.loads(obj.new_value) if new_value and 'password' in new_value: new_value['password'] = "******" return new_value
class SubscriptionApiAttrs(ObjectAttrs): created = fields.DateTime() modified = fields.DateTime() title = fields.Str(attribute='display_name') customfields = fields.Dict(missing={}, default={}) def get_object_url(self, obj): if obj.watcher.watcher_type == 'model': instance = obj.watcher.obj return instance.api_url return '' class Meta: relationships_schema = SubscriptionApiRelationships object_type = 'subscription' url_template = '{api_url}/auth/subscriptions/{ident}'
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 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 NotificationSerializer(ExtSchema): id = fields.Int() verb = fields.Str() timestamp = fields.DateTime() unread = fields.Bool() description = fields.Str() user_schedule_id = fields.Int() user_schedule_item_id = fields.Int() schedule_state = fields.Str() schedule_id = fields.Int()
class NotificationApiAttrs(ObjectAttrs): _type = fields.Str(data_key='type', attribute='type') status = fields.Str() notification_type = fields.Str() created = fields.DateTime() ref_value = fields.Str(default='') class Meta: relationships_schema = NotificationApiRelationships object_type = 'notification' url_template = '{api_url}/auth/notifications/{ident}'
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 ResourceCSVMetadataSerializer(schemas.ExtSchema): frontend_absolute_url = fields.Url(data_key=_('Resource URL')) title = TranslatedStr(data_key=_('Resource title'), default='') description = TranslatedStr(data_key=_('Resource description')) created = fields.DateTime(data_key=_('Resource created'), format='iso8601') data_date = fields.Date(data_key=_('Data date')) openness_score = fields.Int(data_key=_('Openness score')) resource_type = fields.Function(lambda obj: obj.get_type_display(), data_key=_('Type')) format = fields.Str(data_key=_('File format'), default='') file_size = fields.Function(lambda obj: sizeof_fmt(obj.file_size) if obj.file_size else '', data_key=_('File size')) views_count = fields.Int(attribute='computed_views_count', data_key=_("Resource views count")) downloads_count = fields.Int(attribute='computed_downloads_count', data_key=_("Resource downloads count")) has_table = fields.Function(lambda obj: _('YES') if obj.has_table else _('NO'), data_key=_('Table')) has_chart = fields.Function(lambda obj: _('YES') if obj.has_chart else _('NO'), data_key=_('Map')) has_map = fields.Function(lambda obj: _('YES') if obj.has_map else _('NO'), data_key=_('Chart')) download_url = fields.Url(data_key=_('Download URL')) data_special_signs = fields.Nested(SpecialSignSchema, data_key=_('special signs'), many=True) @ma.post_dump(pass_many=False) def prepare_nested_data(self, data, **kwargs): special_signs = data.get(_('special signs')) signs_str = '\n'.join([ '{name_label}: {name}, {symbol_label}: "{symbol}", {desc_label}: {desc}' .format(name=sign['name'], name_label=_('name'), symbol=sign['symbol'], symbol_label=_('symbol'), desc=sign['description'], desc_label=_('description')) for sign in special_signs ]) data[_('special signs')] = signs_str values_with_html = [_('Resource title'), _('Resource description')] for attribute in values_with_html: data[attribute] = strip_tags(data[attribute]) return data class Meta: ordered = True
class TopLevelMeta(schemas.ExtSchema): language = fields.String() params = fields.Raw() path = fields.String() count = fields.Integer() relative_uri = fields.String() aggregations = fields.Raw() subscription_url = fields.String() server_time = fields.DateTime(default=now) notifications = fields.Raw() @pre_dump def do_something(self, data, **kwargs): request = self.context['request'] user = getattr(request, 'user', None) if user and user.is_authenticated: data['notifications'] = user.get_unread_notifications() return data
class SubmissionAttrs(ObjectAttrs): title = fields.Str(required=True, example='Very important data') notes = fields.Str(required=True, example='We need this data to save the world') organization_name = fields.Str(required=False, example='ACME') data_link = fields.Url(required=False, example='https://duckduckgo.com') potential_possibilities = fields.Str(required=False) submission_date = fields.Date(required=True) decision_date = fields.Date(required=True) published_at = fields.DateTime(required=True) feedback_counters = fields.Nested( FeedbackCounters, many=False ) my_feedback = fields.Str(required=False) class Meta: object_type = 'submission' path = 'submissions' url_template = '{api_url}/submissions/accepted/{ident}'
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 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 UserCSVSerializer(CSVSerializer): id = fields.Int(data_key=_('id'), required=True, example=77) email = fields.Email(data_key=_('Email'), default='', required=True, example='*****@*****.**') fullname = fields.Str(data_key=_('Full name'), default='', example='Jan Kowalski') official_phone = fields.Method('get_phone', data_key=_('Official phone'), example='+481234567890') role = fields.Method('get_role', data_key=_('Role'), default='', example='+481234567890') state = fields.Str( data_key=_('State'), required=True, example='active', description="Allowed values: 'active', 'inactive' or 'blocked'") institution = fields.Str(attribute='institutions_ids_list_as_str', data_key=_('Institution'), example='1,2') institution1 = fields.Str(attribute='institutions_ids_list_as_str', data_key=_('Institution1'), example='1,2') institution2 = fields.Int(attribute='agent_organization_id', data_key=_('Institution2'), example=1) is_academy_admin = fields.Method('get_is_academy_admin', data_key=_('Admin AOD'), example='Nie') is_agent = fields.Method('get_is_agent', data_key=_('Agent'), example='Nie') extra_agent_of = fields.Method('get_extra_agent_of', data_key=_('Extra agent'), example=1) is_labs_admin = fields.Method('get_is_labs_admin', data_key=_('Admin LOD'), example='Nie') is_official = fields.Method('get_is_official', data_key=_('Official'), example='Nie') is_staff = fields.Method('get_is_staff', data_key=_('Editor'), example='Nie') is_superuser = fields.Method('get_is_superuser', data_key=_('Admin'), example='Nie') last_login = fields.DateTime(data_key=_('Last login date'), example='2021-01-01T00:00:00Z', default=None) @staticmethod def get_yes(): return _('Yes') @staticmethod def get_no(): return _('No') def get_is_academy_admin(self, obj): return self.get_yes() if obj.is_academy_admin else self.get_no() def get_is_agent(self, obj): return self.get_yes() if obj.is_agent else self.get_no() def get_extra_agent_of(self, obj): return obj.extra_agent_of.id if obj.extra_agent_of else None def get_is_labs_admin(self, obj): return self.get_yes() if obj.is_labs_admin else self.get_no() def get_is_superuser(self, obj): return self.get_yes() if obj.is_superuser else self.get_no() def get_is_official(self, obj): return self.get_yes() if obj.is_official else self.get_no() def get_is_staff(self, obj): return self.get_yes() if obj.is_staff else self.get_no() def get_phone(self, obj): if obj.phone: phone = obj.phone if obj.phone_internal: phone += f'.{obj.phone_internal}' return phone return '' def get_role(self, obj): if obj.is_superuser: return _('Admin') elif obj.is_staff: return _('Editor') else: return _('User') class Meta: ordered = True model = 'users.User' fields = ('id', 'email', 'fullname', 'official_phone', 'is_staff', 'is_official', 'is_superuser', 'is_academy_admin', 'is_labs_admin', 'is_agent', 'extra_agent_of', 'state', 'institution1', 'institution2', 'last_login')
class SourceSchema(ExtSchema): title = fields.Str() type = fields.Str(attribute='source_type') url = fields.URL() update_frequency = TranslatedStr() last_import_timestamp = fields.DateTime()
class SourceXMLSchema(ExtSchema): title = fields.Str() url = fields.URL() update_frequency = TranslatedStr() last_import_timestamp = fields.DateTime()
class DatasetResourcesCSVSerializer(CSVSerializer): dataset_url = fields.Url(attribute='frontend_absolute_url', data_key=_('Dataset URL')) dataset_title = TranslatedStr(attribute='title', data_key=_('Title')) dataset_description = TranslatedStr(attribute='notes', data_key=_('Notes')) dataset_keywords = fields.Function(lambda obj: ', '.join( (tag.name for tag in getattr(obj, f'tags_{get_language()}'))), data_key=_('Tag')) dataset_categories = fields.Function(lambda obj: ', '.join( (category.title_i18n for category in obj.categories.all())), data_key=_('Category')) dataset_update_frequency = fields.Str(attribute='frequency_display', data_key=_('Update frequency')) dataset_created = fields.DateTime(attribute='created', data_key=_('Dataset created'), format='iso8601') dataset_verified = fields.DateTime(attribute='verified', data_key=_('Dataset verified'), format='iso8601') views_count = fields.Int(attribute='computed_views_count', data_key=_("Dataset views count")) downloads_count = fields.Int(attribute='computed_downloads_count', data_key=_('Dataset downloads count')) dataset_resources_count = fields.Int( attribute='published_resources__count', data_key=_('Number of data')) dataset_conditions = fields.Method('get_dataset_conditions', data_key=_('Terms of use')) dataset_license = fields.Str(attribute='license_name', data_key=_('License')) dataset_source = fields.Nested(SourceXMLSchema, attribute='source', data_key=_('source')) organization = fields.Method('get_organization') resources = fields.Nested(ResourceCSVMetadataSerializer, many=True, attribute='published_resources') @ma.post_dump(pass_many=True) def unpack_nested_data(self, data, many, **kwargs): new_result_data = [] for record in data: resources = record.pop('resources') organization = record.pop('organization') record.update(**organization) for resource in resources: tmp_record = record.copy() tmp_record.update(**resource) new_result_data.append(tmp_record) return new_result_data def get_dataset_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]) @ma.post_dump(pass_many=False) def prepare_nested_data(self, data, **kwargs): source = data.get(_('source')) if source: source_str =\ '{title_label}: {title}, {url_label}: {url},' \ ' {last_import_label}: {last_import}, {frequency_label}: {frequency}'.format( title=source['title'], title_label=_('name'), url=source['url'], url_label=_('url'), last_import=source['last_import_timestamp'], last_import_label=_('last import timestamp'), frequency=source['update_frequency'], frequency_label=_('Update frequency') ) data[_('source')] = source_str data[_('Notes')] = strip_tags(data[_('Notes')]) return data def get_organization(self, dataset): context = { 'published_datasets_count': dataset.organization_published_datasets__count, 'published_resources_count': dataset.organization_published_resources__count, } return InstitutionCSVMetadataSerializer( many=False, context=context).dump(dataset.organization) def get_csv_headers(self): result = [] for field_name, field in self.fields.items(): if field_name == 'organization': org_headers = [ org_field.data_key for org_field_name, org_field in InstitutionCSVMetadataSerializer().fields.items() ] result.extend(org_headers) elif field_name == 'resources': res_headers = [ res_field.data_key for res_field_name, res_field in field.schema.fields.items() ] result.extend(res_headers) else: header = field.data_key or field_name result.append(header) return result class Meta: ordered = True
class NotificationAttrs(schemas.ExtSchema): _type = fields.Str(data_key='type', attribute='type') status = fields.Str() notification_type = fields.Str() created = fields.DateTime()
class TableApiAttrsMeta(ObjectAttrsMeta): updated_at = fields.DateTime() row_no = fields.Integer()
class CommonObjectApiAttrs(ObjectAttrs, HighlightObjectMixin): model = fields.Str() # common slug = TranslatedStr() title = TranslatedStr() notes = TranslatedStr() keywords = KeywordsList(TranslatedStr(), faker_type='tagslist') modified = fields.DateTime() created = fields.DateTime() verified = fields.DateTime() categories = fields.Nested(Category, many=True) category = fields.Nested(Category) if is_enabled('S35_high_value_data.be'): has_high_value_data = fields.Boolean() # datasets source = fields.Nested(SourceSchema) # resources data_date = fields.Date() visualization_types = fields.List(fields.Str()) # applications, showcases author = fields.Str() illustrative_graphics_alt = TranslatedStr() illustrative_graphics_url = fields.Str() image_alt = TranslatedStr() image_thumb_url = fields.Str() if is_enabled('S39_showcases.be'): showcase_category = fields.Str() showcase_category_name = fields.Method('get_showcase_category_name') showcase_types = fields.List(fields.Str()) showcase_platforms = fields.List(fields.Str()) # institutions abbreviation = fields.Str() institution_type = fields.Str() datasets_count = fields.Int(attribute='published_datasets_count') resources_count = fields.Int(attribute='published_resources_count') fax = fields.Str() tel = fields.Str() sources = fields.Nested(DataSourceAttr, many=True) # cms pages html_url = fields.Str() if is_enabled('S39_filter_by_geodata.be'): # regions region_id = fields.Int() hierarchy_label = TranslatedStr() bbox = fields.List(fields.List(fields.Float), attribute='bbox.coordinates') regions = fields.Nested(RegionSchema, many=True) def get_showcase_category_name(self, obj): val = getattr(obj, 'showcase_category', None) if val: model = apps.get_model('showcases.Showcase') return str(model.CATEGORY_NAMES[val]) return missing @staticmethod def self_api_url(data): try: api_url = getattr(settings, 'API_URL', 'https://api.dane.gov.pl') model = data.model obj_id = data.id slug = data['slug'][get_language()] full_url = f'{api_url}/{model}s/{obj_id},{slug}' except AttributeError: full_url = None return full_url class Meta: relationships_schema = CommonObjectRelationships object_type = 'common' api_path = 'search'