class RelatedIdentifierSchemaV1(BaseSchema): """Related identifier schema.""" RELATIONS = [ "IsCitedBy", "Cites", "IsSupplementTo", "IsSupplementedBy", "IsContinuedBy", "Continues", "IsDescribedBy", "Describes", "HasMetadata", "IsMetadataFor", "HasVersion", "IsVersionOf", "IsNewVersionOf", "IsPreviousVersionOf", "IsPartOf", "HasPart", "IsReferencedBy", "References", "IsDocumentedBy", "Documents", "IsCompiledBy", "Compiles", "IsVariantFormOf", "IsOriginalFormOf", "IsIdenticalTo", "IsReviewedBy", "Reviews", "IsDerivedFrom", "IsSourceOf", "IsRequiredBy", "Requires", "IsObsoletedBy", "Obsoletes" ] SCHEMES = [ "ARK", "arXiv", "bibcode", "DOI", "EAN13", "EISSN", "Handle", "IGSN", "ISBN", "ISSN", "ISTC", "LISSN", "LSID", "PMID", "PURL", "UPC", "URL", "URN", "w3id" ] identifier = SanitizedUnicode(required=True) scheme = SanitizedUnicode( required=True, validate=validate.OneOf(choices=SCHEMES, error=_('Invalid related identifier scheme. ' + '{input} not one of {choices}.'))) relation_type = SanitizedUnicode( required=True, validate=validate.OneOf( choices=RELATIONS, error=_('Invalid relation type. {input} not one of {choices}.'))) resource_type = Nested(ResourceTypeSchemaV1)
class LicenseSchemaV1(BaseSchema): """License schema.""" license = SanitizedUnicode(required=True) uri = SanitizedUnicode() identifier = SanitizedUnicode() scheme = SanitizedUnicode()
class MetadataSchemaV1(InvenioRecordMetadataSchemaV1Mixin, DCObjectSchemaV1Mixin, StrictKeysMixin): """Schema for the record metadata.""" ALLOWED_SCHEMAS = ACL_ALLOWED_SCHEMAS PREFERRED_SCHEMA = ACL_PREFERRED_SCHEMA owners = fields.List(fields.Int(), dump_only=True) abstract = MultilingualStringSchemaV1(required=True) description = MultilingualStringSchemaV1(required=True) contributors = SanitizedUnicode(required=False) event = fields.Nested(EventSchemaV1(), required=False) difficulty = SanitizedUnicode(required=True) license = SanitizedUnicode(required=True) formats = fields.Nested(FormatSchemaV1(many=True), many=True, required=False) source = fields.URL() @pre_load def set_owners(self, in_data, **kwargs): if current_user.is_authenticated: in_data['owners'] = [current_user.get_id()] return in_data class Meta: unknown = INCLUDE
class CommunitiesRequestV1(BaseSchema): """Community Request Schema.""" id = SanitizedUnicode(required=True) comid = SanitizedUnicode(required=True) title = SanitizedUnicode(required=True) request_id = SanitizedUnicode() created_by = fields.Integer() links = fields.Method('get_links') def get_links(self, obj): """Get links.""" res = { 'self': api_link_for('community_inclusion_request', id=obj['comid'], request_id=obj['request_id']), 'community': api_link_for('community', id=obj['comid']), } for action in ('accept', 'reject', 'comment'): res[action] = api_link_for('community_inclusion_request_action', id=obj['comid'], request_id=obj['request_id'], action=action) return res
class OrganisationMetadataSchemaV1(StrictKeysMixin): """Schema for the organisation metadata.""" pid = PersistentIdentifier() code = SanitizedUnicode(required=True) name = SanitizedUnicode(required=True) isShared = fields.Boolean() isDedicated = fields.Boolean() # When loading, if $schema is not provided, it's retrieved by # Record.schema property. schema = GenFunction(load_only=True, attribute="$schema", data_key="$schema", deserialize=schema_from_organisation) permissions = fields.Dict(dump_only=True) @pre_dump def add_permissions(self, item): """Add permissions to record. :param item: Dict representing the record. :returns: Modified dict. """ item['permissions'] = { 'read': OrganisationPermission.read(current_user, item), 'update': OrganisationPermission.update(current_user, item), 'delete': OrganisationPermission.delete(current_user, item) } return item
class TaxonomySchemaV1(StrictKeysMixin): """Taxonomy schema.""" id = Integer(required=False) slug = SanitizedUnicode(required=False) path = SanitizedUnicode(required=False) title = Nested(TaxonomyTitleSchemaV1(), many=True, required=False) level = Integer(required=False) links = Nested(TaxonomyLinksSchemaV1(), required=False) ref = SanitizedUnicode(required=False, dump_to='$ref', load_from='$ref', attribute="$ref") descendants_count = Integer(required=False, dump_only=True) @pre_load def convert_ref(self, in_data, **kwargs): ref = None if '$ref' in in_data: ref = in_data['$ref'] elif 'links' in in_data: ref = (in_data['links'] or {}).get('self', None) if not ref: raise ValidationError('Either links or $ref must be provided for a Taxonomy record') # noqa path = url_to_path(ref) try: tax, term = Taxonomy.find_taxonomy_and_term(path) except NoResultFound: raise ValidationError('Taxonomy $ref link is invalid: {}'.format(ref)) # noqa if not tax: raise ValidationError('Taxonomy $ref link is invalid: {}'.format(ref)) # noqa return {'$ref': ref}
def app_config(app_config): """Override conftest.py's app_config """ # Added custom configuration app_config['RDM_RECORDS_METADATA_NAMESPACES'] = { 'dwc': { '@context': 'https://example.com/dwc/terms' }, 'nubiomed': { '@context': 'https://example.com/nubiomed/terms' } } app_config['RDM_RECORDS_METADATA_EXTENSIONS'] = { 'dwc': { 'family': { 'elasticsearch': 'keyword', 'marshmallow': SanitizedUnicode(required=True) }, 'behavior': { 'elasticsearch': 'text', 'marshmallow': SanitizedUnicode() } }, 'nubiomed': { 'right_or_wrong': { 'elasticsearch': 'boolean', 'marshmallow': Bool() } } } return app_config
class InstitutionsMixin: relatedID = Nested(RelatedIDSchema) aliases = List(SanitizedUnicode()) ico = SanitizedUnicode() url = Url() provider = Boolean(missing=False) formerNames = List(SanitizedUnicode())
class OutputSchemaV1(StrictKeysMixin): """Output & Product Schema""" output_doi = SanitizedUnicode() output_type = SanitizedUnicode() output_title = SanitizedUnicode() output_abstract = SanitizedUnicode() output_link = SanitizedUnicode()
class ToolSchemaV1(StrictKeysMixin): """Tool Schema""" tool_doi = SanitizedUnicode() tool_type = SanitizedUnicode() tool_title = SanitizedUnicode() tool_abstract = SanitizedUnicode() tool_link = SanitizedUnicode()
class DocsetSchemaV1(StrictKeysMixin): """DocumentSet Schema""" docset_doi = SanitizedUnicode() docset_title = SanitizedUnicode() docset_abstract = SanitizedUnicode() docset_keywords = fields.List(SanitizedUnicode(), many=True) docset_notes = SanitizedUnicode()
class CommunitiesRequest(Schema): """Community Request Schema.""" id = SanitizedUnicode(required=True) comid = SanitizedUnicode(required=True) title = SanitizedUnicode(required=True) request_id = SanitizedUnicode() created_by = fields.Integer()
class MetadataSchemaV1(StrictKeysMixin): """Schema for the record metadata.""" {{ cookiecutter.datamodel_pid_name }} = PersistentIdentifier() title = SanitizedUnicode(required=True, validate=validate.Length(min=3)) keywords = fields.List(SanitizedUnicode(), many=True) publication_date = DateString() contributors = Nested(ContributorSchemaV1, many=True, required=True)
class MetadataSchemaV1(SchemaEnforcingMixin, StrictKeysMixin): """Schema for the record metadata.""" control_number = PersistentIdentifier() title = SanitizedUnicode(required=True, validate=validate.Length(min=3)) keywords = fields.List(SanitizedUnicode(), many=True) publication_date = DateString() contributors = Nested(ContributorSchemaV1, many=True, required=True)
class ContributorSchemaV1(StrictKeysMixin): """Contributor schema.""" ids = fields.Nested(PersonIdsSchemaV1, many=True) name = SanitizedUnicode(required=True) role = SanitizedUnicode() affiliations = fields.List(SanitizedUnicode()) email = fields.Email()
class AuthorMetadataSchemaV1(StrictKeysMixin): """Schema for the author metadata.""" _oai = Nested(OaiSchemaV1) id = PersistentIdentifier() name = SanitizedUnicode(required=True) organization = SanitizedUnicode(required=False) class Meta: unknown = INCLUDE
class ReferenceSchemaV1(BaseSchema): """Reference schema.""" SCHEMES = ["ISNI", "GRID", "Crossref Funder ID", "Other"] reference_string = SanitizedUnicode(required=True) identifier = SanitizedUnicode() scheme = SanitizedUnicode(validate=validate.OneOf( choices=SCHEMES, error=_('Invalid reference scheme. {input} not one of {choices}.')))
def test_taxonomy_field(): extra = { "title": SanitizedUnicode(required=False), "language": List(SanitizedUnicode(required=False)) } schema = TaxonomyField(extra=extra, name="taxonomy") assert type(schema) == TaxonomyNested assert "title" in schema.nested.fields.keys() assert "language" in schema.nested.fields.keys()
class NResultsMetadataSchemaV1(CommonMetadataSchemaV2): N_certifyingAuthority = TaxonomyField( mixins=[TitledMixin, NcertifyingAuthorityMixin]) N_dateCertified = DateString() N_economicalParameters = SanitizedUnicode(validate=Length(max=1024)) N_internalID = SanitizedUnicode() N_referenceNumber = SanitizedUnicode() N_resultUsage = TaxonomyField(mixins=[TitledMixin]) N_technicalParameters = SanitizedUnicode(validate=Length(max=3000)) N_type = TaxonomyField(mixins=[TitledMixin], required=True)
class FileSchema(Schema): """File schema.""" type = fields.String() checksum = fields.String() size = fields.Integer() key = SanitizedUnicode() version_id = SanitizedUnicode() bucket_id = SanitizedUnicode() mimetype = SanitizedUnicode() storage_class = SanitizedUnicode()
class TitleSchemaV1(BaseSchema): """Schema for the additional title.""" title = SanitizedUnicode(required=True, validate=validate.Length(min=3)) type = SanitizedUnicode(missing='MainTitle') lang = SanitizedUnicode(validate=validate_iso639_3) @validates_schema def validate_data(self, data, **kwargs): """Validate type.""" validate_entry('titles.type', data)
class FundingReferenceSchema(StrictKeysMixin): projectID = SanitizedUnicode() projectName = SanitizedUnicode() fundingProgram = SanitizedUnicode() funder = TaxonomyField(mixins=[FunderMixin, TitledMixin]) @validates_schema def required_fields(self, data, **kwargs): if data.get("projectID"): if not data.get("funder"): raise ValidationError("Funder is required")
class DCObjectSchemaV2Mixin(Schema): title = MultilingualStringV2(required=True) alternative = MultilingualStringV2(required=False) abstract = MultilingualStringV2(required=False) creator = SanitizedUnicode(required=True) contributor = SanitizedUnicode(required=False) dateSubmitted = DateString(required=False) available = DateString(required=False) created = DateString(required=True) modified = DateString(required=True) description = MultilingualStringV2(required=False) identifier = SanitizedUnicode(required=True)
class MetadataSchemaV1(DraftValidationSchemaV1Mixin, DraftEnabledSchema, StrictKeysMixin): """Schema for the record metadata.""" id = PersistentIdentifier() title = SanitizedUnicode(required=True, validate=validate.Length(min=1, max=10)) keywords = fields.List(SanitizedUnicode(), many=True) publication_date = DateString() schema = SanitizedUnicode(required=True, attribute='$schema', **load_dump('$schema'))
class MetadataSchemaV1(StrictKeysMixin): """Schema for the record metadata.""" def get_id(self, obj): """Get record id.""" pid = self.context.get('pid') return pid.pid_value if pid else missing id = fields.Function(serialize=get_id, deserialize=get_id) title = SanitizedUnicode() authors = SanitizedUnicode() description = SanitizedUnicode() items = SanitizedUnicode()
class MetadataSchemaV1(StrictKeysMixin): """Schema for the record metadata.""" id = PersistentIdentifier() title = SanitizedUnicode() resource_type = SanitizedUnicode() docset = fields.Nested(DocsetSchemaV1, many=False) publications = fields.Nested(PublicationchemaV1, many=True) datasets = fields.Nested(DatasetSchemaV1, many=True) tools = Nested(ToolSchemaV1, many=True) outputs = Nested(OutputSchemaV1, many=True) virtenvs = Nested(VirtenvSchemaV1, many=True) contributors = Nested(ContributorSchemaV1, many=True)
class ContributorSchemaV1(StrictKeysMixin): """Contributor schema.""" ids = fields.Nested(PersonIdsSchemaV1, many=True) name = SanitizedUnicode(required=True) affiliations = fields.List(SanitizedUnicode()) email = fields.Email() roles = fields.List(SanitizedUnicode()) @post_dump(pass_many=False) def no_email(self, contributor, **kwargs): contributor['email'] = '' return contributor
class MetadataSchemaV1(StrictKeysMixin): """Schema for the record metadata.""" id = PersistentIdentifier() title = SanitizedUnicode(required=True, validate=validate.Length(min=3)) keywords = fields.List(SanitizedUnicode(), many=True) publication_date = DateString() contributors = Nested(ContributorSchemaV1, many=True, required=True) _schema = GenFunction( attribute="$schema", data_key="$schema", deserialize=schema_from_context, # to be added only when loading )
class DepositMetadataSchemaV1(StrictKeysMixin): """Schema for the deposit metadata.""" pid = PersistentIdentifier() contributors = fields.List(fields.Dict()) diffusion = fields.Dict() document = fields.Dict() logs = fields.List(fields.Dict()) metadata = fields.Dict() status = SanitizedUnicode() step = SanitizedUnicode() user = fields.Dict() projects = fields.List(fields.Dict()) _files = fields.List(fields.Dict()) _bucket = SanitizedUnicode() # When loading, if $schema is not provided, it's retrieved by # Record.schema property. schema = GenFunction(load_only=True, attribute="$schema", data_key="$schema", deserialize=schema_from_deposit) permissions = fields.Dict(dump_only=True) @pre_dump def add_permissions(self, item, **kwargs): """Add permissions to record. :param item: Dict representing the record :returns: Dict of modified record. """ item['permissions'] = { 'read': DepositPermission.read(current_user_record, item), 'update': DepositPermission.update(current_user_record, item), 'delete': DepositPermission.delete(current_user_record, item) } return item @pre_load def remove_fields(self, data, **kwargs): """Removes computed fields. :param data: Dict of record data. :returns: Modified data. """ data.pop('permissions', None) return data
class DescriptionSchemaV1(BaseSchema): """Schema for the additional descriptions.""" DESCRIPTION_TYPES = [ "Abstract", "Methods", "SeriesInformation", "TableOfContents", "TechnicalInfo", "Other" ] description = SanitizedUnicode(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 = SanitizedUnicode(validate=validate_iso639_3)