server/python2/django/renkanmanager/api/views.py
changeset 588 95536fa18d0d
parent 587 fb0041aa74d3
--- a/server/python2/django/renkanmanager/api/views.py	Mon Jan 11 18:24:14 2016 +0100
+++ b/server/python2/django/renkanmanager/api/views.py	Tue Jan 26 17:18:04 2016 +0100
@@ -20,7 +20,7 @@
                                       CanEditWorkspace, CanDeleteWorkspace, CanCreateWorkspace, \
                                       CanDeleteRevision
 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer
-from renkanmanager.utils import LineNodePlacer, renkan_copier, renkan_deleter
+from renkanmanager.auth import CsrfExemptSessionAuthentication
 from rest_framework import permissions, status
 from rest_framework.response import Response
 from rest_framework.views import APIView
@@ -43,19 +43,26 @@
         else:
             renkans = Renkan.objects.filter(workspace_guid=workspace_guid)
         serializer = RenkanSerializer(renkans, many=True)
-        return Response(serializer.data, status=status.HTTP_200_OK)    
+        return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')    
     
     def post(self, request, workspace_guid='', format=None):
         create_data = request.data
         # 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
-        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)
+        source_renkan_guid = request.GET.get("source_renkan_guid", request.data.get("source_renkan_guid", None))
+        source_revision_guid = request.GET.get("source_revision_guid", request.data.get("source_revision_guid", None))
+        if source_renkan_guid is not None:
+            try:
+                source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid)
+            except Renkan.DoesNotExist:
+                return Response({'detail': 'Source renkan '+source_renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
+            source_revision_guid = source_renkan.current_revision_guid
         if source_revision_guid is not None:
             try:
                 source_revision=Revision.objects.get(revision_guid=source_revision_guid)
             except Revision.DoesNotExist:
                 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
             create_data["source_revision_guid"] = source_revision.revision_guid
-            create_data["title"] = source_revision.title
+            create_data["title"] = request.data.get("title", source_revision.title)
             create_data["content"] = source_revision.content
         if workspace_guid:
             try:
@@ -66,7 +73,7 @@
         serializer = RenkanSerializer(data=create_data)
         if serializer.is_valid():
             serializer.save(creator=request.user)       
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
+            return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
         
 
@@ -80,6 +87,12 @@
         CanEditRenkan,
         CanDeleteRenkan,
     )
+    authentication_classes = (
+        CsrfExemptSessionAuthentication,
+    )
+    @csrf_exempt
+    def dispatch(self, *args, **kwargs):
+        return super(RenkanDetail, self).dispatch(*args, **kwargs)
     
     def get_object(self, renkan_guid):
         return Renkan.objects.get(renkan_guid=renkan_guid)
@@ -91,7 +104,9 @@
             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
         self.check_object_permissions(request, renkan)
         serializer = RenkanSerializer(renkan)
-        return Response(serializer.data, status=status.HTTP_200_OK)
+        if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
+            return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
+        return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
     
     def put(self, request, renkan_guid, format=None):
         try:
@@ -99,10 +114,16 @@
         except Renkan.DoesNotExist:
             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
         self.check_object_permissions(request, renkan)
-        serializer = RenkanSerializer(renkan, data=request.data)
+        if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
+            put_data = {}
+            put_data["content"] = json.dumps(request.data)
+            put_data["title"] = request.data.get("title", "")
+        else: 
+            put_data = request.data
+        serializer = RenkanSerializer(renkan, data=put_data)
         if serializer.is_valid():
             serializer.save(updator=request.user)
-            return Response(serializer.data, status=status.HTTP_200_OK)
+            return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
     
     def delete(self, request, renkan_guid, format=None):
@@ -139,7 +160,7 @@
         serializer = WorkspaceSerializer(data=request.data)
         if serializer.is_valid():
             serializer.save(creator=request.user)       
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
+            return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
     
 class WorkspaceDetail(APIView):
@@ -162,7 +183,7 @@
             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
         self.check_object_permissions(request, workspace)
         serializer = WorkspaceSerializer(workspace)
-        return Response(serializer.data, status=status.HTTP_200_OK)
+        return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
     
     def put(self, request, workspace_guid, format=None):
         try:
@@ -173,7 +194,7 @@
         serializer = WorkspaceSerializer(workspace, data=request.data)
         if serializer.is_valid():
             serializer.save()       
-            return Response(serializer.data, status=status.HTTP_200_OK)
+            return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
     
     def delete(self, request, workspace_guid, format=None):
@@ -201,7 +222,7 @@
         if not revisions:
             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
         serializer = RevisionSerializer(revisions.all(), many=True)
-        return Response(serializer.data, status=status.HTTP_200_OK)
+        return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
 
 class RevisionDetail(APIView):
     """
@@ -225,7 +246,7 @@
             return Response({'detail': 'Revision '+revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
         self.check_object_permissions(request, revision)
         serializer = RevisionSerializer(revision)
-        return Response(serializer.data, status=status.HTTP_200_OK)
+        return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
     
     def delete(self, request, renkan_guid, revision_guid, format=None):
         revisions = self.get_queryset(renkan_guid)