Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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()
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
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
Ejemplo n.º 10
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
Ejemplo n.º 11
0
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
Ejemplo n.º 14
0
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