forked from platypush/platypush
Better logic for timezone handling/conversion in calendar plugin
This commit is contained in:
parent
0a3fd4065a
commit
9ba2c18595
1 changed files with 21 additions and 9 deletions
|
@ -5,6 +5,7 @@
|
||||||
import datetime
|
import datetime
|
||||||
import dateutil.parser
|
import dateutil.parser
|
||||||
import requests
|
import requests
|
||||||
|
from typing import Union, Optional
|
||||||
|
|
||||||
from platypush.plugins import Plugin, action
|
from platypush.plugins import Plugin, action
|
||||||
from platypush.plugins.calendar import CalendarInterface
|
from platypush.plugins.calendar import CalendarInterface
|
||||||
|
@ -29,7 +30,19 @@ class CalendarIcalPlugin(Plugin, CalendarInterface):
|
||||||
self.url = url
|
self.url = url
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _translate_event(event):
|
def _convert_timestamp(event, attribute: str) -> datetime.datetime:
|
||||||
|
import pytz
|
||||||
|
t = event.get(attribute)
|
||||||
|
if not t:
|
||||||
|
return
|
||||||
|
|
||||||
|
return (
|
||||||
|
dateutil.parser.isoparse(t.dt.isoformat())
|
||||||
|
.replace(tzinfo=pytz.timezone('UTC'))
|
||||||
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _translate_event(cls, event):
|
||||||
return {
|
return {
|
||||||
'id': str(event.get('uid')) if event.get('uid') else None,
|
'id': str(event.get('uid')) if event.get('uid') else None,
|
||||||
'kind': 'calendar#event',
|
'kind': 'calendar#event',
|
||||||
|
@ -44,15 +57,15 @@ class CalendarIcalPlugin(Plugin, CalendarInterface):
|
||||||
'displayName': event.get('organizer').params['cn']
|
'displayName': event.get('organizer').params['cn']
|
||||||
} if event.get('organizer') else None,
|
} if event.get('organizer') else None,
|
||||||
|
|
||||||
'created': event.get('created').dt.isoformat() if event.get('created') else None,
|
'created': cls._convert_timestamp(event, 'created'),
|
||||||
'updated': event.get('last-modified').dt.isoformat() if event.get('last-modified') else None,
|
'updated': cls._convert_timestamp(event, 'last-modified'),
|
||||||
'start': {
|
'start': {
|
||||||
'dateTime': event.get('dtstart').dt.isoformat() if event.get('dtstart') else None,
|
'dateTime': cls._convert_timestamp(event, 'dtstart'),
|
||||||
'timeZone': 'UTC', # TODO Support multiple timezone IDs
|
'timeZone': 'UTC',
|
||||||
},
|
},
|
||||||
|
|
||||||
'end': {
|
'end': {
|
||||||
'dateTime': event.get('dtend').dt.isoformat() if event.get('dtend') else None,
|
'dateTime': cls._convert_timestamp(event, 'dtend'),
|
||||||
'timeZone': 'UTC',
|
'timeZone': 'UTC',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -81,9 +94,8 @@ class CalendarIcalPlugin(Plugin, CalendarInterface):
|
||||||
|
|
||||||
if (
|
if (
|
||||||
event['status'] != 'cancelled'
|
event['status'] != 'cancelled'
|
||||||
and event['end']['dateTime']
|
and event['end'].get('dateTime')
|
||||||
and dateutil.parser.parse(event['end']['dateTime']).replace(tzinfo=pytz.timezone('UTC')) >=
|
and event['end']['dateTime'] >= datetime.datetime.now(pytz.timezone('UTC'))
|
||||||
datetime.datetime.now(pytz.timezone('UTC'))
|
|
||||||
and (
|
and (
|
||||||
(only_participating
|
(only_participating
|
||||||
and event.get('responseStatus') in [None, 'accepted', 'tentative'])
|
and event.get('responseStatus') in [None, 'accepted', 'tentative'])
|
||||||
|
|
Loading…
Reference in a new issue