3 from django.db import transaction |
3 from django.db import transaction |
4 from django.contrib.auth import get_user_model |
4 from django.contrib.auth import get_user_model |
5 from django.conf import settings |
5 from django.conf import settings |
6 from django.core.exceptions import ValidationError |
6 from django.core.exceptions import ValidationError |
7 from django.utils import dateparse |
7 from django.utils import dateparse |
|
8 from renkanmanager import settings as renkan_settings |
8 from renkanmanager.models import Renkan, Workspace, Revision |
9 from renkanmanager.models import Renkan, Workspace, Revision |
9 from rest_framework import serializers |
10 from rest_framework import serializers |
10 |
11 |
11 logger = logging.getLogger(__name__) |
12 logger = logging.getLogger(__name__) |
12 RENKAN_USER_DISPLAY_FIELD = getattr(settings, "RENKAN_USER_DISPLAY_FIELD", get_user_model().USERNAME_FIELD) |
13 RENKAN_USER_DISPLAY_FIELD = renkan_settings.RENKAN_USER_DISPLAY_FIELD |
13 |
14 |
14 class RenkanSerializer(serializers.Serializer): |
15 class RenkanSerializer(serializers.Serializer): |
15 id = serializers.ReadOnlyField(source="renkan_guid") |
16 id = serializers.ReadOnlyField(source="renkan_guid") |
16 current_revision_id = serializers.SlugRelatedField(source="current_revision", slug_field="revision_guid", read_only=True) |
17 current_revision_id = serializers.SlugRelatedField(source="current_revision", slug_field="revision_guid", read_only=True) |
17 workspace_id = serializers.SlugRelatedField(source="workspace", slug_field="workspace_guid", queryset=Workspace.objects, required=False) |
18 workspace_id = serializers.SlugRelatedField(source="workspace", slug_field="workspace_guid", queryset=Workspace.objects, required=False) |
41 @transaction.atomic |
42 @transaction.atomic |
42 def create(self, validated_data): |
43 def create(self, validated_data): |
43 """ |
44 """ |
44 Method to create a new Renkan (and its first revision) |
45 Method to create a new Renkan (and its first revision) |
45 """ |
46 """ |
|
47 logger.debug("RENKANSERIALIZER %r", validated_data) |
46 creator = validated_data.get('creator') |
48 creator = validated_data.get('creator') |
47 workspace_obj = validated_data.get('workspace', None) |
49 workspace_obj = validated_data.get('workspace', None) |
48 source_revision_obj = validated_data.get('source_revision', None) |
50 source_revision_obj = validated_data.get('source_revision', None) |
49 try: |
51 try: |
50 return Renkan.objects.create_renkan( |
52 return Renkan.objects.create_renkan( |
60 @transaction.atomic |
62 @transaction.atomic |
61 def update(self, renkan, validated_data): |
63 def update(self, renkan, validated_data): |
62 """ |
64 """ |
63 Method to update a Renkan object. Creates a new revision if needed |
65 Method to update a Renkan object. Creates a new revision if needed |
64 """ |
66 """ |
|
67 logger.debug('RENKAN SERIALIZER UPDATE %r', validated_data) |
65 updator = validated_data.get('updator') |
68 updator = validated_data.get('updator') |
66 create_new_revision = validated_data.get("create_new_revision", False) |
69 create_new_revision = validated_data.get("create_new_revision", False) |
67 title = validated_data.get('title', renkan.current_revision.title) |
70 title = validated_data.get('title', renkan.current_revision.title) |
68 content = validated_data.get('content', '') |
71 content = validated_data.get('content', '') |
69 if not content: |
72 if not content: |
81 content = json.dumps(content_dict) |
84 content = json.dumps(content_dict) |
82 try: |
85 try: |
83 renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision) |
86 renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision) |
84 except ValidationError as ve: |
87 except ValidationError as ve: |
85 raise serializers.ValidationError(str(ve.args[0])) |
88 raise serializers.ValidationError(str(ve.args[0])) |
86 return renkan |
89 # FORCE Renkan reload. |
|
90 # TODO: How to avoid the reload ??? |
|
91 return Renkan.objects.get(id=renkan.id) |
87 |
92 |
88 def validate_workspace_id(self, value): |
93 def validate_workspace_id(self, value): |
89 if self.instance is not None: |
94 if self.instance is not None: |
90 raise serializers.ValidationError("You cannot update workspace_guid") |
95 raise serializers.ValidationError("You cannot update workspace_guid") |
91 return value |
96 return value |
107 if (not "views" in loaded_json): |
112 if (not "views" in loaded_json): |
108 raise serializers.ValidationError("Content requires a 'views' entry") |
113 raise serializers.ValidationError("Content requires a 'views' entry") |
109 return value |
114 return value |
110 |
115 |
111 def validate_validation_timestamp(self, value): |
116 def validate_validation_timestamp(self, value): |
112 logger.debug("%r < %r", dateparse.parse_datetime(value), self.get_current_revision_modification_date(self.instance)) |
117 logger.debug("%r < %r", dateparse.parse_datetime(value).timestamp(), self.get_current_revision_modification_date(self.instance).timestamp()) |
113 |
118 |
114 if self.instance and dateparse.parse_datetime(value) < self.get_current_revision_modification_date(self.instance): |
119 if self.instance and dateparse.parse_datetime(value) != self.get_current_revision_modification_date(self.instance): |
115 raise serializers.ValidationError("Invalid timestamp was provided") |
120 raise serializers.ValidationError("Invalid timestamp was provided") |
116 return value |
121 return value |
117 |
122 |
118 class RevisionSerializer(serializers.Serializer): |
123 class RevisionSerializer(serializers.Serializer): |
119 id = serializers.ReadOnlyField(source="revision_guid") |
124 id = serializers.ReadOnlyField(source="revision_guid") |