diff options
Diffstat (limited to 'vobject/change_tz.py')
-rw-r--r-- | vobject/change_tz.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/vobject/change_tz.py b/vobject/change_tz.py new file mode 100644 index 0000000..1227676 --- /dev/null +++ b/vobject/change_tz.py @@ -0,0 +1,77 @@ +"""Translate an ics file's events to a different timezone.""" + +from optparse import OptionParser +import icalendar, base +import sys +try: + import PyICU +except: + PyICU = None + +from datetime import datetime + +def change_tz(cal, new_timezone, default, utc_only=False, utc_tz=icalendar.utc): + for vevent in getattr(cal, 'vevent_list', []): + start = getattr(vevent, 'dtstart', None) + end = getattr(vevent, 'dtend', None) + for node in (start, end): + if node: + dt = node.value + if (isinstance(dt, datetime) and + (not utc_only or dt.tzinfo == utc_tz)): + if dt.tzinfo is None: + dt = dt.replace(tzinfo = default) + node.value = dt.astimezone(new_timezone) + +def main(): + options, args = get_options() + if PyICU is None: + print "Failure. change_tz requires PyICU, exiting" + elif options.list: + for tz_string in PyICU.TimeZone.createEnumeration(): + print tz_string + elif args: + utc_only = options.utc + print "Converting %s events" % "only UTC" if utc_only else "all" + ics_file = args[0] + timezone = PyICU.ICUtzinfo.getInstance(args[1]) if len(args) > 1 else PyICU.ICUtzinfo.default + print "... Reading %s" % ics_file + cal = base.readOne(file(ics_file)) + change_tz(cal, timezone, PyICU.ICUtzinfo.default, utc_only) + + out_name = ics_file + '.converted' + print "... Writing %s" % out_name + out = file(out_name, 'wb') + cal.serialize(out) + print "Done" + + +version = "0.1" + +def get_options(): + ##### Configuration options ##### + + usage = """usage: %prog [options] ics_file [timezone]""" + parser = OptionParser(usage=usage, version=version) + parser.set_description("change_tz will convert the timezones in an ics file. ") + + parser.add_option("-u", "--only-utc", dest="utc", action="store_true", + default=False, help="Only change UTC events.") + parser.add_option("-l", "--list", dest="list", action="store_true", + default=False, help="List available timezones") + + + (cmdline_options, args) = parser.parse_args() + if not args and not cmdline_options.list: + print "error: too few arguments given" + print + print parser.format_help() + return False, False + + return cmdline_options, args + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print "Aborted" |