+# -*- coding: iso-8859-15 -*-
import logging
from pylons import request, response, session, tmpl_context as c
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
+
log = logging.getLogger(__name__)
+formencode.api.set_stdtranslation(domain="FormEncode", languages=["de"])
+
+
+class GermanDateTimeConverter(formencode.FancyValidator):
+ def _to_python(self, value, state):
+ "converts datetime strings like '2009-03-22 20:36'"
+ self.assert_string(value, state)
+ try: return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M')
+ except ValueError, e: raise formencode.Invalid(str(e), value, state)
+
+
+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 = GermanDateTimeConverter
+ 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, 7, 1)
+
def view(self, id):
"Displays a report"
wrreport_q = model.meta.Session.query(model.WrReport)
c.wrreport = 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'] = 'Datum wurde erfolgreich geändert'
+ session.save()
+ return redirect_to(controller='bericht', action='view', id=id)
+
def new(self, id):
"Displays a form to create a new page"
return u"Nicht implementiert."
</py:if>
</table>
+<h3>Anzeigedauer des Rodelbahnberichts ändern</h3>
+<form action="${h.url_for(controller='bericht', action='change_date_invalid', id=c.wrreport.id)}" method="post">
+<table>
+ <tr>
+ <th>Enddatum</th>
+ <td><input type="radio" name="date_invalid" value="no_change" checked="true" />Unverändert</td>
+ <td>${c.date_no_change.strftime('%Y-%m-%d %H:%M')}</td>
+ </tr><tr>
+ <th></th>
+ <td><input type="radio" name="date_invalid" value="tomorrow" />Morgen</td>
+ <td>${c.date_tomorrow.strftime('%Y-%m-%d %H:%M')}</td>
+ </tr><tr>
+ <th></th>
+ <td><input type="radio" name="date_invalid" value="one_week" />In einer Woche</td>
+ <td>${c.date_one_week.strftime('%Y-%m-%d %H:%M')}</td>
+ </tr><tr>
+ <th></th>
+ <td><input type="radio" name="date_invalid" value="two_weeks" />In zwei Wochen</td>
+ <td>${c.date_two_weeks.strftime('%Y-%m-%d %H:%M')}</td>
+ </tr><tr>
+ <th></th>
+ <td><input type="radio" name="date_invalid" value="one_week_more" />Einer Woche länger</td>
+ <td>${c.date_one_week_more.strftime('%Y-%m-%d %H:%M')}</td>
+ </tr><tr>
+ <th></th>
+ <td><input type="radio" name="date_invalid" value="end_of_saison" />Saisonende</td>
+ <td>${c.date_end_of_saison.strftime('%Y-%m-%d %H:%M')}</td>
+ </tr><tr>
+ <th></th>
+ <td><input type="radio" name="date_invalid" value="now" />Jetzt (entspricht ohne Meldung löschen)</td>
+ <td>${c.date_now.strftime('%Y-%m-%d %H:%M')}</td>
+ </tr>
+ <tr>
+ <th></th>
+ <td><input type="radio" name="date_invalid" value="userdefined" />Selbst festlegen: </td>
+ <td><input type="text" name="date_userdefined" value="${c.date_no_change.strftime('%Y-%m-%d %H:%M')}"/></td>
+ </tr>
+ <tr><th>Durchführen</th><td><input type="submit" value="OK"/></td><td></td></tr>
+</table>
+</form>
+
+
</body>
</html>