Merge remote-tracking branch 'origin/master' into feature/frontend
# Conflicts: # backend/api/views.py # backend/khudrive/settings.py
Showing
5 changed files
with
191 additions
and
32 deletions
... | @@ -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 | ... | ... |
-
Please register or login to post a comment