11 |
11 |
12 from django.core.urlresolvers import reverse |
12 from django.core.urlresolvers import reverse |
13 from django.http import Http404 |
13 from django.http import Http404 |
14 from django.http.response import HttpResponse, HttpResponseBadRequest |
14 from django.http.response import HttpResponse, HttpResponseBadRequest |
15 from django.shortcuts import get_object_or_404, redirect |
15 from django.shortcuts import get_object_or_404, redirect |
16 from django.views.decorators.csrf import csrf_exempt |
|
17 from django.views.generic import View |
16 from django.views.generic import View |
|
17 from django.conf import settings |
18 from renkanmanager.models import Renkan, Revision, Workspace |
18 from renkanmanager.models import Renkan, Revision, Workspace |
19 from renkanmanager.permissions import CanEditRenkan, CanDeleteRenkan, CanCreateRenkan, \ |
|
20 CanEditWorkspace, CanDeleteWorkspace, CanCreateWorkspace, \ |
|
21 CanDeleteRevision |
|
22 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer |
19 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer |
23 from rest_framework import permissions, status |
20 from rest_framework import permissions, status |
24 from rest_framework.response import Response |
21 from rest_framework.response import Response |
25 from rest_framework.views import APIView |
22 from rest_framework.views import APIView |
26 |
23 |
27 |
|
28 logger = logging.getLogger(__name__) |
24 logger = logging.getLogger(__name__) |
29 |
25 |
30 class RenkanList(APIView): |
26 class RenkanList(APIView): |
31 """ |
27 """ |
32 View for listing renkans or posting new renkan |
28 View for listing renkans or posting new renkan |
33 """ |
29 """ |
34 permission_classes = ( |
30 |
35 permissions.IsAuthenticatedOrReadOnly, |
31 queryset = Renkan.objects |
36 CanCreateRenkan, |
32 |
37 ) |
|
38 |
|
39 def get(self, request, workspace_guid='', format=None): |
33 def get(self, request, workspace_guid='', format=None): |
40 if workspace_guid == '': |
34 if workspace_guid == '': |
41 renkans = Renkan.objects.all() |
35 renkans = self.queryset.all() |
42 else: |
36 else: |
43 renkans = Renkan.objects.filter(workspace_guid=workspace_guid) |
37 renkans = self.queryset.filter(workspace_guid=workspace_guid) |
44 serializer = RenkanSerializer(renkans, many=True) |
38 serializer = RenkanSerializer(renkans, many=True) |
45 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
39 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
46 |
40 |
47 def post(self, request, workspace_guid='', format=None): |
41 def post(self, request, workspace_guid='', format=None): |
48 create_data = request.data |
42 create_data = {key:request.data[key] for key in request.data.keys()} |
49 source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None)) |
43 source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None)) |
50 source_revision_guid = request.GET.get("source_revision_id", request.data.get("source_revision_id", None)) |
44 source_revision_guid = request.GET.get("source_revision_id", request.data.get("source_revision_id", None)) |
51 if source_renkan_guid is not None: |
45 if source_renkan_guid is not None: |
52 try: |
46 try: |
53 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid) |
47 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid) |
66 try: |
60 try: |
67 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
61 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
68 except Workspace.DoesNotExist: |
62 except Workspace.DoesNotExist: |
69 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
63 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
70 create_data["workspace_id"] = workspace_guid |
64 create_data["workspace_id"] = workspace_guid |
71 |
65 |
72 serializer = RenkanSerializer(data=create_data) |
66 serializer = RenkanSerializer(data=create_data) |
73 if serializer.is_valid(): |
67 if serializer.is_valid(): |
74 serializer.save(creator=request.user) |
68 serializer.save(creator=request.user) |
75 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') |
76 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
70 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
77 |
71 |
78 |
72 |
79 class RenkanDetail(APIView): |
73 class RenkanDetail(APIView): |
80 """ |
74 """ |
81 View for retrieving, updating or deleting a single renkan |
75 View for retrieving, updating or deleting a single renkan |
82 """ |
76 """ |
83 lookup_field = "renkan_guid" |
77 lookup_field = "renkan_guid" |
84 permission_classes = ( |
78 queryset = Renkan.objects |
85 permissions.IsAuthenticatedOrReadOnly, |
79 |
86 CanEditRenkan, |
80 def get_object(self, renkan_guid): |
87 CanDeleteRenkan, |
81 return self.queryset.get(renkan_guid=renkan_guid) |
88 ) |
82 |
89 |
|
90 @csrf_exempt |
|
91 def dispatch(self, *args, **kwargs): |
83 def dispatch(self, *args, **kwargs): |
|
84 logger.debug("TEST 1 21 12 TEST") |
92 return super(RenkanDetail, self).dispatch(*args, **kwargs) |
85 return super(RenkanDetail, self).dispatch(*args, **kwargs) |
93 |
86 |
94 def get_object(self, renkan_guid): |
|
95 return Renkan.objects.get(renkan_guid=renkan_guid) |
|
96 |
|
97 def get(self, request, renkan_guid, format=None): |
87 def get(self, request, renkan_guid, format=None): |
98 try: |
88 try: |
99 renkan = self.get_object(renkan_guid=renkan_guid) |
89 renkan = self.get_object(renkan_guid=renkan_guid) |
100 except Renkan.DoesNotExist: |
90 except Renkan.DoesNotExist: |
101 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
91 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)) |
102 self.check_object_permissions(request, renkan) |
94 self.check_object_permissions(request, renkan) |
|
95 logger.debug("RENKAN GET: PERMISSION GRANTED") |
103 serializer = RenkanSerializer(renkan) |
96 serializer = RenkanSerializer(renkan) |
104 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
97 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
105 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
98 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
106 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
99 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
107 |
100 |
108 def put(self, request, renkan_guid, format=None): |
101 def put(self, request, renkan_guid, format=None): |
109 try: |
102 try: |
110 renkan = self.get_object(renkan_guid=renkan_guid) |
103 renkan = self.get_object(renkan_guid=renkan_guid) |
111 except Renkan.DoesNotExist: |
104 except Renkan.DoesNotExist: |
112 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
105 return Response({'detail': 'Renkan project %r does not exist'.format(renkan_guid)}, status=status.HTTP_404_NOT_FOUND) |
|
106 logger.debug("RENKAN PUT %r : CHECKING OBJECT PERMISSION", renkan_guid) |
|
107 logger.debug("RENKAN PUT: permission? %r", request.user.has_perm("change_renkan", renkan)) |
113 self.check_object_permissions(request, renkan) |
108 self.check_object_permissions(request, renkan) |
|
109 logger.debug("RENKAN PUT: PERMISSION GRANTED") |
114 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
110 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
115 put_data = {} |
111 put_data = {} |
116 put_data["content"] = json.dumps(request.data) |
112 put_data["content"] = json.dumps(request.data) |
117 put_data["title"] = request.data.get("title", "") |
113 put_data["title"] = request.data.get("title", "") |
118 else: |
114 else: |
130 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
126 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
131 self.check_object_permissions(request, to_delete_renkan) |
127 self.check_object_permissions(request, to_delete_renkan) |
132 renkan_revisions = Revision.objects.filter(parent_renkan_guid = to_delete_renkan.renkan_guid) |
128 renkan_revisions = Revision.objects.filter(parent_renkan_guid = to_delete_renkan.renkan_guid) |
133 for child_revision in renkan_revisions: |
129 for child_revision in renkan_revisions: |
134 # Deleting reference to revision in renkans copied from this revision |
130 # Deleting reference to revision in renkans copied from this revision |
135 for related_renkan in Renkan.objects.filter(source_revision_guid=child_revision.revision_guid): |
131 for related_renkan in self.queryset.filter(source_revision_guid=child_revision.revision_guid): |
136 related_renkan.source_revision_guid = '' |
132 related_renkan.source_revision_guid = '' |
137 related_renkan.save() |
133 related_renkan.save() |
138 child_revision.delete() |
134 child_revision.delete() |
139 to_delete_renkan.delete() |
135 to_delete_renkan.delete() |
140 return Response(status=status.HTTP_204_NO_CONTENT) |
136 return Response(status=status.HTTP_204_NO_CONTENT) |
141 |
137 |
142 class WorkspaceList(APIView): |
138 class WorkspaceList(APIView): |
143 """ |
139 """ |
144 View for listing workspaces or creating new workspace |
140 View for listing workspaces or creating new workspace |
145 """ |
141 """ |
146 permission_classes = ( |
142 |
147 permissions.IsAuthenticatedOrReadOnly, |
143 queryset = Workspace.objects |
148 CanCreateWorkspace, |
144 |
149 ) |
|
150 |
|
151 def get(self, request, format=None): |
145 def get(self, request, format=None): |
152 workspaces = Workspace.objects.all() |
146 workspaces = self.queryset.all() |
153 serializer = WorkspaceSerializer(workspaces, many=True) |
147 serializer = WorkspaceSerializer(workspaces, many=True) |
154 return Response(serializer.data) |
148 return Response(serializer.data) |
155 |
149 |
156 def post(self, request, format=None): |
150 def post(self, request, format=None): |
157 serializer = WorkspaceSerializer(data=request.data) |
151 serializer = WorkspaceSerializer(data=request.data) |
162 |
156 |
163 class WorkspaceDetail(APIView): |
157 class WorkspaceDetail(APIView): |
164 """ |
158 """ |
165 View for retrieving, updating or deleting a single workspace |
159 View for retrieving, updating or deleting a single workspace |
166 """ |
160 """ |
167 permission_classes = ( |
161 |
168 permissions.IsAuthenticatedOrReadOnly, |
162 lookup_field = "workspace_guid" |
169 CanEditWorkspace, |
163 queryset = Workspace.objects |
170 CanDeleteWorkspace, |
164 |
171 ) |
|
172 |
|
173 def get_object(self, workspace_guid): |
165 def get_object(self, workspace_guid): |
174 return Workspace.objects.get(workspace_guid=workspace_guid) |
166 return self.queryset.get(workspace_guid=workspace_guid) |
175 |
167 |
176 def get(self, request, workspace_guid, format=None): |
168 def get(self, request, workspace_guid, format=None): |
177 try: |
169 try: |
178 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
170 workspace = self.get_object(workspace_guid=workspace_guid) |
179 except Workspace.DoesNotExist: |
171 except Workspace.DoesNotExist: |
180 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
172 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
181 self.check_object_permissions(request, workspace) |
173 self.check_object_permissions(request, workspace) |
182 serializer = WorkspaceSerializer(workspace) |
174 serializer = WorkspaceSerializer(workspace) |
183 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
175 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
184 |
176 |
185 def put(self, request, workspace_guid, format=None): |
177 def put(self, request, workspace_guid, format=None): |
186 try: |
178 try: |
187 workspace = Workspace.objects.get(workspace_guid=workspace_guid) |
179 workspace = self.get_object(workspace_guid=workspace_guid) |
188 except Workspace.DoesNotExist: |
180 except Workspace.DoesNotExist: |
189 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
181 return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND) |
190 self.check_object_permissions(request, workspace) |
182 self.check_object_permissions(request, workspace) |
191 serializer = WorkspaceSerializer(workspace, data=request.data) |
183 serializer = WorkspaceSerializer(workspace, data=request.data) |
192 if serializer.is_valid(): |
184 if serializer.is_valid(): |
207 |
199 |
208 class RevisionList(APIView): |
200 class RevisionList(APIView): |
209 """ |
201 """ |
210 View for listing revisions from a given renkan |
202 View for listing revisions from a given renkan |
211 """ |
203 """ |
212 permission_classes = (permissions.IsAuthenticatedOrReadOnly,) |
204 |
213 |
205 def get_queryset(self, renkan_guid=""): |
214 def get_queryset(self, renkan_guid): |
206 if renkan_guid: |
215 return Revision.objects.filter(parent_renkan_guid=renkan_guid) |
207 return Revision.objects.filter(parent_renkan_guid=renkan_guid) |
216 |
208 else: |
|
209 return Revision.objects |
|
210 |
217 def get(self, request, renkan_guid, format=None): |
211 def get(self, request, renkan_guid, format=None): |
218 revisions = self.get_queryset(renkan_guid) |
212 revisions = self.get_queryset(renkan_guid) |
219 if not revisions: |
213 if not revisions: |
220 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
214 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
221 serializer = RevisionSerializer(revisions.all(), many=True) |
215 serializer = RevisionSerializer(revisions.all(), many=True) |
223 |
217 |
224 class RevisionDetail(APIView): |
218 class RevisionDetail(APIView): |
225 """ |
219 """ |
226 View for retrieving or deleting a single revision from a given renkan |
220 View for retrieving or deleting a single revision from a given renkan |
227 """ |
221 """ |
228 permission_classes = ( |
222 |
229 permissions.IsAuthenticatedOrReadOnly, |
223 lookup_field = "revision_guid" |
230 CanDeleteRevision, |
224 |
231 ) |
225 def get_queryset(self, renkan_guid=""): |
232 |
226 if renkan_guid: |
233 def get_queryset(self, renkan_guid): |
227 return Revision.objects.filter(parent_renkan_guid=renkan_guid) |
234 return Revision.objects.filter(parent_renkan_guid=renkan_guid) |
228 else: |
235 |
229 return Revision.objects |
|
230 |
236 def get(self, request, renkan_guid, revision_guid, format=None): |
231 def get(self, request, renkan_guid, revision_guid, format=None): |
237 revisions = self.get_queryset(renkan_guid) |
232 revisions = self.get_queryset(renkan_guid) |
238 if not revisions: |
233 if not revisions: |
239 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
234 return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND) |
240 try: |
235 try: |