diff --git a/src/plone/restapi/deserializer/dxcontent.py b/src/plone/restapi/deserializer/dxcontent.py index 8a28394aaf..393ac4f844 100644 --- a/src/plone/restapi/deserializer/dxcontent.py +++ b/src/plone/restapi/deserializer/dxcontent.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from AccessControl import getSecurityManager +from datetime import datetime from plone.autoform.interfaces import WRITE_PERMISSIONS_KEY from plone.dexterity.interfaces import IDexterityContent from plone.dexterity.utils import iterSchemata @@ -23,6 +24,8 @@ from .mixins import OrderingMixin +import pytz + @implementer(IDeserializeFromJson) @adapter(IDexterityContent, Interface) @@ -78,14 +81,20 @@ def __call__(self, validate_all=False, data=None): # noqa: ignore=C901 'message': e.doc(), 'field': name, 'error': e}) else: field_data[name] = value - try: - if value != dm.get(): - dm.set(value) - modified = True - except TypeError: - # Most probably due to offset-naive and offset - # aware objects, set the value as they most likely - # are not the same + dm_value = dm.get() + + # This is required in case that we can compare + # offset-naive and offset aware objects. We convert all + # offset-naive datetimes to UTC timezone first and then + # compare them + if isinstance(value, datetime) and \ + isinstance(dm_value, datetime): + if value.tzinfo is None: + value = value.replace(tzinfo=pytz.UTC) + if dm_value.tzinfo is None: + dm_value = dm_value.replace(tzinfo=pytz.UTC) + + if value != dm_value: dm.set(value) modified = True