class ListingSchema(CommonSchema): page = fields.NumberField(data_key='page', missing=1, default=1, example=1, description='Page number. Default value is 1.', validate=validate.Range( 1, error=_('Invalid page number'))) per_page = fields.NumberField( missing=25, default=25, example=10, description= 'Page size. Default value is 25, max allowed page size is 100.', validate=validate.Range(1, 100, error=_("Invalid page size"))) def get_queryset(self, queryset, data): if not data: return queryset dumped = self.dump(data) for field_name, t in dumped.items(): f, d = t queryset = f(queryset, d) return queryset class Meta: strict = True
class ResourceApiRequest(CommonSchema): id = search_fields.NumberField( _in='path', description='Resource ID', example='447', required=True ) class Meta: strict = True ordered = True
class FetchSubscription(core_schemas.CommonSchema): id = search_fields.NumberField( _in='path', description='Subscription ID', example='447', required=True ) class Meta: strict = True ordered = True
class NotificationRequest(CommonSchema): id = fields.NumberField( _in='path', description='Notification ID', example='447', required=True ) class Meta: strict = True ordered = True
class HistoryApiRequest(CommonSchema): id = search_fields.NumberField(_in='path', description='History ID', example='1', required=True) class Meta: strict = True ordered = True
class NotificationApiRequest(core_schemas.CommonSchema): id = search_fields.NumberField(_in='path', description='Notification ID', example='447', required=True) class Meta: strict = True ordered = True
class InstitutionApiRequest(CommonSchema): id = search_fields.NumberField(_in='path', description='Institution ID', example='44', required=True) class Meta: strict = True ordered = True
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