diff --git a/.gitignore b/.gitignore index 7ff7241..25a6ceb 100644 --- a/.gitignore +++ b/.gitignore @@ -128,3 +128,4 @@ dmypy.json # IDE .idea/ +.vscode/ \ No newline at end of file diff --git a/invenio_drafts_resources/services/records/components/base.py b/invenio_drafts_resources/services/records/components/base.py index 96611cd..aa5a6c7 100644 --- a/invenio_drafts_resources/services/records/components/base.py +++ b/invenio_drafts_resources/services/records/components/base.py @@ -9,7 +9,8 @@ """Base class for service components.""" from invenio_i18n import gettext as _ -from invenio_records_resources.services.files.transfer import TransferType +from invenio_records_resources.proxies import current_transfer_registry +from invenio_records_resources.services.files.transfer.base import TransferStatus from invenio_records_resources.services.records.components import ( BaseRecordFilesComponent as _BaseRecordFilesComponent, ) @@ -236,8 +237,12 @@ def _check_file_completed(self, file_record): has_attached_object = file_record.file is not None if not has_attached_object: return False - transfer = TransferType(file_record.file.storage_class) - if transfer.is_completed: + transfer = current_transfer_registry.get_transfer( + record=file_record.record, + file_record=file_record, + file_service=self.service.draft_files, + ) + if transfer.status == TransferStatus.COMPLETED: return True def publish(self, identity, draft=None, record=None): diff --git a/tests/mock_module/permissions.py b/tests/mock_module/permissions.py index 6e32c7b..4c9a223 100644 --- a/tests/mock_module/permissions.py +++ b/tests/mock_module/permissions.py @@ -1,6 +1,6 @@ """Example of a permission policy.""" -from invenio_records_permissions.generators import AnyUser +from invenio_records_permissions.generators import AnyUser, SystemProcess from invenio_drafts_resources.services.records.permissions import RecordPermissionPolicy @@ -33,7 +33,9 @@ class PermissionPolicy(RecordPermissionPolicy): can_draft_media_update_files = [AnyUser()] can_draft_media_delete_files = [AnyUser()] - can_draft_create_files = [AnyUser()] + # SystemProcess is needed for metadata extraction - + # there is a 'create' action check there + can_draft_create_files = [AnyUser(), SystemProcess()] can_draft_set_content_files = [AnyUser()] can_draft_get_content_files = [AnyUser()] can_draft_commit_files = [AnyUser()] diff --git a/tests/services/test_record_service_files.py b/tests/services/test_record_service_files.py index 57efcad..03beaed 100644 --- a/tests/services/test_record_service_files.py +++ b/tests/services/test_record_service_files.py @@ -21,7 +21,9 @@ import pytest from invenio_files_rest.errors import BucketLockedError, InvalidOperationError from invenio_files_rest.models import Bucket, FileInstance, ObjectVersion -from invenio_records_resources.services.files.transfer import TransferType +from invenio_records_resources.services.files.transfer.constants import ( + FETCH_TRANSFER_TYPE, +) from marshmallow.exceptions import ValidationError from mock_module.models import DraftMetadata, FileDraftMetadata, FileRecordMetadata from mock_module.permissions import PermissionPolicy @@ -486,17 +488,19 @@ def test_update_draft_set_default_file_preview_reports_error( assert draft.data["files"] == {"enabled": True} -@patch("invenio_records_resources.services.files.transfer.fetch_file") +@patch("invenio_records_resources.services.files.tasks.requests.get") def test_publish_with_fetch_files( - p_fetch_file, app, service, draft_file_service, input_data, identity_simple + p_response_raw, app, service, draft_file_service, input_data, identity_simple ): """Tests wether it is possible to submit a record if the file isn't fully downloaded.""" draft = service.create(identity_simple, input_data) # 1 file_to_initialise = [ { "key": "article.txt", - "uri": "https://inveniordm.test/files/article.txt", - "storage_class": "F", + "transfer": { + "type": FETCH_TRANSFER_TYPE, + "url": "https://inveniordm.test/files/article.txt", + }, } ] @@ -505,7 +509,7 @@ def test_publish_with_fetch_files( ) for file_record in files.entries: - assert file_record["storage_class"] == TransferType.FETCH + assert file_record["transfer"]["type"] == FETCH_TRANSFER_TYPE with pytest.raises(ValidationError): service.publish(identity_simple, draft.id)