class CreateUserScheduleItemAttrs(ObjectAttrs):
    institution = fields.Str(attribute='organization_name', required=True, validate=validate.Length(min=1))
    institution_unit = fields.Str(attribute='organization_unit')
    dataset_title = fields.Str(required=True, validate=validate.Length(min=1))
    format = fields.Str(required=True, validate=validate.Length(min=1))
    is_new = fields.Bool(required=True)
    is_openness_score_increased = fields.Bool()
    is_quality_improved = fields.Bool()
    description = fields.Str()

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

    @validates_schema
    def validate_data(self, data, **kwargs):
        is_new = data.get('is_new')
        is_openness_score_increased = data.get('is_openness_score_increased')
        is_quality_improved = data.get('is_quality_improved')
        if is_new:
            if 'is_openness_score_increased' in data:
                del data['is_openness_score_increased']
            if 'is_quality_improved' in data:
                del data['is_quality_improved']
        if is_new is False and is_openness_score_increased is None and is_quality_improved is None:  # False is ok.
            raise ValidationError(
                _('is_openness_score_increased or is_quality_improved is required if value of is_new is False!'))
Ejemplo n.º 2
0
class SparqlApiAttrs(ObjectAttrs):
    result = fields.Str()
    has_previous = fields.Bool()
    has_next = fields.Bool()
    content_type = fields.Str()
    download_url = fields.Url()

    class Meta:
        object_type = 'sparql'
        ordered = True
Ejemplo n.º 3
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, ''))
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'
Ejemplo n.º 5
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 AgentImplementedUserScheduleItemAttrs(ObjectAttrs):
    is_resource_added = fields.Bool(required=True)
    is_resource_added_notes = fields.Str()
    resource_link = fields.Str()

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

    @validates('resource_link')
    def validate_resource_link(self, value):
        if value:
            validate.URL()(value)

    @validates_schema
    def validate_data(self, data, **kwargs):
        is_resource_added = data.get('is_resource_added')
        is_resource_added_notes = data.get('is_resource_added_notes')
        resource_link = data.get('resource_link')
        obj = self.context.get('obj')
        if obj:
            if obj.is_accepted:
                if is_resource_added and not resource_link:
                    raise ValidationError('This field is required!', field_name='resource_link')
                if not is_resource_added and not is_resource_added_notes:
                    raise ValidationError('This field is required!', field_name='is_resource_added_notes')
            else:
                data.pop('is_resource_added', None)
                data.pop('is_resource_added_notes', None)
                data.pop('resource_link', None)
class NotificationAttrs(ObjectAttrs):
    unread = fields.Bool(required=True)

    class Meta:
        object_type = 'notification'
        strict = True
        ordered = True
class CreateNotificationsApiAttrs(ObjectAttrs):
    result = fields.Str()
    success = fields.Bool()

    class Meta:
        object_type = 'result'
        ordered = True
class AdminCreateUserScheduleItemAttrs(CreateUserScheduleItemAttrs):
    recommendation_state = fields.Str(
        validate=validate.OneOf(
            choices=USER_SCHEDULE_ITEM_STATES,
            error=_('Unsupported recommendation state. Supported are: %(states)s') % {
                'states': USER_SCHEDULE_ITEM_STATES})
    )
    recommendation_notes = fields.Str(allow_none=True)
    is_accepted = fields.Bool()
    is_resource_added = fields.Bool()
    is_resource_added_notes = fields.Str(allow_none=True)
    resource_link = fields.Str(allow_none=True)

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

    @validates('resource_link')
    def validate_resource_link(self, value):
        if value:
            validate.URL()(value)

    @post_load
    def prepare_data(self, data, **kwargs):
        obj = self.context.get('obj')
        if not obj:
            if data.get('recommendation_notes') is None:
                data['recommendation_notes'] = ''
            if data.get('resource_link') is None:
                data['resource_link'] = ''
            if data.get('is_resource_added_notes') is None:
                data['is_resource_added_notes'] = ''
        is_accepted = data.pop('is_accepted', None)
        if is_accepted is True:
            data['recommendation_state'] = 'recommended'
        elif is_accepted is False:
            data['recommendation_state'] = 'not_recommended'
        return data

    @validates_schema
    def validate_data(self, data, **kwargs):
        is_accepted = data.get('is_accepted')
        recommendation_notes = data.get('recommendation_notes')
        recommendation_state = data.get('recommendation_state')
        if (recommendation_state == 'not_recommended' or is_accepted is False) and not recommendation_notes:
            raise ValidationError('This field is required!', field_name='recommendation_notes')
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 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()
Ejemplo n.º 12
0
class ResourceApiAttrs(ObjectAttrs, HighlightObjectMixin):
    title = TranslatedStr()
    description = TranslatedStr()
    category = fields.Str()
    format = fields.Str()
    media_type = fields.Str(
        attribute='type'
    )  # https://jsonapi.org/format/#document-resource-object-fields
    visualization_types = ListWithoutNoneStrElement(fields.Str())
    downloads_count =\
        fields.Function(
            lambda obj: obj.computed_downloads_count if is_enabled('S16_new_date_counters.be') else obj.downloads_count)
    openness_score = fields.Integer()
    views_count =\
        fields.Function(
            lambda obj: obj.computed_views_count if is_enabled('S16_new_date_counters.be') else obj.views_count)
    modified = fields.DateTime()
    created = fields.DateTime()
    verified = fields.DateTime()
    data_date = fields.Date()
    file_url = fields.Str()
    file_size = fields.Integer()
    csv_file_url = fields.Str()
    csv_file_size = fields.Integer()
    jsonld_file_url = fields.Str()
    jsonld_file_size = fields.Integer()
    jsonld_download_url = fields.Str()
    download_url = fields.Str()
    csv_download_url = fields.Str()
    link = fields.Str()
    data_special_signs = fields.Nested(SpecialSignSchema,
                                       data_key='special_signs',
                                       many=True)
    is_chart_creation_blocked = fields.Bool()
    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.Method('get_regions')
    if is_enabled('S40_new_file_model.be'):
        files = fields.Method('get_files')

    class Meta:
        relationships_schema = ResourceApiRelationships
        object_type = 'resource'
        api_path = 'resources'
        url_template = '{api_url}/resources/{ident}'
        model = 'resources.Resource'

    def get_regions(self, res):
        return RegionSchema(many=True).dump(
            getattr(res, 'all_regions', res.regions))

    def get_files(self, res):
        return ResourceFileSchema(many=True).dump(
            getattr(res, 'all_files', res.files))
class UserApiAttrs(UserSchemaMixin, ObjectAttrs):
    is_newsletter_receiver = fields.Bool(required=False,
                                         faker_type='boolean',
                                         example=True)

    class Meta:
        relationships_schema = UserApiRelationships
        object_type = 'user'
        api_path = '/auth/user'
        url_template = '{api_url}/auth/user'
        model = 'users.User'
class UserScheduleAttrs(ObjectAttrs):
    is_ready = fields.Bool(required=True)

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

    @validates_schema
    def validate_data(self, data, **kwargs):
        obj = self.context.get('obj')
        if obj and obj.is_blocked:
            raise ValidationError(_('User schedule\'s readiness state cannot be changed!'), field_name='is_ready')
class DatasetCommentCSVSerializer(CSVSerializer):
    id = fields.Int(data_key='id', required=True, example=77)
    title = fields.Str(data_key=_('Title'), attribute='dataset.title', example='Przykładowy zbiór danych')
    comment = fields.Str(data_key=_('text of comment'), example='Treść uwagi...')
    editor_email = fields.Str(data_key=_('editor e-mail'), example='*****@*****.**')
    data_url = fields.Str(data_key=_('comment reported for dataset'), example='http://dane.gov.pl/dataset/1')
    data_provider_url = fields.Str(data_key=_('Data provider'), example='http://dane.gov.pl/institution/1')
    editor_comment = fields.Str(data_key=_('comment'), example='Treść komentarza edytora...')
    report_date = fields.Date(data_key=_('report date'))
    is_data_provider_error = fields.Bool(data_key=_('data provider error'), example=False)
    is_user_error = fields.Bool(data_key=_('user error'), example=False)
    is_portal_error = fields.Bool(data_key=_('portal error'), example=False)
    is_other_error = fields.Bool(data_key=_('other error'), example=False)
    decision = fields.Str(data_key=_('Decision made'), example='accepted')
    decision_date = fields.Date(data_key=_('Decision date'), default='')

    class Meta:
        ordered = True
        fields = ('id', 'title', 'comment', 'editor_email', 'data_url', 'data_provider_url', 'editor_comment',
                  'report_date', 'is_data_provider_error', 'is_user_error', 'is_portal_error', 'is_other_error',
                  'decision', 'decision_date',)
        model = 'suggestions.DatasetComment'
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.'
                  ))
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 ScheduleAttrs(ObjectAttrs):
    period_name = fields.Str(validate=validate.Length(min=1, max=100))
    end_date = fields.Date(allow_none=True)
    new_end_date = fields.Date(allow_none=True)
    link = fields.Str()
    is_blocked = fields.Bool()

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

    @validates('link')
    def validate_link(self, value):
        if value:
            validate.URL()(value)

    @validates_schema
    def validate_data(self, data, **kwargs):
        obj = self.context.get('obj')
        if obj and not obj.end_date and 'new_end_date' in data:
            raise ValidationError(
                _('You cannot set new_end_date if end_date is not set yet!'), field_name='new_end_date')
class UserScheduleItemApiAttrs(ObjectAttrs):
    email = fields.Email()
    institution = fields.Str(attribute='organization_name')
    institution_unit = fields.Str(attribute='organization_unit')
    dataset_title = fields.Str()
    created = fields.Date()
    format = fields.Str()
    is_new = fields.Bool()
    is_openness_score_increased = fields.Bool()
    is_quality_improved = fields.Bool()
    description = fields.Str()
    state = fields.Str()
    recommendation_state = fields.Str()
    recommendation_notes = fields.Str()
    is_recommendation_issued = fields.Bool()

    is_accepted = fields.Bool()
    is_completed = fields.Bool()
    is_resource_added = fields.Bool()
    is_resource_added_notes = fields.Str()
    resource_link = fields.Url()

    class Meta:
        relationships_schema = UserScheduleItemApiRelationships
        object_type = 'user_schedule_item'
        url_template = '{api_url}/auth/user_schedule_items/{ident}'
        ordered = True
        model = 'schedules.UserScheduleItem'

    @post_dump
    def prepare_data(self, data, **kwargs):
        request = self.context.get('request')
        user = getattr(request, 'user', None) if request else None
        if not user or not user.is_superuser:
            del data['recommendation_state']
            del data['recommendation_notes']
        return data
class ChangePasswordApiAttrs(ObjectAttrs):
    is_password_changed = fields.Bool(required=True)

    class Meta:
        object_type = 'user'
        url_template = '{api_url}/auth/password/change'
class LogoutApiAttrs(ObjectAttrs):
    is_logged_out = fields.Bool(required=True)

    class Meta:
        object_type = 'user'
        url_template = '{api_url}/auth/logout'
class ResendActivationEmailAttrs(ObjectAttrs):
    is_activation_email_sent = fields.Bool(required=True)

    class Meta:
        object_type = 'user'
        url_template = '{api_url}/auth/registration/resend-email'
class ResetPasswordAttrs(ObjectAttrs):
    is_password_reset_email_sent = fields.Bool(required=True)

    class Meta:
        object_type = 'user'
        url_template = '{api_url}/auth/password/reset'
class VerifyEmailAttrs(ObjectAttrs):
    is_verified = fields.Bool(required=True)

    class Meta:
        object_type = 'user'
        url_template = '{api_url}/registration/verify-email/'
class AcceptedSubmissionCommentAttrs(ObjectAttrs):
    is_comment_email_sent = fields.Bool(required=True)

    class Meta:
        object_type = 'comment_confirmation'
class ConfirmResetPasswordApiAttrs(ObjectAttrs):
    is_confirmed = fields.Bool(required=True)

    class Meta:
        object_type = 'user'
        url_template = '{api_url}/auth/password/reset'
Ejemplo n.º 27
0
class ChartApiMeta(TopLevelMeta):
    named_charts = fields.Bool()