server/python/django2/renkanmanager/serializers.py
changeset 615 f3875fbe206a
parent 613 e00a24b711a0
child 618 3051b847c124
equal deleted inserted replaced
614:23416a833ca8 615:f3875fbe206a
     3 from django.db import transaction
     3 from django.db import transaction
     4 from django.contrib.auth import get_user_model
     4 from django.contrib.auth import get_user_model
     5 from django.conf import settings
     5 from django.conf import settings
     6 from django.core.exceptions import ValidationError
     6 from django.core.exceptions import ValidationError
     7 from django.utils import dateparse
     7 from django.utils import dateparse
       
     8 from renkanmanager import settings as renkan_settings
     8 from renkanmanager.models import Renkan, Workspace, Revision
     9 from renkanmanager.models import Renkan, Workspace, Revision
     9 from rest_framework import serializers
    10 from rest_framework import serializers
    10 
    11 
    11 logger = logging.getLogger(__name__)
    12 logger = logging.getLogger(__name__)
    12 RENKAN_USER_DISPLAY_FIELD = getattr(settings, "RENKAN_USER_DISPLAY_FIELD", get_user_model().USERNAME_FIELD)
    13 RENKAN_USER_DISPLAY_FIELD = renkan_settings.RENKAN_USER_DISPLAY_FIELD
    13 
    14 
    14 class RenkanSerializer(serializers.Serializer):
    15 class RenkanSerializer(serializers.Serializer):
    15     id = serializers.ReadOnlyField(source="renkan_guid")
    16     id = serializers.ReadOnlyField(source="renkan_guid")
    16     current_revision_id = serializers.SlugRelatedField(source="current_revision", slug_field="revision_guid", read_only=True)
    17     current_revision_id = serializers.SlugRelatedField(source="current_revision", slug_field="revision_guid", read_only=True)
    17     workspace_id = serializers.SlugRelatedField(source="workspace", slug_field="workspace_guid", queryset=Workspace.objects, required=False)
    18     workspace_id = serializers.SlugRelatedField(source="workspace", slug_field="workspace_guid", queryset=Workspace.objects, required=False)
    41     @transaction.atomic
    42     @transaction.atomic
    42     def create(self, validated_data):
    43     def create(self, validated_data):
    43         """
    44         """
    44             Method to create a new Renkan (and its first revision)
    45             Method to create a new Renkan (and its first revision)
    45         """
    46         """
       
    47         logger.debug("RENKANSERIALIZER %r", validated_data)
    46         creator = validated_data.get('creator')
    48         creator = validated_data.get('creator')
    47         workspace_obj = validated_data.get('workspace', None)
    49         workspace_obj = validated_data.get('workspace', None)
    48         source_revision_obj = validated_data.get('source_revision', None)
    50         source_revision_obj = validated_data.get('source_revision', None)
    49         try:
    51         try:
    50             return Renkan.objects.create_renkan(
    52             return Renkan.objects.create_renkan(
    60     @transaction.atomic
    62     @transaction.atomic
    61     def update(self, renkan, validated_data):
    63     def update(self, renkan, validated_data):
    62         """
    64         """
    63             Method to update a Renkan object. Creates a new revision if needed
    65             Method to update a Renkan object. Creates a new revision if needed
    64         """
    66         """
       
    67         logger.debug('RENKAN SERIALIZER UPDATE %r', validated_data)
    65         updator = validated_data.get('updator')
    68         updator = validated_data.get('updator')
    66         create_new_revision = validated_data.get("create_new_revision", False)
    69         create_new_revision = validated_data.get("create_new_revision", False)
    67         title = validated_data.get('title', renkan.current_revision.title)
    70         title = validated_data.get('title', renkan.current_revision.title)
    68         content = validated_data.get('content', '')
    71         content = validated_data.get('content', '')
    69         if not content:
    72         if not content:
    81             content = json.dumps(content_dict)
    84             content = json.dumps(content_dict)
    82         try:
    85         try:
    83             renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision)
    86             renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision)
    84         except ValidationError as ve:
    87         except ValidationError as ve:
    85             raise serializers.ValidationError(str(ve.args[0]))
    88             raise serializers.ValidationError(str(ve.args[0]))
    86         return renkan
    89         # FORCE Renkan reload.
       
    90         # TODO: How to avoid the reload ???
       
    91         return Renkan.objects.get(id=renkan.id)
    87 
    92 
    88     def validate_workspace_id(self, value):
    93     def validate_workspace_id(self, value):
    89         if self.instance is not None:
    94         if self.instance is not None:
    90             raise serializers.ValidationError("You cannot update workspace_guid")
    95             raise serializers.ValidationError("You cannot update workspace_guid")
    91         return value
    96         return value
   107         if (not "views" in loaded_json):
   112         if (not "views" in loaded_json):
   108             raise serializers.ValidationError("Content requires a 'views' entry")
   113             raise serializers.ValidationError("Content requires a 'views' entry")
   109         return value
   114         return value
   110 
   115 
   111     def validate_validation_timestamp(self, value):
   116     def validate_validation_timestamp(self, value):
   112         logger.debug("%r < %r", dateparse.parse_datetime(value), self.get_current_revision_modification_date(self.instance))
   117         logger.debug("%r < %r", dateparse.parse_datetime(value).timestamp(), self.get_current_revision_modification_date(self.instance).timestamp())
   113 
   118 
   114         if self.instance and dateparse.parse_datetime(value) < self.get_current_revision_modification_date(self.instance):
   119         if self.instance and dateparse.parse_datetime(value) != self.get_current_revision_modification_date(self.instance):
   115             raise serializers.ValidationError("Invalid timestamp was provided")
   120             raise serializers.ValidationError("Invalid timestamp was provided")
   116         return value
   121         return value
   117 
   122 
   118 class RevisionSerializer(serializers.Serializer):
   123 class RevisionSerializer(serializers.Serializer):
   119     id = serializers.ReadOnlyField(source="revision_guid")
   124     id = serializers.ReadOnlyField(source="revision_guid")