-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathviews.py
More file actions
133 lines (113 loc) · 5.17 KB
/
Copy pathviews.py
File metadata and controls
133 lines (113 loc) · 5.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from django.conf import settings
from django.http import JsonResponse
from django.shortcuts import render
from django.views.decorators.csrf import ensure_csrf_cookie
from drf_chunked_upload.exceptions import ChunkedUploadError
from drf_chunked_upload.views import ChunkedUploadView
from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.generics import get_object_or_404
from rest_framework.parsers import MultiPartParser, JSONParser
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.response import Response
from rest_framework.views import APIView
# Create your views here.
class DataChunkedUploadView(ChunkedUploadView):
permission_classes = [IsAuthenticated]
parser_classes = (MultiPartParser,)
def _put_chunk(self, request, pk=None, whole=False, *args, **kwargs):
try:
chunk = request.data[self.field_name]
except KeyError:
raise ChunkedUploadError(status=status.HTTP_400_BAD_REQUEST,
detail='No chunk file was submitted')
if whole:
start = 0
total = chunk.size
end = total - 1
else:
content_range = request.META.get('HTTP_CONTENT_RANGE', '')
match = self.content_range_pattern.match(content_range)
if not match:
raise ChunkedUploadError(status=status.HTTP_400_BAD_REQUEST,
detail='Error in request headers')
start = int(match.group('start'))
end = int(match.group('end'))
total = int(match.group('total'))
chunk_size = end - start + 1
max_bytes = self.get_max_bytes(request)
if end > total:
raise ChunkedUploadError(
status=status.HTTP_400_BAD_REQUEST,
detail='End of chunk exceeds reported total (%s bytes)' % total
)
if max_bytes is not None and total > max_bytes:
raise ChunkedUploadError(
status=status.HTTP_400_BAD_REQUEST,
detail='Size of file exceeds the limit (%s bytes)' % max_bytes
)
if chunk.size != chunk_size:
raise ChunkedUploadError(
status=status.HTTP_400_BAD_REQUEST,
detail="File size doesn't match headers: file size is {} but {} reported".format(
chunk.size,
chunk_size,
),
)
if pk:
upload_id = pk
chunked_upload = get_object_or_404(self.get_queryset(),
pk=upload_id)
self.is_valid_chunked_upload(chunked_upload)
if chunked_upload.offset != start:
raise ChunkedUploadError(
status=status.HTTP_400_BAD_REQUEST,
detail='Offsets do not match',
expected_offset=chunked_upload.offset,
provided_offset=start,
)
chunked_upload.append_chunk(chunk, chunk_size=chunk_size)
else:
kwargs = {'offset': chunk.size}
if hasattr(self.model, self.user_field_name):
if hasattr(request, 'user') and request.user.is_authenticated:
kwargs[self.user_field_name] = request.user
elif self.model._meta.get_field(self.user_field_name).null:
kwargs[self.user_field_name] = None
else:
raise ChunkedUploadError(
status=status.HTTP_400_BAD_REQUEST,
detail="Upload requires user authentication but user cannot be determined",
)
print(request.data)
chunked_upload = self.serializer_class(data=request.data)
if not chunked_upload.is_valid():
raise ChunkedUploadError(status=status.HTTP_400_BAD_REQUEST,
detail=chunked_upload.errors)
# chunked_upload is currently a serializer;
# save returns model instance
chunked_upload = chunked_upload.save(**kwargs)
return chunked_upload
def on_completion(self, chunked_upload, request):
return super().on_completion(chunked_upload, request)
class LogoutView(APIView):
permission_classes = [IsAuthenticated]
parser_classes = (MultiPartParser, JSONParser)
def post(self, request):
channel_layer = get_channel_layer()
session_id = request.data.get("session_id")
async_to_sync(channel_layer.group_send)(
f"search_{session_id}", {
"type": "search_message", "message": {
"type": "logout",
}})
return Response(status=status.HTTP_200_OK)
class FrontEndTemplateView(APIView):
permission_classes = [AllowAny]
def get(self, request):
return Response({"footer":settings.FRONTEND_FOOTER}, status=status.HTTP_200_OK)
@ensure_csrf_cookie
def set_csrf(request):
return JsonResponse(data={"data": "CSRF cookie set"}, status=status.HTTP_200_OK)