김재형

Merge remote-tracking branch 'origin/master' into feature/frontend

# Conflicts:
#	backend/api/views.py
#	backend/khudrive/settings.py
...@@ -14,7 +14,7 @@ class Item(models.Model): ...@@ -14,7 +14,7 @@ class Item(models.Model):
14 is_deleted = models.BooleanField(default = False) 14 is_deleted = models.BooleanField(default = False)
15 created_time = models.DateTimeField(auto_now=True) 15 created_time = models.DateTimeField(auto_now=True)
16 updated_time = models.DateTimeField(null=True) 16 updated_time = models.DateTimeField(null=True)
17 - status = models.BooleanField() 17 + status = models.BooleanField(default=False)
18 18
19 #file = models.FileField(upload_to = \path) 19 #file = models.FileField(upload_to = \path)
20 20
......
...@@ -4,6 +4,7 @@ import os ...@@ -4,6 +4,7 @@ import os
4 from datetime import datetime, timedelta 4 from datetime import datetime, timedelta
5 5
6 import boto3 6 import boto3
7 +from botocore.client import Config
7 8
8 from django.core import serializers 9 from django.core import serializers
9 from django.views.decorators.csrf import csrf_exempt 10 from django.views.decorators.csrf import csrf_exempt
...@@ -14,12 +15,14 @@ from rest_framework.decorators import action ...@@ -14,12 +15,14 @@ from rest_framework.decorators import action
14 from rest_framework.permissions import IsAuthenticated, AllowAny 15 from rest_framework.permissions import IsAuthenticated, AllowAny
15 16
16 from .models import Item, SharedItem, User 17 from .models import Item, SharedItem, User
17 -from .serializers import UserSerializer,GroupSerializer,ItemSerializer 18 +from .serializers import UserSerializer, GroupSerializer, ItemSerializer
18 from rest_framework import status 19 from rest_framework import status
19 from annoying.functions import get_object_or_None 20 from annoying.functions import get_object_or_None
20 from django.conf import settings 21 from django.conf import settings
21 import jwt 22 import jwt
22 from django.http import HttpResponse, JsonResponse 23 from django.http import HttpResponse, JsonResponse
24 +from khudrive.settings import AWS_SESSION_TOKEN, AWS_SECRET_ACCESS_KEY, AWS_ACCESS_KEY_ID, AWS_REGION, \
25 + AWS_STORAGE_BUCKET_NAME
23 26
24 27
25 class UserViewSet(viewsets.ModelViewSet): 28 class UserViewSet(viewsets.ModelViewSet):
...@@ -33,15 +36,17 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -33,15 +36,17 @@ class UserViewSet(viewsets.ModelViewSet):
33 ] 36 ]
34 permission_classes_by_action = {'get': [permissions.AllowAny], 37 permission_classes_by_action = {'get': [permissions.AllowAny],
35 'destroy': [permissions.AllowAny]} 38 'destroy': [permissions.AllowAny]}
39 +
36 @csrf_exempt 40 @csrf_exempt
37 - @action(detail=False, methods=['POST'], permission_classes=[permissions.AllowAny], url_path='signup', url_name='singup') 41 + @action(detail=False, methods=['POST'], permission_classes=[permissions.AllowAny], url_path='signup',
42 + url_name='singup')
38 def signup(self, request): 43 def signup(self, request):
39 user_id = request.POST.get('user_id', '') 44 user_id = request.POST.get('user_id', '')
40 name = request.POST.get('name', '') 45 name = request.POST.get('name', '')
41 password = request.POST.get('password', '') 46 password = request.POST.get('password', '')
42 user = get_object_or_None(User, user_id=user_id) 47 user = get_object_or_None(User, user_id=user_id)
43 if user == None: 48 if user == None:
44 - user = User(user_id = user_id, name = name, password = password, total_size=100000, current_size = 0) 49 + user = User(user_id=user_id, name=name, password=password, total_size=100000, current_size=0)
45 user.save() 50 user.save()
46 root = Item(is_folder=True, name="root", file_type="folder", path="", user_id=user.int_id, size=0, 51 root = Item(is_folder=True, name="root", file_type="folder", path="", user_id=user.int_id, size=0,
47 status=True) 52 status=True)
...@@ -53,7 +58,7 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -53,7 +58,7 @@ class UserViewSet(viewsets.ModelViewSet):
53 'int_id': user.int_id, 58 'int_id': user.int_id,
54 'user_id': user.user_id, 59 'user_id': user.user_id,
55 'name': user.name, 60 'name': user.name,
56 - 'root_folder':root.item_id, 61 + 'root_folder': root.item_id,
57 'total_size': user.total_size, 62 'total_size': user.total_size,
58 'current_size': user.current_size, 63 'current_size': user.current_size,
59 'created_time': user.created_time 64 'created_time': user.created_time
...@@ -116,7 +121,7 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -116,7 +121,7 @@ class UserViewSet(viewsets.ModelViewSet):
116 data = serializers.serialize("json", user) 121 data = serializers.serialize("json", user)
117 json_data = json.loads(data) 122 json_data = json.loads(data)
118 res = json_data[0]['fields'] 123 res = json_data[0]['fields']
119 - res['id']=json_data[0]['pk'] 124 + res['id'] = json_data[0]['pk']
120 return Response({'data': res}, status=status.HTTP_200_OK) 125 return Response({'data': res}, status=status.HTTP_200_OK)
121 126
122 def get_permissions(self): 127 def get_permissions(self):
...@@ -129,11 +134,10 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -129,11 +134,10 @@ class UserViewSet(viewsets.ModelViewSet):
129 134
130 135
131 class ItemViewSet(viewsets.ViewSet): 136 class ItemViewSet(viewsets.ViewSet):
132 -
133 queryset = Item.objects.all() 137 queryset = Item.objects.all()
134 serializer_class = ItemSerializer 138 serializer_class = ItemSerializer
135 permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny, 139 permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny,
136 - #IsOwnerOrReadOnly 140 + # IsOwnerOrReadOnly
137 ] 141 ]
138 permission_classes_by_action = {'get': [permissions.AllowAny], 142 permission_classes_by_action = {'get': [permissions.AllowAny],
139 'destroy': [permissions.AllowAny]} 143 'destroy': [permissions.AllowAny]}
...@@ -143,8 +147,8 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -143,8 +147,8 @@ class ItemViewSet(viewsets.ViewSet):
143 def search(self, request): 147 def search(self, request):
144 if request.method == 'GET': 148 if request.method == 'GET':
145 keyword = request.GET.get('keyword', '') 149 keyword = request.GET.get('keyword', '')
146 - user_id = request.GET.get('user_id', '') 150 + # user_id = request.GET.get('user_id', '')
147 - item_list = Item.objects.filter(name__icontains = keyword, user_id = user_id ) 151 + item_list = Item.objects.filter(name__icontains=keyword)
148 152
149 data = serializers.serialize("json", item_list) 153 data = serializers.serialize("json", item_list)
150 json_data = json.loads(data) 154 json_data = json.loads(data)
...@@ -153,33 +157,92 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -153,33 +157,92 @@ class ItemViewSet(viewsets.ViewSet):
153 t = i['fields'] 157 t = i['fields']
154 t['id'] = i['pk'] 158 t['id'] = i['pk']
155 res.append(t) 159 res.append(t)
156 - return Response({'data': {'list' : res}}, status=status.HTTP_200_OK) 160 + return Response({'data': {'list': res}}, status=status.HTTP_200_OK)
161 +
162 + """
163 + # url: items/11/
164 + # 마지막 slash도 써주어야함
165 + def get(self, request, pk):
166 + #print(pk)
167 + s3 = boto3.client('s3')
168 + s3_bucket = AWS_STORAGE_BUCKET_NAME
169 +
170 + #파일 객체 생성
171 + object_name = request.GET.get('name', '')
172 +
173 + presigned_url = s3.generate_presigned_url(
174 + 'get_object',
175 + Params={'Bucket': s3_bucket,
176 + 'Key': object_name},
177 + ExpiresIn = 3600
178 + )
179 +
180 + return Response({'message': presigned_url}, status=status.HTTP_200_OK)
181 + """
157 182
158 # url: items/11/ 183 # url: items/11/
159 # 마지막 slash도 써주어야함 184 # 마지막 slash도 써주어야함
160 def get(self, request, pk): 185 def get(self, request, pk):
186 + s3 = boto3.client('s3',
187 + aws_access_key_id=AWS_ACCESS_KEY_ID,
188 + aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
189 + aws_session_token=AWS_SESSION_TOKEN,
190 + config=Config(signature_version='s3v4'))
191 + s3_bucket = AWS_STORAGE_BUCKET_NAME
192 +
161 item = Item.objects.filter(item_id=pk) 193 item = Item.objects.filter(item_id=pk)
194 + object_name = item.get().name
162 data = serializers.serialize("json", item) 195 data = serializers.serialize("json", item)
163 json_data = json.loads(data) 196 json_data = json.loads(data)
197 +
198 + presigned_url = s3.generate_presigned_url(
199 + 'get_object',
200 + Params={'Bucket': s3_bucket,
201 + 'Key': object_name},
202 + ExpiresIn=3600
203 + )
204 +
164 res = json_data[0]['fields'] 205 res = json_data[0]['fields']
165 - res['id']=json_data[0]['pk'] 206 + res['id'] = json_data[0]['pk']
207 + res['signed_url'] = presigned_url
166 return Response({'data': res}, status=status.HTTP_200_OK) 208 return Response({'data': res}, status=status.HTTP_200_OK)
167 209
168 # url: items/11/ 210 # url: items/11/
169 # 마지막 slash도 써주어야함 211 # 마지막 slash도 써주어야함
170 def destroy(self, request, pk): 212 def destroy(self, request, pk):
171 if request.method == 'DELETE': 213 if request.method == 'DELETE':
172 - print(pk)
173 item = get_object_or_None(Item, item_id=pk) 214 item = get_object_or_None(Item, item_id=pk)
174 if item != None: 215 if item != None:
175 - if item.is_folder == True: # 폴더는 삭제 안되도록 처리 216 + if item.is_folder == True: # 폴더는 삭제 안되도록 처리
176 return Response({'message': 'This item is folder.'}, status=status.HTTP_200_OK) 217 return Response({'message': 'This item is folder.'}, status=status.HTTP_200_OK)
177 item.is_deleted = True 218 item.is_deleted = True
178 item.save() 219 item.save()
179 # item.delete() 이거 하면 완전 삭제되어버림 is deleted True 면 휴지통에서 리스트 조회할 수 있도록! 220 # item.delete() 이거 하면 완전 삭제되어버림 is deleted True 면 휴지통에서 리스트 조회할 수 있도록!
180 - return Response({'message': 'delete complete'},status=status.HTTP_200_OK) 221 + return Response({'message': 'destroy complete'}, status=status.HTTP_200_OK)
181 return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT) 222 return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT)
182 223
224 + @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='restore', url_name='restore')
225 + def restore(self, request, pk):
226 + if request.method == 'POST':
227 + item = get_object_or_None(Item, item_id=pk)
228 + if item != None:
229 + item.is_deleted = False
230 + item.save()
231 + return Response({'message': 'restore complete'}, status=status.HTTP_200_OK)
232 + return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT)
233 +
234 + @action(methods=['DELETE'], detail=True, permission_classes=[AllowAny], url_path='delete', url_name='delete')
235 + def delete(self, request, pk):
236 + if request.method == 'DELETE':
237 + item = get_object_or_None(Item, item_id=pk)
238 + if item != None:
239 + if item.is_folder == True: # 폴더는 삭제 안되도록 처리
240 + return Response({'message': 'This item is folder.'}, status=status.HTTP_200_OK)
241 + item.delete()
242 + return Response({'message': 'delete permanently complete'}, status=status.HTTP_200_OK)
243 + return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT)
244 +
245 +
183 # url: items/11/move 246 # url: items/11/move
184 # 마지막 slash도 써주어야함 247 # 마지막 slash도 써주어야함
185 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='move', url_name='move') 248 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='move', url_name='move')
...@@ -233,15 +296,16 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -233,15 +296,16 @@ class ItemViewSet(viewsets.ViewSet):
233 if child.is_folder == True: 296 if child.is_folder == True:
234 return Response({'message': 'item is folder'}, status=status.HTTP_204_NO_CONTENT) 297 return Response({'message': 'item is folder'}, status=status.HTTP_204_NO_CONTENT)
235 copiedName = child.name + "_복사본_" + str(datetime.now().strftime('%Y-%m-%d %H:%M')) 298 copiedName = child.name + "_복사본_" + str(datetime.now().strftime('%Y-%m-%d %H:%M'))
236 - copiedItem = Item(is_folder = False, name = copiedName, path =child.path, parent = parent_id, user_id= child.user_id, size=child.size, status=child.status) 299 + copiedItem = Item(is_folder=False, name=copiedName, path=child.path, parent=parent_id,
300 + user_id=child.user_id, size=child.size, status=child.status)
237 copiedItem.save() 301 copiedItem.save()
238 302
239 - copiedItem = Item.objects.filter(name = copiedName) 303 + copiedItem = Item.objects.filter(name=copiedName)
240 copied_data = serializers.serialize("json", copiedItem) 304 copied_data = serializers.serialize("json", copiedItem)
241 json_data = json.loads(copied_data) 305 json_data = json.loads(copied_data)
242 res = json_data[0]['fields'] 306 res = json_data[0]['fields']
243 res['id'] = json_data[0]['pk'] 307 res['id'] = json_data[0]['pk']
244 - parent = Item.objects.filter(item_id = parent_id) 308 + parent = Item.objects.filter(item_id=parent_id)
245 parent_data = serializers.serialize("json", parent) 309 parent_data = serializers.serialize("json", parent)
246 json_parent = json.loads(parent_data)[0]['fields'] 310 json_parent = json.loads(parent_data)[0]['fields']
247 res['parentInfo'] = json_parent 311 res['parentInfo'] = json_parent
...@@ -265,10 +329,10 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -265,10 +329,10 @@ class ItemViewSet(viewsets.ViewSet):
265 url_path='children', url_name='children') 329 url_path='children', url_name='children')
266 def children(self, request, pk): 330 def children(self, request, pk):
267 if request.method == 'GET': 331 if request.method == 'GET':
268 - children = Item.objects.filter(parent = pk, is_deleted=False) 332 + children = Item.objects.filter(parent=pk, is_deleted=False)
269 children_data = serializers.serialize("json", children) 333 children_data = serializers.serialize("json", children)
270 json_children = json.loads(children_data) 334 json_children = json.loads(children_data)
271 - parent = Item.objects.filter(item_id=pk) #item 335 + parent = Item.objects.filter(item_id=pk) # item
272 parent_data = serializers.serialize("json", parent) 336 parent_data = serializers.serialize("json", parent)
273 json_parent = json.loads(parent_data)[0]['fields'] 337 json_parent = json.loads(parent_data)[0]['fields']
274 res = json_parent 338 res = json_parent
...@@ -283,25 +347,99 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -283,25 +347,99 @@ class ItemViewSet(viewsets.ViewSet):
283 if request.method == 'POST': 347 if request.method == 'POST':
284 name = request.POST.get('name', '') 348 name = request.POST.get('name', '')
285 user_id = request.GET.get('user_id', '') 349 user_id = request.GET.get('user_id', '')
286 - item = Item(is_folder=True, name=name, file_type="folder", path="", parent=pk, user_id=user_id, size=0, status=True) 350 + item = Item(is_folder=True, name=name, file_type="folder", path="", parent=pk, user_id=user_id, size=0,
351 + status=True)
287 item.save() 352 item.save()
288 - item = Item.objects.filter(item_id = item.item_id) 353 + item = Item.objects.filter(item_id=item.item_id)
289 item_data = serializers.serialize("json", item) 354 item_data = serializers.serialize("json", item)
290 json_item = json.loads(item_data) 355 json_item = json.loads(item_data)
291 res = json_item[0]['fields'] 356 res = json_item[0]['fields']
292 - res['id']=json_item[0]['pk'] 357 + res['id'] = json_item[0]['pk']
293 res['inside_folder_list'] = [] 358 res['inside_folder_list'] = []
294 res['inside_file_list'] = [] 359 res['inside_file_list'] = []
295 return Response({'data': res}, status=status.HTTP_200_OK) 360 return Response({'data': res}, status=status.HTTP_200_OK)
296 361
362 + @action(methods=['GET'], detail=False, permission_classes=[AllowAny],
363 + url_path='trash', url_name='trash')
364 + def trash(self, request):
365 + if request.method == 'GET':
366 + children = Item.objects.filter(is_deleted = True)
367 + children_data = serializers.serialize("json", children)
368 + json_children = json.loads(children_data)
369 + res = {}
370 + children_list = []
371 + for i in json_children:
372 + t = i['fields']
373 + t['id'] = i['pk']
374 + children_list.append(t)
375 + res['list'] = children_list
376 + return Response({'data': res}, status=status.HTTP_200_OK)
297 377
298 -class SharedItemViewSet(viewsets.ModelViewSet): 378 + # url: /upload/
379 + @action(methods=['POST'], detail=True, permission_classes=[AllowAny],
380 + url_path='upload', url_name='upload')
381 + def upload(self, request, pk):
382 + if request.method == 'POST':
383 + s3 = boto3.client('s3')
384 + s3_bucket = AWS_STORAGE_BUCKET_NAME
385 +
386 + # 파일 객체 생성
387 + file_name = request.POST.get('name', '')
388 + file_size = request.POST.get('size', '')
389 + file_parent = pk
390 + file_type = mimetypes.guess_type(file_name)[0]
391 + upload_item = Item(name=file_name, size=file_size, user_id=1, file_type=file_type, parent=file_parent)
392 + upload_item.save()
393 +
394 + date_long = datetime.utcnow().strftime('%Y%m%dT000000Z')
395 +
396 + presigned_post = s3.generate_presigned_post(
397 + s3_bucket,
398 + file_name,
399 + {
400 + "acl": "private",
401 + "Content-Type": file_type,
402 + 'region': AWS_REGION,
403 + 'x-amz-algorithm': 'AWS4-HMAC-SHA256',
404 + 'x-amz-date': date_long
405 + },
406 + [
407 + {"acl": "private"},
408 + {"Content-Type": file_type},
409 + {'x-amz-algorithm': 'AWS4-HMAC-SHA256'},
410 + {'x-amz-date': date_long}
411 + ],
412 + 3600
413 + )
414 +
415 + data = {
416 + "signed_url": presigned_post,
417 + 'url': 'https://%s.s3.amazonaws.com/%s' % (s3_bucket, file_name)
418 + }
419 +
420 + return Response({'presigned_post': presigned_post, 'proc_data': data}, status=status.HTTP_200_OK)
299 421
422 + # url: /status/
423 + @action(methods=['POST'], detail=True, permission_classes=[AllowAny],
424 + url_path='status', url_name='status')
425 + def status(self, request, *args, **kwargs):
426 + if request.method == 'POST':
427 + pk = request.POST.get('item_id', '')
428 + queryset = Item.objects.filter(item_id=pk)
429 + for cand in queryset:
430 + cand.status = True
431 + cand.save()
432 + return Response({'Message': 'File Upload Successful'}, status=status.HTTP_200_OK)
433 + return Response({'Error': 'No such item found in queryset'}, status=status.HTTP_400_BAD_REQUEST)
434 +
435 +
436 +class SharedItemViewSet(viewsets.ModelViewSet):
300 queryset = SharedItem.objects.all() 437 queryset = SharedItem.objects.all()
301 # serializer_class = SharedItemSerializer 438 # serializer_class = SharedItemSerializer
302 permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny, 439 permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny,
303 # IsOwnerOrReadOnly 440 # IsOwnerOrReadOnly
304 ] 441 ]
442 +
305 # url: http://localhost:8000/items/1/share/ 443 # url: http://localhost:8000/items/1/share/
306 # 마지막 slash도 써주어야함 444 # 마지막 slash도 써주어야함
307 @csrf_exempt 445 @csrf_exempt
...@@ -315,20 +453,21 @@ class SharedItemViewSet(viewsets.ModelViewSet): ...@@ -315,20 +453,21 @@ class SharedItemViewSet(viewsets.ModelViewSet):
315 if sharedfile != None: 453 if sharedfile != None:
316 # 서버는 정상이나 이미 공유객체로 등록된 파일임 454 # 서버는 정상이나 이미 공유객체로 등록된 파일임
317 return Response({'message': 'This file is already shared'}, status=status.HTTP_200_OK) 455 return Response({'message': 'This file is already shared'}, status=status.HTTP_200_OK)
318 - sharedfile = SharedItem(item_id =pk, password=password, expires = expires) 456 + sharedfile = SharedItem(item_id=pk, password=password, expires=expires)
319 sharedfile.save() 457 sharedfile.save()
320 - sharedfile = SharedItem.objects.get(item_id = pk) 458 + sharedfile = SharedItem.objects.get(item_id=pk)
321 459
322 # sf = serializers.serialize("json", sharedfile) 460 # sf = serializers.serialize("json", sharedfile)
323 - item = Item.objects.filter(item_id = pk) 461 + item = Item.objects.filter(item_id=pk)
324 item_json = serializers.serialize("json", item) 462 item_json = serializers.serialize("json", item)
325 463
326 json_data = json.loads(item_json) 464 json_data = json.loads(item_json)
327 print(json_data) 465 print(json_data)
328 res = json_data[0]['fields'] 466 res = json_data[0]['fields']
329 res['id'] = json_data[0]['pk'] 467 res['id'] = json_data[0]['pk']
330 - return Response({"shared": sharedfile.created_time , 'data': res}, status=status.HTTP_200_OK) 468 + return Response({"shared": sharedfile.created_time, 'data': res}, status=status.HTTP_200_OK)
469 +
331 470
332 item = ItemViewSet.as_view({ 471 item = ItemViewSet.as_view({
333 'delete': 'destroy', 472 'delete': 'destroy',
334 -}) 473 +})
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -11,10 +11,17 @@ https://docs.djangoproject.com/en/3.0/ref/settings/ ...@@ -11,10 +11,17 @@ https://docs.djangoproject.com/en/3.0/ref/settings/
11 """ 11 """
12 12
13 import os 13 import os
14 +import sys
15 +import json
14 16
15 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 17 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 18 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17 19
20 +ROOT_DIR = os.path.dirname(BASE_DIR)
21 +# secrets.json의 경로
22 +SECRETS_PATH = os.path.join(ROOT_DIR, 'secrets.json')
23 +# json파일을 파이썬 객체로 변환
24 +secrets = json.loads(open(SECRETS_PATH).read())
18 25
19 # Quick-start development settings - unsuitable for production 26 # Quick-start development settings - unsuitable for production
20 # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ 27 # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
...@@ -127,3 +134,11 @@ USE_TZ = True ...@@ -127,3 +134,11 @@ USE_TZ = True
127 # https://docs.djangoproject.com/en/3.0/howto/static-files/ 134 # https://docs.djangoproject.com/en/3.0/howto/static-files/
128 135
129 STATIC_URL = '/static/' 136 STATIC_URL = '/static/'
137 +
138 +
139 +#S3
140 +DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
141 +STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
142 +
143 +for key, value in secrets.items():
144 + setattr(sys.modules[__name__], key, value)
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -30,11 +30,15 @@ urlpatterns = [ ...@@ -30,11 +30,15 @@ urlpatterns = [
30 path('admin/', admin.site.urls), 30 path('admin/', admin.site.urls),
31 path('', include(router.urls)), 31 path('', include(router.urls)),
32 url(r'^search/$', views.ItemViewSet.search, name='search'), 32 url(r'^search/$', views.ItemViewSet.search, name='search'),
33 + url(r'^<int:pk>/delete/$', views.ItemViewSet.delete, name='delete'),
34 + url(r'^<int:pk>/restore/$', views.ItemViewSet.restore, name='restore'),
33 url(r'^<int:pk>/share/$', views.SharedItemViewSet.share, name='share'), 35 url(r'^<int:pk>/share/$', views.SharedItemViewSet.share, name='share'),
34 url(r'^<int:pk>/move/$', views.ItemViewSet.move, name='move'), 36 url(r'^<int:pk>/move/$', views.ItemViewSet.move, name='move'),
35 url(r'^<int:pk>/copy/$', views.ItemViewSet.copy, name='copy'), 37 url(r'^<int:pk>/copy/$', views.ItemViewSet.copy, name='copy'),
36 - url(r'^<int:pk>/children/$', views.ItemViewSet.children, name='copy'), 38 + url(r'^<int:pk>/children/$', views.ItemViewSet.children, name='children'),
39 + url(r'^trash/$', views.ItemViewSet.trash, name='trash'),
37 url(r'^signup/$', views.UserViewSet.signup, name='signup'), 40 url(r'^signup/$', views.UserViewSet.signup, name='signup'),
38 url(r'^login/$', views.UserViewSet.login, name='login'), 41 url(r'^login/$', views.UserViewSet.login, name='login'),
39 - 42 + url(r'^upload/$', views.ItemViewSet.upload, name='upload'),
40 -] 43 + url(r'^status/$', views.ItemViewSet.status, name='status'),
44 +]
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -22,3 +22,4 @@ npm-debug.log* ...@@ -22,3 +22,4 @@ npm-debug.log*
22 yarn-debug.log* 22 yarn-debug.log*
23 yarn-error.log* 23 yarn-error.log*
24 .idea 24 .idea
25 +secrets.json
......