Repository :
http://git.fedorahosted.org/cgit/fedocal.git
On branch : master
---------------------------------------------------------------
commit 5cb97088726a61b49683d39d77ae5f31757af4b3
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Fri Nov 16 17:47:52 2012 +0100
Fix the meeting to allow any starting time
From now on the input time by the user is a real time entity and
we save this in the database.
However, we still only shows half-hour slots on the agenda.
---------------------------------------------------------------
fedocal/__init__.py | 15 ++++----
fedocal/fedocallib/__init__.py | 75 +++++++++++++++++++--------------------
fedocal/fedocallib/model.py | 7 ++--
fedocal/forms.py | 39 +++++++++++----------
4 files changed, 67 insertions(+), 69 deletions(-)
diff --git a/fedocal/__init__.py b/fedocal/__init__.py
index 6095285..3eb9b4f 100644
--- a/fedocal/__init__.py
+++ b/fedocal/__init__.py
@@ -319,10 +319,11 @@ def add_meeting(calendar_name):
end_repeats=form.end_repeats.data,
remind_when=form.remind_when.data,
remind_who=form.remind_who.data)
- except FedocalException:
- flask.redirect(flask.url_for('add_meeting',
+ except FedocalException, err:
+ flask.flash(err)
+ return flask.render_template('add_meeting.html',
calendar=calendarobj, form=form,
- tzone=tzone))
+ tzone=tzone)
except SQLAlchemyError, err:
print 'add_meeting:', err
flask.flash('Could not add this meeting to this calendar')
@@ -370,12 +371,10 @@ def edit_meeting(meeting_id):
meeting.meeting_date = form.meeting_date.data
meeting_end_date = form.meeting_date_end.data
if not meeting_end_date:
- meeting_end_date = form.meeting_date.date
+ meeting_end_date = form.meeting_date.data
meeting.meeting_end_date = meeting_end_date
- meeting.meeting_time_start = datetime.time(int(
- form.meeting_time_start.data))
- meeting.meeting_time_stop = datetime.time(int(
- form.meeting_time_stop.data))
+ meeting.meeting_time_start = form.meeting_time_start.data
+ meeting.meeting_time_stop = form.meeting_time_stop.data
meeting.meeting_information = form.information.data
region = form.meeting_region.data
diff --git a/fedocal/fedocallib/__init__.py b/fedocal/fedocallib/__init__.py
index 3a41877..30b6fe2 100644
--- a/fedocal/fedocallib/__init__.py
+++ b/fedocal/fedocallib/__init__.py
@@ -236,31 +236,36 @@ def get_meetings(session, calendar, year=None, month=None,
day=None,
# pylint: disable=W0612
meetings[key] = [None for cnt2 in range(0, 7)]
for meeting in week.meetings:
- start = meeting.meeting_time_start.hour
- stop = meeting.meeting_time_stop.hour
- if meeting.meeting_time_stop.minute == 59:
- stop = stop + 1
- order = range(0, stop - start)
- invorder = order[:]
- invorder.reverse()
- cnt = 0
- for item in order:
- start_time = start + item
+ start_minute = meeting.meeting_time_start.minute
+ stop_minute = meeting.meeting_time_stop.minute
+ if start_minute != 0 and start_minute != 30:
+ if start_minute - 30 > 0:
+ start_minute = 30
+ else:
+ start_minute = 0
+ if stop_minute != 0 and stop_minute != 30:
+ if stop_minute - 30 > 0:
+ stop_minute = 30
+ else:
+ stop_minute = 0
+ startdt = datetime(2000, 01, 01, meeting.meeting_time_start.hour,
+ start_minute, 0)
+ stopdt = datetime(2000, 01, 01, meeting.meeting_time_stop.hour,
+ stop_minute, 0)
+
+ startdt = convert_time(startdt, 'UTC', tzone)
+ stopdt = convert_time(stopdt, 'UTC', tzone)
+
+ t_time = startdt
+ while t_time < stopdt:
day = meeting.meeting_date.weekday()
- for key in [convert_time(
- datetime(2000, 01, 01, int(start_time), 0, 0),
- 'UTC',
- tzone).strftime(fmt),
- convert_time(
- datetime(2000, 01, 01, int(start_time), 30, 0),
- 'UTC',
- tzone).strftime(fmt)]:
- if key in meetings:
- if meetings[key][day]:
- meetings[key][day].append(meeting)
- else:
- meetings[key][day] = [meeting]
- cnt = cnt + 1
+ key = t_time.strftime(fmt)
+ if key in meetings:
+ if meetings[key][day]:
+ meetings[key][day].append(meeting)
+ else:
+ meetings[key][day] = [meeting]
+ t_time = t_time + timedelta(minutes=30)
return meetings
@@ -364,7 +369,7 @@ def get_future_regular_meeting_of_user(session, username,
def agenda_is_free(session, calendar, meeting_date,
- time_start, time_stop):
+ time_start):
"""Check if there is already someting planned in this agenda at that
time.
@@ -372,10 +377,9 @@ def agenda_is_free(session, calendar, meeting_date,
:arg calendar: the name of the calendar of interest.
:arg meeting_date: the date of the meeting (as Datetime object)
:arg time_start: the time at which the meeting starts (as int)
- :arg time_stop: the time at which the meeting stops (as int)
"""
meetings = Meeting.get_by_time(session, calendar, meeting_date,
- time(time_start), time(time_stop))
+ time_start)
if not meetings:
return True
else:
@@ -549,26 +553,21 @@ def add_meeting(session, calendarobj, fas_user,
raise InvalidMeeting('The date you entered is in '\
'the past')
- if int(meeting_time_start) > \
- int(meeting_time_stop):
+ if meeting_time_start > meeting_time_stop:
raise InvalidMeeting(
'The start time of your meeting is later than the stop time.')
meeting_time_start = convert_time(
- datetime(2000, 1, 1, int(meeting_time_start), 0),
+ datetime(2000, 1, 1, meeting_time_start.hour,
+ meeting_time_start.minute),
tzone, 'UTC')
- tsp_hour = int(meeting_time_stop)
- tsp_minute = 0
- if tsp_hour == 24:
- tsp_hour = 23
- tsp_minute = 59
meeting_time_stop = convert_time(
- datetime(2000, 1, 1, tsp_hour, tsp_minute),
+ datetime(2000, 1, 1, meeting_time_stop.hour,
+ meeting_time_stop.minute),
tzone, 'UTC')
free_time = agenda_is_free(session, calendarobj,
- meeting_date, meeting_time_start.hour,
- meeting_time_stop.hour)
+ meeting_date, meeting_time_start.time())
if not bool(calendarobj.calendar_multiple_meetings) and \
not bool(free_time):
diff --git a/fedocal/fedocallib/model.py b/fedocal/fedocallib/model.py
index e882ee7..510d002 100644
--- a/fedocal/fedocallib/model.py
+++ b/fedocal/fedocallib/model.py
@@ -298,16 +298,15 @@ class Meeting(BASE):
(Meeting.meeting_region == region)).all()
@classmethod
- def get_by_time(cls, session, calendar, meetingdate, start_time,
- stop_time):
+ def get_by_time(cls, session, calendar, meetingdate, start_time):
""" Retrieve the list of meetings for a given date and between
two times.
"""
return session.query(cls).filter(and_
(Meeting.calendar == calendar),
(Meeting.meeting_date == meetingdate),
- (Meeting.meeting_time_start >= start_time),
- (Meeting.meeting_time_stop <= stop_time)).all()
+ (Meeting.meeting_time_start <= start_time),
+ (Meeting.meeting_time_stop > start_time)).all()
@classmethod
def get_past_meeting_of_user(cls, session, username, start_date):
diff --git a/fedocal/forms.py b/fedocal/forms.py
index d9a0321..b777350 100644
--- a/fedocal/forms.py
+++ b/fedocal/forms.py
@@ -25,10 +25,23 @@
import flask
from flask.ext import wtf
+from datetime import time
from fedocallib import HOURS
+def validate_time(form, field):
+ """ Validate if the data set in the given field is a valid time.
"""
+ import re
+ if not re.match('\d?\d:\d\d?', field.data):
+ raise ValidationError('Time must be of type "HH:MM"')
+ time_data = field.data.split(':')
+ try:
+ field.data = time(int(time_data[0]), int(time_data[1]))
+ except ValueError:
+ raise ValidationError('Time must be of type "HH:MM"')
+
+
class AddCalendarForm(wtf.Form):
""" Form used to create a new calendar. """
calendar_name = wtf.TextField('Calendar',
@@ -52,15 +65,12 @@ class AddMeetingForm(wtf.Form):
meeting_date_end = wtf.DateField('End date',
[wtf.validators.optional()])
- meeting_time_start = wtf.SelectField('Start time',
- [wtf.validators.Required()],
- choices=[(hour, hour) for hour in HOURS]
- )
+ meeting_time_start = wtf.TextField('Start time',
+ [wtf.validators.Required(), validate_time])
+
+ meeting_time_stop = wtf.TextField('Stop time',
+ [wtf.validators.Required(), validate_time])
- meeting_time_stop = wtf.SelectField('Stop time',
- [wtf.validators.Required()],
- choices=[(hour, hour) for hour in HOURS]
- )
comanager = wtf.TextField('Co-manager')
information = wtf.TextAreaField('Information')
@@ -97,20 +107,11 @@ class AddMeetingForm(wtf.Form):
super(AddMeetingForm, self).__init__(*args, **kwargs)
if 'meeting' in kwargs:
meeting = kwargs['meeting']
- if meeting.meeting_time_start.hour < 10:
- start_hour = "0%s" % str(meeting.meeting_time_start.hour)
- else:
- start_hour = str(meeting.meeting_time_start.hour)
- if meeting.meeting_time_stop.hour < 10:
- stop_hour = "0%s" % str(meeting.meeting_time_stop.hour)
- else:
- stop_hour = str(meeting.meeting_time_stop.hour)
-
self.meeting_name.data = meeting.meeting_name
self.meeting_date.data = meeting.meeting_date
self.meeting_date_end.data = meeting.meeting_date_end
- self.meeting_time_start.data = start_hour
- self.meeting_time_stop.data = stop_hour
+ self.meeting_time_start.data = meeting.meeting_time_start
+ self.meeting_time_stop.data = meeting.meeting_time_stop
self.information.data = meeting.meeting_information
# You are not allowed to remove yourself from the managers.
meeting_manager = meeting.meeting_manager.replace(