X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=parserrules.py;h=a2175fed34e8168e62384de0275274f164be1b93;hb=ae40266069204ee411350d5fd3d31f40d89187af;hp=0ac3d9720b2c9b0d72376064ae84b7707332ca61;hpb=d6a7b9600696f577ea2c6f49e99dc6f01b4f76d8;p=frenchie%2Ficalparse.git diff --git a/parserrules.py b/parserrules.py index 0ac3d97..a2175fe 100644 --- a/parserrules.py +++ b/parserrules.py @@ -28,6 +28,9 @@ import vobject +ruleConfig = {} +ruleConfig["defaultTZ"] = "UTC" + def facebookOrganiser(cal): '''Adds organiser details to the body of facebook calendars.''' @@ -36,11 +39,14 @@ def facebookOrganiser(cal): for event in cal.vevent_list: if not event.contents.has_key(u'organizer'): continue - organizer = "Organised by: " + event.organizer.cn_param + " (" - organizer += event.organizer.value.lstrip('MAILTO:') + ")\n\n" - - event.description.value = organizer + event.description.value - + 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): @@ -48,47 +54,72 @@ def whatPrivacy(cal): for event in cal.vevent_list: if event.contents.has_key(u'class'): - del event.contents[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 dropMSKeys(cal): - '''Drops microsoft keys, good for outlook, just bandwidth when not.''' - - eventBlacklist = [x.lower() for x in [ - "X-ALT-DESC", - "X-MICROSOFT-CDO-BUSYSTATUS", - "X-MICROSOFT-CDO-IMPORTANCE", - "X-MICROSOFT-DISALLOW-COUNTER", - "X-MS-OLK-ALLOWEXTERNCHECK", - "X-MS-OLK-AUTOSTARTCHECK", - "X-MS-OLK-CONFTYPE", - "X-MS-OLK-AUTOFILLLOCATION" - ]] - - vcalBlacklist = [x.lower() for x in [ - "X-CALEND", - "X-CALSTART", - "X-CLIPEND", - "X-CLIPSTART", - "X-MS-OLK-WKHRDAYS", - "X-MS-OLK-WKHREND", - "X-MS-OLK-WKHRSTART", - "X-OWNER", - "X-PRIMARY-CALENDAR", - "X-PUBLISHED-TTL", - "X-WR-CALDESC", - "X-WR-CALNAME", - "X-WR-RELCALID" - ]] +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: - for blacklist in eventBlacklist: - if event.contents.has_key(blacklist): del event.contents[blacklist] + 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) - for blacklist in vcalBlacklist: - if cal.contents.has_key(blacklist): del cal.contents[blacklist] + 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