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