Repository :
http://git.fedorahosted.org/cgit/fedocal.git
On branch : master
---------------------------------------------------------------
commit da7b4cc8423a2f37d9b76dbf295b07625c51c930
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Mon Nov 26 20:40:51 2012 +0100
Add recursive meetings to the get_meeting_with_reminder functions
With the change in database design we were not considering recursive meetings when
retrieving meetings to remind. This commit takes care of it.
The unit-tests have been changed accordingly to check that we do retrieve a recursive
meeting in the 3 weeks following the first meeting.
---------------------------------------------------------------
fedocal/fedocallib/model.py | 19 +++++++++++++++++-
fedocal/tests/test_meeting.py | 43 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/fedocal/fedocallib/model.py b/fedocal/fedocallib/model.py
index 12f3e9c..f942ca3 100644
--- a/fedocal/fedocallib/model.py
+++ b/fedocal/fedocallib/model.py
@@ -19,6 +19,7 @@ import pkg_resources
from datetime import datetime
from datetime import date
+from datetime import timedelta
from sqlalchemy import (
Boolean,
@@ -372,11 +373,27 @@ class Meeting(BASE):
reminders = [int(item.reminder_id) for item in reminders]
if not reminders:
return []
- return session.query(cls).filter(and_
+ meetings = session.query(cls).filter(and_
(Meeting.meeting_date == start_date),
(Meeting.meeting_time_start >= start_time),
(Meeting.meeting_time_start < stop_time),
(Meeting.reminder_id.in_(reminders))).all()
+ # Add recursive meetings
+ recursive_meetings = session.query(cls).filter(and_
+ (Meeting.meeting_time_start >= start_time),
+ (Meeting.meeting_time_start < stop_time),
+ (Meeting.recursion_ends >= start_date),
+ (Meeting.reminder_id.in_(reminders))).all()
+ for meeting in recursive_meetings:
+ meeting_date = meeting.meeting_date
+ while meeting_date <= meeting.recursion_ends:
+ if meeting_date == start_date:
+ if meeting not in meetings:
+ meetings.append(meeting)
+ break
+ meeting_date = meeting_date + timedelta(
+ days=meeting.recursion_frequency)
+ return meetings
class Reminder(BASE):
diff --git a/fedocal/tests/test_meeting.py b/fedocal/tests/test_meeting.py
index 52763b9..82c3bfb 100644
--- a/fedocal/tests/test_meeting.py
+++ b/fedocal/tests/test_meeting.py
@@ -543,9 +543,18 @@ class Meetingtests(Modeltests):
def test_get_meeting_with_reminder(self):
""" Test the Meeting get_meeting_with_reminder function.
"""
self.test_init_meeting()
+ for delta in [0, 7, 14, 21]:
+ meetings = model.Meeting.get_meeting_with_reminder(self.session,
+ TODAY + timedelta(days=12 + delta), time(10, 00),
+ time(10, 30), 'H-12')
+ self.assertNotEqual(meetings, None)
+ self.assertEqual(len(meetings), 1)
+ self.assertEqual(meetings[0].meeting_name,
+ 'Test meeting with reminder and recursion')
+
meetings = model.Meeting.get_meeting_with_reminder(self.session,
- TODAY + timedelta(days=11), time(11, 00), time(11, 30),
- 'H-12')
+ TODAY + timedelta(days=11), time(11, 00),
+ time(11, 30), 'H-12')
self.assertNotEqual(meetings, None)
self.assertEqual(len(meetings), 1)
self.assertEqual(meetings[0].meeting_name,
@@ -577,6 +586,36 @@ class Meetingtests(Modeltests):
self.assertEqual(len(meetings), 0)
self.assertEqual(meetings, [])
+ meetings = model.Meeting.get_meeting_with_reminder(self.session,
+ TODAY + timedelta(days=11), time(10, 30), time(11, 00),
+ 'H-12')
+ self.assertNotEqual(meetings, None)
+ self.assertEqual(len(meetings), 0)
+ self.assertEqual(meetings, [])
+
+ meetings = model.Meeting.get_meeting_with_reminder(self.session,
+ TODAY + timedelta(days=11), time(11, 30), time(12, 00),
+ 'H-12')
+ self.assertNotEqual(meetings, None)
+ self.assertEqual(len(meetings), 0)
+ self.assertEqual(meetings, [])
+
+ for delta in [0, 7, 14, 21]:
+ meetings = model.Meeting.get_meeting_with_reminder(self.session,
+ TODAY + timedelta(days=12 + delta), time(9, 30),
+ time(10, 00), 'H-12')
+ self.assertNotEqual(meetings, None)
+ self.assertEqual(len(meetings), 0)
+ self.assertEqual(meetings, [])
+
+ meetings = model.Meeting.get_meeting_with_reminder(self.session,
+ TODAY + timedelta(days=12 + delta), time(10, 30),
+ time(11, 00), 'H-12')
+ self.assertNotEqual(meetings, None)
+ self.assertEqual(len(meetings), 0)
+ self.assertEqual(meetings, [])
+
+
if __name__ == '__main__':
SUITE = unittest.TestLoader().loadTestsFromTestCase(Meetingtests)
unittest.TextTestRunner(verbosity=2).run(SUITE)