diff --git a/swh/deposit/api/checks.py b/swh/deposit/api/checks.py --- a/swh/deposit/api/checks.py +++ b/swh/deposit/api/checks.py @@ -5,15 +5,14 @@ """Functional Metadata checks: -Mandatory fields: -- 'author' -- 'name' or 'title' +Mandatory alternate fields: +- 'author' or 'codemeta:author' +- 'name' or 'codemeta:name' or 'title' or 'codemeta:title' """ from typing import Dict, Optional, Tuple -MANDATORY_FIELDS_MISSING = "Mandatory fields are missing" ALTERNATE_FIELDS_MISSING = "Mandatory alternate fields are missing" @@ -28,36 +27,26 @@ ok (False, ) otherwise. """ - # following fields are mandatory - required_fields = { - "author": False, - } # at least one value per couple below is mandatory - alternate_fields = { - ("name", "title"): False, + mandatory_alternate_fields = { + ("codemeta:author", "author"): False, + ("name", "title", "codemeta:name", "codemeta:title"): False, } for field, value in metadata.items(): - for name in required_fields: - if name in field: - required_fields[name] = True - - for possible_names in alternate_fields: + for possible_names in mandatory_alternate_fields: for possible_name in possible_names: if possible_name in field: - alternate_fields[possible_names] = True + mandatory_alternate_fields[possible_names] = True continue - mandatory_result = [k for k, v in required_fields.items() if not v] - optional_result = [" or ".join(k) for k, v in alternate_fields.items() if not v] + alternate_fields_result_check = [ + " or ".join(k) for k, v in mandatory_alternate_fields.items() if not v + ] - if mandatory_result == [] and optional_result == []: + if alternate_fields_result_check == []: return True, None - detail = [] - if mandatory_result != []: - detail.append({"summary": MANDATORY_FIELDS_MISSING, "fields": mandatory_result}) - if optional_result != []: - detail.append( - {"summary": ALTERNATE_FIELDS_MISSING, "fields": optional_result,} - ) + detail = [ + {"summary": ALTERNATE_FIELDS_MISSING, "fields": alternate_fields_result_check,} + ] return False, {"metadata": detail} diff --git a/swh/deposit/tests/api/test_checks.py b/swh/deposit/tests/api/test_checks.py --- a/swh/deposit/tests/api/test_checks.py +++ b/swh/deposit/tests/api/test_checks.py @@ -23,6 +23,30 @@ "title": "bar", "author": "no one", }, + { + "url": "some url", + "external_identifier": "some id", + "title": "bar", + "codemeta:author": "no one", + }, + { + "url": "some url", + "external_identifier": "some id", + "codemeta:title": "bar", + "codemeta:author": "no one", + }, + { + "url": "some url", + "external_identifier": "some id", + "codemeta:name": "bar", + "codemeta:author": "no one", + }, + { + "url": "some url", + "external_identifier": "some id", + "name": "bar", + "codemeta:author": "no one", + }, ], ) def test_api_checks_check_metadata_ok(metadata_ok, swh_checks_deposit): @@ -42,7 +66,7 @@ }, { "summary": "Mandatory alternate fields are missing", - "fields": ["name or title"], + "fields": ["name or title or codemeta:name or codemeta:title"], }, ), ( @@ -51,7 +75,53 @@ "external_identifier": "something-else", "title": "foobar", }, - {"summary": "Mandatory fields are missing", "fields": ["author"],}, + { + "summary": "Mandatory alternate fields are missing", + "fields": ["codemeta:author or author"], + }, + ), + ( + { + "url": "something", + "external_identifier": "something-else", + "name": "foobar", + }, + { + "summary": "Mandatory alternate fields are missing", + "fields": ["codemeta:author or author"], + }, + ), + ( + { + "url": "something", + "external_identifier": "something-else", + "codemeta:title": "foobar", + }, + { + "summary": "Mandatory alternate fields are missing", + "fields": ["codemeta:author or author"], + }, + ), + ( + { + "url": "something", + "external_identifier": "something-else", + "codemeta:name": "foobar", + }, + { + "summary": "Mandatory alternate fields are missing", + "fields": ["codemeta:author or author"], + }, + ), + ( + {"url": "something", "external_identifier": "something-else",}, + { + "summary": "Mandatory alternate fields are missing", + "fields": [ + "codemeta:author or author", + "name or title or codemeta:name or codemeta:title", + ], + }, ), ], ) diff --git a/swh/deposit/tests/api/test_deposit_private_check.py b/swh/deposit/tests/api/test_deposit_private_check.py --- a/swh/deposit/tests/api/test_deposit_private_check.py +++ b/swh/deposit/tests/api/test_deposit_private_check.py @@ -7,7 +7,7 @@ import pytest from rest_framework import status -from swh.deposit.api.checks import ALTERNATE_FIELDS_MISSING, MANDATORY_FIELDS_MISSING +from swh.deposit.api.checks import ALTERNATE_FIELDS_MISSING from swh.deposit.api.private.deposit_check import ( MANDATORY_ARCHIVE_INVALID, MANDATORY_ARCHIVE_MISSING, @@ -130,13 +130,15 @@ assert len(details["archive"]) == 1 assert details["archive"][0]["summary"] == MANDATORY_ARCHIVE_UNSUPPORTED # metadata check failure - assert len(details["metadata"]) == 2 - mandatory = details["metadata"][0] - assert mandatory["summary"] == MANDATORY_FIELDS_MISSING - assert set(mandatory["fields"]) == set(["author"]) - alternate = details["metadata"][1] - assert alternate["summary"] == ALTERNATE_FIELDS_MISSING - assert alternate["fields"] == ["name or title"] + assert details["metadata"] == [ + { + "summary": ALTERNATE_FIELDS_MISSING, + "fields": [ + "codemeta:author or author", + "name or title or codemeta:name or codemeta:title", + ], + } + ] deposit = Deposit.objects.get(pk=deposit.id) assert deposit.status == DEPOSIT_STATUS_REJECTED diff --git a/swh/deposit/tests/api/test_deposit_update.py b/swh/deposit/tests/api/test_deposit_update.py --- a/swh/deposit/tests/api/test_deposit_update.py +++ b/swh/deposit/tests/api/test_deposit_update.py @@ -799,7 +799,7 @@ assert response.status_code == status.HTTP_400_BAD_REQUEST assert b"Functional metadata checks failure" in response.content # detail on the errors - assert b"- Mandatory fields are missing (author)" in response.content assert ( - b"- Mandatory alternate fields are missing (name or title)" in response.content + b"- Mandatory alternate fields are missing (codemeta:author or author, " + b"name or title or codemeta:name or codemeta:title)" in response.content )