--- a/server/python/django2/renkanmanager/serializers.py Tue May 03 14:32:28 2016 +0200
+++ b/server/python/django2/renkanmanager/serializers.py Tue Jun 07 10:44:41 2016 +0200
@@ -1,11 +1,14 @@
-import json, uuid, datetime, time
+import json, logging, uuid, datetime, time
from django.db import transaction
from django.contrib.auth import get_user_model
from django.conf import settings
+from django.core.exceptions import ValidationError
+from django.utils import dateparse
from renkanmanager.models import Renkan, Workspace, Revision
from rest_framework import serializers
+logger = logging.getLogger(__name__)
RENKAN_USER_DISPLAY_FIELD = getattr(settings, "RENKAN_USER_DISPLAY_FIELD", get_user_model().USERNAME_FIELD)
class RenkanSerializer(serializers.Serializer):
@@ -66,6 +69,8 @@
validation_timestamp = validated_data.get('validation_timestamp')
else:
validation_timestamp = json.loads(content).get("updated", "")
+ if dateparse.parse_datetime(validation_timestamp) < renkan.current_revision.modification_date:
+ raise serializers.ValidationError("Provided timestamp is invalid")
if title != json.loads(content).get("title", ""):
content_dict = json.loads(content)
content_dict["title"] = title
@@ -73,7 +78,7 @@
try:
renkan.save_renkan(updator=updator, timestamp=validation_timestamp, title=title, content=content, create_new_revision=create_new_revision)
except ValidationError as ve:
- raise serializers.ValidationError(ve.args[0])
+ raise serializers.ValidationError(str(ve.args[0]))
return renkan
def validate_workspace_id(self, value):
@@ -88,20 +93,22 @@
def validate_content(self, value):
try:
- json.loads(value)
+ loaded_json = json.loads(value)
except ValueError:
raise serializers.ValidationError("Content format is not a JSON-serializable")
- loaded_json = json.loads(value)
-
if (not "nodes" in loaded_json):
raise serializers.ValidationError("Content requires a 'nodes' entry")
if (not "edges" in loaded_json):
raise serializers.ValidationError("Content requires a 'edges' entry")
if (not "views" in loaded_json):
raise serializers.ValidationError("Content requires a 'views' entry")
-
return value
-
+
+ def validate_validation_timestamp(self, value):
+ logger.debug("%r", value)
+ if self.instance and dateparse.parse_datetime(value) < self.get_current_revision_modification_date(self.instance):
+ raise serializers.ValidationError("Invalid timestamp was provided")
+ return value
class RevisionSerializer(serializers.Serializer):
id = serializers.ReadOnlyField(source="revision_guid")