23 content = serializers.JSONField(required=False) |
23 content = serializers.JSONField(required=False) |
24 creation_date = serializers.ReadOnlyField() |
24 creation_date = serializers.ReadOnlyField() |
25 modification_date = serializers.SerializerMethodField("get_current_revision_modification_date") |
25 modification_date = serializers.SerializerMethodField("get_current_revision_modification_date") |
26 create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating |
26 create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating |
27 validation_timestamp = serializers.CharField(write_only=True, required=False) # only used for updating is a content json is not provided |
27 validation_timestamp = serializers.CharField(write_only=True, required=False) # only used for updating is a content json is not provided |
28 |
28 |
29 # ADD ERROR HANDLING |
29 # ADD ERROR HANDLING |
30 def get_current_revision_last_updator(self, renkan): |
30 def get_current_revision_last_updator(self, renkan): |
31 return getattr(renkan.current_revision.last_updated_by, RENKAN_USER_DISPLAY_FIELD) |
31 last_updator = renkan.current_revision.last_updated_by |
32 |
32 if last_updator: |
33 |
33 return getattr(last_updator, RENKAN_USER_DISPLAY_FIELD) |
|
34 else: |
|
35 return '' |
|
36 |
|
37 |
34 def get_current_revision_modification_date(self, renkan): |
38 def get_current_revision_modification_date(self, renkan): |
35 return renkan.current_revision.modification_date |
39 return renkan.current_revision.modification_date |
36 |
40 |
37 @transaction.atomic |
41 @transaction.atomic |
38 def create(self, validated_data): |
42 def create(self, validated_data): |
39 """ |
43 """ |
40 Method to create a new Renkan (and its first revision) |
44 Method to create a new Renkan (and its first revision) |
41 """ |
45 """ |
50 workspace=workspace_obj, |
54 workspace=workspace_obj, |
51 source_revision=source_revision_obj |
55 source_revision=source_revision_obj |
52 ) |
56 ) |
53 except ValidationError as ve: |
57 except ValidationError as ve: |
54 raise serializers.ValidationError(ve.args[0]) |
58 raise serializers.ValidationError(ve.args[0]) |
55 |
59 |
56 @transaction.atomic |
60 @transaction.atomic |
57 def update(self, renkan, validated_data): |
61 def update(self, renkan, validated_data): |
58 """ |
62 """ |
59 Method to update a Renkan object. Creates a new revision if needed |
63 Method to update a Renkan object. Creates a new revision if needed |
60 """ |
64 """ |
78 try: |
82 try: |
79 renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision) |
83 renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision) |
80 except ValidationError as ve: |
84 except ValidationError as ve: |
81 raise serializers.ValidationError(str(ve.args[0])) |
85 raise serializers.ValidationError(str(ve.args[0])) |
82 return renkan |
86 return renkan |
83 |
87 |
84 def validate_workspace_id(self, value): |
88 def validate_workspace_id(self, value): |
85 if self.instance is not None: |
89 if self.instance is not None: |
86 raise serializers.ValidationError("You cannot update workspace_guid") |
90 raise serializers.ValidationError("You cannot update workspace_guid") |
87 return value |
91 return value |
88 |
92 |
89 def validate_source_revision_id(self, value): |
93 def validate_source_revision_id(self, value): |
90 if self.instance is not None: |
94 if self.instance is not None: |
91 raise serializers.ValidationError("You cannot update source_revision_guid") |
95 raise serializers.ValidationError("You cannot update source_revision_guid") |
92 return value |
96 return value |
93 |
97 |
94 def validate_content(self, value): |
98 def validate_content(self, value): |
95 try: |
99 try: |
96 loaded_json = json.loads(value) |
100 loaded_json = json.loads(value) |
97 except ValueError: |
101 except ValueError: |
98 raise serializers.ValidationError("Content format is not a JSON-serializable") |
102 raise serializers.ValidationError("Content format is not a JSON-serializable") |
99 if (not "nodes" in loaded_json): |
103 if (not "nodes" in loaded_json): |
101 if (not "edges" in loaded_json): |
105 if (not "edges" in loaded_json): |
102 raise serializers.ValidationError("Content requires a 'edges' entry") |
106 raise serializers.ValidationError("Content requires a 'edges' entry") |
103 if (not "views" in loaded_json): |
107 if (not "views" in loaded_json): |
104 raise serializers.ValidationError("Content requires a 'views' entry") |
108 raise serializers.ValidationError("Content requires a 'views' entry") |
105 return value |
109 return value |
106 |
110 |
107 def validate_validation_timestamp(self, value): |
111 def validate_validation_timestamp(self, value): |
108 logger.debug("%r", value) |
112 logger.debug("%r < %r", dateparse.parse_datetime(value), self.get_current_revision_modification_date(self.instance)) |
|
113 |
109 if self.instance and dateparse.parse_datetime(value) < self.get_current_revision_modification_date(self.instance): |
114 if self.instance and dateparse.parse_datetime(value) < self.get_current_revision_modification_date(self.instance): |
110 raise serializers.ValidationError("Invalid timestamp was provided") |
115 raise serializers.ValidationError("Invalid timestamp was provided") |
111 return value |
116 return value |
112 |
117 |
113 class RevisionSerializer(serializers.Serializer): |
118 class RevisionSerializer(serializers.Serializer): |
119 renkan_created_by = serializers.SerializerMethodField("get_related_renkan_creator") |
124 renkan_created_by = serializers.SerializerMethodField("get_related_renkan_creator") |
120 renkan_creation_date = serializers.SerializerMethodField("get_related_renkan_creation_date") |
125 renkan_creation_date = serializers.SerializerMethodField("get_related_renkan_creation_date") |
121 revision_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) |
126 revision_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) |
122 revision_last_updated_by = serializers.SlugRelatedField(source="last_updated_by", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) |
127 revision_last_updated_by = serializers.SlugRelatedField(source="last_updated_by", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) |
123 revision_modification_date = serializers.ReadOnlyField(source="modification_date") |
128 revision_modification_date = serializers.ReadOnlyField(source="modification_date") |
124 |
129 |
125 def get_related_workspace_guid(self, revision): |
130 def get_related_workspace_guid(self, revision): |
126 if revision.parent_renkan.workspace: |
131 if revision.parent_renkan.workspace: |
127 return revision.parent_renkan.workspace.workspace_guid |
132 return revision.parent_renkan.workspace.workspace_guid |
128 else: |
133 else: |
129 return '' |
134 return '' |
130 |
135 |
131 def get_related_renkan_creator(self, revision): |
136 def get_related_renkan_creator(self, revision): |
132 return getattr(revision.parent_renkan.creator, RENKAN_USER_DISPLAY_FIELD) |
137 return getattr(revision.parent_renkan.creator, RENKAN_USER_DISPLAY_FIELD) |
133 |
138 |
134 def get_related_renkan_creation_date(self, revision): |
139 def get_related_renkan_creation_date(self, revision): |
135 return revision.parent_renkan.creation_date |
140 return revision.parent_renkan.creation_date |
136 |
141 |
137 |
142 |
138 class WorkspaceSerializer(serializers.Serializer): |
143 class WorkspaceSerializer(serializers.Serializer): |
139 id = serializers.ReadOnlyField(source="workspace_guid") |
144 id = serializers.ReadOnlyField(source="workspace_guid") |
140 workspace_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) |
145 workspace_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True) |
141 creation_date = serializers.ReadOnlyField() |
146 creation_date = serializers.ReadOnlyField() |
142 renkan_count = serializers.ReadOnlyField() |
147 renkan_count = serializers.ReadOnlyField() |
143 title = serializers.CharField() |
148 title = serializers.CharField() |
144 |
149 |
145 def create(self, validated_data): |
150 def create(self, validated_data): |
146 creator = validated_data.get('creator') |
151 creator = validated_data.get('creator') |
147 title = validated_data.get('title', '') |
152 title = validated_data.get('title', '') |
148 workspace = Workspace.objects.create(creator=creator, title=title) |
153 workspace = Workspace.objects.create(creator=creator, title=title) |
149 workspace.save() |
154 workspace.save() |
150 return workspace |
155 return workspace |
151 |
156 |
152 def update(self, workspace, validated_data): |
157 def update(self, workspace, validated_data): |
153 workspace.title = validated_data.get('title', '') |
158 workspace.title = validated_data.get('title', '') |
154 workspace.save() |
159 workspace.save() |
155 return workspace |
160 return workspace |