From ef7c5308a40576261ec6f3319b0e15dd248b2c24 Mon Sep 17 00:00:00 2001 From: Jacob Nesbitt Date: Mon, 17 Jun 2024 11:28:37 -0400 Subject: [PATCH] Prohibit uploads to dandiset during un-embargo --- dandiapi/api/tests/test_upload.py | 19 +++++++++++++++++++ dandiapi/api/views/upload.py | 5 +++++ 2 files changed, 24 insertions(+) diff --git a/dandiapi/api/tests/test_upload.py b/dandiapi/api/tests/test_upload.py index e8a7493f8..133c2ff7a 100644 --- a/dandiapi/api/tests/test_upload.py +++ b/dandiapi/api/tests/test_upload.py @@ -109,6 +109,25 @@ def test_upload_initialize(api_client, user, dandiset_factory, embargoed): assert upload.blob.name == f'test-prefix/blobs/{upload_id[:3]}/{upload_id[3:6]}/{upload_id}' +@pytest.mark.django_db() +def test_upload_initialize_unembargoing(api_client, user, dandiset_factory): + dandiset = dandiset_factory(embargo_status=Dandiset.EmbargoStatus.UNEMBARGOING) + api_client.force_authenticate(user=user) + assign_perm('owner', user, dandiset) + + content_size = 123 + resp = api_client.post( + '/api/uploads/initialize/', + { + 'contentSize': content_size, + 'digest': {'algorithm': 'dandi:dandi-etag', 'value': 'f' * 32 + '-1'}, + 'dandiset': dandiset.identifier, + }, + format='json', + ) + assert resp.status_code == 400 + + @pytest.mark.django_db() def test_upload_initialize_existing_asset_blob(api_client, user, dandiset, asset_blob): api_client.force_authenticate(user=user) diff --git a/dandiapi/api/views/upload.py b/dandiapi/api/views/upload.py index 178d9ea16..c9efdac68 100644 --- a/dandiapi/api/views/upload.py +++ b/dandiapi/api/views/upload.py @@ -17,6 +17,7 @@ from dandiapi.api.models import AssetBlob, Dandiset, Upload from dandiapi.api.permissions import IsApproved +from dandiapi.api.services.dandiset.exceptions import DandisetUnEmbargoInProgressError from dandiapi.api.tasks import calculate_sha256 from dandiapi.api.views.serializers import AssetBlobSerializer @@ -135,6 +136,10 @@ def upload_initialize_view(request: Request) -> HttpResponseBase: if response: return response + # Ensure dandiset not in the process of un-embargo + if dandiset.embargo_status == Dandiset.EmbargoStatus.UNEMBARGOING: + raise DandisetUnEmbargoInProgressError + logging.info( 'Starting upload initialization of size %s, ETag %s to dandiset %s', content_size,