mirror of
https://github.com/b4tman/sync_ics2gcal
synced 2026-08-26 10:42:55 +03:00
Format with black.
This commit is contained in:
+43
-42
@@ -11,10 +11,9 @@ from .ical import CalendarConverter, DateDateTime
|
||||
|
||||
|
||||
class CalendarSync:
|
||||
"""class for synchronize calendar with Google
|
||||
"""
|
||||
"""class for synchronize calendar with Google"""
|
||||
|
||||
logger = logging.getLogger('CalendarSync')
|
||||
logger = logging.getLogger("CalendarSync")
|
||||
|
||||
def __init__(self, gcalendar: GoogleCalendar, converter: CalendarConverter):
|
||||
self.gcalendar: GoogleCalendar = gcalendar
|
||||
@@ -24,11 +23,10 @@ class CalendarSync:
|
||||
self.to_delete: EventList = []
|
||||
|
||||
@staticmethod
|
||||
def _events_list_compare(items_src: EventList,
|
||||
items_dst: EventList,
|
||||
key: str = 'iCalUID') \
|
||||
-> Tuple[EventList, List[EventTuple], EventList]:
|
||||
""" compare list of events by key
|
||||
def _events_list_compare(
|
||||
items_src: EventList, items_dst: EventList, key: str = "iCalUID"
|
||||
) -> Tuple[EventList, List[EventTuple], EventList]:
|
||||
"""compare list of events by key
|
||||
|
||||
Arguments:
|
||||
items_src {list of dict} -- source events
|
||||
@@ -41,7 +39,8 @@ class CalendarSync:
|
||||
items_to_delete)
|
||||
"""
|
||||
|
||||
def get_key(item: EventData) -> str: return item[key]
|
||||
def get_key(item: EventData) -> str:
|
||||
return item[key]
|
||||
|
||||
keys_src: Set[str] = set(map(get_key, items_src))
|
||||
keys_dst: Set[str] = set(map(get_key, items_dst))
|
||||
@@ -50,9 +49,7 @@ class CalendarSync:
|
||||
keys_to_update = keys_src & keys_dst
|
||||
keys_to_delete = keys_dst - keys_src
|
||||
|
||||
def items_by_keys(items: EventList,
|
||||
key_name: str,
|
||||
keys: Set[str]) -> EventList:
|
||||
def items_by_keys(items: EventList, key_name: str, keys: Set[str]) -> EventList:
|
||||
return list(filter(lambda item: item[key_name] in keys, items))
|
||||
|
||||
items_to_insert = items_by_keys(items_src, key, keys_to_insert)
|
||||
@@ -67,25 +64,25 @@ class CalendarSync:
|
||||
return items_to_insert, items_to_update, items_to_delete
|
||||
|
||||
def _filter_events_to_update(self):
|
||||
""" filter 'to_update' events by 'updated' datetime
|
||||
"""
|
||||
"""filter 'to_update' events by 'updated' datetime"""
|
||||
|
||||
def filter_updated(event_tuple: EventTuple) -> bool:
|
||||
new, old = event_tuple
|
||||
if 'updated' not in new or 'updated' not in old:
|
||||
if "updated" not in new or "updated" not in old:
|
||||
return True
|
||||
new_date = dateutil.parser.parse(new['updated'])
|
||||
old_date = dateutil.parser.parse(old['updated'])
|
||||
new_date = dateutil.parser.parse(new["updated"])
|
||||
old_date = dateutil.parser.parse(old["updated"])
|
||||
return new_date > old_date
|
||||
|
||||
self.to_update = list(filter(filter_updated, self.to_update))
|
||||
|
||||
@staticmethod
|
||||
def _filter_events_by_date(events: EventList,
|
||||
date: DateDateTime,
|
||||
op: Callable[[DateDateTime,
|
||||
DateDateTime], bool]) -> EventList:
|
||||
""" filter events by start datetime
|
||||
def _filter_events_by_date(
|
||||
events: EventList,
|
||||
date: DateDateTime,
|
||||
op: Callable[[DateDateTime, DateDateTime], bool],
|
||||
) -> EventList:
|
||||
"""filter events by start datetime
|
||||
|
||||
Arguments:
|
||||
events -- events list
|
||||
@@ -98,21 +95,22 @@ class CalendarSync:
|
||||
|
||||
def filter_by_date(event: EventData) -> bool:
|
||||
date_cmp = date
|
||||
event_start: Dict[str, str] = event['start']
|
||||
event_start: Dict[str, str] = event["start"]
|
||||
event_date: Union[DateDateTime, str, None] = None
|
||||
compare_dates = False
|
||||
|
||||
if 'date' in event_start:
|
||||
event_date = event_start['date']
|
||||
if "date" in event_start:
|
||||
event_date = event_start["date"]
|
||||
compare_dates = True
|
||||
elif 'dateTime' in event_start:
|
||||
event_date = event_start['dateTime']
|
||||
elif "dateTime" in event_start:
|
||||
event_date = event_start["dateTime"]
|
||||
|
||||
event_date = dateutil.parser.parse(event_date)
|
||||
if compare_dates:
|
||||
date_cmp = datetime.date(date.year, date.month, date.day)
|
||||
event_date = datetime.date(
|
||||
event_date.year, event_date.month, event_date.day)
|
||||
event_date.year, event_date.month, event_date.day
|
||||
)
|
||||
|
||||
return op(event_date, date_cmp)
|
||||
|
||||
@@ -149,44 +147,47 @@ class CalendarSync:
|
||||
|
||||
# divide source events by start datetime
|
||||
events_src_pending = CalendarSync._filter_events_by_date(
|
||||
events_src, start_date, operator.ge)
|
||||
events_src, start_date, operator.ge
|
||||
)
|
||||
events_src_past = CalendarSync._filter_events_by_date(
|
||||
events_src, start_date, operator.lt)
|
||||
events_src, start_date, operator.lt
|
||||
)
|
||||
|
||||
# first events comparison
|
||||
self.to_insert, self.to_update, self.to_delete = CalendarSync._events_list_compare(
|
||||
events_src_pending, events_dst)
|
||||
(
|
||||
self.to_insert,
|
||||
self.to_update,
|
||||
self.to_delete,
|
||||
) = CalendarSync._events_list_compare(events_src_pending, events_dst)
|
||||
|
||||
# find in events 'to_delete' past events from source, for update (move to past)
|
||||
_, add_to_update, self.to_delete = CalendarSync._events_list_compare(
|
||||
events_src_past, self.to_delete)
|
||||
events_src_past, self.to_delete
|
||||
)
|
||||
self.to_update.extend(add_to_update)
|
||||
|
||||
# find if events 'to_insert' exists in gcalendar, for update them
|
||||
add_to_update, self.to_insert = self.gcalendar.find_exists(
|
||||
self.to_insert)
|
||||
add_to_update, self.to_insert = self.gcalendar.find_exists(self.to_insert)
|
||||
self.to_update.extend(add_to_update)
|
||||
|
||||
# exclude outdated events from 'to_update' list, by 'updated' field
|
||||
self._filter_events_to_update()
|
||||
|
||||
self.logger.info(
|
||||
'prepared to sync: ( insert: %d, update: %d, delete: %d )',
|
||||
"prepared to sync: ( insert: %d, update: %d, delete: %d )",
|
||||
len(self.to_insert),
|
||||
len(self.to_update),
|
||||
len(self.to_delete)
|
||||
len(self.to_delete),
|
||||
)
|
||||
|
||||
def clear(self) -> None:
|
||||
""" clear prepared sync lists (insert, update, delete)
|
||||
"""
|
||||
"""clear prepared sync lists (insert, update, delete)"""
|
||||
self.to_insert.clear()
|
||||
self.to_update.clear()
|
||||
self.to_delete.clear()
|
||||
|
||||
def apply(self) -> None:
|
||||
""" apply sync (insert, update, delete), using prepared lists of events
|
||||
"""
|
||||
"""apply sync (insert, update, delete), using prepared lists of events"""
|
||||
|
||||
self.gcalendar.insert_events(self.to_insert)
|
||||
self.gcalendar.update_events(self.to_update)
|
||||
@@ -194,4 +195,4 @@ class CalendarSync:
|
||||
|
||||
self.clear()
|
||||
|
||||
self.logger.info('sync done')
|
||||
self.logger.info("sync done")
|
||||
|
||||
Reference in New Issue
Block a user