|
1 import json |
1 import uuid |
2 import uuid |
2 |
3 |
3 from guardian.shortcuts import assign_perm |
4 from guardian.shortcuts import assign_perm |
4 from models import Renkan, Workspace, Revision |
5 from renkanmanager.models import Renkan, Workspace, Revision |
5 from rest_framework import serializers |
6 from rest_framework import serializers |
6 |
7 |
7 |
8 |
8 class RenkanSerializer(serializers.Serializer): |
9 class RenkanSerializer(serializers.Serializer): |
9 renkan_guid = serializers.ReadOnlyField() |
10 renkan_guid = serializers.ReadOnlyField() |
12 source_revision_guid = serializers.CharField(required=False) |
13 source_revision_guid = serializers.CharField(required=False) |
13 revision_count = serializers.ReadOnlyField() |
14 revision_count = serializers.ReadOnlyField() |
14 project_created_by = serializers.StringRelatedField(source="creator") |
15 project_created_by = serializers.StringRelatedField(source="creator") |
15 last_updated_by = serializers.SerializerMethodField("get_current_revision_last_updator") |
16 last_updated_by = serializers.SerializerMethodField("get_current_revision_last_updator") |
16 title = serializers.CharField(required=False) |
17 title = serializers.CharField(required=False) |
17 content = serializers.CharField(required=False) |
18 content = serializers.JSONField(required=False) |
18 creation_date = serializers.ReadOnlyField() |
19 creation_date = serializers.ReadOnlyField() |
19 modification_date = serializers.SerializerMethodField("get_current_revision_modification_date") |
20 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 create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating |
21 |
22 |
22 # ADD ERROR HANDLING |
23 # ADD ERROR HANDLING |
34 Method to create a new Renkan (and its first revision) |
35 Method to create a new Renkan (and its first revision) |
35 """ |
36 """ |
36 creator = validated_data.get('creator') |
37 creator = validated_data.get('creator') |
37 renkan = Renkan.objects.create() |
38 renkan = Renkan.objects.create() |
38 initial_revision = Revision.objects.create() |
39 initial_revision = Revision.objects.create() |
39 initial_revision.title = validated_data.get('title', '') |
40 initial_revision.title = validated_data.get('title', 'Untitled renkan') |
40 initial_revision.content = validated_data.get('content', '{}') |
|
41 initial_revision.parent_renkan_guid = renkan.renkan_guid |
41 initial_revision.parent_renkan_guid = renkan.renkan_guid |
42 initial_revision.creator = creator |
42 initial_revision.creator = creator |
43 initial_revision.last_updated_by = validated_data.get('creator', '') |
43 initial_revision.last_updated_by = validated_data.get('creator', '') |
44 renkan.current_revision_guid = initial_revision.revision_guid |
44 renkan.current_revision_guid = initial_revision.revision_guid |
45 renkan.workspace_guid = validated_data.get('workspace_guid', '') |
45 renkan.workspace_guid = validated_data.get('workspace_guid', '') |
46 renkan.source_revision_guid = validated_data.get('source_revision_guid', '') |
46 renkan.source_revision_guid = validated_data.get('source_revision_guid', '') |
47 renkan.creator = creator |
47 renkan.creator = creator |
|
48 initial_revision.content = validated_data.get('content', json.dumps( |
|
49 { |
|
50 "id": str(renkan.renkan_guid), |
|
51 "title": initial_revision.title, |
|
52 "description": "", |
|
53 "created": str(initial_revision.creation_date), |
|
54 "updated": str(initial_revision.modification_date), |
|
55 "edges": [], |
|
56 "nodes": [], |
|
57 "users": [], |
|
58 "space_id": str(renkan.workspace_guid), |
|
59 "views": [] |
|
60 } |
|
61 )) |
48 initial_revision.save() |
62 initial_revision.save() |
49 renkan.save() |
63 renkan.save() |
50 assign_perm('view_renkan', creator, renkan) |
64 assign_perm('view_renkan', creator, renkan) |
51 assign_perm('change_renkan', creator, renkan) |
65 assign_perm('change_renkan', creator, renkan) |
52 assign_perm('delete_renkan', creator, renkan) |
66 assign_perm('delete_renkan', creator, renkan) |
57 def update(self, renkan, validated_data): |
71 def update(self, renkan, validated_data): |
58 """ |
72 """ |
59 Method to update a Renkan object. Creates a new revision if needed |
73 Method to update a Renkan object. Creates a new revision if needed |
60 """ |
74 """ |
61 updator = validated_data.get('updator') |
75 updator = validated_data.get('updator') |
|
76 current_revision = Revision.objects.get(revision_guid=renkan.current_revision_guid) |
62 if validated_data.get("create_new_revision", False): |
77 if validated_data.get("create_new_revision", False): |
63 revision_to_update = Revision.objects.create() |
78 revision_to_update = Revision.objects.create() |
64 revision_to_update.parent_renkan_guid = renkan.renkan_guid |
79 revision_to_update.parent_renkan_guid = renkan.renkan_guid |
65 revision_to_update.creator = updator |
80 revision_to_update.creator = updator |
66 renkan.current_revision_guid = revision_to_update.revision_guid |
81 renkan.current_revision_guid = revision_to_update.revision_guid |
67 else: |
82 else: |
68 revision_to_update = Revision.objects.get(revision_guid=renkan.current_revision_guid) |
83 revision_to_update = current_revision |
69 |
84 revision_to_update.title = validated_data.get('title', current_revision.title) |
70 revision_to_update.title = validated_data.get('title', '') |
85 revision_to_update.content = validated_data.get('content', current_revision.content) |
71 revision_to_update.content = validated_data.get('content', '{}') |
|
72 revision_to_update.last_updated_by = updator |
86 revision_to_update.last_updated_by = updator |
73 revision_to_update.save() |
87 revision_to_update.save() |
74 if not updator.has_perm('view_revision', revision_to_update): |
88 if not updator.has_perm('view_revision', revision_to_update): |
75 assign_perm('view_revision', updator, revision_to_update) |
89 assign_perm('view_revision', updator, revision_to_update) |
76 assign_perm('delete_revision', updator, revision_to_update) |
90 assign_perm('delete_revision', updator, revision_to_update) |
84 |
98 |
85 def validate_source_revision_guid(self, value): |
99 def validate_source_revision_guid(self, value): |
86 if self.instance is not None: |
100 if self.instance is not None: |
87 raise serializers.ValidationError("You cannot update source_revision_guid") |
101 raise serializers.ValidationError("You cannot update source_revision_guid") |
88 return value |
102 return value |
|
103 |
|
104 def validate_content(self, value): |
|
105 |
|
106 try: |
|
107 json.loads(value) |
|
108 except ValueError: |
|
109 raise serializers.ValidationError("Content format is not a JSON-serializable") |
|
110 loaded_json = json.loads(value) |
|
111 |
|
112 if (not "nodes" in loaded_json): |
|
113 raise serializers.ValidationError("Content requires a 'nodes' entry") |
|
114 if (not "edges" in loaded_json): |
|
115 raise serializers.ValidationError("Content requires a 'edges' entry") |
|
116 if (not "views" in loaded_json): |
|
117 raise serializers.ValidationError("Content requires a 'views' entry") |
|
118 |
|
119 return value |
89 |
120 |
90 |
121 |
91 class RevisionSerializer(serializers.Serializer): |
122 class RevisionSerializer(serializers.Serializer): |
92 revision_guid = serializers.ReadOnlyField() |
123 revision_guid = serializers.ReadOnlyField() |
93 parent_renkan_guid = serializers.ReadOnlyField() |
124 parent_renkan_guid = serializers.ReadOnlyField() |
94 workspace_guid = serializers.SerializerMethodField("get_related_workspace_guid") |
125 workspace_guid = serializers.SerializerMethodField("get_related_workspace_guid") |
95 title = serializers.ReadOnlyField() |
126 title = serializers.ReadOnlyField() |
96 content = serializers.ReadOnlyField() |
127 content = serializers.JSONField(read_only=True) |
97 project_created_by = serializers.SerializerMethodField("get_related_project_creator") |
128 project_created_by = serializers.SerializerMethodField("get_related_project_creator") |
98 project_creation_date = serializers.SerializerMethodField("get_related_project_creation_date") |
129 project_creation_date = serializers.SerializerMethodField("get_related_project_creation_date") |
99 revision_created_by = serializers.StringRelatedField(source="creator") |
130 revision_created_by = serializers.StringRelatedField(source="creator") |
100 revision_last_updated_by = serializers.StringRelatedField(source="last_updated_by") |
131 revision_last_updated_by = serializers.StringRelatedField(source="last_updated_by") |
101 revision_modification_date = serializers.ReadOnlyField(source="modification_date") |
132 revision_modification_date = serializers.ReadOnlyField(source="modification_date") |