class CourseModuleSchema(ObjectAttrs): id = fields.Int() type = fields.Str() type_name = fields.Str() start = fields.Date() end = fields.Date() class Meta: ordered = True
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 MeetingApiAttrs(ObjectAttrs): title = fields.Str() venue = fields.Str() description = fields.Str() start_date = fields.Date() start_time = fields.Str() end_time = fields.Str() materials = fields.Nested(MeetingFileSchema, many=True) state = fields.Str() state_name = fields.Str() class Meta: object_type = 'meeting' api_path = 'meetings' model = 'users.Meeting' ordered = True @staticmethod def self_api_url(data): return None @pre_dump def prepare_data(self, data, **kwargs): today = timezone.now().date() start_date = data.start_date.date() _state = None if start_date < today: _state = 'finished' elif start_date >= today: _state = 'planned' if _state: setattr(data, 'state', _state) setattr(data, 'state_name', Meeting.MEETING_STATES.get(_state)) return data
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 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 SubmissionAttrs(ObjectAttrs): title = fields.Str(required=True, example='Very important data') notes = fields.Str(required=True, example='We need this data to save the world') organization_name = fields.Str(required=False, example='ACME') data_link = fields.Url(required=False, example='https://duckduckgo.com') potential_possibilities = fields.Str(required=False) submission_date = fields.Date(required=True) decision_date = fields.Date(required=True) published_at = fields.DateTime(required=True) feedback_counters = fields.Nested( FeedbackCounters, many=False ) my_feedback = fields.Str(required=False) class Meta: object_type = 'submission' path = 'submissions' url_template = '{api_url}/submissions/accepted/{ident}'
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 LaboratoryApiAttrs(ObjectAttrs): title = TranslatedStr() notes = TranslatedStr() event_type = fields.String() execution_date = fields.Date() reports = fields.Nested(ReportSchema, many=True) class Meta: object_type = 'Laboratory' url_template = '{api_url}/laboratories/{ident}' model = 'laboratory.LabEvent'
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 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 CourseApiAttrs(ObjectAttrs, HighlightObjectMixin): title = fields.Str() notes = fields.Str() participants_number = fields.Int() venue = fields.Str() start = fields.Date() end = fields.Date() file_type = fields.Str() file_url = fields.URL() materials_file_type = fields.Str() materials_file_url = fields.URL() sessions = fields.Nested(CourseModuleSchema, many=True) state = fields.Str() state_name = fields.Str() class Meta: # relationships_schema = ApplicationApiRelationships object_type = 'course' url_template = '{api_url}/courses/{ident}' model = 'academy.Course' @pre_dump def prepare_data(self, data, **kwargs): if data.start and data.end: today = timezone.now().date() start_date = data.start.date() end_date = data.end.date() _state = None if start_date <= today <= end_date: _state = 'current' elif end_date < today: _state = 'finished' elif today < start_date: _state = 'planned' if _state: setattr(data, 'state', _state) setattr(data, 'state_name', Course.COURSE_STATES.get(_state)) return data
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 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 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 ResourceApiAttrs(ObjectAttrs): title = TranslatedStr() description = TranslatedStr() category = fields.Str() format = fields.Str() media_type = fields.Str() downloads_count = fields.Integer() openness_score = fields.Integer() views_count = fields.Integer() modified = fields.DateTime() created = fields.DateTime() verified = fields.DateTime() data_date = fields.Date() file_url = fields.Str() download_url = fields.Str() link = fields.Str() file_size = fields.Integer() class Meta: relationships_schema = ResourceApiRelationships object_type = 'resource' api_path = 'resources' url_template = '{api_url}/resources/{ident}'
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 CommonObjectApiAttrs(ObjectAttrs, HighlightObjectMixin): model = fields.Str() # common slug = TranslatedStr() title = TranslatedStr() notes = TranslatedStr() keywords = KeywordsList(TranslatedStr(), faker_type='tagslist') modified = fields.DateTime() created = fields.DateTime() verified = fields.DateTime() categories = fields.Nested(Category, many=True) category = fields.Nested(Category) if is_enabled('S35_high_value_data.be'): has_high_value_data = fields.Boolean() # datasets source = fields.Nested(SourceSchema) # resources data_date = fields.Date() visualization_types = fields.List(fields.Str()) # applications, showcases author = fields.Str() illustrative_graphics_alt = TranslatedStr() illustrative_graphics_url = fields.Str() image_alt = TranslatedStr() image_thumb_url = fields.Str() if is_enabled('S39_showcases.be'): showcase_category = fields.Str() showcase_category_name = fields.Method('get_showcase_category_name') showcase_types = fields.List(fields.Str()) showcase_platforms = fields.List(fields.Str()) # institutions abbreviation = fields.Str() institution_type = fields.Str() datasets_count = fields.Int(attribute='published_datasets_count') resources_count = fields.Int(attribute='published_resources_count') fax = fields.Str() tel = fields.Str() sources = fields.Nested(DataSourceAttr, many=True) # cms pages html_url = fields.Str() if is_enabled('S39_filter_by_geodata.be'): # regions region_id = fields.Int() hierarchy_label = TranslatedStr() bbox = fields.List(fields.List(fields.Float), attribute='bbox.coordinates') regions = fields.Nested(RegionSchema, many=True) def get_showcase_category_name(self, obj): val = getattr(obj, 'showcase_category', None) if val: model = apps.get_model('showcases.Showcase') return str(model.CATEGORY_NAMES[val]) return missing @staticmethod def self_api_url(data): try: api_url = getattr(settings, 'API_URL', 'https://api.dane.gov.pl') model = data.model obj_id = data.id slug = data['slug'][get_language()] full_url = f'{api_url}/{model}s/{obj_id},{slug}' except AttributeError: full_url = None return full_url class Meta: relationships_schema = CommonObjectRelationships object_type = 'common' api_path = 'search'
class SearchDateRangeAggregation(ExtSchema): max_date = fields.Date() min_date = fields.Date()