class SubscriptionsRequest(ListingSchema): watcher__object_name__endswith = fields.StringField(data_key='object_name', description='Object name', example='resource', required=False) watcher__object_ident = fields.StringField(data_key='object_id', description='Object ID', example='3776', required=False) class Meta: strict = True ordered = True
class CommonSchema(ExtSchema): x_api_version = fields.StringField(data_key='X-API-VERSION', description='Sets API version.', example='1.4', _in='header', allowEmptyValue=True) content_language = fields.StringField( data_key='Accept-Language', description= 'Sets language code. Supported languages are english (en) and polish (pl)', default='pl', _in='header', allowEmptyValue=True)
class SubscriptionListApiRequest(core_schemas.ListingSchema): object_name = search_fields.StringField( description='Object name', example='resource', required=False, validate=validate.OneOf(choices=ALLOWED_OBJECT_NAMES, error=_('Unsupported object name'))) object_id = search_fields.StringField(description='Object ID', example='3776', required=False) class Meta: strict = True ordered = True
class ListingRequest(ListingSchema): state = search_fields.StringField( description='State of schedule', example='planned', required=False, validate=validate.OneOf( choices=SCHEDULE_STATES, error=_('Invalid value! Possible values: %(values)s') % {'values': SCHEDULE_STATES_STR})) full = search_fields.NoDataField()
class TableApiRequest(CommonSchema): id = search_fields.StringField( _in='path', description='Row ID', example='a52c4405-7d0c-5166-bba9-bde651f46fb9', required=True ) class Meta: strict = True ordered = True
class FetchNotifications(core_schemas.ListingSchema): subscription__watcher__object_name__endswith = search_fields.StringField(data_key='object_name', description='Object name', example='resource', required=False) subscription__watcher__object_ident = search_fields.StringField(data_key='object_id', description='Object ID', example='3776', required=False) notification_type = search_fields.StringField(description='Type of notificaton', example='object_updated', required=False, validate=validate.OneOf(choices=ALLOWED_NOTIFICATION_TYPES, error=_('Invalid notification type'))) status = search_fields.StringField(description='Message status (new or read)', example='new', required=False, validate=validate.OneOf(choices=ALLOWED_STATUS_CHOICES, error=_('Invalid notification status'))) class Meta: strict = True ordered = True
class ScheduleApiRequest(CommonSchema): include = search_fields.StringField( description='Allow the client to customize which related resources should be returned in included section.', allowEmptyValue=True, ) full = search_fields.NoDataField() class Meta: strict = True ordered = True
class NotificationApiListRequest(core_schemas.ListingSchema): object_name = search_fields.StringField( description='Object name', example='resource', required=False, validate=validate.OneOf(choices=ALLOWED_OBJECT_NAMES, error=_('Unsupported object name'))) object_id = search_fields.StringField(description='Object ID', example='3776', required=False) notification_type = search_fields.StringField( description='Type of notificaton', example='object_updated', required=False, validate=validate.OneOf(choices=ALLOWED_NOTIFICATION_TYPES, error=_('Invalid notification type'))) status = search_fields.StringField( description='Message status (new or read)', example='new', required=False, validate=validate.OneOf(choices=ALLOWED_STATUS_CHOICES, error=_('Invalid notification status'))) class Meta: strict = True ordered = True @pre_load def prepare_object_name(self, data, **kwargs): if 'object_name' in data: data['object_name'] = data['object_name'].lower() return data @post_load def replace_object_name_with_model(self, data, **kwargs): _attr = 'subscription__watcher__object_name__endswith' if _attr in data: data[_attr] = OBJECT_NAME_TO_MODEL[data[_attr]] return data
class InstitutionApiRequest(CommonSchema): id = search_fields.NumberField( _in='path', description='Institution ID', example='44', required=True ) include = search_fields.StringField( data_key='include', description='Allow the client to customize which related resources should be returned in included section.', allowEmptyValue=True, ) class Meta: strict = True ordered = True
class ApiSuggestRequest(CommonSchema): q = fields.StringField() per_model = fields.NumberField( missing=1, default=1, example=2, description= 'Suggestion size for each model. Default value is 1, max allowed page size is 10.', validate=validate.Range(1, 10, error=_("Invalid suggestion size"))) max_length = fields.NumberField( missing=1, example=2, description= 'Maximum length of given suggestion list. By default there is no limit', validate=validate.Range(1, 100, error=_("Invalid maximum list length"))) _supported_models = { 'application', 'article', 'dataset', 'institution', 'knowledge_base', 'resource', 'showcase', } _completion_models = {'region'} models = fields.StringField() advanced = fields.StringField() def __init__(self, *args, **kwargs): if is_enabled('S39_filter_by_geodata.be'): self._supported_models.add('region') super(ApiSuggestRequest, self).__init__(*args, **kwargs) def get_queryset(self, queryset, data): phrase = data.get('q') if 'models' not in data: models = self._supported_models else: models = data['models'].split(',') advanced = data.get('advanced') op, suffix = get_advanced_options(advanced) lang = get_language() per_model = data.get('per_model', 1) ms = MultiSearch(index=settings.ELASTICSEARCH_COMMON_ALIAS_NAME) for model in models: if is_enabled('S39_filter_by_geodata.be' ) and model in self._completion_models: sug_query = Search(index=f'{model}s') sug_query = sug_query.suggest('title', phrase, completion={ 'field': f'title.{lang}.suggest', 'size': per_model }) res = sug_query.execute() suggestions = res.suggest['title'][0] ids = [sug['_id'] for sug in suggestions['options']] query = Search(index=settings.ELASTICSEARCH_COMMON_ALIAS_NAME) query = query.filter('term', model=model).query('ids', values=ids) else: query = Search(index=settings.ELASTICSEARCH_COMMON_ALIAS_NAME) query = query.filter('term', model=model) query = query.query('bool', should=[ nested_query_with_advanced_opts( phrase, field, lang, op, suffix) for field in ('title', 'notes') ]) query = query.extra(size=per_model) ms = ms.add(query) return ms @validates('models') def validate_models(self, models): for model in models.split(','): if model not in self._supported_models: msg = _('The entered model - %(model)s, is not supported') % { 'model': model } raise ValidationError(msg) @validates('advanced') def validate_advanced(self, adv): if adv not in 'any all exact synonyms'.split(): msg = _( 'advanced option should take one of values: any, all, exact, synonyms' ) raise ValidationError(msg) class Meta: strict = True ordered = False
class ApiSearchRequest(ListingSchema): q = CommonSearchField(doc_template='docs/generic/fields/query_field.html', doc_base_url='/search', doc_field_name='q') advanced = fields.StringField() sort = fields.SortField( sort_fields={ 'title': 'title.{lang}.sort', 'date': 'search_date', 'views_count': 'views_count', }, doc_base_url='/search', ) facet = fields.FacetField(DataAggregations) id = fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/search', doc_field_name='ID', query_field='_id', ) model = fields.FilterField( StringTermSchema, doc_template='docs/search/fields/model.html', doc_base_url='/search', doc_field_name='models', ) institution = fields.FilterField(InstitutionFilterSchema) category = fields.FilterField(DatasetCategoryFilterSchema) categories = fields.FilterField(DatasetCategoriesFilterSchema) format = fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/search', doc_field_name='format', query_field='formats') types = fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/search', doc_field_name='types', ) openness_score = fields.FilterField( NumberTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/search', doc_field_name='openness score', query_field='openness_scores') visualization_types = fields.FilterField( ListTermsSchema, query_field='visualization_types', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/search', doc_field_name='visualization type') date = fields.FilterField( DateTermSchema, query_field='search_date', doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/search', doc_field_name='search_date') institution_type = fields.FilterField( StringTermSchema, query_field='institution_type', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/search', doc_field_name='institution_type') source = fields.FilterField(SourceFilterSchema) license_code = fields.FilterField( NumberTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/search', doc_field_name='license code', query_field='license_code') update_frequency = fields.FilterField( StringTermSchema, query_field='update_frequency', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/search', doc_field_name='update_frequency') has_high_value_data = fields.FilterField( BooleanTermSchema, query_field='has_high_value_data', doc_template='docs/generic/fields/boolean_term_field.html', doc_base_url='/search', doc_field_name='has_high_value_data') if is_enabled('S39_filter_by_geodata.be'): regions = fields.FilterField(RegionsFilterSchema) if is_enabled('S39_showcases.be'): showcase_category = fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/search', doc_field_name='showcase_category', ) showcase_types = fields.FilterField( StringTermSchema, query_field='showcase_types', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/search', doc_field_name='showcase types') showcase_platforms = fields.FilterField( StringTermSchema, query_field='showcase_platforms', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/search', doc_field_name='showcase platforms') @validates('q') def validate_q(self, queries, down_limit=2, up_limit=3000): for q in queries: if len(q) < down_limit: msg = _( 'The entered phrase should be at least %(limit)s characters long' ) % { 'limit': down_limit } raise ValidationError(msg) elif len(q) > up_limit: msg = _( 'The entered phrase should be at most %(limit)s characters long' ) % { 'limit': up_limit } raise ValidationError(msg) @validates('advanced') def validate_advanced(self, adv): allowed = ('any', 'all', 'exact', 'synonyms') if adv not in allowed: msg = _('Advanced option should take one of values: ') + ', '.join( allowed) raise ValidationError(msg) class Meta: strict = True ordered = True
class RdfValidationRequest: shacl = search_fields.StringField()
class DatasetApiSearchRequest(ListingSchema): id = search_fields.FilterField( NumberTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/datasets', doc_field_name='ID') title = search_fields.FilterField( StringMatchSchema, doc_template='docs/generic/fields/string_match_field.html', doc_base_url='/datasets', doc_field_name='title', translated=True, search_path='title') notes = search_fields.FilterField( StringMatchSchema, doc_template='docs/generic/fields/string_match_field.html', doc_base_url='/datasets', doc_field_name='notes', translated=True, search_path='notes') category = search_fields.FilterField(CategoryFilterSchema) categories = search_fields.FilterField(CategoriesFilterSchema) institution = search_fields.FilterField(InstitutionFilterSchema) application = search_fields.FilterField(ApplicationFilterSchema) tag = search_fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/datasets', doc_field_name='tag', translated=True, search_path='tags', query_field='tags') keyword = search_fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/datasets', doc_field_name='keyword', search_path='keywords', query_field='keywords.name', condition=Term(keywords__language=get_language), nested_search=True, ) format = search_fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/datasets', doc_field_name='format', query_field='formats') types = search_fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/datasets', doc_field_name='types', query_field='types') openness_score = search_fields.FilterField( NumberTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/datasets', doc_field_name='openness score', query_field='openness_scores', ) resource = search_fields.FilterField(ResourceFilterSchema) visualization_types = search_fields.FilterField( ListTermsSchema, query_field='visualization_types', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/datasets', doc_field_name='visualization types') created = search_fields.FilterField( DateTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/datasets', doc_field_name='created', ) q = search_fields.MultiMatchField( query_fields={ 'title': ['title^4'], 'notes': ['notes^2'] }, nested_query_fields={'resources': [ 'title', ]}) sort = search_fields.SortField( sort_fields={ 'id': 'id', 'title': 'title.{lang}.sort', 'modified': 'modified', 'created': 'created', 'views_count': 'views_count', 'verified': 'verified', }, doc_base_url='/datasets', missing='id', ) facet = search_fields.FacetField(DatasetAggregations) include = search_fields.StringField( data_key='include', description= 'Allow the client to customize which related resources should be returned in included section.', allowEmptyValue=True, ) class Meta: strict = True ordered = True
class InstitutionApiSearchRequest(ListingSchema): id = search_fields.FilterField(NumberTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/institutions', doc_field_name='ID' ) slug = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='slug', translated=True, search_path='slug' ) city = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='city' ) regon = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='regon' ) street = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='street' ) postal_code = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='postal code' ) email = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='email address' ) org_type = search_fields.FilterField(StringTermSchema, data_key='type', query_field='institution_type', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='type' ) tel = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='tel', ) fax = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='fax' ) website = search_fields.FilterField(StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/institutions', doc_field_name='website' ) title = search_fields.FilterField(StringMatchSchema, doc_template='docs/generic/fields/string_match_field.html', doc_base_url='/institutions', doc_field_name='title', translated=True, search_path='title' ) description = search_fields.FilterField(StringMatchSchema, doc_template='docs/generic/fields/string_match_field.html', doc_base_url='/institutions', doc_field_name='description', translated=True, search_path='title' ) q = search_fields.MultiMatchField( query_fields={'title': ['title^4'], 'description': ['description^2']}, nested_query_fields={'datasets': ['title', ]}, doc_template='docs/generic/fields/query_field.html', doc_base_url='/institutions', doc_field_name='q' ) sort = search_fields.SortField( sort_fields={ 'id': 'id', 'title': 'title.{lang}.sort', "city": "city.{lang}", 'modified': 'modified', 'created': 'created' }, doc_base_url='/institutions', ) facet = search_fields.FacetField(InstitutionApiAggregations) include = search_fields.StringField( data_key='include', description='Allow the client to customize which related resources should be returned in included section.', allowEmptyValue=True, ) class Meta: strict = True ordered = True
class ResourceApiSearchRequest(ListingSchema): id = search_fields.FilterField( NumberTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/resources', doc_field_name='ID') title = search_fields.FilterField( StringMatchSchema, doc_template='docs/generic/fields/string_match_field.html', doc_base_url='/resources', doc_field_name='title', translated=True, search_path='title') description = search_fields.FilterField( StringMatchSchema, doc_template='docs/generic/fields/string_match_field.html', doc_base_url='/resources', doc_field_name='description', translated=True, search_path='description') format = search_fields.FilterField( StringTermSchema, doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/resources', doc_field_name='format') media_type = search_fields.FilterField( StringTermSchema, query_field='type', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/resources', doc_field_name='media type') type = search_fields.FilterField( StringTermSchema, query_field='type', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/resources', doc_field_name='type') visualization_type = search_fields.FilterField( ListTermsSchema, query_field='visualization_types', doc_template='docs/generic/fields/string_term_field.html', doc_base_url='/resources', doc_field_name='visualization type') openness_score = search_fields.FilterField( NumberTermSchema, doc_template='docs/resources/fields/openness_score.html', doc_base_url='/resources', doc_field_name='openness score') created = search_fields.FilterField( DateTermSchema, doc_template='docs/generic/fields/number_term_field.html', doc_base_url='/resources', doc_field_name='created') q = search_fields.MultiMatchField( query_fields={ 'title': ['title^4'], 'description': ['description^2'] }, nested_query_fields={'dataset': [ 'title', ]}, doc_template='docs/generic/fields/query_field.html', doc_base_url='/resources', doc_field_name='q') sort = search_fields.SortField( sort_fields={ 'id': 'id', 'title': 'title.{lang}.raw', 'modified': 'modified', 'created': 'created', 'verified': 'verified', 'data_date': 'data_date', 'views_count': 'views_count', }, doc_base_url='/resources', ) dataset = search_fields.FilterField( ResourceDatasetFilterField, doc_template='docs/resources/fields/dataset.html', doc_base_url='/resources', doc_field_name='dataset') facet = search_fields.FacetField(ResourceAggregations) include = search_fields.StringField( data_key='include', description= 'Allow the client to customize which related resources should be returned in included section.', allowEmptyValue=True, ) class Meta: strict = True ordered = True