권주희

implement restore api

...@@ -15,13 +15,15 @@ from rest_framework.decorators import action ...@@ -15,13 +15,15 @@ from rest_framework.decorators import action
15 from rest_framework.permissions import IsAuthenticated, AllowAny 15 from rest_framework.permissions import IsAuthenticated, AllowAny
16 16
17 from .models import Item, SharedItem, User 17 from .models import Item, SharedItem, User
18 -from .serializers import UserSerializer,GroupSerializer,ItemSerializer 18 +from .serializers import UserSerializer, GroupSerializer, ItemSerializer
19 from rest_framework import status 19 from rest_framework import status
20 from annoying.functions import get_object_or_None 20 from annoying.functions import get_object_or_None
21 from django.conf import settings 21 from django.conf import settings
22 import jwt 22 import jwt
23 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, AWS_STORAGE_BUCKET_NAME 24 +from khudrive.settings import AWS_SESSION_TOKEN, AWS_SECRET_ACCESS_KEY, AWS_ACCESS_KEY_ID, AWS_REGION, \
25 + AWS_STORAGE_BUCKET_NAME
26 +
25 27
26 class UserViewSet(viewsets.ModelViewSet): 28 class UserViewSet(viewsets.ModelViewSet):
27 """ 29 """
...@@ -34,15 +36,17 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -34,15 +36,17 @@ class UserViewSet(viewsets.ModelViewSet):
34 ] 36 ]
35 permission_classes_by_action = {'get': [permissions.AllowAny], 37 permission_classes_by_action = {'get': [permissions.AllowAny],
36 'destroy': [permissions.AllowAny]} 38 'destroy': [permissions.AllowAny]}
39 +
37 @csrf_exempt 40 @csrf_exempt
38 - @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')
39 def signup(self, request): 43 def signup(self, request):
40 user_id = request.POST.get('user_id', '') 44 user_id = request.POST.get('user_id', '')
41 name = request.POST.get('name', '') 45 name = request.POST.get('name', '')
42 password = request.POST.get('password', '') 46 password = request.POST.get('password', '')
43 user = get_object_or_None(User, user_id=user_id) 47 user = get_object_or_None(User, user_id=user_id)
44 if user == None: 48 if user == None:
45 - 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)
46 user.save() 50 user.save()
47 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,
48 status=True) 52 status=True)
...@@ -52,7 +56,7 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -52,7 +56,7 @@ class UserViewSet(viewsets.ModelViewSet):
52 'int_id': user.int_id, 56 'int_id': user.int_id,
53 'user_id': user.user_id, 57 'user_id': user.user_id,
54 'name': user.name, 58 'name': user.name,
55 - 'root_folder':root.item_id, 59 + 'root_folder': root.item_id,
56 'total_size': user.total_size, 60 'total_size': user.total_size,
57 'current_size': user.current_size, 61 'current_size': user.current_size,
58 'created_time': user.created_time 62 'created_time': user.created_time
...@@ -107,7 +111,7 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -107,7 +111,7 @@ class UserViewSet(viewsets.ModelViewSet):
107 data = serializers.serialize("json", user) 111 data = serializers.serialize("json", user)
108 json_data = json.loads(data) 112 json_data = json.loads(data)
109 res = json_data[0]['fields'] 113 res = json_data[0]['fields']
110 - res['id']=json_data[0]['pk'] 114 + res['id'] = json_data[0]['pk']
111 return Response({'data': res}, status=status.HTTP_200_OK) 115 return Response({'data': res}, status=status.HTTP_200_OK)
112 116
113 def get_permissions(self): 117 def get_permissions(self):
...@@ -120,11 +124,10 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -120,11 +124,10 @@ class UserViewSet(viewsets.ModelViewSet):
120 124
121 125
122 class ItemViewSet(viewsets.ViewSet): 126 class ItemViewSet(viewsets.ViewSet):
123 -
124 queryset = Item.objects.all() 127 queryset = Item.objects.all()
125 serializer_class = ItemSerializer 128 serializer_class = ItemSerializer
126 permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny, 129 permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny,
127 - #IsOwnerOrReadOnly 130 + # IsOwnerOrReadOnly
128 ] 131 ]
129 permission_classes_by_action = {'get': [permissions.AllowAny], 132 permission_classes_by_action = {'get': [permissions.AllowAny],
130 'destroy': [permissions.AllowAny]} 133 'destroy': [permissions.AllowAny]}
...@@ -134,8 +137,8 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -134,8 +137,8 @@ class ItemViewSet(viewsets.ViewSet):
134 def search(self, request): 137 def search(self, request):
135 if request.method == 'GET': 138 if request.method == 'GET':
136 keyword = request.GET.get('keyword', '') 139 keyword = request.GET.get('keyword', '')
137 - user_id = request.GET.get('user_id', '') 140 + # user_id = request.GET.get('user_id', '')
138 - item_list = Item.objects.filter(name__icontains = keyword, user_id = user_id ) 141 + item_list = Item.objects.filter(name__icontains=keyword)
139 142
140 data = serializers.serialize("json", item_list) 143 data = serializers.serialize("json", item_list)
141 json_data = json.loads(data) 144 json_data = json.loads(data)
...@@ -144,7 +147,8 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -144,7 +147,8 @@ class ItemViewSet(viewsets.ViewSet):
144 t = i['fields'] 147 t = i['fields']
145 t['id'] = i['pk'] 148 t['id'] = i['pk']
146 res.append(t) 149 res.append(t)
147 - return Response({'data': {'list' : res}}, status=status.HTTP_200_OK) 150 + return Response({'data': {'list': res}}, status=status.HTTP_200_OK)
151 +
148 """ 152 """
149 # url: items/11/ 153 # url: items/11/
150 # 마지막 slash도 써주어야함 154 # 마지막 slash도 써주어야함
...@@ -165,55 +169,66 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -165,55 +169,66 @@ class ItemViewSet(viewsets.ViewSet):
165 169
166 return Response({'message': presigned_url}, status=status.HTTP_200_OK) 170 return Response({'message': presigned_url}, status=status.HTTP_200_OK)
167 """ 171 """
172 +
168 # url: items/11/ 173 # url: items/11/
169 # 마지막 slash도 써주어야함 174 # 마지막 slash도 써주어야함
170 def get(self, request, pk): 175 def get(self, request, pk):
171 s3 = boto3.client('s3', 176 s3 = boto3.client('s3',
172 - aws_access_key_id=AWS_ACCESS_KEY_ID, 177 + aws_access_key_id=AWS_ACCESS_KEY_ID,
173 - aws_secret_access_key=AWS_SECRET_ACCESS_KEY, 178 + aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
174 - aws_session_token=AWS_SESSION_TOKEN, 179 + aws_session_token=AWS_SESSION_TOKEN,
175 - config=Config(signature_version='s3v4')) 180 + config=Config(signature_version='s3v4'))
176 s3_bucket = AWS_STORAGE_BUCKET_NAME 181 s3_bucket = AWS_STORAGE_BUCKET_NAME
177 - 182 +
178 item = Item.objects.filter(item_id=pk) 183 item = Item.objects.filter(item_id=pk)
179 object_name = item.get().name 184 object_name = item.get().name
180 data = serializers.serialize("json", item) 185 data = serializers.serialize("json", item)
181 json_data = json.loads(data) 186 json_data = json.loads(data)
182 - 187 +
183 presigned_url = s3.generate_presigned_url( 188 presigned_url = s3.generate_presigned_url(
184 'get_object', 189 'get_object',
185 Params={'Bucket': s3_bucket, 190 Params={'Bucket': s3_bucket,
186 'Key': object_name}, 191 'Key': object_name},
187 - ExpiresIn = 3600 192 + ExpiresIn=3600
188 ) 193 )
189 194
190 res = json_data[0]['fields'] 195 res = json_data[0]['fields']
191 - res['id']=json_data[0]['pk'] 196 + res['id'] = json_data[0]['pk']
192 - res['signed_url']=presigned_url 197 + res['signed_url'] = presigned_url
193 return Response({'data': res}, status=status.HTTP_200_OK) 198 return Response({'data': res}, status=status.HTTP_200_OK)
194 199
195 # url: items/11/ 200 # url: items/11/
196 # 마지막 slash도 써주어야함 201 # 마지막 slash도 써주어야함
197 def destroy(self, request, pk): 202 def destroy(self, request, pk):
198 if request.method == 'DELETE': 203 if request.method == 'DELETE':
199 - print(pk)
200 item = get_object_or_None(Item, item_id=pk) 204 item = get_object_or_None(Item, item_id=pk)
201 if item != None: 205 if item != None:
202 - if item.is_folder == True: # 폴더는 삭제 안되도록 처리 206 + if item.is_folder == True: # 폴더는 삭제 안되도록 처리
203 return Response({'message': 'This item is folder.'}, status=status.HTTP_200_OK) 207 return Response({'message': 'This item is folder.'}, status=status.HTTP_200_OK)
204 item.is_deleted = True 208 item.is_deleted = True
205 item.save() 209 item.save()
206 # item.delete() 이거 하면 완전 삭제되어버림 is deleted True 면 휴지통에서 리스트 조회할 수 있도록! 210 # item.delete() 이거 하면 완전 삭제되어버림 is deleted True 면 휴지통에서 리스트 조회할 수 있도록!
207 - return Response({'message': 'delete complete'},status=status.HTTP_200_OK) 211 + return Response({'message': 'destroy complete'}, status=status.HTTP_200_OK)
208 return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT) 212 return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT)
209 213
214 + @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='restore', url_name='restore')
215 + def restore(self, request, pk):
216 + if request.method == 'POST':
217 + item = get_object_or_None(Item, item_id=pk)
218 + if item != None:
219 + item.is_deleted = False
220 + item.save()
221 + return Response({'message': 'restore complete'}, status=status.HTTP_200_OK)
222 + return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT)
223 +
224 +
210 # url: items/11/move 225 # url: items/11/move
211 # 마지막 slash도 써주어야함 226 # 마지막 slash도 써주어야함
212 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='move', url_name='move') 227 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='move', url_name='move')
213 def move(self, request, pk): 228 def move(self, request, pk):
214 if request.method == 'POST': 229 if request.method == 'POST':
215 parent_id = request.POST.get('parent', '') 230 parent_id = request.POST.get('parent', '')
216 - name = request.POST.get('name','') 231 + name = request.POST.get('name', '')
217 parent = get_object_or_None(Item, item_id=parent_id) 232 parent = get_object_or_None(Item, item_id=parent_id)
218 if parent != None and parent.is_folder == True: 233 if parent != None and parent.is_folder == True:
219 child = get_object_or_None(Item, item_id=pk) 234 child = get_object_or_None(Item, item_id=pk)
...@@ -221,12 +236,12 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -221,12 +236,12 @@ class ItemViewSet(viewsets.ViewSet):
221 return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT) 236 return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT)
222 child.parent = parent_id 237 child.parent = parent_id
223 child.save() 238 child.save()
224 - child = Item.objects.filter(item_id = pk) 239 + child = Item.objects.filter(item_id=pk)
225 child_data = serializers.serialize("json", child) 240 child_data = serializers.serialize("json", child)
226 json_child = json.loads(child_data) 241 json_child = json.loads(child_data)
227 res = json_child[0]['fields'] 242 res = json_child[0]['fields']
228 res['id'] = pk 243 res['id'] = pk
229 - parent = Item.objects.filter(item_id = parent_id) 244 + parent = Item.objects.filter(item_id=parent_id)
230 parent_data = serializers.serialize("json", parent) 245 parent_data = serializers.serialize("json", parent)
231 json_parent = json.loads(parent_data)[0]['fields'] 246 json_parent = json.loads(parent_data)[0]['fields']
232 res['parentInfo'] = json_parent 247 res['parentInfo'] = json_parent
...@@ -249,15 +264,16 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -249,15 +264,16 @@ class ItemViewSet(viewsets.ViewSet):
249 if child.is_folder == True: 264 if child.is_folder == True:
250 return Response({'message': 'item is folder'}, status=status.HTTP_204_NO_CONTENT) 265 return Response({'message': 'item is folder'}, status=status.HTTP_204_NO_CONTENT)
251 copiedName = child.name + "_복사본_" + str(datetime.now().strftime('%Y-%m-%d %H:%M')) 266 copiedName = child.name + "_복사본_" + str(datetime.now().strftime('%Y-%m-%d %H:%M'))
252 - copiedItem = Item(is_folder = False, name = copiedName, path =child.path, parent = parent_id, user_id= child.user_id, size=child.size, status=child.status) 267 + copiedItem = Item(is_folder=False, name=copiedName, path=child.path, parent=parent_id,
268 + user_id=child.user_id, size=child.size, status=child.status)
253 copiedItem.save() 269 copiedItem.save()
254 270
255 - copiedItem = Item.objects.filter(name = copiedName) 271 + copiedItem = Item.objects.filter(name=copiedName)
256 copied_data = serializers.serialize("json", copiedItem) 272 copied_data = serializers.serialize("json", copiedItem)
257 json_data = json.loads(copied_data) 273 json_data = json.loads(copied_data)
258 res = json_data[0]['fields'] 274 res = json_data[0]['fields']
259 res['id'] = json_data[0]['pk'] 275 res['id'] = json_data[0]['pk']
260 - parent = Item.objects.filter(item_id = parent_id) 276 + parent = Item.objects.filter(item_id=parent_id)
261 parent_data = serializers.serialize("json", parent) 277 parent_data = serializers.serialize("json", parent)
262 json_parent = json.loads(parent_data)[0]['fields'] 278 json_parent = json.loads(parent_data)[0]['fields']
263 res['parentInfo'] = json_parent 279 res['parentInfo'] = json_parent
...@@ -281,10 +297,10 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -281,10 +297,10 @@ class ItemViewSet(viewsets.ViewSet):
281 url_path='children', url_name='children') 297 url_path='children', url_name='children')
282 def children(self, request, pk): 298 def children(self, request, pk):
283 if request.method == 'GET': 299 if request.method == 'GET':
284 - children = Item.objects.filter(parent = pk, is_deleted=False) 300 + children = Item.objects.filter(parent=pk, is_deleted=False)
285 children_data = serializers.serialize("json", children) 301 children_data = serializers.serialize("json", children)
286 json_children = json.loads(children_data) 302 json_children = json.loads(children_data)
287 - parent = Item.objects.filter(item_id=pk) #item 303 + parent = Item.objects.filter(item_id=pk) # item
288 parent_data = serializers.serialize("json", parent) 304 parent_data = serializers.serialize("json", parent)
289 json_parent = json.loads(parent_data)[0]['fields'] 305 json_parent = json.loads(parent_data)[0]['fields']
290 res = json_parent 306 res = json_parent
...@@ -299,26 +315,27 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -299,26 +315,27 @@ class ItemViewSet(viewsets.ViewSet):
299 if request.method == 'POST': 315 if request.method == 'POST':
300 name = request.POST.get('name', '') 316 name = request.POST.get('name', '')
301 user_id = request.GET.get('user_id', '') 317 user_id = request.GET.get('user_id', '')
302 - item = Item(is_folder=True, name=name, file_type="folder", path="", parent=pk, user_id=user_id, size=0, status=True) 318 + item = Item(is_folder=True, name=name, file_type="folder", path="", parent=pk, user_id=user_id, size=0,
319 + status=True)
303 item.save() 320 item.save()
304 - item = Item.objects.filter(item_id = item.item_id) 321 + item = Item.objects.filter(item_id=item.item_id)
305 item_data = serializers.serialize("json", item) 322 item_data = serializers.serialize("json", item)
306 json_item = json.loads(item_data) 323 json_item = json.loads(item_data)
307 res = json_item[0]['fields'] 324 res = json_item[0]['fields']
308 - res['id']=json_item[0]['pk'] 325 + res['id'] = json_item[0]['pk']
309 res['inside_folder_list'] = [] 326 res['inside_folder_list'] = []
310 res['inside_file_list'] = [] 327 res['inside_file_list'] = []
311 return Response({'data': res}, status=status.HTTP_200_OK) 328 return Response({'data': res}, status=status.HTTP_200_OK)
312 329
313 # url: /upload/ 330 # url: /upload/
314 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], 331 @action(methods=['POST'], detail=True, permission_classes=[AllowAny],
315 - url_path='upload', url_name='upload') 332 + url_path='upload', url_name='upload')
316 def upload(self, request, pk): 333 def upload(self, request, pk):
317 if request.method == 'POST': 334 if request.method == 'POST':
318 s3 = boto3.client('s3') 335 s3 = boto3.client('s3')
319 s3_bucket = AWS_STORAGE_BUCKET_NAME 336 s3_bucket = AWS_STORAGE_BUCKET_NAME
320 337
321 - #파일 객체 생성 338 + # 파일 객체 생성
322 file_name = request.POST.get('name', '') 339 file_name = request.POST.get('name', '')
323 file_size = request.POST.get('size', '') 340 file_size = request.POST.get('size', '')
324 file_parent = pk 341 file_parent = pk
...@@ -346,21 +363,21 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -346,21 +363,21 @@ class ItemViewSet(viewsets.ViewSet):
346 ], 363 ],
347 3600 364 3600
348 ) 365 )
349 - 366 +
350 data = { 367 data = {
351 "signed_url": presigned_post, 368 "signed_url": presigned_post,
352 'url': 'https://%s.s3.amazonaws.com/%s' % (s3_bucket, file_name) 369 'url': 'https://%s.s3.amazonaws.com/%s' % (s3_bucket, file_name)
353 } 370 }
354 - 371 +
355 - return Response({'presigned_post':presigned_post, 'proc_data':data}, status=status.HTTP_200_OK) 372 + return Response({'presigned_post': presigned_post, 'proc_data': data}, status=status.HTTP_200_OK)
356 - 373 +
357 # url: /status/ 374 # url: /status/
358 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], 375 @action(methods=['POST'], detail=True, permission_classes=[AllowAny],
359 - url_path='status', url_name='status') 376 + url_path='status', url_name='status')
360 def status(self, request, *args, **kwargs): 377 def status(self, request, *args, **kwargs):
361 if request.method == 'POST': 378 if request.method == 'POST':
362 pk = request.POST.get('item_id', '') 379 pk = request.POST.get('item_id', '')
363 - queryset = Item.objects.filter(item_id = pk) 380 + queryset = Item.objects.filter(item_id=pk)
364 for cand in queryset: 381 for cand in queryset:
365 cand.status = True 382 cand.status = True
366 cand.save() 383 cand.save()
...@@ -369,12 +386,12 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -369,12 +386,12 @@ class ItemViewSet(viewsets.ViewSet):
369 386
370 387
371 class SharedItemViewSet(viewsets.ModelViewSet): 388 class SharedItemViewSet(viewsets.ModelViewSet):
372 -
373 queryset = SharedItem.objects.all() 389 queryset = SharedItem.objects.all()
374 # serializer_class = SharedItemSerializer 390 # serializer_class = SharedItemSerializer
375 permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny, 391 permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.AllowAny,
376 # IsOwnerOrReadOnly 392 # IsOwnerOrReadOnly
377 ] 393 ]
394 +
378 # url: http://localhost:8000/items/1/share/ 395 # url: http://localhost:8000/items/1/share/
379 # 마지막 slash도 써주어야함 396 # 마지막 slash도 써주어야함
380 @csrf_exempt 397 @csrf_exempt
...@@ -388,20 +405,21 @@ class SharedItemViewSet(viewsets.ModelViewSet): ...@@ -388,20 +405,21 @@ class SharedItemViewSet(viewsets.ModelViewSet):
388 if sharedfile != None: 405 if sharedfile != None:
389 # 서버는 정상이나 이미 공유객체로 등록된 파일임 406 # 서버는 정상이나 이미 공유객체로 등록된 파일임
390 return Response({'message': 'This file is already shared'}, status=status.HTTP_200_OK) 407 return Response({'message': 'This file is already shared'}, status=status.HTTP_200_OK)
391 - sharedfile = SharedItem(item_id =pk, password=password, expires = expires) 408 + sharedfile = SharedItem(item_id=pk, password=password, expires=expires)
392 sharedfile.save() 409 sharedfile.save()
393 - sharedfile = SharedItem.objects.get(item_id = pk) 410 + sharedfile = SharedItem.objects.get(item_id=pk)
394 411
395 # sf = serializers.serialize("json", sharedfile) 412 # sf = serializers.serialize("json", sharedfile)
396 - item = Item.objects.filter(item_id = pk) 413 + item = Item.objects.filter(item_id=pk)
397 item_json = serializers.serialize("json", item) 414 item_json = serializers.serialize("json", item)
398 415
399 json_data = json.loads(item_json) 416 json_data = json.loads(item_json)
400 print(json_data) 417 print(json_data)
401 res = json_data[0]['fields'] 418 res = json_data[0]['fields']
402 res['id'] = json_data[0]['pk'] 419 res['id'] = json_data[0]['pk']
403 - return Response({"shared": sharedfile.created_time , 'data': res}, status=status.HTTP_200_OK) 420 + return Response({"shared": sharedfile.created_time, 'data': res}, status=status.HTTP_200_OK)
421 +
404 422
405 item = ItemViewSet.as_view({ 423 item = ItemViewSet.as_view({
406 'delete': 'destroy', 424 'delete': 'destroy',
407 -}) 425 +})
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -30,6 +30,8 @@ urlpatterns = [ ...@@ -30,6 +30,8 @@ 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'),
...@@ -38,4 +40,4 @@ urlpatterns = [ ...@@ -38,4 +40,4 @@ urlpatterns = [
38 url(r'^login/$', views.UserViewSet.login, name='login'), 40 url(r'^login/$', views.UserViewSet.login, name='login'),
39 url(r'^upload/$', views.ItemViewSet.upload, name='upload'), 41 url(r'^upload/$', views.ItemViewSet.upload, name='upload'),
40 url(r'^status/$', views.ItemViewSet.status, name='status'), 42 url(r'^status/$', views.ItemViewSet.status, name='status'),
41 -] 43 +]
...\ No newline at end of file ...\ No newline at end of file
......