X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=parserrules.py;h=7db0413af970c2ecdf0fd5b99e17fd9d1ec32eb5;hb=ee8a5360ac1f00ccbeef97c53d8615f6615108bf;hp=424de515cb496f91c58fd8dc71ee20af54851324;hpb=1a7f8e3e07ffd99b36cbb0504b0359c089e9f3a4;p=frenchie%2Ficalparse.git diff --git a/parserrules.py b/parserrules.py index 424de51..7db0413 100644 --- a/parserrules.py +++ b/parserrules.py @@ -28,14 +28,20 @@ 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 'prodid' in cal.contents: if not "Facebook" in cal.prodid.value: return cal + if 'vevent_list' not in dir(cal): + return cal + for event in cal.vevent_list: - if not event.contents.has_key(u'organizer'): continue + if 'organizer' not in event.contents: continue try: a = event.organizer.cn_paramlist organizer = "Organised by: " + event.organizer.cn_param + " (" @@ -49,16 +55,24 @@ def facebookOrganiser(cal): def whatPrivacy(cal): '''Marks events public so google calendar doesn't have a sad about them.''' + if 'vevent_list' not in dir(cal): + return cal + for event in cal.vevent_list: - if event.contents.has_key(u'class'): - del event.contents[u'class'] + if 'class' in event.contents: # Bit of a hack as class is a reserved word in python + del event.contents['class'] event.add('class').value = "PUBLIC" return cal -def dropMSKeys(cal): - '''Drops microsoft keys, good for outlook, just bandwidth when not.''' +def dropAttributes(cal): + '''Removing unwanted metadata''' + if "facebook" in ruleConfig: + if ruleConfig["facebook"] == True: return cal + + if 'vevent_list' not in dir(cal): + return cal eventBlacklist = [x.lower() for x in [ "X-ALT-DESC", @@ -68,29 +82,107 @@ def dropMSKeys(cal): "X-MS-OLK-ALLOWEXTERNCHECK", "X-MS-OLK-AUTOSTARTCHECK", "X-MS-OLK-CONFTYPE", - "X-MS-OLK-AUTOFILLLOCATION" + "X-MS-OLK-AUTOFILLLOCATION", + "TRANSP", + "SEQUENCE", + "PRIORITY" + ]] + + mainBlacklist = [x.lower() for x in [ + "X-CLIPSTART", + "X-CALSTART", + "X-OWNER", + "X-MS-OLK-WKHRSTART", + "X-MS-OLK-WKHREND", + "X-WR-RELCALID", + "X-MS-OLK-WKHRDAYS", + "X-MS-OLK-APPTSEQTIME", + "X-CLIPEND", + "X-CALEND", + "VTIMEZONE", + "X-PRIMARY-CALENDAR" ]] for event in cal.vevent_list: for blacklist in eventBlacklist: - if event.contents.has_key(blacklist): del event.contents[blacklist] + if blacklist in event.contents: del event.contents[blacklist] + + for blkl in mainBlacklist: + while blkl in cal.contents: del cal.contents[blkl] return cal def exDate(cal): - '''Changes multi-EXDATE into singles (apple can't obey even simple specs)''' + '''Replacing multi-value EXDATES with multiple single-value EXDATES''' + if "facebook" in ruleConfig: + if ruleConfig["facebook"] == True: return cal + + if 'vevent_list' not in dir(cal): + return cal + + 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 + if 'exdate' not in event.contents: continue dates = event.exdate.value - try: tzid = event.exdate.tzid_param - except AttributeError: tzid = '' - del event.contents[u'exdate'] + del event.contents['exdate'] for date in dates: - entry = event.add(u'exdate') + if isinstance(date, datetime): + if date.tzinfo is None: date = date.replace(tzinfo = default) + date = date.astimezone(vobject.icalendar.utc) + entry = event.add('exdate') entry.value = [date] - if tzid: entry.tzid_param = tzid + + 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''' + + if 'vevent_list' not in dir(cal): + return cal + + 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" + ] + + if 'vevent_list' not in dir(cal): + return cal + + 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