server/python2/django/renkanmanager/serializers.py
changeset 588 95536fa18d0d
parent 587 fb0041aa74d3
equal deleted inserted replaced
587:fb0041aa74d3 588:95536fa18d0d
       
     1 import json
     1 import uuid
     2 import uuid
     2 
     3 
     3 from guardian.shortcuts import assign_perm
     4 from guardian.shortcuts import assign_perm
     4 from models import Renkan, Workspace, Revision
     5 from renkanmanager.models import Renkan, Workspace, Revision
     5 from rest_framework import serializers
     6 from rest_framework import serializers
     6 
     7 
     7 
     8 
     8 class RenkanSerializer(serializers.Serializer):
     9 class RenkanSerializer(serializers.Serializer):
     9     renkan_guid = serializers.ReadOnlyField()
    10     renkan_guid = serializers.ReadOnlyField()
    12     source_revision_guid = serializers.CharField(required=False)
    13     source_revision_guid = serializers.CharField(required=False)
    13     revision_count = serializers.ReadOnlyField()
    14     revision_count = serializers.ReadOnlyField()
    14     project_created_by = serializers.StringRelatedField(source="creator")
    15     project_created_by = serializers.StringRelatedField(source="creator")
    15     last_updated_by = serializers.SerializerMethodField("get_current_revision_last_updator")
    16     last_updated_by = serializers.SerializerMethodField("get_current_revision_last_updator")
    16     title = serializers.CharField(required=False)
    17     title = serializers.CharField(required=False)
    17     content = serializers.CharField(required=False)
    18     content = serializers.JSONField(required=False)
    18     creation_date = serializers.ReadOnlyField()
    19     creation_date = serializers.ReadOnlyField()
    19     modification_date = serializers.SerializerMethodField("get_current_revision_modification_date")
    20     modification_date = serializers.SerializerMethodField("get_current_revision_modification_date")
    20     create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating
    21     create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating
    21     
    22     
    22     # ADD ERROR HANDLING
    23     # ADD ERROR HANDLING
    34             Method to create a new Renkan (and its first revision)
    35             Method to create a new Renkan (and its first revision)
    35         """
    36         """
    36         creator = validated_data.get('creator')
    37         creator = validated_data.get('creator')
    37         renkan = Renkan.objects.create()
    38         renkan = Renkan.objects.create()
    38         initial_revision = Revision.objects.create()
    39         initial_revision = Revision.objects.create()
    39         initial_revision.title = validated_data.get('title', '')
    40         initial_revision.title = validated_data.get('title', 'Untitled renkan')
    40         initial_revision.content = validated_data.get('content', '{}')
       
    41         initial_revision.parent_renkan_guid = renkan.renkan_guid
    41         initial_revision.parent_renkan_guid = renkan.renkan_guid
    42         initial_revision.creator = creator
    42         initial_revision.creator = creator
    43         initial_revision.last_updated_by = validated_data.get('creator', '')
    43         initial_revision.last_updated_by = validated_data.get('creator', '')
    44         renkan.current_revision_guid = initial_revision.revision_guid
    44         renkan.current_revision_guid = initial_revision.revision_guid
    45         renkan.workspace_guid = validated_data.get('workspace_guid', '')
    45         renkan.workspace_guid = validated_data.get('workspace_guid', '')
    46         renkan.source_revision_guid = validated_data.get('source_revision_guid', '')
    46         renkan.source_revision_guid = validated_data.get('source_revision_guid', '')
    47         renkan.creator = creator
    47         renkan.creator = creator
       
    48         initial_revision.content = validated_data.get('content', json.dumps(
       
    49             {
       
    50                 "id": str(renkan.renkan_guid),
       
    51                 "title": initial_revision.title,
       
    52                 "description": "",
       
    53                 "created": str(initial_revision.creation_date),
       
    54                 "updated": str(initial_revision.modification_date),
       
    55                 "edges": [],
       
    56                 "nodes": [],
       
    57                 "users": [],
       
    58                 "space_id": str(renkan.workspace_guid),
       
    59                 "views": []
       
    60             }
       
    61         ))
    48         initial_revision.save()
    62         initial_revision.save()
    49         renkan.save()
    63         renkan.save()
    50         assign_perm('view_renkan', creator, renkan)
    64         assign_perm('view_renkan', creator, renkan)
    51         assign_perm('change_renkan', creator, renkan)
    65         assign_perm('change_renkan', creator, renkan)
    52         assign_perm('delete_renkan', creator, renkan)
    66         assign_perm('delete_renkan', creator, renkan)
    57     def update(self, renkan, validated_data):
    71     def update(self, renkan, validated_data):
    58         """
    72         """
    59             Method to update a Renkan object. Creates a new revision if needed
    73             Method to update a Renkan object. Creates a new revision if needed
    60         """
    74         """
    61         updator = validated_data.get('updator')
    75         updator = validated_data.get('updator')
       
    76         current_revision = Revision.objects.get(revision_guid=renkan.current_revision_guid)  
    62         if validated_data.get("create_new_revision", False):
    77         if validated_data.get("create_new_revision", False):
    63             revision_to_update = Revision.objects.create()
    78             revision_to_update = Revision.objects.create()
    64             revision_to_update.parent_renkan_guid = renkan.renkan_guid
    79             revision_to_update.parent_renkan_guid = renkan.renkan_guid
    65             revision_to_update.creator = updator
    80             revision_to_update.creator = updator
    66             renkan.current_revision_guid = revision_to_update.revision_guid
    81             renkan.current_revision_guid = revision_to_update.revision_guid
    67         else:
    82         else:
    68             revision_to_update = Revision.objects.get(revision_guid=renkan.current_revision_guid)   
    83             revision_to_update = current_revision
    69         
    84         revision_to_update.title = validated_data.get('title', current_revision.title)
    70         revision_to_update.title = validated_data.get('title', '')
    85         revision_to_update.content = validated_data.get('content', current_revision.content)
    71         revision_to_update.content = validated_data.get('content', '{}')
       
    72         revision_to_update.last_updated_by = updator
    86         revision_to_update.last_updated_by = updator
    73         revision_to_update.save()
    87         revision_to_update.save()
    74         if not updator.has_perm('view_revision', revision_to_update):
    88         if not updator.has_perm('view_revision', revision_to_update):
    75             assign_perm('view_revision', updator, revision_to_update)
    89             assign_perm('view_revision', updator, revision_to_update)
    76             assign_perm('delete_revision', updator, revision_to_update)
    90             assign_perm('delete_revision', updator, revision_to_update)
    84     
    98     
    85     def validate_source_revision_guid(self, value):
    99     def validate_source_revision_guid(self, value):
    86         if self.instance is not None:
   100         if self.instance is not None:
    87             raise serializers.ValidationError("You cannot update source_revision_guid")
   101             raise serializers.ValidationError("You cannot update source_revision_guid")
    88         return value
   102         return value
       
   103     
       
   104     def validate_content(self, value):
       
   105         
       
   106         try:
       
   107             json.loads(value)
       
   108         except ValueError:
       
   109             raise serializers.ValidationError("Content format is not a JSON-serializable")
       
   110         loaded_json = json.loads(value)
       
   111             
       
   112         if (not "nodes" in loaded_json):
       
   113             raise serializers.ValidationError("Content requires a 'nodes' entry")
       
   114         if (not "edges" in loaded_json):
       
   115             raise serializers.ValidationError("Content requires a 'edges' entry")
       
   116         if (not "views" in loaded_json):
       
   117             raise serializers.ValidationError("Content requires a 'views' entry")
       
   118             
       
   119         return value
    89 
   120 
    90 
   121 
    91 class RevisionSerializer(serializers.Serializer):
   122 class RevisionSerializer(serializers.Serializer):
    92     revision_guid = serializers.ReadOnlyField()
   123     revision_guid = serializers.ReadOnlyField()
    93     parent_renkan_guid = serializers.ReadOnlyField()
   124     parent_renkan_guid = serializers.ReadOnlyField()
    94     workspace_guid = serializers.SerializerMethodField("get_related_workspace_guid")
   125     workspace_guid = serializers.SerializerMethodField("get_related_workspace_guid")
    95     title = serializers.ReadOnlyField()
   126     title = serializers.ReadOnlyField()
    96     content = serializers.ReadOnlyField()
   127     content = serializers.JSONField(read_only=True)
    97     project_created_by = serializers.SerializerMethodField("get_related_project_creator")
   128     project_created_by = serializers.SerializerMethodField("get_related_project_creator")
    98     project_creation_date = serializers.SerializerMethodField("get_related_project_creation_date")
   129     project_creation_date = serializers.SerializerMethodField("get_related_project_creation_date")
    99     revision_created_by = serializers.StringRelatedField(source="creator")
   130     revision_created_by = serializers.StringRelatedField(source="creator")
   100     revision_last_updated_by = serializers.StringRelatedField(source="last_updated_by")
   131     revision_last_updated_by = serializers.StringRelatedField(source="last_updated_by")
   101     revision_modification_date = serializers.ReadOnlyField(source="modification_date")
   132     revision_modification_date = serializers.ReadOnlyField(source="modification_date")