diff --git a/nomad/processing/data.py b/nomad/processing/data.py index bf46e6b6091b3e59e50afd0ced643e2509bc186f..8d10a9f8b8d3ba14da1a6d6bddbee7267e00b98e 100644 --- a/nomad/processing/data.py +++ b/nomad/processing/data.py @@ -586,6 +586,10 @@ class Calc(Proc): if definition is None and self.upload.from_oasis: definition = _oasis_metadata.get(key, None) + if key == 'uploader': + if datamodel.User.get(self.upload.user_id).is_admin: + definition = datamodel.EntryMetadata.uploader + if definition is None: logger.warn('Users cannot set metadata', quantity=key) continue diff --git a/tests/conftest.py b/tests/conftest.py index 16fecf41197891435dc6240532d48bc665663efc..288c741498f7c5d78d14237171e3dd125fdff2f8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -297,6 +297,7 @@ def keycloak(monkeypatch): @pytest.fixture(scope='function') def proc_infra(worker, elastic, mongo, raw_files): ''' Combines all fixtures necessary for processing (elastic, worker, files, mongo) ''' + processing.Upload.metadata_file_cached.cache_clear() return dict(elastic=elastic) diff --git a/tests/data/proc/examples_with_adminmetadata.zip b/tests/data/proc/examples_with_adminmetadata.zip new file mode 100644 index 0000000000000000000000000000000000000000..de6f4503aaa28cad845af6765aa66d4ffdeef977 Binary files /dev/null and b/tests/data/proc/examples_with_adminmetadata.zip differ diff --git a/tests/processing/test_data.py b/tests/processing/test_data.py index 1edf034a82ee4b8627d84bae75ae48751443e30d..eeb53fee31cd1d1349a549730bddf875d2b181b4 100644 --- a/tests/processing/test_data.py +++ b/tests/processing/test_data.py @@ -606,3 +606,25 @@ def test_read_metadata_from_file(proc_infra, test_user, other_test_user): assert entry_coauthors[j].email == coauthors[i][j].email assert entry_coauthors[j].first_name == coauthors[i][j].first_name assert entry_coauthors[j].last_name == coauthors[i][j].last_name + + +@pytest.mark.parametrize('user,uploader', [ + ('admin_user', 'other_test_user'), + ('test_user', 'test_user') +]) +def test_read_adminmetadata_from_file(proc_infra, test_user, other_test_user, admin_user, user, uploader): + def user_from_name(user_name): + if user_name == 'test_user': + return test_user + if user_name == 'other_test_user': + return other_test_user + if user_name == 'admin_user': + return admin_user + + user = user_from_name(user) + uploader = user_from_name(uploader) + + upload = run_processing( + ('test_upload', 'tests/data/proc/examples_with_adminmetadata.zip'), user) + calc = Calc.objects(upload_id=upload.upload_id).first() + assert calc.metadata['uploader'] == uploader.user_id