From ec801b54365590a392bb0f71aa51cea13f778fdb Mon Sep 17 00:00:00 2001 From: David Beguin Date: Tue, 4 Sep 2018 17:33:50 +0200 Subject: [PATCH] [FIX] calendar : all day event Date to Datetime error - calendar.event.start and stop are expecting datetime and not date. Now, if 'All Day' event, start time = 00h00 and stop time = 23h59m59s - when switching from all day event to not all day event, due to stop time = 23h59m59s, the rounding for duration leads to make the stop pass to the next day (00h00). each time you switch between all day and not all day, the duiration is incremented by 24h. We remove 1 sec to event stop time to avoid this. --- addons/calendar/models/calendar.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py index b547a2fbe3a..ad11e5b8155 100644 --- a/addons/calendar/models/calendar.py +++ b/addons/calendar/models/calendar.py @@ -4,7 +4,8 @@ import base64 import babel.dates import collections -from datetime import datetime, timedelta, MAXYEAR +import datetime +from datetime import timedelta, MAXYEAR from dateutil import parser from dateutil import rrule from dateutil.relativedelta import relativedelta @@ -41,7 +42,7 @@ def calendar_id2real_id(calendar_id=None, with_date=False): real_id = res[0] if with_date: real_date = time.strftime(DEFAULT_SERVER_DATETIME_FORMAT, time.strptime(res[1], VIRTUALID_DATETIME_FORMAT)) - start = datetime.strptime(real_date, DEFAULT_SERVER_DATETIME_FORMAT) + start = datetime.datetime.strptime(real_date, DEFAULT_SERVER_DATETIME_FORMAT) end = start + timedelta(hours=with_date) return (int(real_id), real_date, end.strftime(DEFAULT_SERVER_DATETIME_FORMAT)) return int(real_id) @@ -336,10 +337,10 @@ class AlarmManager(models.AbstractModel): """ result = [] # TODO: remove event_maxdelta and if using it - if one_date - timedelta(minutes=(missing and 0 or event_maxdelta)) < datetime.now() + timedelta(seconds=in_the_next_X_seconds): # if an alarm is possible for this date + if one_date - timedelta(minutes=(missing and 0 or event_maxdelta)) < datetime.datetime.now() + timedelta(seconds=in_the_next_X_seconds): # if an alarm is possible for this date for alarm in event.alarm_ids: if alarm.type == alarm_type and \ - one_date - timedelta(minutes=(missing and 0 or alarm.duration_minutes)) < datetime.now() + timedelta(seconds=in_the_next_X_seconds) and \ + one_date - timedelta(minutes=(missing and 0 or alarm.duration_minutes)) < datetime.datetime.now() + timedelta(seconds=in_the_next_X_seconds) and \ (not after or one_date - timedelta(minutes=alarm.duration_minutes) > fields.Datetime.from_string(after)): alert = { 'alarm_id': alarm.id, @@ -447,7 +448,7 @@ class AlarmManager(models.AbstractModel): if alarm.type == 'notification': message = meeting.display_time - delta = alert['notify_at'] - datetime.now() + delta = alert['notify_at'] - datetime.datetime.now() delta = delta.seconds + delta.days * 3600 * 24 return { @@ -609,7 +610,7 @@ class Meeting(models.Model): timezone = pytz.timezone(self._context.get('tz') or 'UTC') event_date = pytz.UTC.localize(fields.Datetime.from_string(reference_date)) # Add "+hh:mm" timezone if not event_date: - event_date = datetime.now() + event_date = datetime.datetime.now() use_naive_datetime = self.allday and self.rrule and 'UNTIL' in self.rrule and 'Z' not in self.rrule if use_naive_datetime: @@ -950,17 +951,17 @@ class Meeting(models.Model): if self.start_datetime: start = self.start_datetime self.start = self.start_datetime - self.stop = start + timedelta(hours=self.duration) + self.stop = start + timedelta(hours=self.duration) - timedelta(seconds=1) @api.onchange('start_date') def _onchange_start_date(self): if self.start_date: - self.start = self.start_date + self.start = datetime.datetime.combine(self.start_date, datetime.time.min) @api.onchange('stop_date') def _onchange_stop_date(self): if self.stop_date: - self.stop = self.stop_date + self.stop = datetime.datetime.combine(self.stop_date, datetime.time.max) #################################################### # Calendar Business, Reccurency, ...