server/python/django2/renkanmanager/api/views.py
changeset 610 b9edc1c1538a
parent 608 8fd40139827c
child 611 f0f07e2b841f
equal deleted inserted replaced
609:854a027c80ff 610:b9edc1c1538a
     7 from datetime import datetime
     7 from datetime import datetime
     8 import json
     8 import json
     9 import logging
     9 import logging
    10 import uuid
    10 import uuid
    11 
    11 
       
    12 from django.db import transaction
    12 from django.core.urlresolvers import reverse
    13 from django.core.urlresolvers import reverse
    13 from django.http import Http404
    14 from django.http import Http404
    14 from django.http.response import HttpResponse, HttpResponseBadRequest
    15 from django.http.response import HttpResponse, HttpResponseBadRequest
    15 from django.shortcuts import get_object_or_404, redirect
    16 from django.shortcuts import get_object_or_404, redirect
    16 from django.views.generic import View
    17 from django.views.generic import View
    32     
    33     
    33     def get(self, request, workspace_guid='', format=None):
    34     def get(self, request, workspace_guid='', format=None):
    34         if workspace_guid == '':
    35         if workspace_guid == '':
    35             renkans = self.queryset.all()
    36             renkans = self.queryset.all()
    36         else:
    37         else:
    37             renkans = self.queryset.filter(workspace_guid=workspace_guid)
    38             renkans = self.queryset.filter(workspace__workspace_guid=workspace_guid)
    38         serializer = RenkanSerializer(renkans, many=True)
    39         serializer = RenkanSerializer(renkans, many=True)
    39         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')    
    40         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')    
    40     
    41     
    41     def post(self, request, workspace_guid='', format=None):
    42     def post(self, request, workspace_guid='', format=None):
    42         create_data = {key:request.data[key] for key in request.data.keys()}
    43         create_data = {key:request.data[key] for key in request.data.keys()}
    45         if source_renkan_guid is not None:
    46         if source_renkan_guid is not None:
    46             try:
    47             try:
    47                 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid)
    48                 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid)
    48             except Renkan.DoesNotExist:
    49             except Renkan.DoesNotExist:
    49                 return Response({'detail': 'Source renkan '+source_renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    50                 return Response({'detail': 'Source renkan '+source_renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    50             source_revision_guid = source_renkan.current_revision_guid
    51             source_revision_guid = source_renkan.current_revision.revision_guid
    51         if source_revision_guid is not None:
    52         if source_revision_guid is not None:
    52             try:
    53             try:
    53                 source_revision=Revision.objects.get(revision_guid=source_revision_guid)
    54                 source_revision=Revision.objects.get(revision_guid=source_revision_guid)
    54             except Revision.DoesNotExist:
    55             except Revision.DoesNotExist:
    55                 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    56                 return Response({'detail': 'Source revision '+source_revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    60             try:
    61             try:
    61                 workspace = Workspace.objects.get(workspace_guid=workspace_guid)
    62                 workspace = Workspace.objects.get(workspace_guid=workspace_guid)
    62             except Workspace.DoesNotExist:
    63             except Workspace.DoesNotExist:
    63                 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    64                 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    64             create_data["workspace_id"] = workspace_guid
    65             create_data["workspace_id"] = workspace_guid
    65         
       
    66         serializer = RenkanSerializer(data=create_data)
    66         serializer = RenkanSerializer(data=create_data)
    67         if serializer.is_valid():
    67         if serializer.is_valid():
    68             serializer.save(creator=request.user)       
    68             serializer.save(creator=request.user)     
    69             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')
    70         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    70         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    71         
    71         
    72 
    72 
    73 class RenkanDetail(APIView):
    73 class RenkanDetail(APIView):
    79     
    79     
    80     def get_object(self, renkan_guid):
    80     def get_object(self, renkan_guid):
    81         return self.queryset.get(renkan_guid=renkan_guid)
    81         return self.queryset.get(renkan_guid=renkan_guid)
    82     
    82     
    83     def dispatch(self, *args, **kwargs):
    83     def dispatch(self, *args, **kwargs):
    84         logger.debug("TEST 1 21 12 TEST")
       
    85         return super(RenkanDetail, self).dispatch(*args, **kwargs)
    84         return super(RenkanDetail, self).dispatch(*args, **kwargs)
    86     
    85     
    87     def get(self, request, renkan_guid, format=None):
    86     def get(self, request, renkan_guid, format=None):
    88         try:
    87         try:
    89             renkan = self.get_object(renkan_guid=renkan_guid)
    88             renkan = self.get_object(renkan_guid=renkan_guid)
    90         except Renkan.DoesNotExist:
    89         except Renkan.DoesNotExist:
    91             return Response({'detail': 'Renkan project %r does not exist'.format(renkan_guid)}, status=status.HTTP_404_NOT_FOUND)
    90             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))
       
    94         self.check_object_permissions(request, renkan)
    91         self.check_object_permissions(request, renkan)
    95         logger.debug("RENKAN GET: PERMISSION GRANTED")
       
    96         serializer = RenkanSerializer(renkan)
    92         serializer = RenkanSerializer(renkan)
    97         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
    93         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
    98             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
    94             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
    99         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
    95         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   100 
    96 
   117         if serializer.is_valid():
   113         if serializer.is_valid():
   118             serializer.save(updator=request.user)
   114             serializer.save(updator=request.user)
   119             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   115             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   120         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   116         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   121 
   117 
       
   118     @transaction.atomic
   122     def delete(self, request, renkan_guid, format=None):
   119     def delete(self, request, renkan_guid, format=None):
   123         try:
   120         try:
   124             to_delete_renkan = self.get_object(renkan_guid=renkan_guid)
   121             to_delete_renkan = self.get_object(renkan_guid=renkan_guid)
   125         except Renkan.DoesNotExist:
   122         except Renkan.DoesNotExist:
   126             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   123             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   127         self.check_object_permissions(request, to_delete_renkan)
   124         self.check_object_permissions(request, to_delete_renkan)
   128         renkan_revisions = Revision.objects.filter(parent_renkan_guid = to_delete_renkan.renkan_guid)
       
   129         for child_revision in renkan_revisions:
       
   130             # Deleting reference to revision in renkans copied from this revision
       
   131             for related_renkan in self.queryset.filter(source_revision_guid=child_revision.revision_guid):
       
   132                 related_renkan.source_revision_guid = ''
       
   133                 related_renkan.save()
       
   134             child_revision.delete()
       
   135         to_delete_renkan.delete()
   125         to_delete_renkan.delete()
   136         return Response(status=status.HTTP_204_NO_CONTENT)
   126         return Response(status=status.HTTP_204_NO_CONTENT)
   137 
   127 
   138 class WorkspaceList(APIView):
   128 class WorkspaceList(APIView):
   139     """
   129     """
   202         View for listing revisions from a given renkan
   192         View for listing revisions from a given renkan
   203     """
   193     """
   204     
   194     
   205     def get_queryset(self, renkan_guid=""):
   195     def get_queryset(self, renkan_guid=""):
   206         if renkan_guid:
   196         if renkan_guid:
   207             return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   197             return Revision.objects.filter(parent_renkan__renkan_guid=renkan_guid)
   208         else:
   198         else:
   209             return Revision.objects
   199             return Revision.objects
   210     
   200     
   211     def get(self, request, renkan_guid, format=None):
   201     def get(self, request, renkan_guid, format=None):
   212         revisions = self.get_queryset(renkan_guid)
   202         revisions = self.get_queryset(renkan_guid)
   222     
   212     
   223     lookup_field = "revision_guid"
   213     lookup_field = "revision_guid"
   224     
   214     
   225     def get_queryset(self, renkan_guid=""):
   215     def get_queryset(self, renkan_guid=""):
   226         if renkan_guid:
   216         if renkan_guid:
   227             return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   217             return Revision.objects.filter(parent_renkan__renkan_guid=renkan_guid)
   228         else:
   218         else:
   229             return Revision.objects
   219             return Revision.objects
   230     
   220     
   231     def get(self, request, renkan_guid, revision_guid, format=None):
   221     def get(self, request, renkan_guid, revision_guid, format=None):
   232         revisions = self.get_queryset(renkan_guid)
   222         revisions = self.get_queryset(renkan_guid)
   251         self.check_object_permissions(request, revision)
   241         self.check_object_permissions(request, revision)
   252         if revisions.count() == 1:
   242         if revisions.count() == 1:
   253             return Response({'detail': 'You cannot delete the last remaining revision of a renkan from the Revision API. Try deleting the parent Renkan with the Renkan API'}, status=status.HTTP_400_BAD_REQUEST)
   243             return Response({'detail': 'You cannot delete the last remaining revision of a renkan from the Revision API. Try deleting the parent Renkan with the Renkan API'}, status=status.HTTP_400_BAD_REQUEST)
   254         if revision.is_current_revision:
   244         if revision.is_current_revision:
   255             return Response({'detail': 'You cannot delete the current revision of a renkan from the Revision API.'}, status=status.HTTP_400_BAD_REQUEST)
   245             return Response({'detail': 'You cannot delete the current revision of a renkan from the Revision API.'}, status=status.HTTP_400_BAD_REQUEST)
   256 
       
   257         # Deleting reference to revision in renkans copied from this revision
       
   258         for related_renkan in Renkan.objects.filter(source_revision_guid=revision_guid):
       
   259             related_renkan.source_revision_guid = ''
       
   260             related_renkan.save()
       
   261         revision.delete()
   246         revision.delete()
   262         return Response(status=status.HTTP_204_NO_CONTENT)
   247         return Response(status=status.HTTP_204_NO_CONTENT)