server/python/django2/renkanmanager/api/views.py
changeset 618 3051b847c124
parent 615 f3875fbe206a
child 619 d427a6db1902
equal deleted inserted replaced
617:80ce81208b08 618:3051b847c124
    13 from django.core.exceptions import ObjectDoesNotExist
    13 from django.core.exceptions import ObjectDoesNotExist
    14 from django.core.urlresolvers import reverse
    14 from django.core.urlresolvers import reverse
    15 from django.http import Http404
    15 from django.http import Http404
    16 from django.http.response import HttpResponse, HttpResponseBadRequest
    16 from django.http.response import HttpResponse, HttpResponseBadRequest
    17 from django.shortcuts import get_object_or_404, redirect
    17 from django.shortcuts import get_object_or_404, redirect
       
    18 from django.utils import dateparse
    18 from django.views.generic import View
    19 from django.views.generic import View
    19 from django.conf import settings
    20 from django.conf import settings
       
    21 
    20 from renkanmanager.models import Renkan, Revision, Workspace
    22 from renkanmanager.models import Renkan, Revision, Workspace
    21 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer
    23 from renkanmanager.serializers import RenkanSerializer, RevisionSerializer, WorkspaceSerializer
       
    24 from renkanmanager.utils import parse_bool
       
    25 
    22 from rest_framework import permissions, status
    26 from rest_framework import permissions, status
    23 from rest_framework.response import Response
    27 from rest_framework.response import Response
    24 from rest_framework.views import APIView
    28 from rest_framework.views import APIView
    25 
    29 
    26 logger = logging.getLogger(__name__)
    30 logger = logging.getLogger(__name__)
    40         serializer = RenkanSerializer(renkans, many=True)
    44         serializer = RenkanSerializer(renkans, many=True)
    41         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
    45         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
    42 
    46 
    43     def post(self, request, workspace_guid='', format=None):
    47     def post(self, request, workspace_guid='', format=None):
    44         create_data = {key:request.data[key] for key in request.data.keys()}
    48         create_data = {key:request.data[key] for key in request.data.keys()}
    45         logger.debug("HELLO %r", create_data)
       
    46 
    49 
    47         source_renkan_guid_str = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None))
    50         source_renkan_guid_str = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None))
    48         source_revision_guid_str = request.GET.get("source_revision_id", request.data.get("source_revision_id", None))
    51         source_revision_guid_str = request.GET.get("source_revision_id", request.data.get("source_revision_id", None))
    49         try:
    52         try:
    50             source_renkan_guid =  source_renkan_guid_str and uuid.UUID(source_renkan_guid_str) or None
    53             source_renkan_guid =  source_renkan_guid_str and uuid.UUID(source_renkan_guid_str) or None
    67 
    70 
    68         if source_revision:
    71         if source_revision:
    69             create_data["source_revision_id"] = source_revision.revision_guid
    72             create_data["source_revision_id"] = source_revision.revision_guid
    70             create_data["title"] = request.data.get("title", source_revision.title)
    73             create_data["title"] = request.data.get("title", source_revision.title)
    71             create_data["content"] = source_revision.content
    74             create_data["content"] = source_revision.content
    72             logger.debug("SOURCE_REVISION CONTENT %r", create_data["content"])
       
    73 
    75 
    74         try:
    76         try:
    75             workspace_guid_uuid =  workspace_guid and uuid.UUID(workspace_guid) or None
    77             workspace_guid_uuid =  workspace_guid and uuid.UUID(workspace_guid) or None
    76         except ValueError:
    78         except ValueError:
    77             return Response({'detail': 'workspace guid %r not correctly formatted'%workspace_guid}, status=status.HTTP_400_BAD_REQUEST)
    79             return Response({'detail': 'workspace guid %r not correctly formatted'%workspace_guid}, status=status.HTTP_400_BAD_REQUEST)
   117         except Renkan.DoesNotExist:
   119         except Renkan.DoesNotExist:
   118             return Response({'detail': 'Renkan project %r does not exist'%renkan_guid}, status=status.HTTP_404_NOT_FOUND)
   120             return Response({'detail': 'Renkan project %r does not exist'%renkan_guid}, status=status.HTTP_404_NOT_FOUND)
   119 
   121 
   120         self.check_object_permissions(request, renkan)
   122         self.check_object_permissions(request, renkan)
   121         serializer = RenkanSerializer(renkan)
   123         serializer = RenkanSerializer(renkan)
   122         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   124         if parse_bool(request.GET.get("content_only", "false")):
   123             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
   125             return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
   124         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   126         return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   125 
   127 
   126     def put(self, request, renkan_guid, format=None):
   128     def put(self, request, renkan_guid, format=None):
   127         try:
   129         try:
   132             return Response({'detail': 'Renkan project %r does not exist'%renkan_guid}, status=status.HTTP_404_NOT_FOUND)
   134             return Response({'detail': 'Renkan project %r does not exist'%renkan_guid}, status=status.HTTP_404_NOT_FOUND)
   133         logger.debug("RENKAN PUT %r : CHECKING OBJECT PERMISSION", renkan_guid)
   135         logger.debug("RENKAN PUT %r : CHECKING OBJECT PERMISSION", renkan_guid)
   134         logger.debug("RENKAN PUT: permission? %r", request.user.has_perm("change_renkan", renkan))
   136         logger.debug("RENKAN PUT: permission? %r", request.user.has_perm("change_renkan", renkan))
   135         self.check_object_permissions(request, renkan)
   137         self.check_object_permissions(request, renkan)
   136         logger.debug("RENKAN PUT: PERMISSION GRANTED")
   138         logger.debug("RENKAN PUT: PERMISSION GRANTED")
   137         if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   139         if parse_bool(request.GET.get("content_only", "false")):
   138             put_data = {}
   140             put_data = {}
   139             put_data["content"] = json.dumps(request.data)
   141             put_data["content"] = json.dumps(request.data)
   140             put_data["title"] = request.data.get("title", "")
   142             put_data["title"] = request.data.get("title", "")
   141         else:
   143         else:
   142             put_data = request.data
   144             put_data = request.data
   143         if put_data.get("validation_timestamp", None) is None and put_data.get("content", None) is not None:
   145         validation_timestamp = request.GET.get("validation_timestamp")
   144             put_data["validation_timestamp"] = json.loads(put_data["content"]).get("updated", "")
   146         if validation_timestamp is None and put_data.get("content") is not None:
   145         serializer = RenkanSerializer(renkan, data=put_data)
   147             validation_timestamp =  json.loads(put_data["content"]).get("updated", "")
       
   148         if validation_timestamp:
       
   149             validation_timestamp =  dateparse.parse_datetime(validation_timestamp)
       
   150         create_new_revision = parse_bool(request.GET.get('create_new_revision', 'false'))
       
   151         serializer = RenkanSerializer(renkan, data=put_data, validation_timestamp=validation_timestamp)
   146         if serializer.is_valid():
   152         if serializer.is_valid():
   147             serializer.save(updator=request.user)
   153             serializer.save(updator=request.user, create_new_revision=create_new_revision)
   148             if {'true': True, 'false': False, "0": False, "1": True}.get(request.GET.get("content_only", "false").lower()):
   154             if parse_bool(request.GET.get("content_only", "false")):
   149                 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
   155                 return Response(json.loads(serializer.data["content"]), status=status.HTTP_200_OK, content_type='application/json')
   150             logger.debug("RENKAN PUT: SERIALIZER DATA %r", serializer.data)
       
   151             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   156             return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
   152         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   157         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
   153 
   158 
   154     @transaction.atomic
   159     @transaction.atomic
   155     def delete(self, request, renkan_guid, format=None):
   160     def delete(self, request, renkan_guid, format=None):