예제 #1
0
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)
예제 #2
0
class LicenseSchemaV1(BaseSchema):
    """License schema."""

    license = SanitizedUnicode(required=True)
    uri = SanitizedUnicode()
    identifier = SanitizedUnicode()
    scheme = SanitizedUnicode()
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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}
예제 #7
0
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
예제 #8
0
class InstitutionsMixin:
    relatedID = Nested(RelatedIDSchema)
    aliases = List(SanitizedUnicode())
    ico = SanitizedUnicode()
    url = Url()
    provider = Boolean(missing=False)
    formerNames = List(SanitizedUnicode())
예제 #9
0
class OutputSchemaV1(StrictKeysMixin):
    """Output & Product Schema"""

    output_doi = SanitizedUnicode()
    output_type = SanitizedUnicode()
    output_title = SanitizedUnicode()
    output_abstract = SanitizedUnicode()
    output_link = SanitizedUnicode()
예제 #10
0
class ToolSchemaV1(StrictKeysMixin):
    """Tool Schema"""

    tool_doi = SanitizedUnicode()
    tool_type = SanitizedUnicode()
    tool_title = SanitizedUnicode()
    tool_abstract = SanitizedUnicode()
    tool_link = SanitizedUnicode()
예제 #11
0
class DocsetSchemaV1(StrictKeysMixin):
    """DocumentSet Schema"""

    docset_doi = SanitizedUnicode()
    docset_title = SanitizedUnicode()
    docset_abstract = SanitizedUnicode()
    docset_keywords = fields.List(SanitizedUnicode(), many=True)
    docset_notes = SanitizedUnicode()
예제 #12
0
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()
예제 #13
0
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)
예제 #14
0
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)
예제 #15
0
class ContributorSchemaV1(StrictKeysMixin):
    """Contributor schema."""

    ids = fields.Nested(PersonIdsSchemaV1, many=True)
    name = SanitizedUnicode(required=True)
    role = SanitizedUnicode()
    affiliations = fields.List(SanitizedUnicode())
    email = fields.Email()
예제 #16
0
파일: json.py 프로젝트: Alzpeta/testinvenio
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
예제 #17
0
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}.')))
예제 #18
0
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()
예제 #19
0
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)
예제 #20
0
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()
예제 #21
0
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)
예제 #22
0
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")
예제 #23
0
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)
예제 #24
0
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'))
예제 #25
0
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()
예제 #26
0
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)
예제 #27
0
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
예제 #28
0
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
    )
예제 #29
0
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
예제 #30
0
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)