Repository :
http://git.fedorahosted.org/cgit/fedocal.git
On branch : master
---------------------------------------------------------------
commit 256418f676483f3f259f8851f85d5af181ff109d
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Tue Dec 11 20:48:13 2012 +0100
Finish up the list view
With this commit, recursive meetings are displayed in the list view as single meeting
but
with the correct meeting_id so that links still work.
Meetings are ordered by date.
Tests have been adjusted accordingly
---------------------------------------------------------------
fedocal/__init__.py | 6 +---
fedocal/fedocallib/__init__.py | 40 ++++++++++++++++++++++++++++++++++++++
fedocal/tests/test_fedocallib.py | 34 ++++++++++++++++++++++++++++++-
3 files changed, 74 insertions(+), 6 deletions(-)
diff --git a/fedocal/__init__.py b/fedocal/__init__.py
index 74f72a3..cf059da 100644
--- a/fedocal/__init__.py
+++ b/fedocal/__init__.py
@@ -209,10 +209,8 @@ def calendar_list(calendar_name, year, month, day):
calendarobj = Calendar.by_id(SESSION, calendar_name)
tzone = get_timezone()
- meetings_utc = Meeting.get_by_date(SESSION, calendarobj, start_date,
- end_date)
- meetings = [fedocallib.convert_meeting_timezone(meeting, 'UTC', tzone)
- for meeting in meetings_utc]
+ meetings = fedocallib.get_by_date(SESSION, calendarobj, start_date,
+ end_date, tzone)
week_start = fedocallib.get_start_week(inyear, inmonth, inday)
weekdays = fedocallib.get_week_days(inyear, inmonth, inday)
next_week = fedocallib.get_next_week(week_start.year,
diff --git a/fedocal/fedocallib/__init__.py b/fedocal/fedocallib/__init__.py
index f2ff36d..2f3b311 100644
--- a/fedocal/fedocallib/__init__.py
+++ b/fedocal/fedocallib/__init__.py
@@ -16,6 +16,7 @@ license.
import vobject
import pytz
+import operator
from datetime import datetime
from datetime import date
@@ -656,6 +657,45 @@ def get_html_monthly_cal(day=None, month=None, year=None,
return curmonth_cal_nf
+def get_by_date(session, calendarobj, start_date, end_date, tzone='UTC'):
+ """ Returns all the meetings in a given time period.
+ Recursive meetings are expanded as if each was a single meeting.
+
+ :arg session: the database session to use
+ :arg calendarobj: the calendar (object) of interest.
+ :arg start_date: a Date object representing the beginning of the
+ period
+ :arg start_date: a Date object representing the ending of the period
+ :kwarg tzone: the timezone in which the meetings should be displayed
+ defaults to UTC.
+ """
+ meetings_utc = Meeting.get_by_date(session, calendarobj, start_date,
+ end_date)
+ meetings = []
+ for meeting in meetings_utc:
+ if meeting.recursion_frequency and meeting.recursion_ends:
+ meeting_date = meeting.meeting_date
+ cnt = 0
+ while meeting_date >= start_date and meeting_date < end_date \
+ and meeting_date <= meeting.recursion_ends:
+ recmeeting = meeting.copy()
+ recmeeting.meeting_id = meeting.meeting_id
+ recmeeting.meeting_date = recmeeting.meeting_date + timedelta(
+ days=recmeeting.recursion_frequency * cnt)
+ recmeeting.meeting_date_end = recmeeting.meeting_date_end \
+ + timedelta(days=recmeeting.recursion_frequency * cnt)
+ meeting_date = recmeeting.meeting_date + timedelta(
+ days=recmeeting.recursion_frequency)
+ meetings.append(convert_meeting_timezone(recmeeting,
+ 'UTC', tzone))
+ cnt = cnt + 1
+ else:
+ meetings.append(convert_meeting_timezone(meeting, 'UTC',
+ tzone))
+ meetings.sort(key=operator.attrgetter('meeting_date'))
+ return meetings
+
+
# pylint: disable=R0913,R0914
def add_meeting(session, calendarobj, fas_user,
meeting_name, meeting_date, # meeting_date_end,
diff --git a/fedocal/tests/test_fedocallib.py b/fedocal/tests/test_fedocallib.py
index ed90b45..fb245d1 100644
--- a/fedocal/tests/test_fedocallib.py
+++ b/fedocal/tests/test_fedocallib.py
@@ -39,6 +39,7 @@ from datetime import date
from datetime import time
from datetime import datetime
from datetime import timedelta
+from dateutil.relativedelta import relativedelta
from sqlalchemy.exc import IntegrityError
@@ -593,8 +594,29 @@ class Fedocallibtests(Modeltests):
output = fedocallib.get_week_day_index()
self.assertEqual(output, today.isoweekday())
+ def test_get_by_date_empty(self):
+ """ Test the get_by_date function. """
+ self.__setup_calendar()
+ calendarobj = model.Calendar.by_id(self.session, 'test_calendar')
+ self.assertNotEqual(calendarobj, None)
+ output = fedocallib.get_by_date(self.session, calendarobj, TODAY,
+ TODAY + relativedelta(years=+1))
+ self.assertNotEqual(output, None)
+ self.assertEqual(len(output), 0)
+ self.assertEqual(output, [])
+
+ def test_get_by_date(self):
+ """ Test the get_by_date function. """
+ self.__setup_meeting()
+ calendarobj = model.Calendar.by_id(self.session, 'test_calendar')
+ self.assertNotEqual(calendarobj, None)
+ output = fedocallib.get_by_date(self.session, calendarobj, TODAY,
+ TODAY + relativedelta(years=+1))
+ self.assertNotEqual(output, None)
+ self.assertEqual(len(output), 30)
+
# pylint: disable=R0915
- def test_add_meeting(self):
+ def test_add_meeting_fail(self):
""" Test the add_meeting function. """
self.__setup_calendar()
calendarobj = model.Calendar.by_id(self.session, 'test_calendar')
@@ -652,6 +674,14 @@ class Fedocallibtests(Modeltests):
None, None)
self.session.rollback()
+ # pylint: disable=R0915
+ def test_add_meeting(self):
+ """ Test the add_meeting function. """
+ self.__setup_calendar()
+ calendarobj = model.Calendar.by_id(self.session, 'test_calendar')
+ self.assertNotEqual(calendarobj, None)
+ fasuser = FakeUser(['fi-apprentice'])
+
fedocallib.add_meeting(
self.session, calendarobj, fasuser,
'Name', date.today() + timedelta(days=1),
@@ -1030,4 +1060,4 @@ class Fedocallibtests(Modeltests):
if __name__ == '__main__':
SUITE = unittest.TestLoader().loadTestsFromTestCase(Fedocallibtests)
- unittest.TextTestRunner(verbosity=2).run(SUITE)
+ unittest.TextTestRunner(verbosity=2, failfast=True).run(SUITE)