13 from django.core.exceptions import ObjectDoesNotExist |
13 from django.core.exceptions import ObjectDoesNotExist |
14 from django.core.urlresolvers import reverse |
14 from django.core.urlresolvers import reverse |
15 from django.http import Http404 |
15 from django.http import Http404 |
16 from django.http.response import HttpResponse, HttpResponseBadRequest |
16 from django.http.response import HttpResponse, HttpResponseBadRequest |
17 from django.shortcuts import get_object_or_404, redirect |
17 from django.shortcuts import get_object_or_404, redirect |
|
18 from django.utils import dateparse |
18 from django.views.generic import View |
19 from django.views.generic import View |
19 from django.conf import settings |
20 from django.conf import settings |
|
21 |
20 from renkanmanager.models import Renkan, Revision, Workspace |
22 from renkanmanager.models import Renkan, Revision, Workspace |
21 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer |
23 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer |
|
24 from renkanmanager.utils import parse_bool |
|
25 |
22 from rest_framework import permissions, status |
26 from rest_framework import permissions, status |
23 from rest_framework.response import Response |
27 from rest_framework.response import Response |
24 from rest_framework.views import APIView |
28 from rest_framework.views import APIView |
25 |
29 |
26 logger = logging.getLogger(__name__) |
30 logger = logging.getLogger(__name__) |
40 serializer = RenkanSerializer(renkans, many=True) |
44 serializer = RenkanSerializer(renkans, many=True) |
41 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
45 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
42 |
46 |
43 def post(self, request, workspace_guid='', format=None): |
47 def post(self, request, workspace_guid='', format=None): |
44 create_data = {key:request.data[key] for key in request.data.keys()} |
48 create_data = {key:request.data[key] for key in request.data.keys()} |
45 logger.debug("HELLO %r", create_data) |
|
46 |
49 |
47 source_renkan_guid_str = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None)) |
50 source_renkan_guid_str = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None)) |
48 source_revision_guid_str = request.GET.get("source_revision_id", request.data.get("source_revision_id", None)) |
51 source_revision_guid_str = request.GET.get("source_revision_id", request.data.get("source_revision_id", None)) |
49 try: |
52 try: |
50 source_renkan_guid = source_renkan_guid_str and uuid.UUID(source_renkan_guid_str) or None |
53 source_renkan_guid = source_renkan_guid_str and uuid.UUID(source_renkan_guid_str) or None |
67 |
70 |
68 if source_revision: |
71 if source_revision: |
69 create_data["source_revision_id"] = source_revision.revision_guid |
72 create_data["source_revision_id"] = source_revision.revision_guid |
70 create_data["title"] = request.data.get("title", source_revision.title) |
73 create_data["title"] = request.data.get("title", source_revision.title) |
71 create_data["content"] = source_revision.content |
74 create_data["content"] = source_revision.content |
72 logger.debug("SOURCE_REVISION CONTENT %r", create_data["content"]) |
|
73 |
75 |
74 try: |
76 try: |
75 workspace_guid_uuid = workspace_guid and uuid.UUID(workspace_guid) or None |
77 workspace_guid_uuid = workspace_guid and uuid.UUID(workspace_guid) or None |
76 except ValueError: |
78 except ValueError: |
77 return Response({'detail': 'workspace guid %r not correctly formatted'%workspace_guid}, status=status.HTTP_400_BAD_REQUEST) |
79 return Response({'detail': 'workspace guid %r not correctly formatted'%workspace_guid}, status=status.HTTP_400_BAD_REQUEST) |
117 except Renkan.DoesNotExist: |
119 except Renkan.DoesNotExist: |
118 return Response({'detail': 'Renkan project %r does not exist'%renkan_guid}, status=status.HTTP_404_NOT_FOUND) |
120 return Response({'detail': 'Renkan project %r does not exist'%renkan_guid}, status=status.HTTP_404_NOT_FOUND) |
119 |
121 |
120 self.check_object_permissions(request, renkan) |
122 self.check_object_permissions(request, renkan) |
121 serializer = RenkanSerializer(renkan) |
123 serializer = RenkanSerializer(renkan) |
122 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
124 if parse_bool(request.GET.get("content_only", "false")): |
123 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
125 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
124 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
126 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
125 |
127 |
126 def put(self, request, renkan_guid, format=None): |
128 def put(self, request, renkan_guid, format=None): |
127 try: |
129 try: |
132 return Response({'detail': 'Renkan project %r does not exist'%renkan_guid}, status=status.HTTP_404_NOT_FOUND) |
134 return Response({'detail': 'Renkan project %r does not exist'%renkan_guid}, status=status.HTTP_404_NOT_FOUND) |
133 logger.debug("RENKAN PUT %r : CHECKING OBJECT PERMISSION", renkan_guid) |
135 logger.debug("RENKAN PUT %r : CHECKING OBJECT PERMISSION", renkan_guid) |
134 logger.debug("RENKAN PUT: permission? %r", request.user.has_perm("change_renkan", renkan)) |
136 logger.debug("RENKAN PUT: permission? %r", request.user.has_perm("change_renkan", renkan)) |
135 self.check_object_permissions(request, renkan) |
137 self.check_object_permissions(request, renkan) |
136 logger.debug("RENKAN PUT: PERMISSION GRANTED") |
138 logger.debug("RENKAN PUT: PERMISSION GRANTED") |
137 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
139 if parse_bool(request.GET.get("content_only", "false")): |
138 put_data = {} |
140 put_data = {} |
139 put_data["content"] = json.dumps(request.data) |
141 put_data["content"] = json.dumps(request.data) |
140 put_data["title"] = request.data.get("title", "") |
142 put_data["title"] = request.data.get("title", "") |
141 else: |
143 else: |
142 put_data = request.data |
144 put_data = request.data |
143 if put_data.get("validation_timestamp", None) is None and put_data.get("content", None) is not None: |
145 validation_timestamp = request.GET.get("validation_timestamp") |
144 put_data["validation_timestamp"] = json.loads(put_data["content"]).get("updated", "") |
146 if validation_timestamp is None and put_data.get("content") is not None: |
145 serializer = RenkanSerializer(renkan, data=put_data) |
147 validation_timestamp = json.loads(put_data["content"]).get("updated", "") |
|
148 if validation_timestamp: |
|
149 validation_timestamp = dateparse.parse_datetime(validation_timestamp) |
|
150 create_new_revision = parse_bool(request.GET.get('create_new_revision', 'false')) |
|
151 serializer = RenkanSerializer(renkan, data=put_data, validation_timestamp=validation_timestamp) |
146 if serializer.is_valid(): |
152 if serializer.is_valid(): |
147 serializer.save(updator=request.user) |
153 serializer.save(updator=request.user, create_new_revision=create_new_revision) |
148 if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()): |
154 if parse_bool(request.GET.get("content_only", "false")): |
149 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
155 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json') |
150 logger.debug("RENKAN PUT: SERIALIZER DATA %r", serializer.data) |
|
151 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
156 return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json') |
152 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
157 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
153 |
158 |
154 @transaction.atomic |
159 @transaction.atomic |
155 def delete(self, request, renkan_guid, format=None): |
160 def delete(self, request, renkan_guid, format=None): |