]> ToastFreeware Gitweb - philipp/winterrodeln/wradmin.git/blob - wradmin/controllers/rodelbahn.py
Prevent some updates.
[philipp/winterrodeln/wradmin.git] / wradmin / controllers / rodelbahn.py
1 import json
2 import subprocess
3 import urllib.request, urllib.error
4 from collections import OrderedDict
5 from typing import Optional, Tuple, List
6
7 import paginate
8 import sqlalchemy as sa
9 from flask import request, abort, redirect, url_for, flash, render_template
10
11 import wrpylib.mwmarkup
12 import wrpylib.wrmwcache
13 import wrpylib.wrmwmarkup
14 from wradmin.app import db
15 from wradmin.model import WrSledrunCache, WrReport
16 from wradmin.template_helper import PylonsHelper
17 from wrpylib.wrvalidators import rodelbahnbox_to_str, LonLat, difficulty_german_from_str, \
18     avalanches_german_from_str, public_transport_german_from_str, opt_tristate_german_comment_from_str, \
19     nightlightdays_from_str
20
21
22 class RodelbahnController:
23
24     def list(self):
25         """Lists all sled runs"""
26         q = db.session.query(WrSledrunCache)
27         q = q.order_by(WrSledrunCache.page_title)
28         paginator = paginate.Page(q.all(), page=int(request.args.get('page', 1)),
29                                   url_maker=lambda page: url_for('rodelbahn_list', page=page),
30                                   items_per_page=25)
31         return render_template('rodelbahn_list.html', paginator=paginator)
32
33     def view(self, id):
34         """Displays a sled run"""
35         q = db.session.query(WrSledrunCache)
36         sledrun = q.get(id)
37         if sledrun is None:
38             abort(404)
39         q = db.session.query(WrReport)
40         q = q.filter_by(page_id=id).order_by(sa.sql.expression.desc(WrReport.id))
41         paginator = paginate.Page(q.all(), page=int(request.args.get('page', 1)),
42                                   url_maker=lambda page: url_for('rodelbahn_view', id=id, page=page),
43                                   items_per_page=25)
44         return render_template('rodelbahn_view.html', sledding=sledrun, paginator=paginator)
45
46     def view_wikitext(self, id: int) -> str:
47         """Displays a sled run as MediaWiki wiki text"""
48         q = db.session.query(WrSledrunCache)
49         sledrun = q.get(id)
50         if sledrun is None:
51             abort(404)
52         h = PylonsHelper()
53         sledrun_json_url = h.sledrun_json_url(sledrun.page_title)
54         sledrun_json_page = urllib.request.urlopen(sledrun_json_url)  # might raise urllib.error.HTTPError
55         sledrun_json_str = sledrun_json_page.read()
56         sledrun_json = json.loads(sledrun_json_str)
57
58         map_json = None
59         map_url = h.sledrun_map_url(sledrun.page_title)
60         try:
61             map_page = urllib.request.urlopen(map_url)
62             map_str = map_page.read()
63             map_json = json.loads(map_str)
64         except urllib.error.HTTPError as e:
65             if e.code != 404:  # accept "not found" as map not being present
66                 raise
67         sledrun_wiki = wrpylib.wrmwmarkup.create_sledrun_wiki(sledrun_json=sledrun_json, map_json=map_json)
68         return render_template('rodelbahn_view_wikitext.html',
69                                sledrun_name=sledrun.page_title, sledrun_wiki=sledrun_wiki)
70
71     def json_edit(self, sledrun_id):
72         q = db.session.query(WrSledrunCache)
73         sledrun = q.get(sledrun_id)
74         if sledrun is None:
75             abort(404)
76         h = PylonsHelper()
77         schema_url = h.sledrun_json_schema_url()
78         json_url = h.sledrun_json_url(sledrun.page_title)
79         return render_template('json_editor.html', schema_url=schema_url, json_url=json_url)
80
81     def update(self):
82         """Updates the wrsledruncache table from the wiki"""
83         c = db.session.connection()
84         try:
85             wrpylib.wrmwcache.update_wrsledruncache(c)
86             db.session.commit()
87             flash('Die Rodelbahnliste wurde erfolgreich aktualisiert.', 'info')
88         except wrpylib.wrmwcache.UpdateCacheError as e:
89             title = str(e.args[1])
90             title = wrpylib.mwmarkup.dbkey_to_title(title)
91             msg = str(e.args[2])
92             msg = msg.replace('\n', '; ')
93             if len(e.args) == 3:
94                 flash("Fehler bei Rodelbahn '{0}': {1}".format(title, msg), 'error')
95             else:
96                 flash(str(e), 'error')
97         # Redirect to result page
98         return redirect(url_for('rodelbahn_list'))
99
100     def update_regioncache(self):
101         """Updates the wrregioncache table from the wiki"""
102         c = db.session.connection()
103         try:
104             wrpylib.wrmwcache.update_wrregioncache(c)
105             db.session.commit()
106             flash('Die Rodelbahneinträge in den Regionslisten wurden erfolgreich aktualisiert.', 'info')
107         except wrpylib.wrmwcache.UpdateCacheError as e:
108             flash(str(e), 'error')
109         # Redirect to result page
110         return redirect(url_for('rodelbahn_list'))
111
112     def update_mapcache(self):
113         """Updates the wrmappointcache and wrmappathcache tables from the wiki."""
114         c = db.session.connection()
115         try:
116             wrpylib.wrmwcache.update_wrmapcache(c)
117             db.session.commit()
118             flash('Die Landkarteninformationen aus dem Wiki wurden erfolgreich aktualisiesrt.', 'info')
119         except wrpylib.wrmwcache.UpdateCacheError as e:
120             flash(str(e), 'error')
121         # Redirect to result page
122         return redirect(url_for('rodelbahn_list'))