コード例 #1
0
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
コード例 #2
0
class ResourceApiRequest(CommonSchema):
    id = search_fields.NumberField(
        _in='path', description='Resource ID', example='447', required=True
    )

    class Meta:
        strict = True
        ordered = True
コード例 #3
0
ファイル: deserializers.py プロジェクト: horosin/mcod-backend
class FetchSubscription(core_schemas.CommonSchema):
    id = search_fields.NumberField(
        _in='path', description='Subscription ID', example='447', required=True
    )

    class Meta:
        strict = True
        ordered = True
コード例 #4
0
class NotificationRequest(CommonSchema):
    id = fields.NumberField(
        _in='path', description='Notification ID', example='447', required=True
    )

    class Meta:
        strict = True
        ordered = True
コード例 #5
0
class HistoryApiRequest(CommonSchema):
    id = search_fields.NumberField(_in='path',
                                   description='History ID',
                                   example='1',
                                   required=True)

    class Meta:
        strict = True
        ordered = True
コード例 #6
0
class NotificationApiRequest(core_schemas.CommonSchema):
    id = search_fields.NumberField(_in='path',
                                   description='Notification ID',
                                   example='447',
                                   required=True)

    class Meta:
        strict = True
        ordered = True
コード例 #7
0
ファイル: deserializers.py プロジェクト: horosin/mcod-backend
class InstitutionApiRequest(CommonSchema):
    id = search_fields.NumberField(_in='path',
                                   description='Institution ID',
                                   example='44',
                                   required=True)

    class Meta:
        strict = True
        ordered = True
コード例 #8
0
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
コード例 #9
0
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