server/python/django2/renkanmanager/api/views.py
changeset 598 eb4f4eceada0
parent 596 58bcb390c9e2
child 602 fa80b0104695
equal deleted inserted replaced
597:ebdd1d769158 598:eb4f4eceada0
    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 
    29 logger = logging.getLogger(__name__)
    29 logger = logging.getLogger(__name__)
    30             
    30 
    31 class RenkanList(APIView):
    31 class RenkanList(APIView):
    32     """
    32     """
    33         View for listing renkans or posting new renkan
    33         View for listing renkans or posting new renkan
    34     """
    34     """
    35     permission_classes = (
    35     permission_classes = (
    36         permissions.IsAuthenticatedOrReadOnly,
    36         permissions.IsAuthenticatedOrReadOnly,
    37         CanCreateRenkan,
    37         CanCreateRenkan,
    38     )
    38     )
    39     
    39 
    40     def get(self, request, workspace_guid='', format=None):
    40     def get(self, request, workspace_guid='', format=None):
    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, content_type='application/json')    
    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         source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None))
    50         source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None))
    51         source_revision_guid = request.GET.get("source_revision_id", request.data.get("source_revision_id", None))
    51         source_revision_guid = request.GET.get("source_revision_id", request.data.get("source_revision_id", None))
    52         if source_renkan_guid is not None:
    52         if source_renkan_guid is not None:
    67             try:
    67             try:
    68                 workspace = Workspace.objects.get(workspace_guid=workspace_guid)
    68                 workspace = Workspace.objects.get(workspace_guid=workspace_guid)
    69             except Workspace.DoesNotExist:
    69             except Workspace.DoesNotExist:
    70                 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    70                 return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
    71             create_data["workspace_id"] = workspace_guid
    71             create_data["workspace_id"] = workspace_guid
    72         
    72 
    73         serializer = RenkanSerializer(data=create_data)
    73         serializer = RenkanSerializer(data=create_data)
    74         if serializer.is_valid():
    74         if serializer.is_valid():
    75             serializer.save(creator=request.user)       
    75             serializer.save(creator=request.user)
    76             return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
    76             return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
    77         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    77         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    78         
    78 
    79 
    79 
    80 class RenkanDetail(APIView):
    80 class RenkanDetail(APIView):
    81     """
    81     """
    82         View for retrieving, updating or deleting a single renkan
    82         View for retrieving, updating or deleting a single renkan
    83     """
    83     """
    84     lookup_field = "renkan_guid"
    84     lookup_field = "renkan_guid"
    85     permission_classes = (
    85     permission_classes = (
    86         permissions.IsAuthenticatedOrReadOnly, 
    86         permissions.IsAuthenticatedOrReadOnly,
    87         CanEditRenkan,
    87         CanEditRenkan,
    88         CanDeleteRenkan,
    88         CanDeleteRenkan,
    89     )
    89     )
    90     authentication_classes = tuple(APIView.authentication_classes) + (CsrfExemptSessionAuthentication,)
    90     authentication_classes = tuple(APIView.authentication_classes) + (CsrfExemptSessionAuthentication,)
    91     
    91 
    92     @csrf_exempt
    92     @csrf_exempt
    93     def dispatch(self, *args, **kwargs):
    93     def dispatch(self, *args, **kwargs):
    94         return super(RenkanDetail, self).dispatch(*args, **kwargs)
    94         return super(RenkanDetail, self).dispatch(*args, **kwargs)
    95     
    95 
    96     def get_object(self, renkan_guid):
    96     def get_object(self, renkan_guid):
    97         return Renkan.objects.get(renkan_guid=renkan_guid)
    97         return Renkan.objects.get(renkan_guid=renkan_guid)
    98     
    98 
    99     def get(self, request, renkan_guid, format=None):
    99     def get(self, request, renkan_guid, format=None):
   100         try:
   100         try:
   101             renkan = self.get_object(renkan_guid=renkan_guid)
   101             renkan = self.get_object(renkan_guid=renkan_guid)
   102         except Renkan.DoesNotExist:
   102         except Renkan.DoesNotExist:
   103             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   103             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   104         self.check_object_permissions(request, renkan)
   104         self.check_object_permissions(request, renkan)
   105         serializer = RenkanSerializer(renkan)
   105         serializer = RenkanSerializer(renkan)
   106         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   106         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   107             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
   107             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
   108         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   108         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   109     
   109 
   110     def put(self, request, renkan_guid, format=None):
   110     def put(self, request, renkan_guid, format=None):
   111         try:
   111         try:
   112             renkan = self.get_object(renkan_guid=renkan_guid)
   112             renkan = self.get_object(renkan_guid=renkan_guid)
   113         except Renkan.DoesNotExist:
   113         except Renkan.DoesNotExist:
   114             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   114             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   115         self.check_object_permissions(request, renkan)
   115         self.check_object_permissions(request, renkan)
   116         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   116         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   117             put_data = {}
   117             put_data = {}
   118             put_data["content"] = json.dumps(request.data)
   118             put_data["content"] = json.dumps(request.data)
   119             put_data["title"] = request.data.get("title", "")
   119             put_data["title"] = request.data.get("title", "")
   120         else: 
   120         else:
   121             put_data = request.data
   121             put_data = request.data
   122         serializer = RenkanSerializer(renkan, data=put_data)
   122         serializer = RenkanSerializer(renkan, data=put_data)
   123         if serializer.is_valid():
   123         if serializer.is_valid():
   124             serializer.save(updator=request.user)
   124             serializer.save(updator=request.user)
   125             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   125             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   126         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   126         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   127     
   127 
   128     def delete(self, request, renkan_guid, format=None):
   128     def delete(self, request, renkan_guid, format=None):
   129         try:
   129         try:
   130             to_delete_renkan = self.get_object(renkan_guid=renkan_guid)
   130             to_delete_renkan = self.get_object(renkan_guid=renkan_guid)
   131         except Renkan.DoesNotExist:
   131         except Renkan.DoesNotExist:
   132             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   132             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   147     """
   147     """
   148     permission_classes = (
   148     permission_classes = (
   149         permissions.IsAuthenticatedOrReadOnly,
   149         permissions.IsAuthenticatedOrReadOnly,
   150         CanCreateWorkspace,
   150         CanCreateWorkspace,
   151     )
   151     )
   152     
   152 
   153     def get(self, request, format=None):
   153     def get(self, request, format=None):
   154         workspaces = Workspace.objects.all()
   154         workspaces = Workspace.objects.all()
   155         serializer = WorkspaceSerializer(workspaces, many=True)
   155         serializer = WorkspaceSerializer(workspaces, many=True)
   156         return Response(serializer.data)
   156         return Response(serializer.data)
   157     
   157 
   158     def post(self, request, format=None):
   158     def post(self, request, format=None):
   159         serializer = WorkspaceSerializer(data=request.data)
   159         serializer = WorkspaceSerializer(data=request.data)
   160         if serializer.is_valid():
   160         if serializer.is_valid():
   161             serializer.save(creator=request.user)       
   161             serializer.save(creator=request.user)
   162             return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
   162             return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
   163         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   163         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   164     
   164 
   165 class WorkspaceDetail(APIView):
   165 class WorkspaceDetail(APIView):
   166     """
   166     """
   167         View for retrieving, updating or deleting a single workspace
   167         View for retrieving, updating or deleting a single workspace
   168     """
   168     """
   169     permission_classes = (
   169     permission_classes = (
   170         permissions.IsAuthenticatedOrReadOnly,
   170         permissions.IsAuthenticatedOrReadOnly,
   171         CanEditWorkspace,
   171         CanEditWorkspace,
   172         CanDeleteWorkspace,
   172         CanDeleteWorkspace,
   173     )
   173     )
   174     
   174 
   175     def get_object(self, workspace_guid):
   175     def get_object(self, workspace_guid):
   176         return Workspace.objects.get(workspace_guid=workspace_guid)
   176         return Workspace.objects.get(workspace_guid=workspace_guid)
   177     
   177 
   178     def get(self, request, workspace_guid, format=None):
   178     def get(self, request, workspace_guid, format=None):
   179         try:
   179         try:
   180             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   180             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   181         except Workspace.DoesNotExist:
   181         except Workspace.DoesNotExist:
   182             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   182             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   183         self.check_object_permissions(request, workspace)
   183         self.check_object_permissions(request, workspace)
   184         serializer = WorkspaceSerializer(workspace)
   184         serializer = WorkspaceSerializer(workspace)
   185         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   185         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   186     
   186 
   187     def put(self, request, workspace_guid, format=None):
   187     def put(self, request, workspace_guid, format=None):
   188         try:
   188         try:
   189             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   189             workspace = Workspace.objects.get(workspace_guid=workspace_guid)
   190         except Workspace.DoesNotExist:
   190         except Workspace.DoesNotExist:
   191             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   191             return Response({'detail': 'Workspace '+workspace_guid+' does not exist.'}, status=status.HTTP_404_NOT_FOUND)
   192         self.check_object_permissions(request, workspace)
   192         self.check_object_permissions(request, workspace)
   193         serializer = WorkspaceSerializer(workspace, data=request.data)
   193         serializer = WorkspaceSerializer(workspace, data=request.data)
   194         if serializer.is_valid():
   194         if serializer.is_valid():
   195             serializer.save()       
   195             serializer.save()
   196             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   196             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   197         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   197         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   198     
   198 
   199     def delete(self, request, workspace_guid, format=None):
   199     def delete(self, request, workspace_guid, format=None):
   200         try:
   200         try:
   201             to_delete_workspace = self.get_object(workspace_guid=workspace_guid)
   201             to_delete_workspace = self.get_object(workspace_guid=workspace_guid)
   202         except Workspace.DoesNotExist:
   202         except Workspace.DoesNotExist:
   203             return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   203             return Response({'detail': 'Workspace '+workspace_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   210 class RevisionList(APIView):
   210 class RevisionList(APIView):
   211     """
   211     """
   212         View for listing revisions from a given renkan
   212         View for listing revisions from a given renkan
   213     """
   213     """
   214     permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
   214     permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
   215     
   215 
   216     def get_queryset(self, renkan_guid):
   216     def get_queryset(self, renkan_guid):
   217         return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   217         return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   218     
   218 
   219     def get(self, request, renkan_guid, format=None):
   219     def get(self, request, renkan_guid, format=None):
   220         revisions = self.get_queryset(renkan_guid)
   220         revisions = self.get_queryset(renkan_guid)
   221         if not revisions:
   221         if not revisions:
   222             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   222             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   223         serializer = RevisionSerializer(revisions.all(), many=True)
   223         serializer = RevisionSerializer(revisions.all(), many=True)
   229     """
   229     """
   230     permission_classes = (
   230     permission_classes = (
   231         permissions.IsAuthenticatedOrReadOnly,
   231         permissions.IsAuthenticatedOrReadOnly,
   232         CanDeleteRevision,
   232         CanDeleteRevision,
   233     )
   233     )
   234     
   234 
   235     def get_queryset(self, renkan_guid):
   235     def get_queryset(self, renkan_guid):
   236         return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   236         return Revision.objects.filter(parent_renkan_guid=renkan_guid)
   237     
   237 
   238     def get(self, request, renkan_guid, revision_guid, format=None):
   238     def get(self, request, renkan_guid, revision_guid, format=None):
   239         revisions = self.get_queryset(renkan_guid)
   239         revisions = self.get_queryset(renkan_guid)
   240         if not revisions:
   240         if not revisions:
   241             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   241             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   242         try:
   242         try:
   244         except Revision.DoesNotExist:
   244         except Revision.DoesNotExist:
   245             return Response({'detail': 'Revision '+revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   245             return Response({'detail': 'Revision '+revision_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   246         self.check_object_permissions(request, revision)
   246         self.check_object_permissions(request, revision)
   247         serializer = RevisionSerializer(revision)
   247         serializer = RevisionSerializer(revision)
   248         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   248         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   249     
   249 
   250     def delete(self, request, renkan_guid, revision_guid, format=None):
   250     def delete(self, request, renkan_guid, revision_guid, format=None):
   251         revisions = self.get_queryset(renkan_guid)
   251         revisions = self.get_queryset(renkan_guid)
   252         if not revisions:
   252         if not revisions:
   253             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   253             return Response({'detail': 'Renkan project '+renkan_guid+' does not exist'}, status=status.HTTP_404_NOT_FOUND)
   254         try:
   254         try:
   258         self.check_object_permissions(request, revision)
   258         self.check_object_permissions(request, revision)
   259         if revisions.count() == 1:
   259         if revisions.count() == 1:
   260             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)
   260             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)
   261         if revision.is_current_revision:
   261         if revision.is_current_revision:
   262             return Response({'detail': 'You cannot delete the current revision of a renkan from the Revision API.'}, status=status.HTTP_400_BAD_REQUEST)
   262             return Response({'detail': 'You cannot delete the current revision of a renkan from the Revision API.'}, status=status.HTTP_400_BAD_REQUEST)
   263         
   263 
   264         # Deleting reference to revision in renkans copied from this revision
   264         # Deleting reference to revision in renkans copied from this revision
   265         for related_renkan in Renkan.objects.filter(source_revision_guid=revision_guid):
   265         for related_renkan in Renkan.objects.filter(source_revision_guid=revision_guid):
   266             related_renkan.source_revision_guid = ''
   266             related_renkan.source_revision_guid = ''
   267             related_renkan.save()
   267             related_renkan.save()
   268         revision.delete()
   268         revision.delete()