3 import urllib.request, urllib.error
4 from collections import OrderedDict
5 from typing import Optional, Tuple, List
8 import sqlalchemy as sa
9 from flask import request, abort, redirect, url_for, flash, render_template
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
22 class RodelbahnController:
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),
31 return render_template('rodelbahn_list.html', paginator=paginator)
34 """Displays a sled run"""
35 q = db.session.query(WrSledrunCache)
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),
44 return render_template('rodelbahn_view.html', sledding=sledrun, paginator=paginator)
46 def view_wikitext(self, id: int) -> str:
47 """Displays a sled run as MediaWiki wiki text"""
48 q = db.session.query(WrSledrunCache)
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)
59 map_url = h.sledrun_map_url(sledrun.page_title)
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
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)
71 def json_edit(self, sledrun_id):
72 q = db.session.query(WrSledrunCache)
73 sledrun = q.get(sledrun_id)
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)
82 """Updates the wrsledruncache table from the wiki"""
83 c = db.session.connection()
85 wrpylib.wrmwcache.update_wrsledruncache(c)
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)
92 msg = msg.replace('\n', '; ')
94 flash("Fehler bei Rodelbahn '{0}': {1}".format(title, msg), 'error')
96 flash(str(e), 'error')
97 # Redirect to result page
98 return redirect(url_for('rodelbahn_list'))
100 def update_regioncache(self):
101 """Updates the wrregioncache table from the wiki"""
102 c = db.session.connection()
104 wrpylib.wrmwcache.update_wrregioncache(c)
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'))
112 def update_mapcache(self):
113 """Updates the wrmappointcache and wrmappathcache tables from the wiki."""
114 c = db.session.connection()
116 wrpylib.wrmwcache.update_wrmapcache(c)
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'))