diff -r fb0041aa74d3 -r 95536fa18d0d server/python2/django/renkanmanager/api/views.py --- 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)