Repository :
http://git.fedorahosted.org/cgit/fedocal.git
On branch : master
---------------------------------------------------------------
commit e00aef2462c94b65b3699c0e954a0da8ec398c96
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Mon Dec 3 17:41:14 2012 +0100
Fix recursive edit
---------------------------------------------------------------
fedocal/__init__.py | 28 ++++++++++++----
fedocal/fedocallib/__init__.py | 66 +++++++++++++++++++++++++++++++------
fedocal/tests/test_fedocallib.py | 22 ++++++++++++
3 files changed, 98 insertions(+), 18 deletions(-)
diff --git a/fedocal/__init__.py b/fedocal/__init__.py
index 838cdf6..e717bd9 100644
--- a/fedocal/__init__.py
+++ b/fedocal/__init__.py
@@ -352,10 +352,6 @@ def edit_meeting(meeting_id):
'you are not allowed to edit it.')
return flask.redirect(flask.url_for('index'))
meeting = Meeting.by_id(SESSION, meeting_id)
- if not fedocallib.is_date_in_future(meeting.meeting_date,
- meeting.meeting_time_start.hour):
- flask.flash('This meeting has already occured, you may not '\
- 'change it anymore')
calendarobj = Calendar.by_id(SESSION, meeting.calendar_name)
tzone = get_timezone()
form = forms.AddMeetingForm()
@@ -375,10 +371,11 @@ def edit_meeting(meeting_id):
meeting_information=form.information.data,
meeting_region=form.meeting_region.data,
tzone=get_timezone(),
- frequency=form.frequency.data,
- end_repeats=form.end_repeats.data,
+ recursion_frequency=form.frequency.data,
+ recursion_ends=form.end_repeats.data,
remind_when=form.remind_when.data,
- remind_who=form.remind_who.data)
+ remind_who=form.remind_who.data,
+ edit_all_meeting=True)
except FedocalException, err:
flask.flash(err)
return flask.render_template('edit_meeting.html',
@@ -396,6 +393,23 @@ def edit_meeting(meeting_id):
return flask.redirect(flask.url_for('view_meeting',
meeting_id=meeting_id))
else:
+ if meeting.recursion_frequency and meeting.recursion_ends and \
+ fedocallib.is_date_in_future(meeting.recursion_ends,
+ meeting.meeting_time_start):
+ cnt = 0
+ meetingobj = Meeting.copy(meeting)
+ while meetingobj.meeting_date < datetime.date.today():
+ meetingobj = Meeting.copy(meeting)
+ meetingobj.meeting_date = meetingobj.meeting_date + \
+ datetime.timedelta(
+ days=meetingobj.recursion_frequency * cnt)
+ cnt = cnt + 1
+ meeting = meetingobj
+ if not fedocallib.is_date_in_future(meeting.meeting_date,
+ meeting.meeting_time_start):
+ flask.flash('This meeting has already occured, you may not '\
+ 'change it anymore')
+ return flask.redirect(flask.url_for('my_meetings'))
form = forms.AddMeetingForm(meeting=meeting, tzone=get_timezone())
return flask.render_template('edit_meeting.html', meeting=meeting,
calendar=calendarobj, form=form, tzone=tzone)
diff --git a/fedocal/fedocallib/__init__.py b/fedocal/fedocallib/__init__.py
index f1d8730..d0bc7e8 100644
--- a/fedocal/fedocallib/__init__.py
+++ b/fedocal/fedocallib/__init__.py
@@ -376,7 +376,22 @@ def get_past_meeting_of_user(session, username, tzone='UTC',
from_date)
meetings = []
for meeting in meetings_tmp:
- meetings.append(convert_meeting_timezone(meeting, 'UTC', tzone))
+ if meeting.recursion_frequency and meeting.recursion_ends:
+ rec_meetings = []
+ cnt = 0
+ meetingobj = Meeting.copy(meeting)
+ while meetingobj.meeting_date < from_date:
+ meetingobj = Meeting.copy(meeting)
+ meetingobj.meeting_date = meetingobj.meeting_date + \
+ timedelta(days=meeting.recursion_frequency * cnt)
+ cnt = cnt + 1
+ if meetingobj.meeting_date < from_date:
+ rec_meetings.append(convert_meeting_timezone(
+ meetingobj, 'UTC', tzone))
+ rec_meetings.reverse()
+ meetings.extend(rec_meetings)
+ else:
+ meetings.append(convert_meeting_timezone(meeting, 'UTC', tzone))
return meetings
@@ -674,8 +689,9 @@ def edit_meeting(session, meeting, calendarobj, fas_user,
meeting_time_start, meeting_time_stop, comanager,
meeting_information,
meeting_region, tzone,
- frequency, end_repeats,
- remind_when, remind_who):
+ recursion_frequency, recursion_ends,
+ remind_when, remind_who,
+ edit_all_meeting=True):
""" When a user wants to edit a meeting to the database, we need to
perform a number of test first checking that the input is valid
and then edit the desired meeting.
@@ -700,6 +716,31 @@ def edit_meeting(session, meeting, calendarobj, fas_user,
raise InvalidMeeting(
'The start date of your meeting is later than the end date.')
+ ## The information are correct
+ ## What we do now:
+ # a) the meeting is not recursive -> edit the information as provided
+ # b) the meeting is recursive and we update all the meetings
+ # -> recursion_end = today
+ # -> copy meeting to new object
+ # -> update new object
+ # c) the meeting is recursive and the update only one meeting
+ # -> recursion_end = today
+ # -> copy meeting to new object w/o recursion
+ # -> update new object
+ # -> copy meeting to new object w/ recursion and date = date + offset
+
+ if recursion_frequency and meeting.recursion_frequency:
+ old_meeting = Meeting.copy(meeting)
+ old_meeting.recursion_ends = meeting_date - timedelta(days=1)
+ if old_meeting.recursion_ends > old_meeting.meeting_date:
+ old_meeting.save(session)
+ if not edit_all_meeting:
+ new_meeting = Meeting.copy(meeting)
+ new_meeting.meeting_date = meeting.meeting_date + timedelta(
+ days=meeting.recursion_frequency)
+ new_meeting.save(session)
+
+
meeting_time_start = convert_time(
datetime(meeting_date.year, meeting_date.month, meeting_date.day,
meeting_time_start.hour,
@@ -729,15 +770,14 @@ def edit_meeting(session, meeting, calendarobj, fas_user,
region = None
meeting.meeting_region = region
- frequency = frequency
- if not frequency:
- frequency = None
- meeting.recursion_frequency = frequency
+ recursion_frequency = recursion_frequency
+ if not recursion_frequency:
+ recursion_frequency = None
+ meeting.recursion_frequency = recursion_frequency
- ends_date = end_repeats
- if not ends_date:
- ends_date = date(2025, 12, 31)
- meeting.recursion_ends = ends_date
+ if not recursion_ends:
+ recursion_ends = date(2025, 12, 31)
+ meeting.recursion_ends = recursion_ends
if remind_when and remind_who:
if meeting.reminder_id:
@@ -756,5 +796,9 @@ def edit_meeting(session, meeting, calendarobj, fas_user,
meeting.reminder.delete(session)
meeting.reminder_id = None
+ if not edit_all_meeting and meeting.recursion_frequency:
+ meeting.recursion_frequency = None
+ meeting.recursion_ends = None
+
meeting.save(session)
session.commit()
diff --git a/fedocal/tests/test_fedocallib.py b/fedocal/tests/test_fedocallib.py
index cf1d108..c4bfb21 100644
--- a/fedocal/tests/test_fedocallib.py
+++ b/fedocal/tests/test_fedocallib.py
@@ -995,6 +995,28 @@ class Fedocallibtests(Modeltests):
self.assertEqual(meeting.meeting_date_end, date.today() + \
timedelta(days=3))
+ meeting = model.Meeting.by_id(self.session, 9)
+ fedocallib.edit_meeting(
+ self.session, meeting, calendarobj, fasuser,
+ 'Test meeting with reminder-2',
+ date.today() + timedelta(days=1), date.today() + timedelta(
+ days=3),
+ time(23, 0), time(23, 59), None,
+ 'Information2', None, 'Europe/Paris',
+ 7, TODAY + timedelta(days=30),
+ 'H-24', 'test(a)example.org',
+ edit_all_meeting=False)
+ meeting = model.Meeting.by_id(self.session, 9)
+ self.assertNotEqual(meeting, None)
+ self.assertEqual(meeting.meeting_name,
+ 'Test meeting with reminder-2')
+ self.assertEqual(meeting.meeting_manager, 'username,')
+ self.assertEqual(meeting.meeting_information, 'Information2')
+ self.assertEqual(meeting.reminder.reminder_offset, 'H-24')
+ self.assertEqual(meeting.reminder.reminder_to, 'test(a)example.org')
+ self.assertEqual(meeting.meeting_date_end, date.today() + \
+ timedelta(days=3))
+
if __name__ == '__main__':
SUITE = unittest.TestLoader().loadTestsFromTestCase(Fedocallibtests)