Skip to content

Commit a265243

Browse files
authored
Merge pull request #2696 from dandi/fix-upload-init-id-parsing
Fix dandiset ID parsing during upload initialization
2 parents 65c57bb + 29e3884 commit a265243

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

dandiapi/api/tests/test_upload.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,26 @@ def test_upload_initialize(api_client, embargoed):
101101
assert upload.blob.name == f'blobs/{upload_id[:3]}/{upload_id[3:6]}/{upload_id}'
102102

103103

104+
@pytest.mark.django_db
105+
@pytest.mark.parametrize('dandiset_id', ['DANDI:abc', 'DANDI:123456', '001'])
106+
def test_upload_initialize_invalid_dandiset(api_client, dandiset_id):
107+
user = UserFactory.create()
108+
DandisetFactory.create(embargo_status=Dandiset.EmbargoStatus.UNEMBARGOING, owners=[user])
109+
api_client.force_authenticate(user=user)
110+
111+
content_size = 123
112+
resp = api_client.post(
113+
'/api/uploads/initialize/',
114+
{
115+
'contentSize': content_size,
116+
'digest': {'algorithm': 'dandi:dandi-etag', 'value': 'f' * 32 + '-1'},
117+
'dandiset': dandiset_id,
118+
},
119+
)
120+
121+
assert resp.status_code == 400
122+
123+
104124
@pytest.mark.django_db
105125
def test_upload_initialize_unembargo_in_progress(api_client):
106126
user = UserFactory.create()

dandiapi/api/views/upload.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class DigestSerializer(serializers.Serializer):
3939
class UploadInitializationRequestSerializer(serializers.Serializer):
4040
contentSize = serializers.IntegerField(min_value=1) # noqa: N815
4141
digest = DigestSerializer()
42-
dandiset = serializers.RegexField(Dandiset.IDENTIFIER_REGEX)
42+
dandiset = serializers.RegexField(f'^{Dandiset.IDENTIFIER_REGEX}$')
4343

4444

4545
class PartInitializationResponseSerializer(serializers.Serializer):
@@ -131,7 +131,7 @@ def upload_initialize_view(request: AuthenticatedRequest) -> HttpResponseBase:
131131
if digest['algorithm'] != 'dandi:dandi-etag':
132132
return Response('Unsupported Digest Type', status=400)
133133
etag = digest['value']
134-
dandiset_id = request_serializer.validated_data['dandiset']
134+
dandiset_id = int(request_serializer.validated_data['dandiset'])
135135
dandiset = get_object_or_404(
136136
get_visible_dandisets(request.user),
137137
id=dandiset_id,

0 commit comments

Comments
 (0)