|
1 import uuid |
|
2 |
|
3 from guardian.shortcuts import assign_perm |
|
4 from models import Renkan, Workspace, Revision |
|
5 from rest_framework import serializers |
|
6 |
|
7 |
|
8 class RenkanSerializer(serializers.Serializer): |
|
9 renkan_guid = serializers.ReadOnlyField() |
|
10 current_revision_guid = serializers.ReadOnlyField() |
|
11 workspace_guid = serializers.CharField(required=False) |
|
12 source_revision_guid = serializers.CharField(required=False) |
|
13 revision_count = serializers.ReadOnlyField() |
|
14 project_created_by = serializers.StringRelatedField(source="creator") |
|
15 last_updated_by = serializers.SerializerMethodField("get_current_revision_last_updator") |
|
16 title = serializers.CharField(required=False) |
|
17 content = serializers.CharField(required=False) |
|
18 creation_date = serializers.ReadOnlyField() |
|
19 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 |
|
22 # ADD ERROR HANDLING |
|
23 def get_current_revision_last_updator(self, renkan): |
|
24 current_revision = Revision.objects.get(revision_guid = renkan.current_revision_guid) |
|
25 return current_revision.last_updated_by.username |
|
26 |
|
27 |
|
28 def get_current_revision_modification_date(self, renkan): |
|
29 current_revision = Revision.objects.get(revision_guid = renkan.current_revision_guid) |
|
30 return current_revision.modification_date |
|
31 |
|
32 def create(self, validated_data): |
|
33 """ |
|
34 Method to create a new Renkan (and its first revision) |
|
35 """ |
|
36 creator = validated_data.get('creator') |
|
37 renkan = Renkan.objects.create() |
|
38 initial_revision = Revision.objects.create() |
|
39 initial_revision.title = validated_data.get('title', '') |
|
40 initial_revision.content = validated_data.get('content', '{}') |
|
41 initial_revision.parent_renkan_guid = renkan.renkan_guid |
|
42 initial_revision.creator = creator |
|
43 initial_revision.last_updated_by = validated_data.get('creator', '') |
|
44 renkan.current_revision_guid = initial_revision.revision_guid |
|
45 renkan.workspace_guid = validated_data.get('workspace_guid', '') |
|
46 renkan.source_revision_guid = validated_data.get('source_revision_guid', '') |
|
47 renkan.creator = creator |
|
48 initial_revision.save() |
|
49 renkan.save() |
|
50 assign_perm('view_renkan', creator, renkan) |
|
51 assign_perm('change_renkan', creator, renkan) |
|
52 assign_perm('delete_renkan', creator, renkan) |
|
53 assign_perm('view_revision', creator, initial_revision) |
|
54 assign_perm('delete_revision', creator, initial_revision) |
|
55 return renkan |
|
56 |
|
57 def update(self, renkan, validated_data): |
|
58 """ |
|
59 Method to update a Renkan object. Creates a new revision if needed |
|
60 """ |
|
61 updator = validated_data.get('updator') |
|
62 if validated_data.get("create_new_revision", False): |
|
63 revision_to_update = Revision.objects.create() |
|
64 revision_to_update.parent_renkan_guid = renkan.renkan_guid |
|
65 revision_to_update.creator = updator |
|
66 renkan.current_revision_guid = revision_to_update.revision_guid |
|
67 else: |
|
68 revision_to_update = Revision.objects.get(revision_guid=renkan.current_revision_guid) |
|
69 |
|
70 revision_to_update.title = validated_data.get('title', '') |
|
71 revision_to_update.content = validated_data.get('content', '{}') |
|
72 revision_to_update.last_updated_by = updator |
|
73 revision_to_update.save() |
|
74 if not updator.has_perm('view_revision', revision_to_update): |
|
75 assign_perm('view_revision', updator, revision_to_update) |
|
76 assign_perm('delete_revision', updator, revision_to_update) |
|
77 renkan.save() |
|
78 return renkan |
|
79 |
|
80 def validate_workspace_guid(self, value): |
|
81 if self.instance is not None: |
|
82 raise serializers.ValidationError("You cannot update workspace_guid") |
|
83 return value |
|
84 |
|
85 def validate_source_revision_guid(self, value): |
|
86 if self.instance is not None: |
|
87 raise serializers.ValidationError("You cannot update source_revision_guid") |
|
88 return value |
|
89 |
|
90 |
|
91 class RevisionSerializer(serializers.Serializer): |
|
92 revision_guid = serializers.ReadOnlyField() |
|
93 parent_renkan_guid = serializers.ReadOnlyField() |
|
94 workspace_guid = serializers.SerializerMethodField("get_related_workspace_guid") |
|
95 title = serializers.ReadOnlyField() |
|
96 content = serializers.ReadOnlyField() |
|
97 project_created_by = serializers.SerializerMethodField("get_related_project_creator") |
|
98 project_creation_date = serializers.SerializerMethodField("get_related_project_creation_date") |
|
99 revision_created_by = serializers.StringRelatedField(source="creator") |
|
100 revision_last_updated_by = serializers.StringRelatedField(source="last_updated_by") |
|
101 revision_modification_date = serializers.ReadOnlyField(source="modification_date") |
|
102 |
|
103 def get_related_workspace_guid(self, revision): |
|
104 parent_project = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) |
|
105 return parent_project.workspace_guid |
|
106 |
|
107 def get_related_project_creator(self, revision): |
|
108 parent_project = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) |
|
109 return parent_project.creator.username |
|
110 |
|
111 def get_related_project_creation_date(self, revision): |
|
112 parent_project = Renkan.objects.get(renkan_guid = revision.parent_renkan_guid) |
|
113 return parent_project.creation_date |
|
114 |
|
115 |
|
116 class WorkspaceSerializer(serializers.Serializer): |
|
117 workspace_guid = serializers.ReadOnlyField() |
|
118 workspace_created_by = serializers.StringRelatedField(source="creator") |
|
119 creation_date = serializers.ReadOnlyField() |
|
120 renkan_count = serializers.ReadOnlyField() |
|
121 title = serializers.CharField() |
|
122 |
|
123 def create(self, validated_data): |
|
124 creator = validated_data.get('creator') |
|
125 workspace = Workspace.objects.create() |
|
126 workspace.title = validated_data.get('title', '') |
|
127 workspace.creator = creator |
|
128 workspace.save() |
|
129 assign_perm('view_workspace', creator, workspace) |
|
130 assign_perm('change_workspace', creator, workspace) |
|
131 assign_perm('delete_workspace', creator, workspace) |
|
132 return workspace |
|
133 |
|
134 def update(self, workspace, validated_data): |
|
135 workspace.title = validated_data.get('title', '') |
|
136 workspace.save() |
|
137 return workspace |