class Category(ExtSchema): id = fields.String() name = TranslatedStr() title = TranslatedStr() description = TranslatedStr() image_url = fields.String() code = fields.String()
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 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 LicenseApiAttrs(ObjectAttrs): link = fields.String() secondLink = fields.String() description = fields.Nested(DescriptionSchema()) allowed = fields.Nested(DescriptionSchema(), many=True) conditions = fields.Nested(DescriptionSchema(), many=True) class Meta: object_type = 'license' ordered = True
class Aggregation(schemas.ExtSchema): id = fields.String(attribute='key') title = fields.String(attribute='key_as_string') doc_count = fields.Integer() @pre_dump(pass_many=True) def prepare_data(self, data, many, **kwargs): if many: for item in data: item['title'] = str(item.key).upper() return data
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 ErrorSchema(schemas.ExtSchema): id = fields.String() status = fields.String() code = fields.String() title = fields.String() detail = fields.String() meta = fields.Nested(ErrorMeta, many=False) source = fields.Nested(ErrorSource) class Meta: strict = True ordered = True
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 CreateSubmissionAttrs(ObjectAttrs): applicant_email = core_fields.Email(required=False, default=None) author = core_fields.Str(required=False, default=None) title = core_fields.Str(required=True, faker_type='application title', example='Some App') url = core_fields.Url(required=True) notes = core_fields.Str(required=True) image = core_fields.Base64String(required=False, default=None, max_size=settings.IMAGE_UPLOAD_MAX_SIZE) datasets = core_fields.List(core_fields.Int(), required=False, default=[]) external_datasets = core_fields.Nested(ExternalResourceSchema, required=False, default={}, many=True) keywords = core_fields.List(core_fields.Str(), default='', required=False) comment = core_fields.String(required=False, description='Comment body', example='Looks unpretty', default='') class Meta: strict = True ordered = True object_type = 'application-submission'
class UpdateSubscriptionAttrs(core_schemas.ExtSchema): name = core_fields.String(description='Subscription name', example='my query 1', required=False) enable_notifications = core_fields.Boolean(description='Enable notifications', example=True, required=False) customfields = core_fields.Raw() class Meta: strict = True ordered = True
class CreateSubmissionAttrs(ObjectAttrs): notes = core_fields.String(description='Notes', example='Lorem Ipsum', required=True) class Meta: strict = True ordered = True object_type = 'submission'
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 CreateSubscriptionAttrs(core_schemas.ExtSchema): object_name = core_fields.String(description='Object name', example='resource', required=True, validate=validate.OneOf(choices=ALLOWED_OBJECT_NAMES, error=_('Unsupported object name'))) object_ident = core_fields.String(description='Object ID or query url.', example='12342', required=True) name = core_fields.String(description='Subscription name', example='my query 1', required=False) enable_notifications = core_fields.Boolean(description='Enable notifications', example=True, required=False) customfields = core_fields.Raw() class Meta: strict = True ordered = True @pre_load(pass_many=False) def ident_to_string(self, data): data['object_ident'] = str(data['object_ident']) return data
class CreateFeedbackAttrs(ObjectAttrs): opinion = core_fields.String(description='Opinion', example='like', required=True) class Meta: strict = True ordered = True object_type = 'feedback'
class UpdateSubscriptionAttrs(ObjectAttrs): name = core_fields.String(description='Subscription name', example='my query 1', required=False) customfields = core_fields.Raw() class Meta: strict = True ordered = True object_type = 'subscription'
class ChangeNotificationAttrs(ObjectAttrs): status = core_fields.String(required=True, validate=validate.OneOf( choices=ALLOWED_STATUS_CHOICES, error=_('Invalid notification status'))) class Meta: strict = True ordered = True object_type = 'notification'
class LaboratoryApiAttrs(ObjectAttrs): title = TranslatedStr() notes = TranslatedStr() event_type = fields.String() execution_date = fields.Date() reports = fields.Nested(ReportSchema, many=True) class Meta: object_type = 'Laboratory' url_template = '{api_url}/laboratories/{ident}' model = 'laboratory.LabEvent'
class CreateDatasetSubmissionAttrs(ObjectAttrs): title = core_fields.String(description='Name', example='Lorem Ipsum', required=True) notes = core_fields.String(description='Description', example='Lorem Ipsum', required=True) organization_name = core_fields.String(description='Organization', example='ACME', required=False) data_link = core_fields.URL(description='Link to data', example='https://dane.gov.pl', required=False) potential_possibilities = core_fields.String( description='potential possibilities', example='none', required=False) class Meta: strict = True ordered = True object_type = 'submission'
class CreateCommentAttrs(ObjectAttrs): comment = core_fields.String(required=True, description='Comment body', example='Looks unpretty') @validates('comment') def validate_comment(self, comment): if len(comment) < 3: raise ValidationError(_('Comment must be at least 3 characters long')) class Meta: strict = True ordered = True object_type = 'comment'
class ExtAggregation(schemas.ExtSchema): id = fields.String() title = fields.String() doc_count = fields.Integer() @pre_dump(pass_many=True) def prepare_data(self, data, **kwargs): _meta_cls = getattr(self, 'Meta') if _meta_cls: model_str = getattr(_meta_cls, 'model') field_name = getattr(_meta_cls, 'title_field', 'name') if model_str: model = apps.get_model(model_str) _data = {item['key']: item['doc_count'] for item in data} data = [] for item in model.objects.filter(pk__in=_data.keys()).values('id', field_name): data.append({ 'id': item['id'], 'title': item[field_name], 'doc_count': _data[item['id']] }) return data
class CreateSubscriptionAttrs(ObjectAttrs): object_name = core_fields.String(description='Object name', example='resource', required=True, validate=validate.OneOf( choices=ALLOWED_OBJECT_NAMES, error=_('Unsupported object name'))) object_ident = core_fields.String(description='Object ID or query url.', example='12342', required=True) name = core_fields.String(description='Subscription name', example='my query 1', required=False) customfields = core_fields.Raw() @pre_load def prepare_data(self, data, **kwargs): object_ident = data.get('object_ident') data['object_ident'] = str(object_ident) if object_ident else None object_name = data.get('object_name') if object_name and isinstance(object_name, str): data['object_name'] = object_name.lower() return data @validates_schema def validate_url(self, data, **kwargs): if data['object_name'] == 'query': url_split = urlsplit(data['object_ident']) api_split = urlsplit(settings.API_URL) if url_split.scheme != api_split.scheme or url_split.netloc != api_split.netloc: raise ValidationError(_('Invalid url address'), field_name='object_ident') class Meta: object_type = 'subscription' strict = True ordered = True
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 SubscriptionAttrs(ObjectAttrs): email = core_fields.Email(required=True) newsletter_subscription_info = core_fields.String( description='Human readable subscription status', example='Your subscription is active', required=False) is_active = core_fields.Boolean( description='Is newsletter subscription active?', example=True, required=False) class Meta: object_type = 'subscription' strict = True ordered = True
class CreateSubmissionAttrs(ObjectAttrs): applicant_email = core_fields.Email(required=False, default=None) author = core_fields.Str(required=False, default=None) title = core_fields.Str(required=True, faker_type='application title', example='Some App') url = core_fields.Url(required=True) notes = core_fields.Str(required=True) image = core_fields.Base64String(required=False, default=None, max_size=settings.IMAGE_UPLOAD_MAX_SIZE) illustrative_graphics = core_fields.Base64String( required=False, default=None, max_size=settings.IMAGE_UPLOAD_MAX_SIZE) image_alt = core_fields.Str(required=False, default=None) datasets = core_fields.List(core_fields.Str(), required=False, default=[]) external_datasets = core_fields.Nested(ExternalResourceSchema, required=False, default={}, many=True) keywords = core_fields.List(core_fields.Str(), default='', required=False) comment = core_fields.String(required=False, description='Comment body', example='Looks unpretty', default='') is_personal_data_processing_accepted = core_fields.Boolean(required=True) is_terms_of_service_accepted = core_fields.Boolean(required=True) class Meta: strict = True ordered = True object_type = 'application-submission' @pre_load def prepare_data(self, data, **kwargs): data['datasets'] = [ x.replace('dataset-', '') for x in data.get('datasets', []) if x ] return data @validates('is_personal_data_processing_accepted') def validate_is_personal_data_processing_accepted(self, value): if not value: raise ValidationError(_('This field is required')) @validates('is_terms_of_service_accepted') def validate_is_terms_of_service_accepted(self, value): if not value: raise ValidationError(_('This field is required'))
class Object(schemas.ExtSchema): OPTIONS_CLASS = ObjectOpts _type = fields.String(required=True, data_key='type') def __init__( self, only=None, exclude=(), many=False, context=None, load_only=(), dump_only=(), partial=False, unknown=None, ): self._declared_fields['attributes'] = fields.Nested( self.opts.attrs_schema, name='attributes', many=False ) # relationships_schema = getattr(self.opts.attrs_schema.opts, 'relationships_schema', None) # # if relationships_schema: # self._declared_fields['relationships'] = fields.Nested(relationships_schema, many=False, # name='relationships') super().__init__(only=only, exclude=exclude, many=many, context=context, load_only=load_only, dump_only=dump_only, partial=partial, unknown=unknown)
class SparqlRequestAttrs(ObjectAttrs): q = core_fields.String(required=True, description='Sparql query', example='Looks unpretty') format = core_fields.Str( required=True, validate=validate.OneOf( choices=SPARQL_FORMAT_CHOICES, error=_('Unsupported format. Supported are: %(formats)s') % {'formats': ', '.join(SPARQL_FORMAT_CHOICES)})) page = core_fields.Int() per_page = core_fields.Int() external_sparql_endpoint = core_fields.Str(validate=validate.OneOf( choices=SPARQL_ENDPOINTS, error= _('Unsupported SPARQL endpoint value. Supported values are: %(providers)s' ) % {'providers': ', '.join(SPARQL_ENDPOINTS)}, ), allow_none=True) class Meta: strict = True ordered = True object_type = 'sparql'
class NewsletterRulesAttrs(ObjectAttrs): personal_data_processing = core_fields.String() personal_data_use = core_fields.String() personal_data_use_rules = core_fields.String()
class RelationshipLinks(schemas.ExtSchema): related = fields.String(required=True)
class RelationshipData(schemas.ExtSchema): id = fields.String(required=True) _type = fields.String(required=True, data_key='type')