From a6401391ed305f4382bc66f895dfd8e1860bef08 Mon Sep 17 00:00:00 2001 From: jem-odoo Date: Wed, 5 Sep 2018 13:37:22 +0200 Subject: [PATCH] [FIX] fields: raise when setting aware datetime Now that Date/Datetime fields use python naive datetime, we want to prevent developper to call or assign aware datetime to fields. Moreover, if so, the timezone will be stored in the database, but when reading Datetime fields, we expect naive datetime. Comparing naive and aware datetime objects leads to errors. This commit forces developpers to use naive datetime when saving data in database. As example, we have to erase the timezone of dates in calendar modules. We also regroup the 2 assignations in one call to `write` for performance reason. Thanks to @dbeguin and @RomainLibert for spending some time on this bug. --- addons/calendar/models/calendar.py | 7 +++++-- odoo/fields.py | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py index 471de145472..b547a2fbe3a 100644 --- a/addons/calendar/models/calendar.py +++ b/addons/calendar/models/calendar.py @@ -897,13 +897,16 @@ class Meeting(models.Model): enddate = tz.localize(enddate) enddate = enddate.replace(hour=18) enddate = enddate.astimezone(pytz.utc) - meeting.stop = enddate startdate = fields.Datetime.from_string(meeting.start_date) startdate = tz.localize(startdate) # Add "+hh:mm" timezone startdate = startdate.replace(hour=8) # Set 8 AM in localtime startdate = startdate.astimezone(pytz.utc) # Convert to UTC - meeting.start = startdate + + meeting.write({ + 'start': startdate.replace(tzinfo=None), + 'stop': enddate.replace(tzinfo=None) + }) else: meeting.write({'start': meeting.start_datetime, 'stop': meeting.stop_datetime}) diff --git a/odoo/fields.py b/odoo/fields.py index 16a58d70653..650eaebb799 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -1681,6 +1681,8 @@ class Datetime(Field): return None if isinstance(value, date): if isinstance(value, datetime): + if value.tzinfo: + raise ValueError("Datetime field expects a naive datetime: %s" % value) return value return datetime.combine(value, time.min) try: