pykolab/xml tests/unit

Thomas Brüderli bruederli at kolabsys.com
Wed Jan 7 18:47:14 CET 2015


 pykolab/xml/event.py         |   10 +++++++---
 pykolab/xml/utils.py         |    2 +-
 tests/unit/test-003-event.py |   12 ++++++++++++
 3 files changed, 20 insertions(+), 4 deletions(-)

New commits:
commit 856a2aa11f6d1d661eacbf9e4f34c92d23a2f4ce
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Tue Dec 23 06:36:46 2014 +0100

    Fix event.get_next_occurence() computation with infinitely recurring all-day events (#4079)

diff --git a/pykolab/xml/event.py b/pykolab/xml/event.py
index 0e7c333..72c5e07 100644
--- a/pykolab/xml/event.py
+++ b/pykolab/xml/event.py
@@ -1134,17 +1134,21 @@ class Event(object):
         from kolab.calendaring import EventCal
         return EventCal(self.event)
 
-    def get_next_occurence(self, datetime):
+    def get_next_occurence(self, _datetime):
         if not hasattr(self, 'eventcal'):
             self.eventcal = self.to_event_cal()
 
-        next_cdatetime = self.eventcal.getNextOccurence(xmlutils.to_cdatetime(datetime, True))
+        next_cdatetime = self.eventcal.getNextOccurence(xmlutils.to_cdatetime(_datetime, True))
         next_datetime  = xmlutils.from_cdatetime(next_cdatetime, True) if next_cdatetime is not None else None
 
         # cut infinite recurrence at a reasonable point
-        if next_datetime and not self.get_last_occurrence() and next_datetime > self._recurrence_end():
+        if next_datetime and not self.get_last_occurrence() and next_datetime > xmlutils.to_dt(self._recurrence_end()):
             next_datetime = None
 
+        # next_datetime is always a cdatetime, convert to date if necessary
+        if not isinstance(self.get_start(), datetime.datetime):
+            next_datetime = datetime.date(next_datetime.year, next_datetime.month, next_datetime.day)
+
         return next_datetime
 
     def get_occurence_end_date(self, datetime):
diff --git a/pykolab/xml/utils.py b/pykolab/xml/utils.py
index 97b72af..a3ecbcf 100644
--- a/pykolab/xml/utils.py
+++ b/pykolab/xml/utils.py
@@ -14,7 +14,7 @@ def to_dt(dt):
     """
 
     if isinstance(dt, datetime.date) and not isinstance(dt, datetime.datetime) or dt is not None and not hasattr(dt, 'hour'):
-        dt = datetime.datetime(dt.year, dt.month, dt.day, 0, 0, 0, 0, tzinfo=tzlocal())
+        dt = datetime.datetime(dt.year, dt.month, dt.day, 0, 0, 0, 0, tzinfo=pytz.utc)
 
     elif isinstance(dt, datetime.datetime):
         if dt.tzinfo == None:
diff --git a/tests/unit/test-003-event.py b/tests/unit/test-003-event.py
index 7fae6eb..02bc8df 100644
--- a/tests/unit/test-003-event.py
+++ b/tests/unit/test-003-event.py
@@ -533,6 +533,18 @@ END:VEVENT
         self.assertEqual(next_instance.get_start().month, 7)
         self.assertFalse(next_instance.is_recurring())
 
+        # check get_next_occurence() with an infinitely recurring all-day event
+        rrule = kolabformat.RecurrenceRule()
+        rrule.setFrequency(kolabformat.RecurrenceRule.Yearly)
+        self.event.set_recurrence(rrule);
+
+        self.event.set_start(datetime.date(2014, 5, 1))
+        self.event.set_end(datetime.date(2014, 5, 1))
+        next_date = self.event.get_next_occurence(datetime.date(2015, 1, 1))
+        self.assertIsInstance(next_date, datetime.date)
+        self.assertEqual(next_date.year, 2015)
+        self.assertEqual(next_date.month, 5)
+
     def test_021_calendaring_no_recurrence(self):
         _start = datetime.datetime(2014, 2, 1, 14, 30, 00, tzinfo=pytz.timezone("Europe/London"))
         self.event = Event()




More information about the commits mailing list