server/python2/django/renkanmanager/api/views.py
changeset 588 95536fa18d0d
parent 587 fb0041aa74d3
equal deleted inserted replaced
587:fb0041aa74d3 588:95536fa18d0d
    18 from renkanmanager.models import Renkan, Revision, Workspace
    18 from renkanmanager.models import Renkan, Revision, Workspace
    19 from renkanmanager.permissions import CanEditRenkan, CanDeleteRenkan, CanCreateRenkan, \
    19 from renkanmanager.permissions import CanEditRenkan, CanDeleteRenkan, CanCreateRenkan, \
    20                                       CanEditWorkspace, CanDeleteWorkspace, CanCreateWorkspace, \
    20                                       CanEditWorkspace, CanDeleteWorkspace, CanCreateWorkspace, \
    21                                       CanDeleteRevision
    21                                       CanDeleteRevision
    22 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer
    22 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer
    23 from renkanmanager.utils import LineNodePlacer, renkan_copier, renkan_deleter
    23 from renkanmanager.auth import CsrfExemptSessionAuthentication
    24 from rest_framework import permissions, status
    24 from rest_framework import permissions, status
    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 
    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)    
    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         # 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
    50         # 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
    51         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)
    51         source_renkan_guid = request.GET.get("source_renkan_guid", request.data.get("source_renkan_guid", None))
       
    52         source_revision_guid = request.GET.get("source_revision_guid", request.data.get("source_revision_guid", None))
       
    53         if source_renkan_guid is not None:
       
    54             try:
       
    55                 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid)
       
    56             except Renkan.DoesNotExist:
       
    57                 return Response({'detail': 'Source renkan '+source_renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
       
    58             source_revision_guid = source_renkan.current_revision_guid
    52         if source_revision_guid is not None:
    59         if source_revision_guid is not None:
    53             try:
    60             try:
    54                 source_revision=Revision.objects.get(revision_guid=source_revision_guid)
    61                 source_revision=Revision.objects.get(revision_guid=source_revision_guid)
    55             except Revision.DoesNotExist:
    62             except Revision.DoesNotExist:
    56                 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    63                 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    57             create_data["source_revision_guid"] = source_revision.revision_guid
    64             create_data["source_revision_guid"] = source_revision.revision_guid
    58             create_data["title"] = source_revision.title
    65             create_data["title"] = request.data.get("title", source_revision.title)
    59             create_data["content"] = source_revision.content
    66             create_data["content"] = source_revision.content
    60         if workspace_guid:
    67         if workspace_guid:
    61             try:
    68             try:
    62                 workspace = Workspace.objects.get(workspace_guid=workspace_guid)
    69                 workspace = Workspace.objects.get(workspace_guid=workspace_guid)
    63             except Workspace.DoesNotExist:
    70             except Workspace.DoesNotExist:
    64                 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    71                 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    65             create_data["workspace_guid"] = workspace_guid
    72             create_data["workspace_guid"] = workspace_guid
    66         serializer = RenkanSerializer(data=create_data)
    73         serializer = RenkanSerializer(data=create_data)
    67         if serializer.is_valid():
    74         if serializer.is_valid():
    68             serializer.save(creator=request.user)       
    75             serializer.save(creator=request.user)       
    69             return Response(serializer.data, status=status.HTTP_201_CREATED)
    76             return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
    70         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    77         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    71         
    78         
    72 
    79 
    73 class RenkanDetail(APIView):
    80 class RenkanDetail(APIView):
    74     """
    81     """
    78     permission_classes = (
    85     permission_classes = (
    79         permissions.IsAuthenticatedOrReadOnly, 
    86         permissions.IsAuthenticatedOrReadOnly, 
    80         CanEditRenkan,
    87         CanEditRenkan,
    81         CanDeleteRenkan,
    88         CanDeleteRenkan,
    82     )
    89     )
       
    90     authentication_classes = (
       
    91         CsrfExemptSessionAuthentication,
       
    92     )
       
    93     @csrf_exempt
       
    94     def dispatch(self, *args, **kwargs):
       
    95         return super(RenkanDetail, self).dispatch(*args, **kwargs)
    83     
    96     
    84     def get_object(self, renkan_guid):
    97     def get_object(self, renkan_guid):
    85         return Renkan.objects.get(renkan_guid=renkan_guid)
    98         return Renkan.objects.get(renkan_guid=renkan_guid)
    86     
    99     
    87     def get(self, request, renkan_guid, format=None):
   100     def get(self, request, renkan_guid, format=None):
    89             renkan = self.get_object(renkan_guid=renkan_guid)
   102             renkan = self.get_object(renkan_guid=renkan_guid)
    90         except Renkan.DoesNotExist:
   103         except Renkan.DoesNotExist:
    91             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   104             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    92         self.check_object_permissions(request, renkan)
   105         self.check_object_permissions(request, renkan)
    93         serializer = RenkanSerializer(renkan)
   106         serializer = RenkanSerializer(renkan)
    94         return Response(serializer.data, status=status.HTTP_200_OK)
   107         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
       
   108             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
       
   109         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
    95     
   110     
    96     def put(self, request, renkan_guid, format=None):
   111     def put(self, request, renkan_guid, format=None):
    97         try:
   112         try:
    98             renkan = self.get_object(renkan_guid=renkan_guid)
   113             renkan = self.get_object(renkan_guid=renkan_guid)
    99         except Renkan.DoesNotExist:
   114         except Renkan.DoesNotExist:
   100             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   115             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   101         self.check_object_permissions(request, renkan)
   116         self.check_object_permissions(request, renkan)
   102         serializer = RenkanSerializer(renkan, data=request.data)
   117         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
       
   118             put_data = {}
       
   119             put_data["content"] = json.dumps(request.data)
       
   120             put_data["title"] = request.data.get("title", "")
       
   121         else: 
       
   122             put_data = request.data
       
   123         serializer = RenkanSerializer(renkan, data=put_data)
   103         if serializer.is_valid():
   124         if serializer.is_valid():
   104             serializer.save(updator=request.user)
   125             serializer.save(updator=request.user)
   105             return Response(serializer.data, status=status.HTTP_200_OK)
   126             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   106         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   127         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   107     
   128     
   108     def delete(self, request, renkan_guid, format=None):
   129     def delete(self, request, renkan_guid, format=None):
   109         try:
   130         try:
   110             to_delete_renkan = self.get_object(renkan_guid=renkan_guid)
   131             to_delete_renkan = self.get_object(renkan_guid=renkan_guid)
   137     
   158     
   138     def post(self, request, format=None):
   159     def post(self, request, format=None):
   139         serializer = WorkspaceSerializer(data=request.data)
   160         serializer = WorkspaceSerializer(data=request.data)
   140         if serializer.is_valid():
   161         if serializer.is_valid():
   141             serializer.save(creator=request.user)       
   162             serializer.save(creator=request.user)       
   142             return Response(serializer.data, status=status.HTTP_201_CREATED)
   163             return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
   143         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   164         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   144     
   165     
   145 class WorkspaceDetail(APIView):
   166 class WorkspaceDetail(APIView):
   146     """
   167     """
   147         View for retrieving, updating or deleting a single workspace
   168         View for retrieving, updating or deleting a single workspace
   160             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   181             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   161         except Workspace.DoesNotExist:
   182         except Workspace.DoesNotExist:
   162             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   183             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   163         self.check_object_permissions(request, workspace)
   184         self.check_object_permissions(request, workspace)
   164         serializer = WorkspaceSerializer(workspace)
   185         serializer = WorkspaceSerializer(workspace)
   165         return Response(serializer.data, status=status.HTTP_200_OK)
   186         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   166     
   187     
   167     def put(self, request, workspace_guid, format=None):
   188     def put(self, request, workspace_guid, format=None):
   168         try:
   189         try:
   169             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   190             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   170         except Workspace.DoesNotExist:
   191         except Workspace.DoesNotExist:
   171             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   192             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   172         self.check_object_permissions(request, workspace)
   193         self.check_object_permissions(request, workspace)
   173         serializer = WorkspaceSerializer(workspace, data=request.data)
   194         serializer = WorkspaceSerializer(workspace, data=request.data)
   174         if serializer.is_valid():
   195         if serializer.is_valid():
   175             serializer.save()       
   196             serializer.save()       
   176             return Response(serializer.data, status=status.HTTP_200_OK)
   197             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   177         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   198         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   178     
   199     
   179     def delete(self, request, workspace_guid, format=None):
   200     def delete(self, request, workspace_guid, format=None):
   180         try:
   201         try:
   181             to_delete_workspace = self.get_object(workspace_guid=workspace_guid)
   202             to_delete_workspace = self.get_object(workspace_guid=workspace_guid)
   199     def get(self, request, renkan_guid, format=None):
   220     def get(self, request, renkan_guid, format=None):
   200         revisions = self.get_queryset(renkan_guid)
   221         revisions = self.get_queryset(renkan_guid)
   201         if not revisions:
   222         if not revisions:
   202             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   223             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   203         serializer = RevisionSerializer(revisions.all(), many=True)
   224         serializer = RevisionSerializer(revisions.all(), many=True)
   204         return Response(serializer.data, status=status.HTTP_200_OK)
   225         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   205 
   226 
   206 class RevisionDetail(APIView):
   227 class RevisionDetail(APIView):
   207     """
   228     """
   208         View for retrieving or deleting a single revision from a given renkan
   229         View for retrieving or deleting a single revision from a given renkan
   209     """
   230     """
   223             revision = revisions.get(revision_guid=revision_guid)
   244             revision = revisions.get(revision_guid=revision_guid)
   224         except Revision.DoesNotExist:
   245         except Revision.DoesNotExist:
   225             return Response({'detail': 'Revision '+revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   246             return Response({'detail': 'Revision '+revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   226         self.check_object_permissions(request, revision)
   247         self.check_object_permissions(request, revision)
   227         serializer = RevisionSerializer(revision)
   248         serializer = RevisionSerializer(revision)
   228         return Response(serializer.data, status=status.HTTP_200_OK)
   249         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   229     
   250     
   230     def delete(self, request, renkan_guid, revision_guid, format=None):
   251     def delete(self, request, renkan_guid, revision_guid, format=None):
   231         revisions = self.get_queryset(renkan_guid)
   252         revisions = self.get_queryset(renkan_guid)
   232         if not revisions:
   253         if not revisions:
   233             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   254             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)