Merge pull request #55 from aceisace/support-for-recurring-events
Support for recurring events
This commit is contained in:
commit
639656cf8c
@ -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."""
|
||||||
|
Loading…
Reference in New Issue
Block a user