server/python2/django/renkanmanager/serializers.py
changeset 588 95536fa18d0d
parent 587 fb0041aa74d3
--- a/server/python2/django/renkanmanager/serializers.py	Mon Jan 11 18:24:14 2016 +0100
+++ b/server/python2/django/renkanmanager/serializers.py	Tue Jan 26 17:18:04 2016 +0100
@@ -1,7 +1,8 @@
+import json
 import uuid
 
 from guardian.shortcuts import assign_perm
-from models import Renkan, Workspace, Revision
+from renkanmanager.models import Renkan, Workspace, Revision
 from rest_framework import serializers
 
 
@@ -14,7 +15,7 @@
     project_created_by = serializers.StringRelatedField(source="creator")
     last_updated_by = serializers.SerializerMethodField("get_current_revision_last_updator")
     title = serializers.CharField(required=False)
-    content = serializers.CharField(required=False)
+    content = serializers.JSONField(required=False)
     creation_date = serializers.ReadOnlyField()
     modification_date = serializers.SerializerMethodField("get_current_revision_modification_date")
     create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating
@@ -36,8 +37,7 @@
         creator = validated_data.get('creator')
         renkan = Renkan.objects.create()
         initial_revision = Revision.objects.create()
-        initial_revision.title = validated_data.get('title', '')
-        initial_revision.content = validated_data.get('content', '{}')
+        initial_revision.title = validated_data.get('title', 'Untitled renkan')
         initial_revision.parent_renkan_guid = renkan.renkan_guid
         initial_revision.creator = creator
         initial_revision.last_updated_by = validated_data.get('creator', '')
@@ -45,6 +45,20 @@
         renkan.workspace_guid = validated_data.get('workspace_guid', '')
         renkan.source_revision_guid = validated_data.get('source_revision_guid', '')
         renkan.creator = creator
+        initial_revision.content = validated_data.get('content', json.dumps(
+            {
+                "id": str(renkan.renkan_guid),
+                "title": initial_revision.title,
+                "description": "",
+                "created": str(initial_revision.creation_date),
+                "updated": str(initial_revision.modification_date),
+                "edges": [],
+                "nodes": [],
+                "users": [],
+                "space_id": str(renkan.workspace_guid),
+                "views": []
+            }
+        ))
         initial_revision.save()
         renkan.save()
         assign_perm('view_renkan', creator, renkan)
@@ -59,16 +73,16 @@
             Method to update a Renkan object. Creates a new revision if needed
         """
         updator = validated_data.get('updator')
+        current_revision = Revision.objects.get(revision_guid=renkan.current_revision_guid)  
         if validated_data.get("create_new_revision", False):
             revision_to_update = Revision.objects.create()
             revision_to_update.parent_renkan_guid = renkan.renkan_guid
             revision_to_update.creator = updator
             renkan.current_revision_guid = revision_to_update.revision_guid
         else:
-            revision_to_update = Revision.objects.get(revision_guid=renkan.current_revision_guid)   
-        
-        revision_to_update.title = validated_data.get('title', '')
-        revision_to_update.content = validated_data.get('content', '{}')
+            revision_to_update = current_revision
+        revision_to_update.title = validated_data.get('title', current_revision.title)
+        revision_to_update.content = validated_data.get('content', current_revision.content)
         revision_to_update.last_updated_by = updator
         revision_to_update.save()
         if not updator.has_perm('view_revision', revision_to_update):
@@ -86,6 +100,23 @@
         if self.instance is not None:
             raise serializers.ValidationError("You cannot update source_revision_guid")
         return value
+    
+    def validate_content(self, value):
+        
+        try:
+            json.loads(value)
+        except ValueError:
+            raise serializers.ValidationError("Content format is not a JSON-serializable")
+        loaded_json = json.loads(value)
+            
+        if (not "nodes" in loaded_json):
+            raise serializers.ValidationError("Content requires a 'nodes' entry")
+        if (not "edges" in loaded_json):
+            raise serializers.ValidationError("Content requires a 'edges' entry")
+        if (not "views" in loaded_json):
+            raise serializers.ValidationError("Content requires a 'views' entry")
+            
+        return value
 
 
 class RevisionSerializer(serializers.Serializer):
@@ -93,7 +124,7 @@
     parent_renkan_guid = serializers.ReadOnlyField()
     workspace_guid = serializers.SerializerMethodField("get_related_workspace_guid")
     title = serializers.ReadOnlyField()
-    content = serializers.ReadOnlyField()
+    content = serializers.JSONField(read_only=True)
     project_created_by = serializers.SerializerMethodField("get_related_project_creator")
     project_creation_date = serializers.SerializerMethodField("get_related_project_creation_date")
     revision_created_by = serializers.StringRelatedField(source="creator")