]> ToastFreeware Gitweb - philipp/winterrodeln/wradmin.git/blob - wradmin/wradmin/controllers/rodelbahn.py
106751e52886f9131f00d230ba290f0745abbb50
[philipp/winterrodeln/wradmin.git] / wradmin / wradmin / controllers / rodelbahn.py
1 #!/usr/bin/python2.6
2 # -*- coding: iso-8859-15 -*-
3 import logging
4
5 from pylons import request, response, session, url, tmpl_context as c
6 from pylons.controllers.util import abort, redirect
7 import webhelpers.paginate as paginate
8
9 from wradmin.lib.base import BaseController, render
10 import wradmin.model as model
11 import sqlalchemy as sa
12 import formencode
13 import re
14
15 import wrpylib.wrmwmarkup
16
17 from weberror import collector        # Prevent a bug of weberror # See https://bitbucket.org/bbangert/weberror/issue/3/nameerror-global-name-fallback_encoding-is-not
18 collector.FALLBACK_ENCODING = 'utf-8' # --"--
19
20 log = logging.getLogger(__name__)
21
22 class RodelbahnController(BaseController):
23
24     def index(self):
25         return render('index.html')
26
27
28     def list(self):
29         "Lists all sled runs"
30         q = model.meta.Session.query(model.WrSledrunCache)
31         q = q.order_by(model.WrSledrunCache.page_title)
32         c.paginator = paginate.Page(q, page=int(request.params.get('page', 1)), items_per_page = 25)
33         return render('rodelbahn_list.html')
34     
35     
36     def view(self, id):
37         "Displays a sled run"
38         q = model.meta.Session.query(model.WrSledrunCache)
39         c.sledding =  q.get(id)
40         if c.sledding is None: abort(404)
41         q = model.meta.Session.query(model.WrReport)
42         q = q.filter_by(page_id=id).order_by(sa.sql.expression.desc(model.WrReport.id))
43         c.paginator = paginate.Page(q, page=int(request.params.get('page', 1)), items_per_page = 25)
44         return render('rodelbahn_view.html')
45     
46     
47     def update(self):
48         "Updates the wrsledruncache table from the wiki"
49         from wradmin.model import page_table as page, wrsledruncache_table as wrsledruncache, categorylinks_table as categorylinks, revision_table as revision, text_table as text
50         from sqlalchemy.sql import select
51         c = model.meta.Session.connection()
52         
53         # As MySQL does not support transactions we make a dry run first and only continue if there is no fatal error
54         for i in range(2):
55             # Query all sledding routes
56             q = select([page, categorylinks, revision, text], (page.c.page_latest==revision.c.rev_id) & (text.c.old_id==revision.c.rev_text_id) & (categorylinks.c.cl_from==page.c.page_id) & (categorylinks.c.cl_to==u'Rodelbahn'))
57             sledding_pages = c.execute(q)
58             # Original SQL:
59             # sql = u"select page_id, rev_id, old_id, page_title, old_text, 'In_Arbeit' in (select cl_to from categorylinks where cl_from=page_id) as under_construction from page, revision, text, categorylinks where page_latest=rev_id and old_id=rev_text_id and cl_from=page_id and cl_to='Rodelbahn' order by page_title"
60             
61             # Delete all existing entries in wrsledruncache
62             if i == 1: c.execute(wrsledruncache.delete())
63             
64             # Refill wrsledruncache table
65             error_msg = u''
66             for sl in sledding_pages:
67                 try: 
68                     start, end, sledrun = wrpylib.wrmwmarkup.rodelbahnbox_to_sledrun(sl.old_text, model.WrSledrunCache())
69                     sledrun.page_id = sl.page_id
70                     sledrun.page_title = sl.page_title
71                     sledrun.under_construction = c.execute(select([categorylinks], (categorylinks.c.cl_from==sl.page_id) & (categorylinks.c.cl_to == u'In_Arbeit')).alias('x').count()).fetchone()[0] > 0 # It would be better to do this in the query above
72                     if i == 1: model.meta.Session.add(sledrun)
73                 except (RuntimeError, formencode.Invalid) as e: error_msg = u"Fehler bei Rodelbahn '%s': " % sl.page_title + unicode(e)
74             if i == 1: model.meta.Session.commit()
75         
76         # Redirect to result page
77         if error_msg == '': session['flash'] = u'Die Rodelbahnliste wurde erfolgreich aktualisiert.'
78         else: session['flash'] = error_msg
79         session.save()
80         return redirect(url(controller='rodelbahn', action='list'))