Handle single and multi-day all-day events
authorDan White <dan@whiteaudio.com>
Fri, 22 Apr 2011 02:33:03 +0000 (21:33 -0500)
committerDan White <dan@whiteaudio.com>
Fri, 22 Apr 2011 02:33:03 +0000 (21:33 -0500)
ical2rem.py

index 021c90fb3294c60bea5bfb04ac31be9e810f9018..06886b4ac11e58428303a51e3c53ce785003e517 100755 (executable)
@@ -42,38 +42,47 @@ cal = vobject.readOne(infile)
 for event in cal.vevent_list:
     text = event.summary.value
 
-    #print event
-
-    # TODO: handle all-day events of +1 day duration
-
     #detect all-day events vs. times
     if isinstance(event.dtstart.value, datetime.datetime):
         dtstart = event.dtstart.value.astimezone(centralTime)
         dtend = event.dtend.value.astimezone(centralTime)
-    elif isinstance(event.dtstart.value, datetime.date):
-        #cannot handle this yet
-        continue
-        #dtstart = event.dtstart.value
-        #dtend = event.dtend.value
-    else:
-        raise TypeError('unknown dtstart type: %s (%s)' % 
-                        (event.dtstart.value, type(event.dtstart.value)))
-
-    duration = str(dtend - dtstart)[:-3]
 
+        duration = str(dtend - dtstart)[:-3]
 
-    if event.rruleset:
-        for dtstart in event.rruleset.between(fromDate, untilDate, inc=True):
+        if event.rruleset:
+            for dtstart in event.rruleset.between(fromDate, untilDate, inc=True):
+                print >>outfile, remfmt_datetime % (
+                     dtstart.strftime(datefmt),
+                     dtstart.strftime(timefmt),
+                     duration, text)
+        else:
             print >>outfile, remfmt_datetime % (
                  dtstart.strftime(datefmt),
                  dtstart.strftime(timefmt),
                  duration, text)
-    else:
-        print >>outfile, remfmt_datetime % (
-             dtstart.strftime(datefmt),
-             dtstart.strftime(timefmt),
-             duration, text)
 
+    elif isinstance(event.dtstart.value, datetime.date):
+        dtstart = event.dtstart.value
+        dtend = event.dtend.value
+
+        duration = dtend - dtstart
+        oneday = datetime.timedelta(days=1)
+
+        # all-day events end at start of next day (exclusive).  Remind is
+        # inclusive
+        dtend = dtend - oneday
 
+        if event.rruleset:
+            print >>sys.stderr, '*** WARNING, ignoring repeating day event:'
+            print >>sys.stderr, event
+
+        print >>outfile, remfmt_date % (
+             dtstart.strftime(datefmt),
+             dtend.strftime(datefmt),
+             text)
+
+    else:
+        raise TypeError('unknown dtstart type: %s (%s)' % 
+                        (event.dtstart.value, type(event.dtstart.value)))