Repository :
http://git.fedorahosted.org/cgit/fedocal.git
On branch : master
---------------------------------------------------------------
commit 9228e0fa68d2ff0130e1fd4c641f496a3c3573ba
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Fri Nov 9 12:02:35 2012 +0100
Start moving code out of the controller (add_reminder/add_meeting)
The controller should have as little code as possible, so here we create the
dbaction file which aims at containing the code for addition/deleteion/edition
of database object.
This is taken out of the main library to allow more in depth testing.
---------------------------------------------------------------
fedocal/__init__.py | 109 ++++++++++++++++------------------------
fedocal/fedocallib/dbaction.py | 80 +++++++++++++++++++++++++++++
2 files changed, 123 insertions(+), 66 deletions(-)
diff --git a/fedocal/__init__.py b/fedocal/__init__.py
index 18764f0..a6b1c2d 100644
--- a/fedocal/__init__.py
+++ b/fedocal/__init__.py
@@ -40,6 +40,7 @@ from flask_fas import FAS, cla_plus_one_required
import forms as forms
import fedocallib as fedocallib
+import fedocallib.dbaction
from fedocallib.model import (Calendar, Meeting, Reminder)
CONFIG = ConfigParser.ConfigParser()
@@ -301,19 +302,22 @@ def add_meeting(calendar_name):
flask.flash('You are not allowed to add a meeting to'\
' this calendar')
return flask.redirect(flask.url_for('index'))
+
if not fedocallib.is_date_in_future(form.meeting_date.data,
form.meeting_time_start.data):
flask.flash('The date you entered is in the past')
return flask.redirect(flask.url_for('add_meeting',
calendar_name=calendarobj.calendar_name, form=form,
tzone=tzone))
- elif int(form.meeting_time_start.data) > \
+
+ if int(form.meeting_time_start.data) > \
int(form.meeting_time_stop.data):
flask.flash('The start time you have entered is later than'\
' the stop time.')
flask.render_template('add_meeting.html',
calendar=calendarobj, form=form, tzone=tzone)
- elif bool(calendarobj.calendar_multiple_meetings) or \
+
+ if bool(calendarobj.calendar_multiple_meetings) or \
(not bool(calendarobj.calendar_multiple_meetings) and \
fedocallib.agenda_is_free(SESSION,
calendarobj,
@@ -322,72 +326,48 @@ def add_meeting(calendar_name):
int(form.meeting_time_stop.data)
)):
- manager = '%s,' % flask.g.fas_user.username
- end_date = form.end_repeats.data
- if not end_date and form.frequency.data:
- end_date = datetime.date(2025, 12, 31)
- frequency = form.frequency.data
- if not frequency:
- frequency = None
- region = form.meeting_region.data
- if not calendarobj.calendar_regional_meetings or not region:
- region = None
- meeting_end_date = form.meeting_date_end.data
- if not meeting_end_date:
- meeting_end_date = form.meeting_date.data
-
- tzone = get_timezone()
- meeting_time_start = fedocallib.convert_time(
- datetime.datetime(2000, 1, 1,
- int(form.meeting_time_start.data), 0),
- tzone, 'UTC')
- meeting_time_stop = fedocallib.convert_time(
- datetime.datetime(2000, 1, 1,
- int(form.meeting_time_stop.data), 0),
- tzone, 'UTC')
- meeting = Meeting(
- meeting_name=form.meeting_name.data,
- meeting_manager=manager,
- meeting_date=form.meeting_date.data,
- meeting_date_end=meeting_end_date,
- meeting_time_start=meeting_time_start.time(),
- meeting_time_stop=meeting_time_stop.time(),
- meeting_information=form.information.data,
- calendar_name=calendarobj.calendar_name,
- reminder_id=None,
- meeting_region=region,
- recursion_frequency=frequency,
- recursion_ends=end_date)
- meeting.save(SESSION)
- try:
- SESSION.flush()
- # pylint: disable=W0703
- except Exception, err:
- print 'add_meeting:', err
- flask.flash('Could not add this meeting to this calendar')
- return flask.render_template('add_meeting.html',
- calendar=calendarobj, form=form, tzone=tzone)
-
+ reminder = None
if form.remind_when.data and form.remind_who.data:
- reminder = Reminder(form.remind_when.data,
- form.remind_who.data,
- None)
- reminder.save(SESSION)
try:
- SESSION.flush()
- meeting.reminder = reminder
- SESSION.flush()
- # pylint: disable=W0703
- except Exception, err:
- print 'add_meeting:', err
+ reminder = dbaction.add_reminder(session=session,
+ remind_when=form.remind_when.data,
+ remind_who=form.remind_who.data)
+ except SQLAlchemyError, err:
+ print 'add_reminder:', err
flask.flash('Could not add this reminder to this meeting')
return flask.render_template('add_meeting.html',
calendar=calendarobj, form=form, tzone=tzone)
+ reminder_id = None
+ if reminder:
+ reminder_id = reminder.reminder_id
+
+ try:
+ reminder = dbaction.add_meeting(session=session,
+ meeting_name=form.meeting_name.data,
+ meeting_manager='%s,' % flask.g.fas_user.username,
+ meeting_date=form.meeting_date.data,
+ meeting_date_end=None,
+ meeting_time_start=datetime.time(int(
+ form.meeting_time_start.data), 0),
+ meeting_time_stop=datetime.time(int(
+ form.meeting_time_stop.data), 0),
+ meeting_information=form.meeting_information.data,
+ calendar=calendarobj,
+ reminder_id=reminder_id,
+ meeting_region=form.meeting_region.data,
+ recursion_frequency=form.frequency.data,
+ recursion_ends=form.end_repeats.data,
+ tzone=get_timezone())
+ except SQLAlchemyError, err:
+ print 'add_meeting:', err
+ flask.flash('Could not add this meeting to this calendar')
+ return flask.render_template('add_meeting.html',
+ calendar=calendarobj, form=form, tzone=tzone)
+
try:
SESSION.commit()
- # pylint: disable=W0703
- except Exception, err:
+ except SQLAlchemyError, err:
flask.flash(
'Something went wrong while commiting to the DB.')
flask.render_template('add_meeting.html',
@@ -475,8 +455,7 @@ def edit_meeting(meeting_id):
SESSION.flush()
meeting.reminder = reminder
SESSION.flush()
- # pylint: disable=W0703
- except Exception, err:
+ except SQLAlchemyError, err:
print 'edit_meeting:', err
flask.flash('Could not edit the reminder of '\
'this meeting')
@@ -486,14 +465,12 @@ def edit_meeting(meeting_id):
elif meeting.reminder_id:
try:
meeting.reminder.delete(SESSION)
- # pylint: disable=W0703
- except Exception, err:
+ except SQLAlchemyError, err:
print 'edit_meeting:', err
meeting.save(SESSION)
SESSION.commit()
- # pylint: disable=W0703
- except Exception, err:
+ except SQLAlchemyError, err:
print 'edit_meeting:', err
flask.flash('Could not update this meeting.')
return flask.redirect(flask.url_for('edit_meeting',
diff --git a/fedocal/fedocallib/dbaction.py b/fedocal/fedocallib/dbaction.py
new file mode 100644
index 0000000..130d753
--- /dev/null
+++ b/fedocal/fedocallib/dbaction.py
@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*-
+
+"""
+dbaction - Simple file containing all the methods to add/edit and remove
+ object from the database.
+
+Copyright (C) 2012 Pierre-Yves Chibon
+Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or (at
+your option) any later version.
+See
http://www.gnu.org/copyleft/gpl.html for the full text of the
+license.
+"""
+
+from datetime import date
+from datetime import datetime
+import fedocallib
+import model
+
+
+def add_reminder(session, remind_when, remind_who):
+ """ Logic to add a reminder to the database.
+ """
+ reminder = model.Reminder(remind_when,
+ remind_who,
+ None)
+ reminder.save(session)
+ session.flush()
+ return reminder
+
+
+# pylint: disable=R0913,R0914
+def add_meeting(session, meeting_name, meeting_manager,
+ meeting_date, meeting_date_end,
+ meeting_time_start, meeting_time_stop,
+ meeting_information, calendarobj, reminder_id=None,
+ meeting_region=None,
+ recursion_frequency=None, recursion_ends=None,
+ tzone='UTC'):
+ """ Logic to add a meeting to the database.
+ """
+
+ if not recursion_frequency:
+ recursion_frequency = None
+ if not recursion_ends and recursion_frequency:
+ recursion_ends = date(2025, 12, 31)
+
+ if not calendarobj.calendar_regional_meetings or not meeting_region:
+ meeting_region = None
+
+ if not meeting_date_end:
+ meeting_date_end = meeting_date
+
+ meeting_time_start = fedocallib.convert_time(
+ datetime(2000, 1, 1,
+ meeting_time_start.hour, meeting_time_start.minute),
+ tzone, 'UTC')
+ meeting_time_stop = fedocallib.convert_time(
+ datetime(2000, 1, 1,
+ meeting_time_start.hour, meeting_time_start.minute),
+ tzone, 'UTC')
+
+ meeting = model.Meeting(
+ meeting_name=meeting_name,
+ meeting_manager=meeting_manager,
+ meeting_date=meeting_date,
+ meeting_date_end=meeting_date_end,
+ meeting_time_start=meeting_time_start.time(),
+ meeting_time_stop=meeting_time_stop.time(),
+ meeting_information=meeting_information,
+ calendar_name=calendarobj.calendar_name,
+ reminder_id=reminder_id,
+ meeting_region=meeting_region,
+ recursion_frequency=recursion_frequency,
+ recursion_ends=recursion_ends)
+ meeting.save(session)
+ session.flush()