Chunk uploading: implement properly using a custom Parser.
This commit is contained in:
parent
11001ed62c
commit
1d5baece1e
17
django_etebase/migrations/0022_auto_20200804_1059.py
Normal file
17
django_etebase/migrations/0022_auto_20200804_1059.py
Normal file
@ -0,0 +1,17 @@
|
||||
# Generated by Django 3.0.3 on 2020-08-04 10:59
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('django_etebase', '0021_auto_20200626_0913'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterUniqueTogether(
|
||||
name='collectionitemchunk',
|
||||
unique_together={('item', 'uid')},
|
||||
),
|
||||
]
|
@ -100,6 +100,9 @@ class CollectionItemChunk(models.Model):
|
||||
def __str__(self):
|
||||
return self.uid
|
||||
|
||||
class Meta:
|
||||
unique_together = ('item', 'uid')
|
||||
|
||||
|
||||
def generate_stoken_uid():
|
||||
return get_random_string(32, allowed_chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_')
|
||||
|
15
django_etebase/parsers.py
Normal file
15
django_etebase/parsers.py
Normal file
@ -0,0 +1,15 @@
|
||||
from rest_framework.parsers import FileUploadParser
|
||||
|
||||
|
||||
class ChunkUploadParser(FileUploadParser):
|
||||
"""
|
||||
Parser for chunk upload data.
|
||||
"""
|
||||
media_type = 'application/octet-stream'
|
||||
|
||||
def get_filename(self, stream, media_type, parser_context):
|
||||
"""
|
||||
Detects the uploaded file name.
|
||||
"""
|
||||
view = parser_context['view']
|
||||
return parser_context['kwargs'][view.lookup_field]
|
@ -73,6 +73,7 @@ from .serializers import (
|
||||
)
|
||||
from .utils import get_user_queryset
|
||||
from .exceptions import EtebaseValidationError
|
||||
from .parsers import ChunkUploadParser
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
@ -398,11 +399,11 @@ class CollectionItemViewSet(BaseViewSet):
|
||||
|
||||
|
||||
class CollectionItemChunkViewSet(viewsets.ViewSet):
|
||||
allowed_methods = ['GET', 'POST']
|
||||
allowed_methods = ['GET', 'PUT']
|
||||
authentication_classes = BaseViewSet.authentication_classes
|
||||
permission_classes = BaseViewSet.permission_classes
|
||||
renderer_classes = BaseViewSet.renderer_classes
|
||||
parser_classes = (MultiPartParser, )
|
||||
parser_classes = (ChunkUploadParser, )
|
||||
serializer_class = CollectionItemChunkSerializer
|
||||
lookup_field = 'uid'
|
||||
|
||||
@ -413,13 +414,24 @@ class CollectionItemChunkViewSet(viewsets.ViewSet):
|
||||
user = self.request.user
|
||||
return queryset.filter(members__user=user)
|
||||
|
||||
def create(self, request, collection_uid=None, collection_item_uid=None, *args, **kwargs):
|
||||
def update(self, request, *args, collection_uid=None, collection_item_uid=None, uid=None, **kwargs):
|
||||
col = get_object_or_404(self.get_collection_queryset(), main_item__uid=collection_uid)
|
||||
col_it = get_object_or_404(col.items, uid=collection_item_uid)
|
||||
|
||||
serializer = self.get_serializer_class()(data=request.data)
|
||||
data = {
|
||||
"uid": uid,
|
||||
"chunkFile": request.data["file"],
|
||||
}
|
||||
|
||||
serializer = self.get_serializer_class()(data=data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
serializer.save(item=col_it)
|
||||
try:
|
||||
serializer.save(item=col_it)
|
||||
except IntegrityError:
|
||||
return Response(
|
||||
{"code": "chunk_exists", "detail": "Chunk already exists."},
|
||||
status=status.HTTP_409_CONFLICT
|
||||
)
|
||||
|
||||
return Response({}, status=status.HTTP_201_CREATED)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user