From 36f1d0a92f6c0e33296acfcbb41e7e9d4f4e3ea2 Mon Sep 17 00:00:00 2001 From: jrcastro2 Date: Fri, 3 Jun 2022 11:41:52 +0200 Subject: [PATCH] schemas: checks for duplicated schemes in identifiers * closes https://github.com/inveniosoftware/react-invenio-deposit/issues/448 --- invenio_rdm_records/services/schemas/metadata.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/invenio_rdm_records/services/schemas/metadata.py b/invenio_rdm_records/services/schemas/metadata.py index 668710952..04573832e 100644 --- a/invenio_rdm_records/services/schemas/metadata.py +++ b/invenio_rdm_records/services/schemas/metadata.py @@ -8,7 +8,6 @@ # it under the terms of the MIT License; see LICENSE file for more details. """RDM record schemas.""" - from functools import partial from urllib import parse @@ -21,6 +20,7 @@ from invenio_vocabularies.contrib.subjects.schema import SubjectRelationSchema from marshmallow import Schema, ValidationError, fields, post_load, validate, \ validates, validates_schema +from marshmallow.fields import List from marshmallow_utils.fields import EDTFDateString, IdentifierSet, \ SanitizedHTML, SanitizedUnicode from marshmallow_utils.schemas import GeometryObjectSchema, IdentifierSchema @@ -340,7 +340,7 @@ class MetadataSchema(Schema): dates = fields.List(fields.Nested(DateSchema)) languages = fields.List(fields.Nested(VocabularySchema)) # alternate identifiers - identifiers = IdentifierSet( + identifiers = List( fields.Nested(partial( IdentifierSchema, allowed_schemes=record_identifiers_schemes)) ) @@ -356,3 +356,15 @@ class MetadataSchema(Schema): locations = fields.Nested(FeatureSchema) funding = fields.List(fields.Nested(FundingSchema)) references = fields.List(fields.Nested(ReferenceSchema)) + + @validates('identifiers') + def validate_non_duplicated_schemes(self, data, **kwargs): + """Checks for duplicated schemes in identifiers.""" + schemes = [identifier["scheme"] for identifier in data] + if not len(data) == len(set(schemes)): + raise ValidationError( + { + 'identifiers': + _('Only one identifier per scheme is allowed.') + } + )