Merge pull request #55 from aceisace/support-for-recurring-events

Support for recurring events
This commit is contained in:
Ace 2019-12-14 19:25:19 +01:00 committed by GitHub
commit 639656cf8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -10,13 +10,19 @@ from settings import ical_urls
import arrow import arrow
from ics import Calendar from ics import Calendar
use_recurring_events = False ## Attention: experimental feature!
print_events = False print_events = False
style = 'DD MMM YY HH:mm' style = 'DD MMM YY HH:mm'
if use_recurring_events == True:
from dateutil.rrule import rrulestr, rruleset
import re
def fetch_events(): def fetch_events():
"""Set timelines for filtering upcoming events""" """Set timelines for filtering upcoming events"""
now = arrow.now(tz=get_tz()) timezone = get_tz()
now = arrow.now(tz=timezone)
beginning_of_month = now.replace(days= - now.day +1) beginning_of_month = now.replace(days= - now.day +1)
near_future = now.replace(days= 30) near_future = now.replace(days= 30)
further_future = now.replace(days=40) further_future = now.replace(days=40)
@ -29,6 +35,36 @@ def fetch_events():
if beginning_of_month <= events.end <= further_future or if beginning_of_month <= events.end <= further_future or
beginning_of_month <= events.begin <= near_future] beginning_of_month <= events.begin <= near_future]
"""Try to parse recurring events. This is clearly experimental! """
if use_recurring_events == True:
for ical in calendars:
for events in ical.events:
event_str = str(events)
if re.search('RRULE:(.+?)\n', event_str):
if events.all_day and events.duration.days > 1:
events.end = events.end.replace(days=-2)
else:
events.begin = events.begin.to(timezone)
events.end = events.end.to(timezone)
try:
rule = re.search('RRULE:(.+?)\n', event_str).group(0)[:-2]
if re.search('UNTIL=(.+?);', rule) and not re.search('UNTIL=(.+?)Z;', rule):
rule = re.sub('UNTIL=(.+?);', 'UNTIL='+re.search('UNTIL=(.+?);', rule).group(0)[6:-1]+'T000000Z;', rule)
dates = rrulestr(rule, dtstart= events.begin.datetime).between(after= now.datetime, before = further_future.datetime)
if dates:
duration = events.duration
for date in dates:
cc = events.clone()
cc.end = arrow.get(date+duration)
cc.begin = arrow.get(date)
upcoming_events.append(cc)
#print("Added '{}' with new start at {}".format(cc.name, cc.begin.format('DD MMM YY')))
except Exception as e:
print('Something went wrong while parsing recurring events')
pass
"""Sort events according to their beginning date""" """Sort events according to their beginning date"""
def sort_dates(event): def sort_dates(event):
return event.begin return event.begin
@ -38,11 +74,10 @@ def fetch_events():
for events in upcoming_events: for events in upcoming_events:
if events.all_day and events.duration.days > 1: if events.all_day and events.duration.days > 1:
events.end = events.end.replace(days=-2) events.end = events.end.replace(days=-2)
if not events.all_day: if not events.all_day:
events.begin = events.begin.to(get_tz()) events.begin = events.begin.to(timezone)
events.end = events.end.to(get_tz()) events.end = events.end.to(timezone)
""" The list upcoming_events should not be modified. If you need the data from """ The list upcoming_events should not be modified. If you need the data from
this one, copy the list or the contents to another one.""" this one, copy the list or the contents to another one."""