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
from ics import Calendar
use_recurring_events = False ## Attention: experimental feature!
print_events = False
style = 'DD MMM YY HH:mm'
if use_recurring_events == True:
from dateutil.rrule import rrulestr, rruleset
import re
def fetch_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)
near_future = now.replace(days= 30)
further_future = now.replace(days=40)
@ -29,6 +35,36 @@ def fetch_events():
if beginning_of_month <= events.end <= further_future or
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"""
def sort_dates(event):
return event.begin
@ -38,11 +74,10 @@ def fetch_events():
for events in upcoming_events:
if events.all_day and events.duration.days > 1:
events.end = events.end.replace(days=-2)
if not events.all_day:
events.begin = events.begin.to(get_tz())
events.end = events.end.to(get_tz())
events.begin = events.begin.to(timezone)
events.end = events.end.to(timezone)
""" 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."""