class DescriptionSchema(Schema): """Schema for the additional descriptions.""" description = SanitizedHTML(required=True, validate=validate.Length(min=3)) type = fields.Nested(VocabularySchema, required=True) lang = fields.Nested(VocabularySchema)
def sanitize_html_fields(self, data, **kwargs): """Sanitize fields that may contain user-input HTML strings.""" if 'abstract' in data: for lang, val in data.get('abstract').items(): raw = data['abstract'][lang] data['abstract'][lang] = SanitizedHTML()._deserialize( raw, 'abstract', data) return data
class CommunityMetadataSchema(Schema): """Community metadata schema.""" COMMUNITY_TYPES = [ 'organization', 'event', 'topic', 'project', ] title = SanitizedUnicode(required=True, validate=_not_blank(max=250)) description = SanitizedUnicode(validate=_not_blank(max=2000)) curation_policy = SanitizedHTML(validate=_not_blank(max=2000)) page = SanitizedHTML(validate=_not_blank(max=2000)) # TODO: Use general small vocabularies type = SanitizedUnicode(validate=validate.OneOf(COMMUNITY_TYPES)) website = fields.Url(validate=_not_blank()) funding = fields.List(fields.Nested(FundingSchema)) organizations = fields.List(fields.Nested(AffiliationSchema))
class UploadSchema(ModelSchema): attachment_count = fields.Method("get_attachement_count", dump_only=True) text_length = fields.Method("get_text_length", dump_only=True) email = fields.Email() phone = fields.String(validate=Regexp(r"^\+?[0-9]{6,13}$")) text = SanitizedHTML(validate=Length(max=(2 * 1024 * 1024)), tags=[], attrs=[]) # ~2MB (or a lot more bc UTF-8) address = SanitizedHTML(tags=[], attrs=[]) name = SanitizedHTML(tags=[], attrs=[]) files = fields.Nested('FileSchema', many=True, exclude=['upload']) def get_attachement_count(self, upload: Upload) -> int: return len(upload.files) # backref def get_text_length(self, upload: Upload) -> int: return len(upload.text) class Meta: model = Upload
class DescriptionSchema(Schema): """Schema for the additional descriptions.""" DESCRIPTION_TYPES = [ "abstract", "methods", "seriesinformation", "tableofcontents", "technicalinfo", "other" ] description = SanitizedHTML(required=True, validate=validate.Length(min=3)) type = SanitizedUnicode( required=True, validate=validate.OneOf( choices=DESCRIPTION_TYPES, error=_( 'Invalid description type. {input} not one of {choices}.'))) lang = fields.Nested(LanguageSchema)
class MetadataSchema(Schema): """Schema for the record metadata.""" field_load_permissions = { # TODO: define "can_admin" action } field_dump_permissions = { # TODO: define "can_admin" action } class Meta: """Meta class to accept unknwon fields.""" unknown = INCLUDE # Metadata fields resource_type = ResourceType(required=True) creators = fields.List(fields.Nested(CreatorSchema), required=True, validate=validate.Length( min=1, error=_("Missing data for required field."))) title = SanitizedUnicode(required=True, validate=validate.Length(min=3)) additional_titles = fields.List(fields.Nested(TitleSchema)) publisher = SanitizedUnicode() publication_date = EDTFDateString(required=True) subjects = fields.List(fields.Nested(SubjectSchema)) contributors = fields.List(fields.Nested(ContributorSchema)) dates = fields.List(fields.Nested(DateSchema)) languages = fields.List(fields.Nested(LanguageSchema)) # alternate identifiers identifiers = IdentifierSet( fields.Nested(partial(IdentifierSchema, allow_all=True))) related_identifiers = fields.List(fields.Nested(RelatedIdentifierSchema)) sizes = fields.List( SanitizedUnicode( validate=_not_blank(_('Size cannot be a blank string.')))) formats = fields.List( SanitizedUnicode( validate=_not_blank(_('Format cannot be a blank string.')))) version = SanitizedUnicode() rights = fields.List(fields.Nested(RightsSchema)) description = SanitizedHTML(validate=validate.Length(min=3)) additional_descriptions = fields.List(fields.Nested(DescriptionSchema)) locations = fields.List(fields.Nested(LocationSchema)) funding = fields.List(fields.Nested(FundingSchema)) references = fields.List(fields.Nested(ReferenceSchema))
class MetadataSchema(Schema): """Schema for the record metadata.""" # Metadata fields resource_type = fields.Nested(VocabularySchema, required=True) creators = fields.List(fields.Nested(CreatorSchema), required=True, validate=validate.Length( min=1, error=_("Missing data for required field."))) title = SanitizedUnicode(required=True, validate=validate.Length(min=3)) additional_titles = fields.List(fields.Nested(TitleSchema)) publisher = SanitizedUnicode() publication_date = EDTFDateString(required=True) subjects = fields.List(fields.Nested(SubjectSchema)) contributors = fields.List(fields.Nested(ContributorSchema)) dates = fields.List(fields.Nested(DateSchema)) languages = fields.List(fields.Nested(VocabularySchema)) # alternate identifiers identifiers = IdentifierSet( fields.Nested( partial(IdentifierSchema, allowed_schemes=record_identifiers_schemes))) related_identifiers = fields.List(fields.Nested(RelatedIdentifierSchema)) sizes = fields.List( SanitizedUnicode( validate=_not_blank(_('Size cannot be a blank string.')))) formats = fields.List( SanitizedUnicode( validate=_not_blank(_('Format cannot be a blank string.')))) version = SanitizedUnicode() rights = fields.List(fields.Nested(RightsSchema)) description = SanitizedHTML(validate=validate.Length(min=3)) additional_descriptions = fields.List(fields.Nested(DescriptionSchema)) locations = fields.Nested(FeatureSchema) funding = fields.List(fields.Nested(FundingSchema)) references = fields.List(fields.Nested(ReferenceSchema))
class FileSchema(ModelSchema): original_filename = SanitizedHTML(tags=[], attrs=[]) mime = fields.String(validate=validate_mimetype) class Meta: model = File