#!/usr/bin/python
#
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-# This file describes a series of rules which will be called on an ics file as
-# rule(key, value)
-
-# Your functions are expected to return a (key, value) tuple or they will be
-# treated as if they don't exist (ie, the line will go through unhindered).
-# Returning any boolean false value other than a None will return the line from
-# the final iCalendar file
+# This file describes a series of rules which must handle a vobject object and
+# return it to the calling script
# The doc string will be presented to the user when run as verbose, so
# please be polite
-def markEventsPublic(key, value):
- '''Marking private events public'''
- # Required as google are strict about the CLASS:PRIVATE/CLASS:CONFIDENTIAL
- # lines and Facebook like to set them
- if key == 'CLASS': return (key, 'PUBLIC')
+import vobject
+
+ruleConfig = {}
+ruleConfig["defaultTZ"] = "UTC"
+
+def facebookOrganiser(cal):
+ '''Adds organiser details to the body of facebook calendars.'''
+
+ if cal.contents.has_key(u'prodid'):
+ if not "Facebook" in cal.prodid.value: return cal
+
+ for event in cal.vevent_list:
+ if not event.contents.has_key(u'organizer'): continue
+ try:
+ a = event.organizer.cn_paramlist
+ organizer = "Organised by: " + event.organizer.cn_param + " ("
+ organizer += event.organizer.value.lstrip('MAILTO:') + ")\n\n"
+ event.description.value = organizer + event.description.value
+ except AttributeError:
+ organizer = "Organized by: " + event.organizer.value
+ event.description.value = organizer + "\n\n" + event.description.value
+ return cal
+
+def whatPrivacy(cal):
+ '''Marks events public so google calendar doesn't have a sad about them.'''
+
+ for event in cal.vevent_list:
+ if event.contents.has_key(u'class'):
+ # Bit of a hack as class is a reserved word in python
+ del event.contents[u'class']
+ event.add('class').value = "PUBLIC"
+
+ return cal
+
+def exDate(cal):
+ '''Replacing multi-value EXDATES with multiple single-value EXDATES'''
+
+ from datetime import datetime
+ from pytz import timezone
+
+ default = timezone(ruleConfig["defaultTZ"])
+
+ for event in cal.vevent_list:
+ if not event.contents.has_key(u'exdate'): continue
+ dates = event.exdate.value
+
+ del event.contents[u'exdate']
+
+ for date in dates:
+ if isinstance(date, datetime):
+ if date.tzinfo is None: date = date.replace(tzinfo = default)
+ date = date.astimezone(vobject.icalendar.utc)
+ entry = event.add(u'exdate')
+ entry.value = [date]
+
+ return cal
+
+def utcise(cal):
+ '''Removing local timezones in favour of UTC. If the remote calendar specifies a timezone
+ then use it, otherwise assume it's in the user-specified or default values'''
+
+ from datetime import datetime
+ from pytz import timezone
+
+ default = timezone(ruleConfig["defaultTZ"])
+
+ for event in cal.vevent_list:
+ dtstart = getattr(event, 'dtstart', None)
+ dtend = getattr(event, 'dtend', None)
+
+ for i in (dtstart, dtend):
+ if not i: continue
+ dt = i.value
+ if isinstance(dt, datetime):
+ if dt.tzinfo is None: dt = dt.replace(tzinfo = default)
+ i.value = dt.astimezone(vobject.icalendar.utc)
+
+ return cal
+
+def unwantedParams(cal):
+ '''Removing unwanted parameters'''
+
+ blklist = [
+ "LANGUAGE",
+ "X-VOBJ-ORIGINAL-TZID",
+ "TZID"
+ ]
+
+ for event in cal.vevent_list:
+ for attr in event.contents:
+ attr = getattr(event, attr)
+ try:
+ for i in blklist:
+ while i in attr.params: del attr.params[i]
+ except AttributeError: continue
+
+ return cal