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 |
29 logger = logging.getLogger(__name__) |
29 logger = logging.getLogger(__name__) |
30 |
30 |
31 class RenkanList(APIView): |
31 class RenkanList(APIView): |
32 """ |
32 """ |
33 View for listing renkans or posting new renkan |
33 View for listing renkans or posting new renkan |
34 """ |
34 """ |
35 permission_classes = ( |
35 permission_classes = ( |
36 permissions.IsAuthenticatedOrReadOnly, |
36 permissions.IsAuthenticatedOrReadOnly, |
37 CanCreateRenkan, |
37 CanCreateRenkan, |
38 ) |
38 ) |
39 |
39 |
40 def get(self, request, workspace_guid='', format=None): |
40 def get(self, request, workspace_guid='', format=None): |
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, content_type='application/json') |
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 source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None)) |
50 source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None)) |
51 source_revision_guid = request.GET.get("source_revision_id", request.data.get("source_revision_id", None)) |
51 source_revision_guid = request.GET.get("source_revision_id", request.data.get("source_revision_id", None)) |
52 if source_renkan_guid is not None: |
52 if source_renkan_guid is not None: |
67 try: |
67 try: |
68 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
68 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
69 except Workspace.DoesNotExist: |
69 except Workspace.DoesNotExist: |
70 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
70 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
71 create_data["workspace_id"] = workspace_guid |
71 create_data["workspace_id"] = workspace_guid |
72 |
72 |
73 serializer = RenkanSerializer(data=create_data) |
73 serializer = RenkanSerializer(data=create_data) |
74 if serializer.is_valid(): |
74 if serializer.is_valid(): |
75 serializer.save(creator=request.user) |
75 serializer.save(creator=request.user) |
76 return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json') |
76 return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json') |
77 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
77 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
78 |
78 |
79 |
79 |
80 class RenkanDetail(APIView): |
80 class RenkanDetail(APIView): |
81 """ |
81 """ |
82 View for retrieving, updating or deleting a single renkan |
82 View for retrieving, updating or deleting a single renkan |
83 """ |
83 """ |
84 lookup_field = "renkan_guid" |
84 lookup_field = "renkan_guid" |
85 permission_classes = ( |
85 permission_classes = ( |
86 permissions.IsAuthenticatedOrReadOnly, |
86 permissions.IsAuthenticatedOrReadOnly, |
87 CanEditRenkan, |
87 CanEditRenkan, |
88 CanDeleteRenkan, |
88 CanDeleteRenkan, |
89 ) |
89 ) |
90 authentication_classes = tuple(APIView.authentication_classes) + (CsrfExemptSessionAuthentication,) |
90 authentication_classes = tuple(APIView.authentication_classes) + (CsrfExemptSessionAuthentication,) |
91 |
91 |
92 @csrf_exempt |
92 @csrf_exempt |
93 def dispatch(self, *args, **kwargs): |
93 def dispatch(self, *args, **kwargs): |
94 return super(RenkanDetail, self).dispatch(*args, **kwargs) |
94 return super(RenkanDetail, self).dispatch(*args, **kwargs) |
95 |
95 |
96 def get_object(self, renkan_guid): |
96 def get_object(self, renkan_guid): |
97 return Renkan.objects.get(renkan_guid=renkan_guid) |
97 return Renkan.objects.get(renkan_guid=renkan_guid) |
98 |
98 |
99 def get(self, request, renkan_guid, format=None): |
99 def get(self, request, renkan_guid, format=None): |
100 try: |
100 try: |
101 renkan = self.get_object(renkan_guid=renkan_guid) |
101 renkan = self.get_object(renkan_guid=renkan_guid) |
102 except Renkan.DoesNotExist: |
102 except Renkan.DoesNotExist: |
103 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
103 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
104 self.check_object_permissions(request, renkan) |
104 self.check_object_permissions(request, renkan) |
105 serializer = RenkanSerializer(renkan) |
105 serializer = RenkanSerializer(renkan) |
106 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
106 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
107 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
107 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
108 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
108 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
109 |
109 |
110 def put(self, request, renkan_guid, format=None): |
110 def put(self, request, renkan_guid, format=None): |
111 try: |
111 try: |
112 renkan = self.get_object(renkan_guid=renkan_guid) |
112 renkan = self.get_object(renkan_guid=renkan_guid) |
113 except Renkan.DoesNotExist: |
113 except Renkan.DoesNotExist: |
114 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
114 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
115 self.check_object_permissions(request, renkan) |
115 self.check_object_permissions(request, renkan) |
116 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
116 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
117 put_data = {} |
117 put_data = {} |
118 put_data["content"] = json.dumps(request.data) |
118 put_data["content"] = json.dumps(request.data) |
119 put_data["title"] = request.data.get("title", "") |
119 put_data["title"] = request.data.get("title", "") |
120 else: |
120 else: |
121 put_data = request.data |
121 put_data = request.data |
122 serializer = RenkanSerializer(renkan, data=put_data) |
122 serializer = RenkanSerializer(renkan, data=put_data) |
123 if serializer.is_valid(): |
123 if serializer.is_valid(): |
124 serializer.save(updator=request.user) |
124 serializer.save(updator=request.user) |
125 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
125 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
126 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
126 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
127 |
127 |
128 def delete(self, request, renkan_guid, format=None): |
128 def delete(self, request, renkan_guid, format=None): |
129 try: |
129 try: |
130 to_delete_renkan = self.get_object(renkan_guid=renkan_guid) |
130 to_delete_renkan = self.get_object(renkan_guid=renkan_guid) |
131 except Renkan.DoesNotExist: |
131 except Renkan.DoesNotExist: |
132 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
132 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
147 """ |
147 """ |
148 permission_classes = ( |
148 permission_classes = ( |
149 permissions.IsAuthenticatedOrReadOnly, |
149 permissions.IsAuthenticatedOrReadOnly, |
150 CanCreateWorkspace, |
150 CanCreateWorkspace, |
151 ) |
151 ) |
152 |
152 |
153 def get(self, request, format=None): |
153 def get(self, request, format=None): |
154 workspaces = Workspace.objects.all() |
154 workspaces = Workspace.objects.all() |
155 serializer = WorkspaceSerializer(workspaces, many=True) |
155 serializer = WorkspaceSerializer(workspaces, many=True) |
156 return Response(serializer.data) |
156 return Response(serializer.data) |
157 |
157 |
158 def post(self, request, format=None): |
158 def post(self, request, format=None): |
159 serializer = WorkspaceSerializer(data=request.data) |
159 serializer = WorkspaceSerializer(data=request.data) |
160 if serializer.is_valid(): |
160 if serializer.is_valid(): |
161 serializer.save(creator=request.user) |
161 serializer.save(creator=request.user) |
162 return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json') |
162 return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json') |
163 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
163 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
164 |
164 |
165 class WorkspaceDetail(APIView): |
165 class WorkspaceDetail(APIView): |
166 """ |
166 """ |
167 View for retrieving, updating or deleting a single workspace |
167 View for retrieving, updating or deleting a single workspace |
168 """ |
168 """ |
169 permission_classes = ( |
169 permission_classes = ( |
170 permissions.IsAuthenticatedOrReadOnly, |
170 permissions.IsAuthenticatedOrReadOnly, |
171 CanEditWorkspace, |
171 CanEditWorkspace, |
172 CanDeleteWorkspace, |
172 CanDeleteWorkspace, |
173 ) |
173 ) |
174 |
174 |
175 def get_object(self, workspace_guid): |
175 def get_object(self, workspace_guid): |
176 return Workspace.objects.get(workspace_guid=workspace_guid) |
176 return Workspace.objects.get(workspace_guid=workspace_guid) |
177 |
177 |
178 def get(self, request, workspace_guid, format=None): |
178 def get(self, request, workspace_guid, format=None): |
179 try: |
179 try: |
180 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
180 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
181 except Workspace.DoesNotExist: |
181 except Workspace.DoesNotExist: |
182 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
182 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
183 self.check_object_permissions(request, workspace) |
183 self.check_object_permissions(request, workspace) |
184 serializer = WorkspaceSerializer(workspace) |
184 serializer = WorkspaceSerializer(workspace) |
185 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
185 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
186 |
186 |
187 def put(self, request, workspace_guid, format=None): |
187 def put(self, request, workspace_guid, format=None): |
188 try: |
188 try: |
189 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
189 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
190 except Workspace.DoesNotExist: |
190 except Workspace.DoesNotExist: |
191 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
191 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
192 self.check_object_permissions(request, workspace) |
192 self.check_object_permissions(request, workspace) |
193 serializer = WorkspaceSerializer(workspace, data=request.data) |
193 serializer = WorkspaceSerializer(workspace, data=request.data) |
194 if serializer.is_valid(): |
194 if serializer.is_valid(): |
195 serializer.save() |
195 serializer.save() |
196 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
196 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
197 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
197 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
198 |
198 |
199 def delete(self, request, workspace_guid, format=None): |
199 def delete(self, request, workspace_guid, format=None): |
200 try: |
200 try: |
201 to_delete_workspace = self.get_object(workspace_guid=workspace_guid) |
201 to_delete_workspace = self.get_object(workspace_guid=workspace_guid) |
202 except Workspace.DoesNotExist: |
202 except Workspace.DoesNotExist: |
203 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
203 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |