diff -r 854a027c80ff -r b9edc1c1538a server/python/django2/renkanmanager/serializers.py --- a/server/python/django2/renkanmanager/serializers.py Wed Apr 27 16:36:30 2016 +0200 +++ b/server/python/django2/renkanmanager/serializers.py Tue May 03 14:32:28 2016 +0200 @@ -1,6 +1,6 @@ -import json -import uuid +import json, uuid, datetime, time +from django.db import transaction from django.contrib.auth import get_user_model from django.conf import settings from renkanmanager.models import Renkan, Workspace, Revision @@ -10,9 +10,9 @@ class RenkanSerializer(serializers.Serializer): id = serializers.ReadOnlyField(source="renkan_guid") - current_revision_id = serializers.ReadOnlyField(source="current_revision_guid") - workspace_id = serializers.CharField(source="workspace_guid", required=False) - source_revision_id = serializers.CharField(source="source_revision_guid", required=False) + current_revision_id = serializers.SlugRelatedField(source="current_revision", slug_field="revision_guid", read_only=True) + workspace_id = serializers.SlugRelatedField(source="workspace", slug_field="workspace_guid", queryset=Workspace.objects, required=False) + source_revision_id = serializers.SlugRelatedField(source="source_revision", slug_field="revision_guid", queryset=Revision.objects, required=False) revision_count = serializers.ReadOnlyField() created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) last_updated_by = serializers.SerializerMethodField("get_current_revision_last_updator") @@ -21,72 +21,59 @@ 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 + validation_timestamp = serializers.CharField(write_only=True, required=False) # only used for updating is a content json is not provided # ADD ERROR HANDLING def get_current_revision_last_updator(self, renkan): - current_revision = Revision.objects.get(revision_guid = renkan.current_revision_guid) - return getattr(current_revision.last_updated_by, RENKAN_USER_DISPLAY_FIELD) + return getattr(renkan.current_revision.last_updated_by, RENKAN_USER_DISPLAY_FIELD) def get_current_revision_modification_date(self, renkan): - current_revision = Revision.objects.get(revision_guid = renkan.current_revision_guid) - return current_revision.modification_date + return renkan.current_revision.modification_date + @transaction.atomic def create(self, validated_data): """ Method to create a new Renkan (and its first revision) """ creator = validated_data.get('creator') - initial_revision = Revision.objects.create( - title = validated_data.get('title', 'Untitled renkan'), - creator = creator, - last_updated_by = creator - ) - renkan = Renkan.objects.create( - current_revision_guid = initial_revision.revision_guid, - workspace_guid = validated_data.get('workspace_guid', ''), - source_revision_guid = validated_data.get('source_revision_guid', ''), - creator = creator - ) - initial_revision.parent_renkan_guid = renkan.renkan_guid - 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() - return renkan + workspace_obj = validated_data.get('workspace', None) + source_revision_obj = validated_data.get('source_revision', None) + try: + return Renkan.objects.create_renkan( + creator=creator, + title=validated_data.get('title', ''), + content=validated_data.get('content', ''), + workspace=workspace_obj, + source_revision=source_revision_obj + ) + except ValidationError as ve: + raise serializers.ValidationError(ve.args[0]) + @transaction.atomic def update(self, renkan, validated_data): """ 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(creator=updator) - revision_to_update.parent_renkan_guid = renkan.renkan_guid - renkan.current_revision_guid = revision_to_update.revision_guid + create_new_revision = validated_data.get("create_new_revision", False) + title = validated_data.get('title', renkan.current_revision.title) + content = validated_data.get('content', '') + if not content: + content = renkan.current_revision.content + if not 'validation_timestamp' in validated_data: + raise serializers.ValidationError("No validation timestamp and no content json to extract it from") + validation_timestamp = validated_data.get('validation_timestamp') else: - 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): - assign_perm('view_revision', updator, revision_to_update) - assign_perm('delete_revision', updator, revision_to_update) - renkan.save() + validation_timestamp = json.loads(content).get("updated", "") + if title != json.loads(content).get("title", ""): + content_dict = json.loads(content) + content_dict["title"] = title + content = json.dumps(content_dict) + try: + renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision) + except ValidationError as ve: + raise serializers.ValidationError(ve.args[0]) return renkan def validate_workspace_id(self, value): @@ -99,8 +86,7 @@ raise serializers.ValidationError("You cannot update source_revision_guid") return value - def validate_content(self, value): - + def validate_content(self, value): try: json.loads(value) except ValueError: @@ -119,27 +105,27 @@ class RevisionSerializer(serializers.Serializer): id = serializers.ReadOnlyField(source="revision_guid") - parent_renkan_id = serializers.ReadOnlyField(source="parent_renkan_guid") + parent_renkan_id = serializers.SlugRelatedField(source="parent_renkan", slug_field='renkan_guid', read_only=True) workspace_id = serializers.SerializerMethodField("get_related_workspace_guid") title = serializers.ReadOnlyField() content = serializers.JSONField(read_only=True) renkan_created_by = serializers.SerializerMethodField("get_related_renkan_creator") renkan_creation_date = serializers.SerializerMethodField("get_related_renkan_creation_date") revision_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) - revision_last_updated_by = serializers.StringRelatedField(source="last_updated_by") + revision_last_updated_by = serializers.SlugRelatedField(source="last_updated_by", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) revision_modification_date = serializers.ReadOnlyField(source="modification_date") def get_related_workspace_guid(self, revision): - parent_renkan = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) - return parent_renkan.workspace_guid + if revision.parent_renkan.workspace: + return revision.parent_renkan.workspace.workspace_guid + else: + return '' def get_related_renkan_creator(self, revision): - parent_renkan = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) - return getattr(parent_renkan.creator, RENKAN_USER_DISPLAY_FIELD) + return getattr(revision.parent_renkan.creator, RENKAN_USER_DISPLAY_FIELD) def get_related_renkan_creation_date(self, revision): - parent_renkan = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) - return parent_renkan.creation_date + return revision.parent_renkan.creation_date class WorkspaceSerializer(serializers.Serializer):