diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py index 981fef73c3b..2febffdf578 100644 --- a/addons/calendar/models/calendar.py +++ b/addons/calendar/models/calendar.py @@ -17,6 +17,7 @@ import uuid from odoo import api, fields, models from odoo import tools +from odoo.addons.base.models.res_partner import _tz_get from odoo.osv import expression from odoo.tools.translate import _ from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT, pycompat @@ -599,7 +600,7 @@ class Meeting(models.Model): else: reference_date = self.start - timezone = pytz.timezone(self._context.get('tz') or 'UTC') + timezone = pytz.timezone(self.event_tz) if self.event_tz else 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.datetime.now() @@ -637,7 +638,7 @@ class Meeting(models.Model): invalidate = True def naive_tz_to_utc(d): - return timezone.localize(d).astimezone(pytz.UTC) + return timezone.localize(d.replace(tzinfo=None), is_dst=True).astimezone(pytz.UTC) return [naive_tz_to_utc(d) if not use_naive_datetime else d for d in rset1 if d.year < MAXYEAR] @api.multi @@ -780,6 +781,7 @@ class Meeting(models.Model): start_datetime = fields.Datetime('Start DateTime', compute='_compute_dates', inverse='_inverse_dates', store=True, states={'done': [('readonly', True)]}, tracking=True) stop_date = fields.Date('End Date', compute='_compute_dates', inverse='_inverse_dates', store=True, states={'done': [('readonly', True)]}, tracking=True) stop_datetime = fields.Datetime('End Datetime', compute='_compute_dates', inverse='_inverse_dates', store=True, states={'done': [('readonly', True)]}, tracking=True) # old date_deadline + event_tz = fields.Selection('_event_tz_get', string='Timezone', default=lambda self: self.env.context.get('tz') or self.user_id.tz) duration = fields.Float('Duration', states={'done': [('readonly', True)]}) description = fields.Text('Description', states={'done': [('readonly', True)]}) privacy = fields.Selection([('public', 'Everyone'), ('private', 'Only me'), ('confidential', 'Only internal users')], 'Privacy', default='public', states={'done': [('readonly', True)]}, oldname="class") @@ -935,6 +937,10 @@ class Meeting(models.Model): data.update(self._rrule_parse(meeting.rrule, data, meeting.start)) meeting.update(data) + @api.model + def _event_tz_get(self): + return _tz_get(self) + @api.constrains('start_datetime', 'stop_datetime', 'start_date', 'stop_date') def _check_closing_date(self): for meeting in self: diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml index 76be748d098..9a69e99410b 100644 --- a/addons/calendar/views/calendar_views.xml +++ b/addons/calendar/views/calendar_views.xml @@ -139,6 +139,7 @@ {'no_create_edit': True}"/> + diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py index 34afa16eb5d..443d01f4729 100644 --- a/addons/hr_holidays/models/hr_leave.py +++ b/addons/hr_holidays/models/hr_leave.py @@ -618,7 +618,8 @@ class HolidaysRequest(models.Model): 'stop': self.date_to, 'allday': False, 'state': 'open', # to block that meeting date in the calendar - 'privacy': 'confidential' + 'privacy': 'confidential', + 'event_tz': self.user_id.tz, } # Add the partner_id (if exist) as an attendee if self.user_id and self.user_id.partner_id: