# -*- coding: iso-8859-15 -*- import logging from pylons import request, response, session, url, tmpl_context as c from pylons.controllers.util import abort, redirect import webhelpers.paginate as paginate from wradmin.lib.base import BaseController, render from pylons.decorators.rest import restrict from pylons.decorators import validate import wradmin.model as model import sqlalchemy as sa import datetime import formencode import wrpylib.wrvalidators log = logging.getLogger(__name__) formencode.api.set_stdtranslation(domain="FormEncode", languages=["de"]) class RequireDateIfUserDefined(formencode.validators.FormValidator): "requires that date_userdefined is not empty if date_invalid == 'userdefined'" def _to_python(self, value_dict, state): # if not value_dict.get('date_invalid'): ... # This is _not_ checked because this should be checked elsewhere if value_dict.get('date_invalid') == 'userdefined' and not value_dict.get('date_userdefined'): value = value_dict.get('date_userdefined') raise formencode.Invalid('Es muss ein Wert eingegeben werden', value, state, error_dict={'date_userdefined': formencode.Invalid(self.message('empty', state), value, state)}) return value_dict class ChangeDateInvalidForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True date_invalid = formencode.validators.OneOf(['no_change', 'tomorrow', 'one_week', 'two_weeks', 'one_week_more', 'end_of_saison', 'now', 'userdefined'], not_empty=True) date_userdefined = wrpylib.wrvalidators.DateTimeNoSec chained_validators = [RequireDateIfUserDefined()] class BerichtController(BaseController): "Manages reports (table wrreport)" def _add_dates_to_c(self, date_invalid): now = datetime.datetime.today() if date_invalid is None: date_invalid = now c.date_now = now c.date_no_change = date_invalid c.date_tomorrow = now + datetime.timedelta(1) c.date_one_week = now + datetime.timedelta(7) c.date_two_weeks = now + datetime.timedelta(14) c.date_one_week_more = date_invalid + datetime.timedelta(7) c.date_end_of_saison = datetime.datetime(now.year if now.month < 7 else now.year + 1, 7, 1) def view(self, id): "Displays a report" q = model.meta.Session.query(model.WrReport) c.wrreport = q.get(id) if c.wrreport is None: abort(404) self._add_dates_to_c(c.wrreport.date_invalid) return render('bericht_view.html') @restrict('POST') @validate(schema=ChangeDateInvalidForm(), form='view') def change_date_invalid(self, id=None): if id is None: abort(404) wrreport_q = model.meta.Session.query(model.WrReport) wrreport = wrreport_q.get(id) if wrreport is None: abort(404) self._add_dates_to_c(wrreport.date_invalid) date = self.form_result['date_invalid'] if date == 'tomorrow': wrreport.date_invalid = c.date_tomorrow elif date == 'one_week': wrreport.date_invalid = c.date_one_week elif date == 'two_weeks': wrreport.date_invalid = c.date_two_weeks elif date == 'one_week_more': wrreport.date_invalid = c.date_one_week_more elif date == 'end_of_saison': wrreport.date_invalid = c.date_end_of_saison elif date == 'now': wrreport.date_invalid = c.date_now elif date == 'userdefined': wrreport.date_invalid = self.form_result['date_userdefined'] model.meta.Session.commit() session['flash'] = u'Datum wurde erfolgreich geändert' session.save() return redirect(url(controller='bericht', action='view', id=id)) def new(self, id): "Displays a form to create a new page" return u"Nicht implementiert." def create(self): "Saves the information submitted from new() and redirects to view()" return u"Nicht implementiert." def edit(self, id): "Displays a form for editing the page id" return u"Nicht implementiert." def save(self, id): "Saves the page id and redirects to view()" return u"Nicht implementiert." def list(self): "Lists all reports" q = model.meta.Session.query(model.WrReport) q = q.order_by(sa.sql.expression.desc(model.WrReport.id)) c.paginator = paginate.Page(q, page=int(request.params.get('page', 1)), items_per_page = 25) return render('bericht_list.html') def delete(self, id): "Deletes a page" return u"Nicht implementiert."