From b962ceb94eabe931590fbbf9fa86ca1dd00981aa Mon Sep 17 00:00:00 2001 From: Javier Romero Castro Date: Fri, 3 Nov 2023 17:08:46 +0100 Subject: [PATCH] manager: improe copy func * closes https://github.com/zenodo/rdm-project/issues/508 --- invenio_records_resources/records/models.py | 2 +- .../records/systemfields/files/manager.py | 22 +++++++++++-------- tests/records/test_systemfield_files.py | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/invenio_records_resources/records/models.py b/invenio_records_resources/records/models.py index befbd0e3..d69c1371 100644 --- a/invenio_records_resources/records/models.py +++ b/invenio_records_resources/records/models.py @@ -53,7 +53,7 @@ def object_version_id(cls): @declared_attr def object_version(cls): """Object version connected to the record file.""" - return db.relationship(ObjectVersion) + return db.relationship(ObjectVersion) # Can we cache this? @declared_attr def __table_args__(cls): diff --git a/invenio_records_resources/records/systemfields/files/manager.py b/invenio_records_resources/records/systemfields/files/manager.py index fb91555b..60c9325e 100644 --- a/invenio_records_resources/records/systemfields/files/manager.py +++ b/invenio_records_resources/records/systemfields/files/manager.py @@ -256,18 +256,22 @@ def copy(self, src_files, copy_obj=True): if not self.enabled: return - for key, rf in src_files.items(): - # Copy object version of link existing? - if copy_obj: - dst_obj = rf.object_version.copy(bucket=self.bucket) - else: - dst_obj = rf.object_version + object_version_ids = [rf.object_version_id for rf in src_files.values() if rf.object_version_id] + + if copy_obj: + object_versions = ObjectVersion.copy_many(object_version_ids, self.bucket) + else: + object_versions = ObjectVersion.query.filter( + ObjectVersion.version_id.in_(object_version_ids) + ).all() + + key_object_versions = {obj.key: obj for obj in object_versions} - # Copy file record + for key, rf in src_files.items(): if rf.metadata is not None: - self[key] = dst_obj, rf.metadata + self[key] = key_object_versions.get(key), rf.metadata else: - self[key] = dst_obj + self[key] = key_object_versions.get(key) self.default_preview = src_files.default_preview self.order = src_files.order diff --git a/tests/records/test_systemfield_files.py b/tests/records/test_systemfield_files.py index ecb2effa..7858f4e2 100644 --- a/tests/records/test_systemfield_files.py +++ b/tests/records/test_systemfield_files.py @@ -270,7 +270,7 @@ def test_record_files_dump(base_app, db, location): "entries": [ { "uuid": str(rf.id), - "version_id": 3, + "version_id": 2, "metadata": {"description": "Test file"}, "checksum": "md5:8bc944dbd052ef51652e70a5104492e3", "key": "f1.txt",