caldav_sync: try to fix tz problems

This commit is contained in:
Marc Durepos 2024-05-28 10:58:03 -04:00
parent babd69fad9
commit f6d6e37c27

View file

@ -2,12 +2,13 @@ import uuid
from odoo import models, api, fields from odoo import models, api, fields
import caldav import caldav
import logging import logging
from datetime import datetime from datetime import datetime, timezone
from icalendar import Calendar, Event, vCalAddress, vText, vWeekday from icalendar import Calendar, Event, vCalAddress, vText, vWeekday
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from datetime import timedelta from datetime import timedelta
import dateutil import dateutil
import re import re
from pytz import timezone
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -143,9 +144,12 @@ class CalendarEvent(models.Model):
calendar.add('version', '2.0') calendar.add('version', '2.0')
for event in self: for event in self:
user_tz = timezone('UTC')
if event.user_id.tz:
user_tz = timezone(event.user_id.tz)
ical_event = Event() ical_event = Event()
ical_event.add('uid', event.caldav_uid) ical_event.add('uid', event.caldav_uid)
ical_event.add('dtstamp', event.write_date.replace(tzinfo=None)) ical_event.add('dtstamp', event.write_date.astimezone(user_tz))
if event.name: if event.name:
ical_event.add('summary', event.name) ical_event.add('summary', event.name)
if self.html_to_text(event.description): if self.html_to_text(event.description):
@ -168,8 +172,8 @@ class CalendarEvent(models.Model):
ical_event.add('rrule', rrule_dict) ical_event.add('rrule', rrule_dict)
# Add DTSTART and DTEND # Add DTSTART and DTEND
ical_event.add('dtstart', event.start.replace(tzinfo=None)) ical_event.add('dtstart', event.start)
ical_event.add('dtend', event.stop.replace(tzinfo=None)) ical_event.add('dtend', event.stop)
calendar.add_component(ical_event) calendar.add_component(ical_event)
@ -279,6 +283,9 @@ class CalendarEvent(models.Model):
email_regex = re.compile(r'[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+') email_regex = re.compile(r'[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+')
now = datetime.now() now = datetime.now()
current_user_email = self.env.user.email.lower() current_user_email = self.env.user.email.lower()
user_tz = timezone('UTC')
if self.env.user.tz:
user_tz = timezone(self.env.user.tz)
for component in ical_event.subcomponents: for component in ical_event.subcomponents:
if isinstance(component, Event): if isinstance(component, Event):
@ -308,10 +315,10 @@ class CalendarEvent(models.Model):
existing_instance = self._get_existing_instance(uid, recurrence_id) existing_instance = self._get_existing_instance(uid, recurrence_id)
start = component.decoded('dtstart') start = component.decoded('dtstart')
if isinstance(start, datetime): if isinstance(start, datetime):
start = start.replace(tzinfo=None) start = start.astimezone(user_tz).replace(tzinfo=None)
end = component.decoded('dtend') end = component.decoded('dtend')
if isinstance(end, datetime): if isinstance(end, datetime):
end = end.replace(tzinfo=None) end = end.astimezone(user_tz).replace(tzinfo=None)
values = { values = {
'name': str(component.get('summary')), 'name': str(component.get('summary')),