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!'))
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
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'
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()
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'
class ChartApiMeta(TopLevelMeta): named_charts = fields.Bool()