7 from datetime import datetime |
7 from datetime import datetime |
8 import json |
8 import json |
9 import logging |
9 import logging |
10 import uuid |
10 import uuid |
11 |
11 |
|
12 from django.db import transaction |
12 from django.core.urlresolvers import reverse |
13 from django.core.urlresolvers import reverse |
13 from django.http import Http404 |
14 from django.http import Http404 |
14 from django.http.response import HttpResponse, HttpResponseBadRequest |
15 from django.http.response import HttpResponse, HttpResponseBadRequest |
15 from django.shortcuts import get_object_or_404, redirect |
16 from django.shortcuts import get_object_or_404, redirect |
16 from django.views.generic import View |
17 from django.views.generic import View |
32 |
33 |
33 def get(self, request, workspace_guid='', format=None): |
34 def get(self, request, workspace_guid='', format=None): |
34 if workspace_guid == '': |
35 if workspace_guid == '': |
35 renkans = self.queryset.all() |
36 renkans = self.queryset.all() |
36 else: |
37 else: |
37 renkans = self.queryset.filter(workspace_guid=workspace_guid) |
38 renkans = self.queryset.filter(workspace__workspace_guid=workspace_guid) |
38 serializer = RenkanSerializer(renkans, many=True) |
39 serializer = RenkanSerializer(renkans, many=True) |
39 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
40 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
40 |
41 |
41 def post(self, request, workspace_guid='', format=None): |
42 def post(self, request, workspace_guid='', format=None): |
42 create_data = {key:request.data[key] for key in request.data.keys()} |
43 create_data = {key:request.data[key] for key in request.data.keys()} |
45 if source_renkan_guid is not None: |
46 if source_renkan_guid is not None: |
46 try: |
47 try: |
47 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid) |
48 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid) |
48 except Renkan.DoesNotExist: |
49 except Renkan.DoesNotExist: |
49 return Response({'detail': 'Source renkan '+source_renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
50 return Response({'detail': 'Source renkan '+source_renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
50 source_revision_guid = source_renkan.current_revision_guid |
51 source_revision_guid = source_renkan.current_revision.revision_guid |
51 if source_revision_guid is not None: |
52 if source_revision_guid is not None: |
52 try: |
53 try: |
53 source_revision=Revision.objects.get(revision_guid=source_revision_guid) |
54 source_revision=Revision.objects.get(revision_guid=source_revision_guid) |
54 except Revision.DoesNotExist: |
55 except Revision.DoesNotExist: |
55 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
56 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
60 try: |
61 try: |
61 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
62 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
62 except Workspace.DoesNotExist: |
63 except Workspace.DoesNotExist: |
63 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
64 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
64 create_data["workspace_id"] = workspace_guid |
65 create_data["workspace_id"] = workspace_guid |
65 |
|
66 serializer = RenkanSerializer(data=create_data) |
66 serializer = RenkanSerializer(data=create_data) |
67 if serializer.is_valid(): |
67 if serializer.is_valid(): |
68 serializer.save(creator=request.user) |
68 serializer.save(creator=request.user) |
69 return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json') |
69 return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json') |
70 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
70 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
71 |
71 |
72 |
72 |
73 class RenkanDetail(APIView): |
73 class RenkanDetail(APIView): |
79 |
79 |
80 def get_object(self, renkan_guid): |
80 def get_object(self, renkan_guid): |
81 return self.queryset.get(renkan_guid=renkan_guid) |
81 return self.queryset.get(renkan_guid=renkan_guid) |
82 |
82 |
83 def dispatch(self, *args, **kwargs): |
83 def dispatch(self, *args, **kwargs): |
84 logger.debug("TEST 1 21 12 TEST") |
|
85 return super(RenkanDetail, self).dispatch(*args, **kwargs) |
84 return super(RenkanDetail, self).dispatch(*args, **kwargs) |
86 |
85 |
87 def get(self, request, renkan_guid, format=None): |
86 def get(self, request, renkan_guid, format=None): |
88 try: |
87 try: |
89 renkan = self.get_object(renkan_guid=renkan_guid) |
88 renkan = self.get_object(renkan_guid=renkan_guid) |
90 except Renkan.DoesNotExist: |
89 except Renkan.DoesNotExist: |
91 return Response({'detail': 'Renkan project %r does not exist'.format(renkan_guid)}, status=status.HTTP_404_NOT_FOUND) |
90 return Response({'detail': 'Renkan project %r does not exist'.format(renkan_guid)}, status=status.HTTP_404_NOT_FOUND) |
92 logger.debug("RENKAN GET %r : CHECKING OBJECT PERMISSION", renkan_guid) |
|
93 logger.debug("RENKAN GET: permission? %r", request.user.has_perm("view_renkan", renkan)) |
|
94 self.check_object_permissions(request, renkan) |
91 self.check_object_permissions(request, renkan) |
95 logger.debug("RENKAN GET: PERMISSION GRANTED") |
|
96 serializer = RenkanSerializer(renkan) |
92 serializer = RenkanSerializer(renkan) |
97 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
93 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
98 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
94 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
99 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
95 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
100 |
96 |
117 if serializer.is_valid(): |
113 if serializer.is_valid(): |
118 serializer.save(updator=request.user) |
114 serializer.save(updator=request.user) |
119 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
115 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
120 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
116 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
121 |
117 |
|
118 @transaction.atomic |
122 def delete(self, request, renkan_guid, format=None): |
119 def delete(self, request, renkan_guid, format=None): |
123 try: |
120 try: |
124 to_delete_renkan = self.get_object(renkan_guid=renkan_guid) |
121 to_delete_renkan = self.get_object(renkan_guid=renkan_guid) |
125 except Renkan.DoesNotExist: |
122 except Renkan.DoesNotExist: |
126 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
123 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
127 self.check_object_permissions(request, to_delete_renkan) |
124 self.check_object_permissions(request, to_delete_renkan) |
128 renkan_revisions = Revision.objects.filter(parent_renkan_guid = to_delete_renkan.renkan_guid) |
|
129 for child_revision in renkan_revisions: |
|
130 # Deleting reference to revision in renkans copied from this revision |
|
131 for related_renkan in self.queryset.filter(source_revision_guid=child_revision.revision_guid): |
|
132 related_renkan.source_revision_guid = '' |
|
133 related_renkan.save() |
|
134 child_revision.delete() |
|
135 to_delete_renkan.delete() |
125 to_delete_renkan.delete() |
136 return Response(status=status.HTTP_204_NO_CONTENT) |
126 return Response(status=status.HTTP_204_NO_CONTENT) |
137 |
127 |
138 class WorkspaceList(APIView): |
128 class WorkspaceList(APIView): |
139 """ |
129 """ |
202 View for listing revisions from a given renkan |
192 View for listing revisions from a given renkan |
203 """ |
193 """ |
204 |
194 |
205 def get_queryset(self, renkan_guid=""): |
195 def get_queryset(self, renkan_guid=""): |
206 if renkan_guid: |
196 if renkan_guid: |
207 return Revision.objects.filter(parent_renkan_guid=renkan_guid) |
197 return Revision.objects.filter(parent_renkan__renkan_guid=renkan_guid) |
208 else: |
198 else: |
209 return Revision.objects |
199 return Revision.objects |
210 |
200 |
211 def get(self, request, renkan_guid, format=None): |
201 def get(self, request, renkan_guid, format=None): |
212 revisions = self.get_queryset(renkan_guid) |
202 revisions = self.get_queryset(renkan_guid) |
222 |
212 |
223 lookup_field = "revision_guid" |
213 lookup_field = "revision_guid" |
224 |
214 |
225 def get_queryset(self, renkan_guid=""): |
215 def get_queryset(self, renkan_guid=""): |
226 if renkan_guid: |
216 if renkan_guid: |
227 return Revision.objects.filter(parent_renkan_guid=renkan_guid) |
217 return Revision.objects.filter(parent_renkan__renkan_guid=renkan_guid) |
228 else: |
218 else: |
229 return Revision.objects |
219 return Revision.objects |
230 |
220 |
231 def get(self, request, renkan_guid, revision_guid, format=None): |
221 def get(self, request, renkan_guid, revision_guid, format=None): |
232 revisions = self.get_queryset(renkan_guid) |
222 revisions = self.get_queryset(renkan_guid) |
251 self.check_object_permissions(request, revision) |
241 self.check_object_permissions(request, revision) |
252 if revisions.count() == 1: |
242 if revisions.count() == 1: |
253 return Response({'detail': 'You cannot delete the last remaining revision of a renkan from the Revision API. Try deleting the parent Renkan with the Renkan API'}, status=status.HTTP_400_BAD_REQUEST) |
243 return Response({'detail': 'You cannot delete the last remaining revision of a renkan from the Revision API. Try deleting the parent Renkan with the Renkan API'}, status=status.HTTP_400_BAD_REQUEST) |
254 if revision.is_current_revision: |
244 if revision.is_current_revision: |
255 return Response({'detail': 'You cannot delete the current revision of a renkan from the Revision API.'}, status=status.HTTP_400_BAD_REQUEST) |
245 return Response({'detail': 'You cannot delete the current revision of a renkan from the Revision API.'}, status=status.HTTP_400_BAD_REQUEST) |
256 |
|
257 # Deleting reference to revision in renkans copied from this revision |
|
258 for related_renkan in Renkan.objects.filter(source_revision_guid=revision_guid): |
|
259 related_renkan.source_revision_guid = '' |
|
260 related_renkan.save() |
|
261 revision.delete() |
246 revision.delete() |
262 return Response(status=status.HTTP_204_NO_CONTENT) |
247 return Response(status=status.HTTP_204_NO_CONTENT) |