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'
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()
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)
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
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)
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
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'
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}'
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'
class DeleteFeedbackAttrs(ObjectAttrs): submission = core_fields.Int(description='Submission ID', example=12, required=True) class Meta: strict = True ordered = True object_type = 'feedback'
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'
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 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)
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
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'
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)
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.' ))