diff -r fb0041aa74d3 -r 95536fa18d0d server/python2/django/renkanmanager/serializers.py --- 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")