server/python/django2/renkanmanager/api/views.py
changeset 608 8fd40139827c
parent 602 fa80b0104695
child 610 b9edc1c1538a
equal deleted inserted replaced
607:d55e89c25d51 608:8fd40139827c
    11 
    11 
    12 from django.core.urlresolvers import reverse
    12 from django.core.urlresolvers import reverse
    13 from django.http import Http404
    13 from django.http import Http404
    14 from django.http.response import HttpResponse, HttpResponseBadRequest
    14 from django.http.response import HttpResponse, HttpResponseBadRequest
    15 from django.shortcuts import get_object_or_404, redirect
    15 from django.shortcuts import get_object_or_404, redirect
    16 from django.views.decorators.csrf import csrf_exempt
       
    17 from django.views.generic import View
    16 from django.views.generic import View
       
    17 from django.conf import settings
    18 from renkanmanager.models import Renkan, Revision, Workspace
    18 from renkanmanager.models import Renkan, Revision, Workspace
    19 from renkanmanager.permissions import CanEditRenkan, CanDeleteRenkan, CanCreateRenkan, \
       
    20                                       CanEditWorkspace, CanDeleteWorkspace, CanCreateWorkspace, \
       
    21                                       CanDeleteRevision
       
    22 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer
    19 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer
    23 from rest_framework import permissions, status
    20 from rest_framework import permissions, status
    24 from rest_framework.response import Response
    21 from rest_framework.response import Response
    25 from rest_framework.views import APIView
    22 from rest_framework.views import APIView
    26 
    23 
    27 
       
    28 logger = logging.getLogger(__name__)
    24 logger = logging.getLogger(__name__)
    29 
    25            
    30 class RenkanList(APIView):
    26 class RenkanList(APIView):
    31     """
    27     """
    32         View for listing renkans or posting new renkan
    28         View for listing renkans or posting new renkan
    33     """
    29     """
    34     permission_classes = (
    30     
    35         permissions.IsAuthenticatedOrReadOnly,
    31     queryset = Renkan.objects
    36         CanCreateRenkan,
    32     
    37     )
       
    38 
       
    39     def get(self, request, workspace_guid='', format=None):
    33     def get(self, request, workspace_guid='', format=None):
    40         if workspace_guid == '':
    34         if workspace_guid == '':
    41             renkans = Renkan.objects.all()
    35             renkans = self.queryset.all()
    42         else:
    36         else:
    43             renkans = Renkan.objects.filter(workspace_guid=workspace_guid)
    37             renkans = self.queryset.filter(workspace_guid=workspace_guid)
    44         serializer = RenkanSerializer(renkans, many=True)
    38         serializer = RenkanSerializer(renkans, many=True)
    45         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
    39         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')    
    46 
    40     
    47     def post(self, request, workspace_guid='', format=None):
    41     def post(self, request, workspace_guid='', format=None):
    48         create_data = request.data
    42         create_data = {key:request.data[key] for key in request.data.keys()}
    49         source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None))
    43         source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None))
    50         source_revision_guid = request.GET.get("source_revision_id", request.data.get("source_revision_id", None))
    44         source_revision_guid = request.GET.get("source_revision_id", request.data.get("source_revision_id", None))
    51         if source_renkan_guid is not None:
    45         if source_renkan_guid is not None:
    52             try:
    46             try:
    53                 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid)
    47                 source_renkan=Renkan.objects.get(renkan_guid=source_renkan_guid)
    66             try:
    60             try:
    67                 workspace = Workspace.objects.get(workspace_guid=workspace_guid)
    61                 workspace = Workspace.objects.get(workspace_guid=workspace_guid)
    68             except Workspace.DoesNotExist:
    62             except Workspace.DoesNotExist:
    69                 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    63                 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    70             create_data["workspace_id"] = workspace_guid
    64             create_data["workspace_id"] = workspace_guid
    71 
    65         
    72         serializer = RenkanSerializer(data=create_data)
    66         serializer = RenkanSerializer(data=create_data)
    73         if serializer.is_valid():
    67         if serializer.is_valid():
    74             serializer.save(creator=request.user)
    68             serializer.save(creator=request.user)       
    75             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')
    76         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    70         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    77 
    71         
    78 
    72 
    79 class RenkanDetail(APIView):
    73 class RenkanDetail(APIView):
    80     """
    74     """
    81         View for retrieving, updating or deleting a single renkan
    75         View for retrieving, updating or deleting a single renkan
    82     """
    76     """
    83     lookup_field = "renkan_guid"
    77     lookup_field = "renkan_guid"
    84     permission_classes = (
    78     queryset = Renkan.objects
    85         permissions.IsAuthenticatedOrReadOnly,
    79     
    86         CanEditRenkan,
    80     def get_object(self, renkan_guid):
    87         CanDeleteRenkan,
    81         return self.queryset.get(renkan_guid=renkan_guid)
    88     )
    82     
    89 
       
    90     @csrf_exempt
       
    91     def dispatch(self, *args, **kwargs):
    83     def dispatch(self, *args, **kwargs):
       
    84         logger.debug("TEST 1 21 12 TEST")
    92         return super(RenkanDetail, self).dispatch(*args, **kwargs)
    85         return super(RenkanDetail, self).dispatch(*args, **kwargs)
    93 
    86     
    94     def get_object(self, renkan_guid):
       
    95         return Renkan.objects.get(renkan_guid=renkan_guid)
       
    96 
       
    97     def get(self, request, renkan_guid, format=None):
    87     def get(self, request, renkan_guid, format=None):
    98         try:
    88         try:
    99             renkan = self.get_object(renkan_guid=renkan_guid)
    89             renkan = self.get_object(renkan_guid=renkan_guid)
   100         except Renkan.DoesNotExist:
    90         except Renkan.DoesNotExist:
   101             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    91             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))
   102         self.check_object_permissions(request, renkan)
    94         self.check_object_permissions(request, renkan)
       
    95         logger.debug("RENKAN GET: PERMISSION GRANTED")
   103         serializer = RenkanSerializer(renkan)
    96         serializer = RenkanSerializer(renkan)
   104         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
    97         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   105             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
    98             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
   106         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
    99         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   107 
   100 
   108     def put(self, request, renkan_guid, format=None):
   101     def put(self, request, renkan_guid, format=None):
   109         try:
   102         try:
   110             renkan = self.get_object(renkan_guid=renkan_guid)
   103             renkan = self.get_object(renkan_guid=renkan_guid)
   111         except Renkan.DoesNotExist:
   104         except Renkan.DoesNotExist:
   112             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   105             return Response({'detail': 'Renkan project %r does not exist'.format(renkan_guid)}, status=status.HTTP_404_NOT_FOUND)
       
   106         logger.debug("RENKAN PUT %r : CHECKING OBJECT PERMISSION", renkan_guid)
       
   107         logger.debug("RENKAN PUT: permission? %r", request.user.has_perm("change_renkan", renkan))
   113         self.check_object_permissions(request, renkan)
   108         self.check_object_permissions(request, renkan)
       
   109         logger.debug("RENKAN PUT: PERMISSION GRANTED")
   114         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   110         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   115             put_data = {}
   111             put_data = {}
   116             put_data["content"] = json.dumps(request.data)
   112             put_data["content"] = json.dumps(request.data)
   117             put_data["title"] = request.data.get("title", "")
   113             put_data["title"] = request.data.get("title", "")
   118         else:
   114         else:
   130             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   126             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   131         self.check_object_permissions(request, to_delete_renkan)
   127         self.check_object_permissions(request, to_delete_renkan)
   132         renkan_revisions = Revision.objects.filter(parent_renkan_guid = to_delete_renkan.renkan_guid)
   128         renkan_revisions = Revision.objects.filter(parent_renkan_guid = to_delete_renkan.renkan_guid)
   133         for child_revision in renkan_revisions:
   129         for child_revision in renkan_revisions:
   134             # Deleting reference to revision in renkans copied from this revision
   130             # Deleting reference to revision in renkans copied from this revision
   135             for related_renkan in Renkan.objects.filter(source_revision_guid=child_revision.revision_guid):
   131             for related_renkan in self.queryset.filter(source_revision_guid=child_revision.revision_guid):
   136                 related_renkan.source_revision_guid = ''
   132                 related_renkan.source_revision_guid = ''
   137                 related_renkan.save()
   133                 related_renkan.save()
   138             child_revision.delete()
   134             child_revision.delete()
   139         to_delete_renkan.delete()
   135         to_delete_renkan.delete()
   140         return Response(status=status.HTTP_204_NO_CONTENT)
   136         return Response(status=status.HTTP_204_NO_CONTENT)
   141 
   137 
   142 class WorkspaceList(APIView):
   138 class WorkspaceList(APIView):
   143     """
   139     """
   144         View for listing workspaces or creating new workspace
   140         View for listing workspaces or creating new workspace
   145     """
   141     """
   146     permission_classes = (
   142     
   147         permissions.IsAuthenticatedOrReadOnly,
   143     queryset = Workspace.objects
   148         CanCreateWorkspace,
   144     
   149     )
       
   150 
       
   151     def get(self, request, format=None):
   145     def get(self, request, format=None):
   152         workspaces = Workspace.objects.all()
   146         workspaces = self.queryset.all()
   153         serializer = WorkspaceSerializer(workspaces, many=True)
   147         serializer = WorkspaceSerializer(workspaces, many=True)
   154         return Response(serializer.data)
   148         return Response(serializer.data)
   155 
   149 
   156     def post(self, request, format=None):
   150     def post(self, request, format=None):
   157         serializer = WorkspaceSerializer(data=request.data)
   151         serializer = WorkspaceSerializer(data=request.data)
   162 
   156 
   163 class WorkspaceDetail(APIView):
   157 class WorkspaceDetail(APIView):
   164     """
   158     """
   165         View for retrieving, updating or deleting a single workspace
   159         View for retrieving, updating or deleting a single workspace
   166     """
   160     """
   167     permission_classes = (
   161     
   168         permissions.IsAuthenticatedOrReadOnly,
   162     lookup_field = "workspace_guid"
   169         CanEditWorkspace,
   163     queryset = Workspace.objects
   170         CanDeleteWorkspace,
   164     
   171     )
       
   172 
       
   173     def get_object(self, workspace_guid):
   165     def get_object(self, workspace_guid):
   174         return Workspace.objects.get(workspace_guid=workspace_guid)
   166         return self.queryset.get(workspace_guid=workspace_guid)
   175 
   167     
   176     def get(self, request, workspace_guid, format=None):
   168     def get(self, request, workspace_guid, format=None):
   177         try:
   169         try:
   178             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   170             workspace = self.get_object(workspace_guid=workspace_guid)
   179         except Workspace.DoesNotExist:
   171         except Workspace.DoesNotExist:
   180             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   172             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   181         self.check_object_permissions(request, workspace)
   173         self.check_object_permissions(request, workspace)
   182         serializer = WorkspaceSerializer(workspace)
   174         serializer = WorkspaceSerializer(workspace)
   183         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   175         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   184 
   176 
   185     def put(self, request, workspace_guid, format=None):
   177     def put(self, request, workspace_guid, format=None):
   186         try:
   178         try:
   187             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   179             workspace = self.get_object(workspace_guid=workspace_guid)
   188         except Workspace.DoesNotExist:
   180         except Workspace.DoesNotExist:
   189             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   181             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   190         self.check_object_permissions(request, workspace)
   182         self.check_object_permissions(request, workspace)
   191         serializer = WorkspaceSerializer(workspace, data=request.data)
   183         serializer = WorkspaceSerializer(workspace, data=request.data)
   192         if serializer.is_valid():
   184         if serializer.is_valid():
   207 
   199 
   208 class RevisionList(APIView):
   200 class RevisionList(APIView):
   209     """
   201     """
   210         View for listing revisions from a given renkan
   202         View for listing revisions from a given renkan
   211     """
   203     """
   212     permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
   204     
   213 
   205     def get_queryset(self, renkan_guid=""):
   214     def get_queryset(self, renkan_guid):
   206         if renkan_guid:
   215         return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   207             return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   216 
   208         else:
       
   209             return Revision.objects
       
   210     
   217     def get(self, request, renkan_guid, format=None):
   211     def get(self, request, renkan_guid, format=None):
   218         revisions = self.get_queryset(renkan_guid)
   212         revisions = self.get_queryset(renkan_guid)
   219         if not revisions:
   213         if not revisions:
   220             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   214             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   221         serializer = RevisionSerializer(revisions.all(), many=True)
   215         serializer = RevisionSerializer(revisions.all(), many=True)
   223 
   217 
   224 class RevisionDetail(APIView):
   218 class RevisionDetail(APIView):
   225     """
   219     """
   226         View for retrieving or deleting a single revision from a given renkan
   220         View for retrieving or deleting a single revision from a given renkan
   227     """
   221     """
   228     permission_classes = (
   222     
   229         permissions.IsAuthenticatedOrReadOnly,
   223     lookup_field = "revision_guid"
   230         CanDeleteRevision,
   224     
   231     )
   225     def get_queryset(self, renkan_guid=""):
   232 
   226         if renkan_guid:
   233     def get_queryset(self, renkan_guid):
   227             return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   234         return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   228         else:
   235 
   229             return Revision.objects
       
   230     
   236     def get(self, request, renkan_guid, revision_guid, format=None):
   231     def get(self, request, renkan_guid, revision_guid, format=None):
   237         revisions = self.get_queryset(renkan_guid)
   232         revisions = self.get_queryset(renkan_guid)
   238         if not revisions:
   233         if not revisions:
   239             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   234             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   240         try:
   235         try: