Пример #1
0
class ResourceCSVSchema(CSVSerializer):
    id = fields.Integer(data_key=_('id'), required=True)
    uuid = fields.Str(data_key=_("uuid"), default='')
    title = fields.Str(data_key=_("title"), default='')
    description = fields.Str(data_key=_("description"), default='')
    link = fields.Str(data_key=_("link"), default='')
    link_is_valid = fields.Str(data_key=_("link_is_valid"), default='')
    file_is_valid = fields.Str(data_key=_("file_is_valid"), default='')
    data_is_valid = fields.Str(data_key=_("data_is_valid"), default='')
    format = fields.Str(data_key=_("format"), default='')
    dataset = fields.Str(attribute='dataset.title',
                         data_key=_("dataset"),
                         default='')
    status = fields.Str(data_key=_("status"), default='')
    created_by = fields.Int(attribute='created_by.id',
                            data_key=_("created_by"),
                            default=None)
    created = fields.DateTime(data_key=_("created"), default=None)
    modified_by = fields.Int(attribute='modified_by.id',
                             data_key=_("modified_by"),
                             default=None)
    modified = fields.DateTime(data_key=_("modified"), default=None)
    resource_type = fields.Str(attribute='type',
                               data_key=_("type"),
                               default='')
    openness_score = fields.Int(data_key=_("openness_score"), default=None)
    views_count = fields.Int(data_key=_("views_count"), default=None)
    downloads_count = fields.Int(data_key=_("downloads_count"), default=None)

    class Meta:
        ordered = True
        model = 'resources.Resource'
Пример #2
0
class DatasetCSVSchema(CSVSerializer):
    id = fields.Integer(data_key=_('id'), required=True)
    uuid = fields.Str(data_key=_("uuid"), default='')
    title = fields.Str(data_key=_("title"), default='')
    notes = fields.Str(data_key=_("notes"), default='')
    url = fields.Str(data_key=_("url"), default='')
    update_frequency = fields.Str(data_key=_("Update frequency"), default='')
    institution = fields.Str(data_key=_("Institution"),
                             attribute='organization.id',
                             default='')
    category = fields.Str(data_key=_("Category"), default='')
    status = fields.Str(data_key=_("Status"), default='')
    is_licence_set = fields.Boolean(data_key=_("Conditions for re-use"),
                                    default=None)
    created_by = fields.Int(attribute='created_by.id',
                            data_key=_("created_by"),
                            default=None)
    created = fields.DateTime(data_key=_("created"), default=None)
    modified_by = fields.Int(attribute='modified_by.id',
                             data_key=_("modified_by"),
                             default=None)
    modified = fields.DateTime(data_key=_("modified"), default=None)
    followers_count = fields.Str(data_key=_("The number of followers"),
                                 default=None)

    class Meta:
        ordered = True
        model = 'datasets.Dataset'
class UserSchemaMixin(object):
    state = fields.Str(
        required=True,
        faker_type='userstate',
        example='active',
        description="Allowed values: 'active', 'inactive' or 'blocked'")
    email = fields.Email(required=True,
                         faker_type='email',
                         example='*****@*****.**')
    fullname = fields.Str(missing=None,
                          faker_type='name',
                          example='Jan Kowalski')
    about = fields.Str(missing=None,
                       faker_type='sentence',
                       example='I am a very talented programmer.')
    created = fields.Date()
    subscriptions_report_opt_in = fields.Boolean()
    rodo_privacy_policy_opt_in = fields.Boolean()
    count_datasets_created = fields.Int()
    count_datasets_modified = fields.Int()

    @post_dump
    def prepare_data(self, data, **kwargs):
        data['subscriptions_report_opt_in'] = True if data.get(
            'subscriptions_report_opt_in') is not None else False
        data['rodo_privacy_policy_opt_in'] = True if data.get(
            'rodo_privacy_policy_opt_in') is not None else False
        return data
class NotificationSerializer(ExtSchema):
    id = fields.Int()
    verb = fields.Str()
    timestamp = fields.DateTime()
    unread = fields.Bool()
    description = fields.Str()
    user_schedule_id = fields.Int()
    user_schedule_item_id = fields.Int()
    schedule_state = fields.Str()
    schedule_id = fields.Int()
Пример #5
0
class DatasetXMLSerializer(ExtSchema):
    id = fields.Integer()
    url = fields.Url(attribute='frontend_absolute_url')
    title = TranslatedStr()
    notes = TranslatedStr()
    keywords = fields.Function(lambda dataset: (
        tag.name for tag in getattr(dataset, f'tags_{get_language()}')))
    categories = fields.Nested(DatasetCategoryAttr, many=True)
    update_frequency = TransUpdateFreqField()
    created = fields.DateTime()
    verified = fields.DateTime()
    views_count = fields.Int(attribute='computed_views_count')
    downloads_count = fields.Int(attribute='computed_downloads_count')
    published_resources_count = fields.Int(
        attribute='published_resources__count')
    license = fields.Str(attribute='license_name')
    conditions = fields.Method('get_conditions')
    organization = fields.Method('get_organization')
    resources = fields.Method('get_resources')

    source = fields.Nested(SourceXMLSchema)

    def get_conditions(self, dataset):
        conditions = _(
            'This dataset is public information, it can be reused under the following conditions: '
        )
        terms = [
            str(
                dataset._meta.get_field(
                    'license_condition_modification').verbose_name)
            if dataset.license_condition_modification else '',
            str(
                dataset._meta.get_field('license_condition_source').
                verbose_name) if dataset.license_condition_source else '',
            dataset.license_condition_db_or_copyrighted,
            dataset.license_condition_personal_data
        ]
        return conditions + '\n'.join([term for term in terms if term])

    def get_organization(self, dataset):
        context = {
            'published_datasets_count':
            dataset.organization_published_datasets__count,
            'published_resources_count':
            dataset.organization_published_resources__count,
        }
        return InstitutionXMLSerializer(many=False, context=context).dump(
            dataset.organization)

    def get_resources(self, dataset):
        return ResourceXMLSerializer(many=True).dump(
            dataset.published_resources)
Пример #6
0
class ResourceCSVMetadataSerializer(schemas.ExtSchema):
    frontend_absolute_url = fields.Url(data_key=_('Resource URL'))
    title = TranslatedStr(data_key=_('Resource title'), default='')
    description = TranslatedStr(data_key=_('Resource description'))
    created = fields.DateTime(data_key=_('Resource created'), format='iso8601')
    data_date = fields.Date(data_key=_('Data date'))
    openness_score = fields.Int(data_key=_('Openness score'))
    resource_type = fields.Function(lambda obj: obj.get_type_display(),
                                    data_key=_('Type'))
    format = fields.Str(data_key=_('File format'), default='')
    file_size = fields.Function(lambda obj: sizeof_fmt(obj.file_size)
                                if obj.file_size else '',
                                data_key=_('File size'))
    views_count = fields.Int(attribute='computed_views_count',
                             data_key=_("Resource views count"))
    downloads_count = fields.Int(attribute='computed_downloads_count',
                                 data_key=_("Resource downloads count"))
    has_table = fields.Function(lambda obj: _('YES')
                                if obj.has_table else _('NO'),
                                data_key=_('Table'))
    has_chart = fields.Function(lambda obj: _('YES')
                                if obj.has_chart else _('NO'),
                                data_key=_('Map'))
    has_map = fields.Function(lambda obj: _('YES') if obj.has_map else _('NO'),
                              data_key=_('Chart'))
    download_url = fields.Url(data_key=_('Download URL'))
    data_special_signs = fields.Nested(SpecialSignSchema,
                                       data_key=_('special signs'),
                                       many=True)

    @ma.post_dump(pass_many=False)
    def prepare_nested_data(self, data, **kwargs):
        special_signs = data.get(_('special signs'))
        signs_str = '\n'.join([
            '{name_label}: {name}, {symbol_label}: "{symbol}", {desc_label}: {desc}'
            .format(name=sign['name'],
                    name_label=_('name'),
                    symbol=sign['symbol'],
                    symbol_label=_('symbol'),
                    desc=sign['description'],
                    desc_label=_('description')) for sign in special_signs
        ])
        data[_('special signs')] = signs_str
        values_with_html = [_('Resource title'), _('Resource description')]
        for attribute in values_with_html:
            data[attribute] = strip_tags(data[attribute])
        return data

    class Meta:
        ordered = True
Пример #7
0
class LogEntryApiAttrs(ObjectAttrs):
    action = fields.Str(attribute='action_name')
    change_timestamp = fields.DateTime()
    change_user_id = fields.Str()
    difference = fields.Method('get_difference')
    message = fields.Str()
    new_value = fields.Method('get_new_value')
    row_id = fields.Int()
    table_name = fields.Str()

    class Meta:
        strict = True
        ordered = True
        object_type = 'history'
        api_path = '/histories'
        url_template = '{api_url}/histories/{ident}'
        model = 'histories.LogEntry'

    def get_difference(self, obj):
        try:
            data = json.loads(obj.difference)
        except ValueError:
            data = {}
        if obj.action_name == 'INSERT':
            for key, val in data.items():
                if isinstance(val, list) and len(val) == 2:
                    data[key] = val[1]
        return data

    def get_new_value(self, obj):
        return self.get_difference(obj)
Пример #8
0
class HistoryApiAttrs(ObjectAttrs):
    action = fields.Str()
    change_timestamp = fields.DateTime()
    change_user_id = fields.Str()
    difference = fields.Method('get_difference')
    message = fields.Str()
    new_value = fields.Method('get_new_value')
    row_id = fields.Int()
    table_name = fields.Str()

    class Meta:
        strict = True
        ordered = True
        object_type = 'history'
        api_path = '/histories'
        url_template = '{api_url}/histories/{ident}'
        model = 'histories.History'

    def get_difference(self, obj):
        difference = json.loads(obj.difference) or {}
        if 'values_changed' in difference:
            if "root['password']" in difference['values_changed']:
                difference['values_changed']["root['password']"][
                    'new_value'] = "********"
                difference['values_changed']["root['password']"][
                    'old_value'] = "********"
        return difference

    def get_new_value(self, obj):
        new_value = obj.new_value if isinstance(
            obj.new_value, dict) else json.loads(obj.new_value)
        if new_value and 'password' in new_value:
            new_value['password'] = "******"
        return new_value
class MeetingFileSchema(ObjectAttrs):
    id = fields.Int()
    download_url = fields.Str()
    name = fields.Str()

    class Meta:
        ordered = True
Пример #10
0
class ApplicationApiAttrs(ObjectAttrs, HighlightObjectMixin):
    slug = TranslatedStr()
    title = TranslatedStr()
    notes = TranslatedStr()
    author = fields.Str(faker_type='firstname')
    url = fields.Str(faker_type='url')
    image_url = fields.Str(faker_type='image_url')
    image_thumb_url = fields.Str(faker_type='image_thumb_url')
    image_alt = TranslatedStr()
    illustrative_graphics_url = fields.Str()
    illustrative_graphics_alt = TranslatedStr()
    followed = fields.Boolean(faker_type='boolean')
    keywords = KeywordsList(TranslatedStr(), faker_type='tagslist')
    views_count = fields.Integer(faker_type='integer')
    modified = fields.Str(faker_type='datetime')
    created = fields.Str(faker_type='datetime')
    has_image_thumb = fields.Bool()
    main_page_position = fields.Int()
    external_datasets = fields.Nested(ExternalDataset, many=True)

    class Meta:
        relationships_schema = ApplicationApiRelationships
        object_type = 'application'
        url_template = '{api_url}/applications/{ident}'
        model = 'applications.Application'
class UserScheduleApiAttrs(ObjectAttrs):
    email = fields.Email(attribute='user.email')
    institution = fields.Str()
    items_count = fields.Int()
    is_ready = fields.Bool()
    is_blocked = fields.Bool()
    recommended_items_count = fields.Int()
    implemented_items_count = fields.Int()
    state = fields.Str()

    class Meta:
        relationships_schema = UserScheduleApiRelationships
        object_type = 'user_schedule'
        url_template = '{api_url}/auth/user_schedules/{ident}'
        ordered = True
        model = 'schedules.UserSchedule'
Пример #12
0
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}'
Пример #13
0
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 DatasetSubmissionCSVSerializer(CSVSerializer):
    id = fields.Int(data_key='id', required=True, example=77)
    title = fields.Str(data_key=_('Title'), example='Propozycja nowych danych')
    notes = fields.Str(data_key=_('Notes'), default='', example='opis...')
    organization_name = fields.Str(data_key=_('Institution name'), default='', example='Ministerstwo Cyfryzacji')
    data_link = fields.Str(data_key=_('Link to data'), default='', example='http://example.com')
    potential_possibilities = fields.Str(data_key=_('provide potential data use'), default='', example='opis...')
    comment = fields.Str(data_key=_('Comment'), example='komentarz...', default='')
    submission_date = fields.Date(data_key=_('Submission date'))
    decision = fields.Str(data_key=_('decision'), example='accepted', default=_('Decision not taken'))
    decision_date = fields.Date(data_key=_('Decision date'), default=None)
    accepted_dataset_submission = fields.Int(
        data_key=_('accepted dataset submission'), attribute='accepted_dataset_submission.id', default=None)

    class Meta:
        ordered = True
        model = 'suggestions.DatasetSubmission'
Пример #15
0
class DeleteFeedbackAttrs(ObjectAttrs):
    submission = core_fields.Int(description='Submission ID',
                                 example=12,
                                 required=True)

    class Meta:
        strict = True
        ordered = True
        object_type = 'feedback'
Пример #16
0
class SubmissionApiRequest(CommonSchema):
    id = core_fields.Int(_in='path',
                         description='Submission ID',
                         example='447',
                         required=True)

    class Meta:
        strict = True
        ordered = True
class CourseModuleSchema(ObjectAttrs):
    id = fields.Int()
    type = fields.Str()
    type_name = fields.Str()
    start = fields.Date()
    end = fields.Date()

    class Meta:
        ordered = True
class UserScheduleItemsApiRequest(SchedulesApiRequest):
    sort = search_fields.SortField(
        sort_fields={
            'id': 'id',
            'created': 'created',
            'institution': 'institution',
        },
    )
    q = fields.Str(validate=validate.Length(min=2))
    exclude_id = fields.Int()
class InstitutionCSVSchema(CSVSerializer):
    id = fields.Integer(data_key=_('id'), required=True)
    title = fields.Str(data_key=_("Title"), default='')
    institution_type = fields.Str(data_key=_("Institution type"), default='')
    datasets_count = fields.Int(data_key=_("The number of datasets"),
                                default=None)

    class Meta:
        ordered = True
        model = 'organizations.Organization'
Пример #20
0
class ShowcaseApiAttrs(ObjectAttrs, HighlightObjectMixin):
    category = fields.Str()
    category_name = fields.Method('get_category_name')
    slug = TranslatedStr()
    title = TranslatedStr()
    notes = TranslatedStr()
    author = fields.Str(faker_type='firstname')
    url = fields.Str(faker_type='url')
    image_url = fields.Str(faker_type='image_url')
    image_thumb_url = fields.Str(faker_type='image_thumb_url')
    image_alt = TranslatedStr()
    illustrative_graphics_url = fields.Str()
    illustrative_graphics_alt = TranslatedStr()
    followed = fields.Boolean(faker_type='boolean')
    keywords = KeywordsList(TranslatedStr(), faker_type='tagslist')
    views_count = fields.Integer(faker_type='integer')
    modified = fields.Str(faker_type='datetime')
    created = fields.Str(faker_type='datetime')
    has_image_thumb = fields.Bool()
    main_page_position = fields.Int()
    external_datasets = fields.Nested(ExternalDataset, many=True)
    # application showcase fields:
    is_mobile_app = fields.Bool()
    is_mobile_app_name = fields.Method('get_is_mobile_app_name')
    is_desktop_app = fields.Bool()
    is_desktop_app_name = fields.Method('get_is_desktop_app_name')
    mobile_apple_url = fields.URL()
    mobile_google_url = fields.URL()
    desktop_linux_url = fields.URL()
    desktop_macos_url = fields.URL()
    desktop_windows_url = fields.URL()

    license_type = fields.Str()
    license_type_name = fields.Method('get_license_type_name')
    # api use showcase fields:
    file_url = fields.Str()

    class Meta:
        relationships_schema = ShowcaseApiRelationships
        object_type = 'showcase'
        url_template = '{api_url}/showcases/{ident}'
        model = 'showcases.Showcase'
        ordered = True

    def get_is_desktop_app_name(self, obj):
        return str(_('Desktop App')) if obj.is_desktop_app else ''

    def get_is_mobile_app_name(self, obj):
        return str(_('Mobile App')) if obj.is_mobile_app else ''

    def get_category_name(self, obj):
        return str(Showcase.CATEGORY_NAMES.get(obj.showcase_category, ''))

    def get_license_type_name(self, obj):
        return str(Showcase.LICENSE_TYPE_NAMES.get(obj.license_type, ''))
Пример #21
0
class ResourceXMLSerializer(schemas.ExtSchema):
    id = fields.Integer()
    access_url = fields.Url(attribute='frontend_absolute_url')
    title = TranslatedStr()
    description = TranslatedStr()
    openness_score = fields.Integer()
    format = fields.Str()
    views_count = fields.Int(attribute='computed_views_count')
    downloads_count = fields.Int(attribute='computed_downloads_count')
    created = fields.DateTime(format='iso8601')
    data_date = fields.Date()
    type = fields.Function(lambda resource: resource.get_type_display())
    file_size = fields.Function(lambda obj: sizeof_fmt(obj.file_size)
                                if obj.file_size else '')

    visualization_types = ListWithoutNoneStrElement(fields.Str())
    download_url = fields.Str()
    data_special_signs = fields.Nested(SpecialSignSchema,
                                       data_key='special_signs',
                                       many=True)
Пример #22
0
class ShowcaseProposalCSVSerializer(CSVSerializer):
    id = fields.Int(data_key='id', required=True, example=77)
    category_name = fields.Str(data_key=_('Category'), example='Aplikacja')
    title = fields.Str(data_key=_('Name'), example='Propozycja aplikacji')
    notes = fields.Str(data_key=_('Notes'), default='', example='opis...')
    url = fields.Str(data_key=_('App URL'),
                     default='',
                     example='http://example.com')
    author = fields.Str(data_key=_('Author'),
                        default='',
                        example='Jan Kowalski')
    applicant_email = fields.Email(data_key=_('applicant email'),
                                   default='',
                                   required=False,
                                   example='*****@*****.**')
    keywords = fields.Str(data_key=_('keywords'),
                          attribute='keywords_as_str',
                          default='',
                          example='tag1,tag2,tag3')
    report_date = fields.Date(data_key=_('report date'))
    decision_date = fields.Date(data_key=_('decision date'), default=None)
    comment = fields.Str(data_key=_('comment'),
                         example='komentarz...',
                         default='')
    datasets = fields.Method('get_datasets',
                             data_key=_('datasets'),
                             example='998,999',
                             default='')
    external_datasets = fields.Raw(data_key=_('external datasets'),
                                   example='[]')
    showcase = fields.Int(data_key=_('Showcase'),
                          attribute='showcase.id',
                          default=None)

    class Meta:
        ordered = True
        model = 'showcases.ShowcaseProposal'

    def get_datasets(self, obj):
        return ','.join(str(x.id) for x in obj.datasets.order_by('id'))
class InstitutionApiAttrs(ObjectAttrs, HighlightObjectMixin):
    abbreviation = fields.Str()
    city = fields.Str()
    created = fields.Str()
    datasets_count = fields.Int(attribute='published_datasets_count')
    email = fields.Str()
    epuap = fields.Str()
    fax = fields.Str()
    flat_number = fields.Str()
    followed = fields.Boolean()
    image_url = fields.Str()
    institution_type = fields.Str()
    modified = fields.Str()
    description = TranslatedStr()
    postal_code = fields.Str()
    regon = fields.Str()
    resources_count = fields.Int(attribute='published_resources_count')
    slug = TranslatedStr()
    sources = fields.Nested(DataSourceAttr, many=True)
    street = fields.Str()
    street_number = fields.Str()
    street_type = fields.Str()
    tel = fields.Str()
    title = TranslatedStr()
    website = fields.Str()

    class Meta:
        relationships_schema = InstitutionApiRelationships
        object_type = 'institution'
        url_template = '{api_url}/institutions/{ident}'
        model = 'organizations.Organization'

    @post_dump(pass_many=False)
    def prepare_notes(self, data, **kwargs):
        data["notes"] = data.get("description")
        return data
Пример #24
0
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'
Пример #25
0
    def __init__(
            self, only=None, exclude=(), many=False, context=None,
            load_only=(), dump_only=(), partial=False, unknown=None,
    ):
        super().__init__(only=only, exclude=exclude, many=many, context=context,
                         load_only=load_only, dump_only=dump_only,
                         partial=partial, unknown=unknown)
        many = self.context.get('many', False)
        if many:
            self.fields['count'] = fields.Int(required=True, missing=0, default=0)

        _meta = getattr(self, 'Meta', None)
        aggs_cls = getattr(_meta, 'aggregations_cls', None)

        self.fields['aggregations'] = fields.Nested(aggs_cls, name='aggregations',
                                                    required=False) if aggs_cls else fields.Dict(nullable=True)
Пример #26
0
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 UserCSVSerializer(CSVSerializer):
    id = api_fields.Int(data_key=_('id'), required=True, example=77)
    email = api_fields.Email(data_key=_('Email'),
                             default='',
                             required=True,
                             example='*****@*****.**')
    fullname = api_fields.Str(data_key=_('Full name'),
                              default='',
                              example='Jan Kowalski')
    official_phone = api_fields.Method('get_phone',
                                       data_key=_('Official phone'),
                                       example='+481234567890')
    role = api_fields.Method('get_role',
                             data_key=_('Role'),
                             default='',
                             example='+481234567890')
    state = api_fields.Str(
        data_key=_('State'),
        required=True,
        example='active',
        description="Allowed values: 'active', 'inactive' or 'blocked'")
    institution = api_fields.Method('get_institutions',
                                    data_key=_('Institution'),
                                    example='Ministerstwo Cyfryzacji')

    def get_phone(self, obj):
        if obj.phone:
            phone = obj.phone
            if obj.phone_internal:
                phone += f'.{obj.phone_internal}'
            return phone
        return ''

    def get_role(self, obj):
        if obj.is_superuser:
            return _('Admin')
        elif obj.is_staff:
            return _('Editor')
        else:
            return _('User')

    def get_institutions(self, obj):
        return ','.join(str(org.id) for org in obj.organizations.all())

    class Meta:
        ordered = True
        model = 'users.User'
class GuideItemApiAttrs(ObjectAttrs):
    title = TranslatedStr(data_key='name')
    content = TranslatedStr()
    route = fields.Str()
    css_selector = fields.Str()
    position = fields.Str()
    order = fields.Int()
    is_optional = fields.Bool()
    is_clickable = fields.Bool()
    is_expandable = fields.Bool()

    class Meta:
        relationships_schema = GuideItemApiRelationships
        object_type = 'item'
        url_template = '{api_url}/guides/{ident}'
        ordered = True
        model = 'guides.GuideItem'
class ScheduleApiAttrs(ObjectAttrs):
    start_date = fields.Date()
    period_name = fields.Str()
    end_date = fields.Date()
    new_end_date = fields.Date()
    link = fields.Url()
    state = fields.Str()
    is_blocked = fields.Bool()
    name = fields.Str()
    total_agents_count = fields.Int()

    class Meta:
        relationships_schema = ScheduleApiRelationships
        object_type = 'schedule'
        url_template = '{api_url}/auth/schedules/{ident}'
        ordered = True
        model = 'schedules.Schedule'
class ChartAttrs(ObjectAttrs):
    resource_id = fields.Int(dump_only=True)
    chart = fields.Raw(required=True)
    is_default = fields.Bool()
    name = fields.Str(required=True, validate=validate.Length(min=1, max=200))

    class Meta:
        object_type = 'chart'
        strict = True
        ordered = True

    @pre_load
    def prepare_data(self, data, **kwargs):
        data.setdefault('is_default', False)
        return data

    @validates_schema
    def validate_schema(self, data, **kwargs):
        chart = self.context.get('chart')
        resource = self.context['resource']
        user = self.context['user']
        if resource.is_chart_creation_blocked and not any(
            [user.is_staff, user.is_superuser]):
            raise ValidationError(
                _('Chart creation for this resource is blocked!'))
        if data['is_default'] and not any([
                user.is_superuser,
                user.is_editor_of_organization(resource.institution)
        ]):
            raise ValidationError(_('No permission to define chart'))
        if chart and chart.is_default != data['is_default']:
            raise ValidationError(_('You cannot change type of chart!'))
        private_charts = resource.charts.filter(is_default=False,
                                                created_by=user)
        if chart:
            private_charts = private_charts.exclude(id=chart.id)
        if not data['is_default'] and private_charts.exists():
            raise ValidationError(_('You cannot add another private chart!'))
        charts_with_same_name = resource.charts.filter(is_default=True,
                                                       name=data['name'])
        if chart:
            charts_with_same_name = charts_with_same_name.exclude(id=chart.id)
        if charts_with_same_name.exists() and data['is_default']:
            raise ValidationError(
                _('You cannot put changes into chart defined by Data Provider. Please provide new chart name.'
                  ))