Repository :
http://git.fedorahosted.org/cgit/fedocal.git
On branch : master
---------------------------------------------------------------
commit dbb59687c7f2e5bafe37bf68a17c5f67dbc38dd8
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Wed Dec 12 21:36:36 2012 +0100
Add a boolean on the Meeting for full_day meeting
This means that in the Week, full_day meetings are separated from the non full-day
meetings.
Adjust the queries to only return full_day meetings when we desire.
Adjust the unit-tests to cover the new features and test their behavior.
---------------------------------------------------------------
.../versions/2e5d25a095df_add_boolean_to_meeti.py | 23 ++++++++++
fedocal/fedocallib/model.py | 22 +++++++---
fedocal/fedocallib/week.py | 17 +++++++
fedocal/tests/test_fedocallib.py | 16 ++++---
fedocal/tests/test_meeting.py | 45 ++++++++++++++++++-
fedocal/tests/test_week.py | 20 +++++++++
6 files changed, 127 insertions(+), 16 deletions(-)
diff --git a/alembic/versions/2e5d25a095df_add_boolean_to_meeti.py
b/alembic/versions/2e5d25a095df_add_boolean_to_meeti.py
new file mode 100644
index 0000000..989986b
--- /dev/null
+++ b/alembic/versions/2e5d25a095df_add_boolean_to_meeti.py
@@ -0,0 +1,23 @@
+"""Add boolean to Meeting for full-day meeting
+
+Revision ID: 2e5d25a095df
+Revises: 45d83da297e8
+Create Date: 2012-12-12 08:46:15.378554
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '2e5d25a095df'
+down_revision = '45d83da297e8'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ op.add_column('meetings', sa.Column('full_days',
+ sa.Boolean))
+
+
+def downgrade():
+ op.drop_column('meetings', 'full_days')
diff --git a/fedocal/fedocallib/model.py b/fedocal/fedocallib/model.py
index ce75348..9c0bfd5 100644
--- a/fedocal/fedocallib/model.py
+++ b/fedocal/fedocallib/model.py
@@ -148,6 +148,7 @@ class Meeting(BASE):
reminder_id = Column(Integer, ForeignKey('reminders.reminder_id'),
nullable=True)
reminder = relationship("Reminder")
+ full_day = Column(Boolean, default=False)
recursion_frequency = Column(Integer, nullable=True, default=None)
recursion_ends = Column(Date, nullable=True, default=None)
@@ -158,7 +159,7 @@ class Meeting(BASE):
meeting_time_start, meeting_time_stop,
meeting_information, calendar_name, reminder_id=None,
meeting_region=None, recursion_frequency=None,
- recursion_ends=None):
+ recursion_ends=None, full_day=False):
""" Constructor instanciating the defaults values.
"""
self.meeting_name = meeting_name
self.meeting_manager = meeting_manager
@@ -172,6 +173,7 @@ class Meeting(BASE):
self.meeting_region = meeting_region
self.recursion_frequency = recursion_frequency
self.recursion_ends = recursion_ends
+ self.full_day = full_day
def __repr__(self):
""" Representation of the Reminder object when printed.
@@ -234,6 +236,7 @@ class Meeting(BASE):
meeting.meeting_region = self.meeting_region
meeting.recursion_frequency = self.recursion_frequency
meeting.recursion_ends = self.recursion_ends
+ meeting.full_day = self.full_day
else:
meeting = Meeting(self.meeting_name, self.meeting_manager,
self.meeting_date, self.meeting_date_end,
@@ -243,7 +246,8 @@ class Meeting(BASE):
self.reminder_id,
self.meeting_region,
self.recursion_frequency,
- self.recursion_ends)
+ self.recursion_ends,
+ self.full_day)
return meeting
@classmethod
@@ -267,18 +271,21 @@ class Meeting(BASE):
return managers
@classmethod
- def get_by_date(cls, session, calendar, start_date, stop_date):
+ def get_by_date(cls, session, calendar, start_date, stop_date,
+ full_day=False):
""" Retrieve the list of meetings between two date.
We include the start date and exclude the stop date.
"""
return session.query(cls).filter(and_
(Meeting.calendar == calendar),
(Meeting.meeting_date >= start_date),
- (Meeting.meeting_date < stop_date)
+ (Meeting.meeting_date < stop_date),
+ (Meeting.full_day == full_day)
).order_by(Meeting.meeting_date).all()
@classmethod
- def get_active_regular_meeting(cls, session, calendar, end_date):
+ def get_active_regular_meeting(cls, session, calendar, end_date,
+ full_day=False):
""" Retrieve the list of meetings with a recursion which
end_date is not past the provided end_date and starting before
the end of the time considered.
@@ -287,7 +294,8 @@ class Meeting(BASE):
(Meeting.meeting_date <= end_date),
(Meeting.recursion_ends >= end_date),
(Meeting.calendar == calendar),
- (Meeting.recursion_frequency != None)
+ (Meeting.recursion_frequency != None),
+ (Meeting.full_day == full_day)
).order_by(Meeting.meeting_date).all()
return meetings
@@ -340,7 +348,7 @@ class Meeting(BASE):
(Meeting.meeting_time_stop > t_time)).all()
@classmethod
- def in_future_at_time(cls, session, calendar, meetingdate,
+ def get_in_future_at_time(cls, session, calendar, meetingdate,
recursion_ends, t_time):
""" Returns the meeting occuring at this specifict time point
at any time in the future.
diff --git a/fedocal/fedocallib/week.py b/fedocal/fedocallib/week.py
index 2d24291..0902870 100644
--- a/fedocal/fedocallib/week.py
+++ b/fedocal/fedocallib/week.py
@@ -34,7 +34,9 @@ class Week(object):
self.start_date = start_date
self.stop_date = start_date + timedelta(days=7)
self.meetings = []
+ self.full_day_meetings = []
self.get_meetings()
+ self.get_full_day_meetings()
def get_meetings(self):
""" Retrieves the list of this week meeting from the database.
@@ -51,6 +53,21 @@ class Week(object):
if meeting not in self.meetings:
self.meetings.append(meeting)
+ def get_full_day_meetings(self):
+ """ Retrieve all the full day meetings of this week.
"""
+ self.full_day_meetings = Meeting.get_by_date(self.session,
+ self.calendar, self.start_date, self.stop_date,
+ full_day=True)
+
+ for meeting in Meeting.get_active_regular_meeting(self.session,
+ self.calendar, self.stop_date, full_day=True):
+ for delta in range(0, 7):
+ day = self.start_date + timedelta(days=delta)
+ if ((meeting.meeting_date - day).days %
+ meeting.recursion_frequency) == 0:
+ if meeting not in self.full_day_meetings:
+ self.full_day_meetings.append(meeting)
+
def __repr__(self):
""" Representation of the Week object when printed.
"""
diff --git a/fedocal/tests/test_fedocallib.py b/fedocal/tests/test_fedocallib.py
index 3e8feaa..601d261 100644
--- a/fedocal/tests/test_fedocallib.py
+++ b/fedocal/tests/test_fedocallib.py
@@ -208,7 +208,7 @@ class Fedocallibtests(Modeltests):
if meeting is not None:
for meet in meeting:
self.assertEqual(meet.meeting_name,
- 'Another test meeting')
+ 'Another test meeting')
else:
cnt = cnt + 1
self.assertEqual(cnt, 6)
@@ -309,7 +309,7 @@ class Fedocallibtests(Modeltests):
meetings = fedocallib.get_future_single_meeting_of_user(self.session,
'pingou,', from_date=TODAY)
self.assertNotEqual(meetings, None)
- self.assertEqual(len(meetings), 3)
+ self.assertEqual(len(meetings), 4)
self.assertEqual(meetings[0].meeting_name,
'Fedora-fr-test-meeting')
self.assertEqual(meetings[0].meeting_information,
@@ -340,7 +340,7 @@ class Fedocallibtests(Modeltests):
meetings = fedocallib.get_future_regular_meeting_of_user(
self.session, 'pingou', from_date=TODAY)
self.assertNotEqual(meetings, None)
- self.assertEqual(len(meetings), 4)
+ self.assertEqual(len(meetings), 5)
self.assertEqual(meetings[0].meeting_name,
'Another past test meeting')
self.assertEqual(meetings[0].meeting_information,
@@ -354,8 +354,12 @@ class Fedocallibtests(Modeltests):
self.assertEqual(meetings[2].meeting_information,
'This is a test meeting with recursion')
self.assertEqual(meetings[3].meeting_name,
- 'Test meeting with reminder and recursion')
+ 'Full-day meeting with recursion')
self.assertEqual(meetings[3].meeting_information,
+ 'Full day meeting with recursion')
+ self.assertEqual(meetings[4].meeting_name,
+ 'Test meeting with reminder and recursion')
+ self.assertEqual(meetings[4].meeting_information,
'This is a test meeting with recursion and reminder')
# pylint: disable=C0103
@@ -495,14 +499,14 @@ class Fedocallibtests(Modeltests):
meetings = fedocallib.get_future_single_meeting_of_user(
self.session, 'pingou,', from_date=TODAY)
self.assertNotEqual(meetings, None)
- self.assertEqual(len(meetings), 3)
+ self.assertEqual(len(meetings), 4)
fedocallib.add_meetings_to_vcal(calendar, meetings)
cnt = 0
for event in calendar.vevent_list:
self.assertTrue(event.summary.value in [
'Fedora-fr-test-meeting', 'Test meeting with reminder',
- 'test-meeting2'])
+ 'test-meeting2', 'Full-day meeting'])
self.assertTrue(event.organizer.value in [
'pingou,', 'pingou, shaiton,'])
cnt = cnt + 1
diff --git a/fedocal/tests/test_meeting.py b/fedocal/tests/test_meeting.py
index b236c5c..8377fa2 100644
--- a/fedocal/tests/test_meeting.py
+++ b/fedocal/tests/test_meeting.py
@@ -236,7 +236,42 @@ class Meetingtests(Modeltests):
meeting_information='This is a past meeting with recursion',
calendar_name='test_calendar',
recursion_frequency=7,
- recursion_ends=TODAY + timedelta(days=90))
+ recursion_ends=TODAY + timedelta(days=90),
+ full_day=False)
+ obj.save(self.session)
+ self.session.commit()
+ self.assertNotEqual(obj, None)
+
+ # Full day meeting
+ obj = model.Meeting( # id:13
+ meeting_name='Full-day meeting',
+ meeting_manager='pingou,',
+ meeting_date=TODAY + timedelta(days=3),
+ meeting_date_end=TODAY + timedelta(days=3),
+ meeting_time_start=time(0, 00),
+ meeting_time_stop=time(23, 59),
+ meeting_information='This is a full day meeting',
+ calendar_name='test_calendar',
+ recursion_frequency=None,
+ recursion_ends=None,
+ full_day=True)
+ obj.save(self.session)
+ self.session.commit()
+ self.assertNotEqual(obj, None)
+
+ # Full day meeting with recursion
+ obj = model.Meeting( # id:14
+ meeting_name='Full-day meeting with recursion',
+ meeting_manager='pingou,',
+ meeting_date=TODAY + timedelta(days=10),
+ meeting_date_end=TODAY + timedelta(days=10),
+ meeting_time_start=time(0, 00),
+ meeting_time_stop=time(23, 59),
+ meeting_information='Full day meeting with recursion',
+ calendar_name='test_calendar',
+ recursion_frequency=7,
+ recursion_ends=TODAY + timedelta(days=30),
+ full_day=True)
obj.save(self.session)
self.session.commit()
self.assertNotEqual(obj, None)
@@ -497,13 +532,15 @@ class Meetingtests(Modeltests):
meetings = model.Meeting.get_future_single_meeting_of_user(
self.session, 'pingou,', TODAY)
self.assertNotEqual(meetings, None)
- self.assertEqual(len(meetings), 3)
+ self.assertEqual(len(meetings), 4)
self.assertEqual(meetings[0].meeting_name,
'Fedora-fr-test-meeting')
self.assertEqual(meetings[1].meeting_name,
'test-meeting2')
self.assertEqual(meetings[2].meeting_name,
'Test meeting with reminder')
+ self.assertEqual(meetings[3].meeting_name,
+ 'Full-day meeting')
# pylint: disable=C0103
def test_get_future_single_meeting_of_user_fail(self):
@@ -531,7 +568,7 @@ class Meetingtests(Modeltests):
meetings = model.Meeting.get_future_regular_meeting_of_user(
self.session, 'pingou', TODAY)
self.assertNotEqual(meetings, None)
- self.assertEqual(len(meetings), 4)
+ self.assertEqual(len(meetings), 5)
self.assertEqual(meetings[0].meeting_name,
'Another past test meeting')
self.assertEqual(meetings[1].meeting_name,
@@ -539,6 +576,8 @@ class Meetingtests(Modeltests):
self.assertEqual(meetings[2].meeting_name,
'Another test meeting')
self.assertEqual(meetings[3].meeting_name,
+ 'Full-day meeting with recursion')
+ self.assertEqual(meetings[4].meeting_name,
'Test meeting with reminder and recursion')
# pylint: disable=C0103
diff --git a/fedocal/tests/test_week.py b/fedocal/tests/test_week.py
index 6fb77f9..2f8ca1f 100644
--- a/fedocal/tests/test_week.py
+++ b/fedocal/tests/test_week.py
@@ -111,6 +111,26 @@ class Weektests(Modeltests):
self.assertEqual(weekobj.meetings[1].meeting_information,
'This is a test meeting with recursion2')
+ def test_meeting_in_week(self):
+ """ Test that the meetings in the week are correct function.
"""
+ calendar = model.Calendar.by_id(self.session, 'test_calendar')
+ weekobj = week.Week(self.session, calendar, TODAY)
+
+ self.assertNotEqual(weekobj, None)
+ self.assertEqual(len(weekobj.full_day_meetings), 1)
+ self.assertNotEqual(weekobj.full_day_meetings[0], None)
+ self.assertEqual(weekobj.full_day_meetings[0].meeting_name,
+ 'Full-day meeting')
+
+ weekobj = week.Week(self.session, calendar, (TODAY + timedelta(
+ days=15)))
+
+ self.assertNotEqual(weekobj, None)
+ self.assertEqual(len(weekobj.full_day_meetings), 1)
+ self.assertNotEqual(weekobj.full_day_meetings[0], None)
+ self.assertEqual(weekobj.full_day_meetings[0].meeting_name,
+ 'Full-day meeting with recursion')
+
if __name__ == '__main__':
SUITE = unittest.TestLoader().loadTestsFromTestCase(Weektests)