diff -r e2e952fcaf7c -r fb0041aa74d3 server/python2/django/renkanmanager/serializers.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/python2/django/renkanmanager/serializers.py Mon Jan 11 18:24:14 2016 +0100 @@ -0,0 +1,137 @@ +import uuid + +from guardian.shortcuts import assign_perm +from models import Renkan, Workspace, Revision +from rest_framework import serializers + + +class RenkanSerializer(serializers.Serializer): + renkan_guid = serializers.ReadOnlyField() + current_revision_guid = serializers.ReadOnlyField() + workspace_guid = serializers.CharField(required=False) + source_revision_guid = serializers.CharField(required=False) + revision_count = serializers.ReadOnlyField() + 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) + 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 + + # ADD ERROR HANDLING + def get_current_revision_last_updator(self, renkan): + current_revision = Revision.objects.get(revision_guid = renkan.current_revision_guid) + return current_revision.last_updated_by.username + + + def get_current_revision_modification_date(self, renkan): + current_revision = Revision.objects.get(revision_guid = renkan.current_revision_guid) + return current_revision.modification_date + + def create(self, validated_data): + """ + Method to create a new Renkan (and its first revision) + """ + 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.parent_renkan_guid = renkan.renkan_guid + initial_revision.creator = creator + initial_revision.last_updated_by = validated_data.get('creator', '') + renkan.current_revision_guid = initial_revision.revision_guid + renkan.workspace_guid = validated_data.get('workspace_guid', '') + renkan.source_revision_guid = validated_data.get('source_revision_guid', '') + renkan.creator = creator + initial_revision.save() + renkan.save() + assign_perm('view_renkan', creator, renkan) + assign_perm('change_renkan', creator, renkan) + assign_perm('delete_renkan', creator, renkan) + assign_perm('view_revision', creator, initial_revision) + assign_perm('delete_revision', creator, initial_revision) + return renkan + + def update(self, renkan, validated_data): + """ + Method to update a Renkan object. Creates a new revision if needed + """ + updator = validated_data.get('updator') + 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.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() + return renkan + + def validate_workspace_guid(self, value): + if self.instance is not None: + raise serializers.ValidationError("You cannot update workspace_guid") + return value + + def validate_source_revision_guid(self, value): + if self.instance is not None: + raise serializers.ValidationError("You cannot update source_revision_guid") + return value + + +class RevisionSerializer(serializers.Serializer): + revision_guid = serializers.ReadOnlyField() + parent_renkan_guid = serializers.ReadOnlyField() + workspace_guid = serializers.SerializerMethodField("get_related_workspace_guid") + title = serializers.ReadOnlyField() + content = serializers.ReadOnlyField() + 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") + revision_last_updated_by = serializers.StringRelatedField(source="last_updated_by") + revision_modification_date = serializers.ReadOnlyField(source="modification_date") + + def get_related_workspace_guid(self, revision): + parent_project = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) + return parent_project.workspace_guid + + def get_related_project_creator(self, revision): + parent_project = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) + return parent_project.creator.username + + def get_related_project_creation_date(self, revision): + parent_project = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) + return parent_project.creation_date + + +class WorkspaceSerializer(serializers.Serializer): + workspace_guid = serializers.ReadOnlyField() + workspace_created_by = serializers.StringRelatedField(source="creator") + creation_date = serializers.ReadOnlyField() + renkan_count = serializers.ReadOnlyField() + title = serializers.CharField() + + def create(self, validated_data): + creator = validated_data.get('creator') + workspace = Workspace.objects.create() + workspace.title = validated_data.get('title', '') + workspace.creator = creator + workspace.save() + assign_perm('view_workspace', creator, workspace) + assign_perm('change_workspace', creator, workspace) + assign_perm('delete_workspace', creator, workspace) + return workspace + + def update(self, workspace, validated_data): + workspace.title = validated_data.get('title', '') + workspace.save() + return workspace \ No newline at end of file