Package: cycle
Version: 0.3.1-2
Severity: wishlist

Hi,

The attached patch and image (also available at
http://people.debian.org/~piman/cycle/) lets cycle export years to iCal
format, so they can be imported by e.g. Evolution. BEGIN, LAST, BIRTH,
PROG, and OVUL marks are exported.

A better image would be appreciated; I have no GIMP talent.
-- 
Joe Wreschnig <[EMAIL PROTECTED]>
--- cycle-0.3.1.orig/cal_year.py
+++ cycle-0.3.1/cal_year.py
@@ -631,6 +630,52 @@
     print s
     return s
 
+def report_year_ical(year, fileobj):
+    import socket
+    hostname = socket.gethostname()
+
+    def get_string(mark):
+        if mark & MARK_LAST: return _("Conception")
+        elif mark & MARK_BEGIN: return _("Beginning of cycle")
+        elif mark & MARK_PROG: return _("Probable beginning of cycle")
+        elif mark & MARK_TABLET: return _("1-st tablet")
+        elif mark & MARK_OVUL: return _("Ovulation")
+        elif mark & MARK_BIRTH: return _("Birth")
+        else: return ""
+
+    def make_event(description, mark, date):
+        date2 = date + wx.TimeSpan.Days(1)
+        datestr = "%04d%02d%02d" % (
+            date.GetYear(), date.GetMonth() + 1, date.GetDay())
+        datestr2 = "%04d%02d%02d" % (
+            date2.GetYear(), date2.GetMonth() + 1, date2.GetDay())
+        uid = "UID:[EMAIL PROTECTED]" % (mark, datestr, hostname)
+        return ["BEGIN:VEVENT", uid,
+                "DTSTART;VALUE=DATE:" + datestr,
+                "DTEND;VALUE=DATE:" + datestr2,
+                "SUMMARY:" + description,
+                "DESCRIPTION:" + description,
+                "CLASS:PUBLIC",
+                "END:VEVENT"]
+
+    s = ["BEGIN:VCALENDAR",
+         "CALSCALE:GREGORIAN",
+         "PRODID:-//Cycle//NONSGML Cycle//EN",
+         "VERSION:2.0"]
+
+    days = cycle.mark.items()
+    days.sort()
+    for day, marks in days:
+        if get_string(marks):
+            d = wx.DateTime()
+            d.SetYear(year)
+            d.SetToYearDay(day)
+            s.extend(make_event(get_string(marks), marks, d))
+
+    s.append("END:VCALENDAR")
+
+    print >>fileobj, "\n".join(s)
+
 #-------------------- Add import --------------------
 from dialogs import Note_Dlg 
    
--- cycle-0.3.1.orig/cycle.py
+++ cycle-0.3.1/cycle.py
@@ -104,10 +104,13 @@
 
 	tb.SetToolSeparation(50)
 	tb.AddSeparator()
-	
+
 	SetToolPath(self, tb, 40, os.path.join(bitmaps_dir,'legend.png'), _('Legend'))
 	wx.EVT_TOOL(self, 40, self.Legend)
 	
+	SetToolPath(self, tb, 45, os.path.join(bitmaps_dir,'export.png'), _('Export to iCal'))
+	wx.EVT_TOOL(self, 45, self.Export)
+	
 	SetToolPath(self, tb, 50, os.path.join(bitmaps_dir,'set.png'), _('Settings'))
 	wx.EVT_TOOL(self, 50, self.Settings)
 	
@@ -136,6 +139,18 @@
 	dlg = Legend_Dlg(self)
         dlg.ShowModal()
 	dlg.Destroy()
+
+    def Export(self, event):
+        dlg = wx.FileDialog(self, _("Export to iCal"),
+                            style=wx.SAVE)
+
+        if dlg.ShowModal() == wx.ID_OK:
+            try:
+                fileobj = file(dlg.GetPath(), "w")
+                report_year_ical(self.cal.year, fileobj)
+            except (IOError, OSError), err:
+                wx.MessageDialog(
+                    self, str(err), _("Unable to export"), style=wx.OK).ShowModal()
         
     def Settings(self,event):
 	dlg = Settings_Dlg(self)

Attachment: export.png
Description: PNG image

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to