From 1a886c7071ec6cf06bcd55290474694f5d6fe285 Mon Sep 17 00:00:00 2001 From: Mohammed Taha Khan Date: Tue, 30 Jun 2026 12:00:22 +0200 Subject: [PATCH] feat: add ARCHIVE related identifier scheme --- invenio.cfg | 5 +++++ site/cds_rdm/schemes.py | 6 ++++++ site/tests/conftest.py | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/invenio.cfg b/invenio.cfg index ba3c9414..feac7470 100644 --- a/invenio.cfg +++ b/invenio.cfg @@ -726,6 +726,11 @@ RDM_RECORDS_RELATED_IDENTIFIERS_SCHEMES = { "validator": schemes.is_edms, "datacite": "EDMS" }, + "archive": { + "label": _("ARCHIVE"), + "validator": schemes.is_archive, + "datacite": "ARCHIVE", + }, "hal": { "label": "HAL", "validator": schemes.is_hal, diff --git a/site/cds_rdm/schemes.py b/site/cds_rdm/schemes.py index e1999dd4..f44d4196 100644 --- a/site/cds_rdm/schemes.py +++ b/site/cds_rdm/schemes.py @@ -27,6 +27,7 @@ # Matches patterns like CERN-EP-2026-001 or CERN-TH-2026-042, as well as # legacy multi-segment department codes like CERN-PH-EP-2012-369. approval_rn_regexp = re.compile(r"^[A-Z]+(?:-[A-Z]+)*-\d{4}-\d+$") +archive_pattern = re.compile(r"^CERN-ARCH(?:-[A-Z0-9]+)+$", flags=re.I) def is_aleph(val): @@ -194,3 +195,8 @@ def hal(): "normalizer": lambda value: value.lower(), "url_generator": generate_hal_url, } + + +def is_archive(val): + """Test if argument is a CERN Archives reference code.""" + return archive_pattern.match(str(val).strip()) diff --git a/site/tests/conftest.py b/site/tests/conftest.py index 82436245..b2e218a7 100644 --- a/site/tests/conftest.py +++ b/site/tests/conftest.py @@ -268,6 +268,11 @@ def app_config(app_config, mock_datacite_client, mock_crossref_client): "validator": schemes.is_edms, "datacite": "EDMS", }, + "archive": { + "label": _("ARCHIVE"), + "validator": schemes.is_archive, + "datacite": "ARCHIVE", + }, "cdsrn": { "label": _("CDS Report Number"), "validator": always_valid,