18 from renkanmanager.models import Renkan, Revision, Workspace |
18 from renkanmanager.models import Renkan, Revision, Workspace |
19 from renkanmanager.permissions import CanEditRenkan, CanDeleteRenkan, CanCreateRenkan, \ |
19 from renkanmanager.permissions import CanEditRenkan, CanDeleteRenkan, CanCreateRenkan, \ |
20 CanEditWorkspace, CanDeleteWorkspace, CanCreateWorkspace, \ |
20 CanEditWorkspace, CanDeleteWorkspace, CanCreateWorkspace, \ |
21 CanDeleteRevision |
21 CanDeleteRevision |
22 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer |
22 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer |
23 from renkanmanager.utils import LineNodePlacer, renkan_copier, renkan_deleter |
23 from renkanmanager.auth import CsrfExemptSessionAuthentication |
24 from rest_framework import permissions, status |
24 from rest_framework import permissions, status |
25 from rest_framework.response import Response |
25 from rest_framework.response import Response |
26 from rest_framework.views import APIView |
26 from rest_framework.views import APIView |
27 |
27 |
28 |
28 |
41 if workspace_guid == '': |
41 if workspace_guid == '': |
42 renkans = Renkan.objects.all() |
42 renkans = Renkan.objects.all() |
43 else: |
43 else: |
44 renkans = Renkan.objects.filter(workspace_guid=workspace_guid) |
44 renkans = Renkan.objects.filter(workspace_guid=workspace_guid) |
45 serializer = RenkanSerializer(renkans, many=True) |
45 serializer = RenkanSerializer(renkans, many=True) |
46 return Response(serializer.data, status=status.HTTP_200_OK) |
46 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
47 |
47 |
48 def post(self, request, workspace_guid='', format=None): |
48 def post(self, request, workspace_guid='', format=None): |
49 create_data = request.data |
49 create_data = request.data |
50 # We check if the POST request is a copy request, either with ?source="id" query arg or with source_revision_guid present in the data |
50 # We check if the POST request is a copy request, either with ?source="id" query arg or with source_revision_guid present in the data |
51 source_revision_guid = request.GET.get("source", None) if request.GET.get("source", None) is not None else request.data.get("source_revision_guid", None) |
51 source_renkan_guid = request.GET.get("source_renkan_guid", request.data.get("source_renkan_guid", None)) |
|
52 source_revision_guid = request.GET.get("source_revision_guid", request.data.get("source_revision_guid", None)) |
|
53 if source_renkan_guid is not None: |
|
54 try: |
|
55 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid) |
|
56 except Renkan.DoesNotExist: |
|
57 return Response({'detail': 'Source renkan '+source_renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
|
58 source_revision_guid = source_renkan.current_revision_guid |
52 if source_revision_guid is not None: |
59 if source_revision_guid is not None: |
53 try: |
60 try: |
54 source_revision=Revision.objects.get(revision_guid=source_revision_guid) |
61 source_revision=Revision.objects.get(revision_guid=source_revision_guid) |
55 except Revision.DoesNotExist: |
62 except Revision.DoesNotExist: |
56 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
63 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
57 create_data["source_revision_guid"] = source_revision.revision_guid |
64 create_data["source_revision_guid"] = source_revision.revision_guid |
58 create_data["title"] = source_revision.title |
65 create_data["title"] = request.data.get("title", source_revision.title) |
59 create_data["content"] = source_revision.content |
66 create_data["content"] = source_revision.content |
60 if workspace_guid: |
67 if workspace_guid: |
61 try: |
68 try: |
62 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
69 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
63 except Workspace.DoesNotExist: |
70 except Workspace.DoesNotExist: |
64 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
71 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
65 create_data["workspace_guid"] = workspace_guid |
72 create_data["workspace_guid"] = workspace_guid |
66 serializer = RenkanSerializer(data=create_data) |
73 serializer = RenkanSerializer(data=create_data) |
67 if serializer.is_valid(): |
74 if serializer.is_valid(): |
68 serializer.save(creator=request.user) |
75 serializer.save(creator=request.user) |
69 return Response(serializer.data, status=status.HTTP_201_CREATED) |
76 return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json') |
70 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
77 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
71 |
78 |
72 |
79 |
73 class RenkanDetail(APIView): |
80 class RenkanDetail(APIView): |
74 """ |
81 """ |
78 permission_classes = ( |
85 permission_classes = ( |
79 permissions.IsAuthenticatedOrReadOnly, |
86 permissions.IsAuthenticatedOrReadOnly, |
80 CanEditRenkan, |
87 CanEditRenkan, |
81 CanDeleteRenkan, |
88 CanDeleteRenkan, |
82 ) |
89 ) |
|
90 authentication_classes = ( |
|
91 CsrfExemptSessionAuthentication, |
|
92 ) |
|
93 @csrf_exempt |
|
94 def dispatch(self, *args, **kwargs): |
|
95 return super(RenkanDetail, self).dispatch(*args, **kwargs) |
83 |
96 |
84 def get_object(self, renkan_guid): |
97 def get_object(self, renkan_guid): |
85 return Renkan.objects.get(renkan_guid=renkan_guid) |
98 return Renkan.objects.get(renkan_guid=renkan_guid) |
86 |
99 |
87 def get(self, request, renkan_guid, format=None): |
100 def get(self, request, renkan_guid, format=None): |
89 renkan = self.get_object(renkan_guid=renkan_guid) |
102 renkan = self.get_object(renkan_guid=renkan_guid) |
90 except Renkan.DoesNotExist: |
103 except Renkan.DoesNotExist: |
91 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
104 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
92 self.check_object_permissions(request, renkan) |
105 self.check_object_permissions(request, renkan) |
93 serializer = RenkanSerializer(renkan) |
106 serializer = RenkanSerializer(renkan) |
94 return Response(serializer.data, status=status.HTTP_200_OK) |
107 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
|
108 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
|
109 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
95 |
110 |
96 def put(self, request, renkan_guid, format=None): |
111 def put(self, request, renkan_guid, format=None): |
97 try: |
112 try: |
98 renkan = self.get_object(renkan_guid=renkan_guid) |
113 renkan = self.get_object(renkan_guid=renkan_guid) |
99 except Renkan.DoesNotExist: |
114 except Renkan.DoesNotExist: |
100 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
115 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
101 self.check_object_permissions(request, renkan) |
116 self.check_object_permissions(request, renkan) |
102 serializer = RenkanSerializer(renkan, data=request.data) |
117 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
|
118 put_data = {} |
|
119 put_data["content"] = json.dumps(request.data) |
|
120 put_data["title"] = request.data.get("title", "") |
|
121 else: |
|
122 put_data = request.data |
|
123 serializer = RenkanSerializer(renkan, data=put_data) |
103 if serializer.is_valid(): |
124 if serializer.is_valid(): |
104 serializer.save(updator=request.user) |
125 serializer.save(updator=request.user) |
105 return Response(serializer.data, status=status.HTTP_200_OK) |
126 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
106 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
127 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
107 |
128 |
108 def delete(self, request, renkan_guid, format=None): |
129 def delete(self, request, renkan_guid, format=None): |
109 try: |
130 try: |
110 to_delete_renkan = self.get_object(renkan_guid=renkan_guid) |
131 to_delete_renkan = self.get_object(renkan_guid=renkan_guid) |
137 |
158 |
138 def post(self, request, format=None): |
159 def post(self, request, format=None): |
139 serializer = WorkspaceSerializer(data=request.data) |
160 serializer = WorkspaceSerializer(data=request.data) |
140 if serializer.is_valid(): |
161 if serializer.is_valid(): |
141 serializer.save(creator=request.user) |
162 serializer.save(creator=request.user) |
142 return Response(serializer.data, status=status.HTTP_201_CREATED) |
163 return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json') |
143 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
164 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
144 |
165 |
145 class WorkspaceDetail(APIView): |
166 class WorkspaceDetail(APIView): |
146 """ |
167 """ |
147 View for retrieving, updating or deleting a single workspace |
168 View for retrieving, updating or deleting a single workspace |
160 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
181 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
161 except Workspace.DoesNotExist: |
182 except Workspace.DoesNotExist: |
162 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
183 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
163 self.check_object_permissions(request, workspace) |
184 self.check_object_permissions(request, workspace) |
164 serializer = WorkspaceSerializer(workspace) |
185 serializer = WorkspaceSerializer(workspace) |
165 return Response(serializer.data, status=status.HTTP_200_OK) |
186 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
166 |
187 |
167 def put(self, request, workspace_guid, format=None): |
188 def put(self, request, workspace_guid, format=None): |
168 try: |
189 try: |
169 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
190 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
170 except Workspace.DoesNotExist: |
191 except Workspace.DoesNotExist: |
171 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
192 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
172 self.check_object_permissions(request, workspace) |
193 self.check_object_permissions(request, workspace) |
173 serializer = WorkspaceSerializer(workspace, data=request.data) |
194 serializer = WorkspaceSerializer(workspace, data=request.data) |
174 if serializer.is_valid(): |
195 if serializer.is_valid(): |
175 serializer.save() |
196 serializer.save() |
176 return Response(serializer.data, status=status.HTTP_200_OK) |
197 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
177 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
198 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
178 |
199 |
179 def delete(self, request, workspace_guid, format=None): |
200 def delete(self, request, workspace_guid, format=None): |
180 try: |
201 try: |
181 to_delete_workspace = self.get_object(workspace_guid=workspace_guid) |
202 to_delete_workspace = self.get_object(workspace_guid=workspace_guid) |
199 def get(self, request, renkan_guid, format=None): |
220 def get(self, request, renkan_guid, format=None): |
200 revisions = self.get_queryset(renkan_guid) |
221 revisions = self.get_queryset(renkan_guid) |
201 if not revisions: |
222 if not revisions: |
202 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
223 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
203 serializer = RevisionSerializer(revisions.all(), many=True) |
224 serializer = RevisionSerializer(revisions.all(), many=True) |
204 return Response(serializer.data, status=status.HTTP_200_OK) |
225 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
205 |
226 |
206 class RevisionDetail(APIView): |
227 class RevisionDetail(APIView): |
207 """ |
228 """ |
208 View for retrieving or deleting a single revision from a given renkan |
229 View for retrieving or deleting a single revision from a given renkan |
209 """ |
230 """ |
223 revision = revisions.get(revision_guid=revision_guid) |
244 revision = revisions.get(revision_guid=revision_guid) |
224 except Revision.DoesNotExist: |
245 except Revision.DoesNotExist: |
225 return Response({'detail': 'Revision '+revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
246 return Response({'detail': 'Revision '+revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
226 self.check_object_permissions(request, revision) |
247 self.check_object_permissions(request, revision) |
227 serializer = RevisionSerializer(revision) |
248 serializer = RevisionSerializer(revision) |
228 return Response(serializer.data, status=status.HTTP_200_OK) |
249 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
229 |
250 |
230 def delete(self, request, renkan_guid, revision_guid, format=None): |
251 def delete(self, request, renkan_guid, revision_guid, format=None): |
231 revisions = self.get_queryset(renkan_guid) |
252 revisions = self.get_queryset(renkan_guid) |
232 if not revisions: |
253 if not revisions: |
233 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
254 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |