-from flask import request, abort, redirect, url_for, flash, render_template
+import json
+import subprocess
+import urllib.request, urllib.error
+from collections import OrderedDict
+from typing import Optional, Tuple, List
+
import paginate
import sqlalchemy as sa
+from flask import request, abort, redirect, url_for, flash, render_template
-import wrpylib.wrmwmarkup
-import wrpylib.wrmwcache
import wrpylib.mwmarkup
-
-import wradmin.model as model
+import wrpylib.wrmwcache
+import wrpylib.wrmwmarkup
+from wradmin.app import db
+from wradmin.model import WrSledrunCache, WrReport
+from wradmin.template_helper import PylonsHelper
+from wrpylib.wrvalidators import rodelbahnbox_to_str, LonLat, difficulty_german_from_str, \
+ avalanches_german_from_str, public_transport_german_from_str, opt_tristate_german_comment_from_str, \
+ nightlightdays_from_str
class RodelbahnController:
def list(self):
"""Lists all sled runs"""
- q = model.meta.Session.query(model.WrSledrunCache)
- q = q.order_by(model.WrSledrunCache.page_title)
+ q = db.session.query(WrSledrunCache)
+ q = q.order_by(WrSledrunCache.page_title)
paginator = paginate.Page(q.all(), page=int(request.args.get('page', 1)),
url_maker=lambda page: url_for('rodelbahn_list', page=page),
items_per_page=25)
def view(self, id):
"""Displays a sled run"""
- q = model.meta.Session.query(model.WrSledrunCache)
- sledding = q.get(id)
- if sledding is None:
+ q = db.session.query(WrSledrunCache)
+ sledrun = q.get(id)
+ if sledrun is None:
abort(404)
- q = model.meta.Session.query(model.WrReport)
- q = q.filter_by(page_id=id).order_by(sa.sql.expression.desc(model.WrReport.id))
+ q = db.session.query(WrReport)
+ q = q.filter_by(page_id=id).order_by(sa.sql.expression.desc(WrReport.id))
paginator = paginate.Page(q.all(), page=int(request.args.get('page', 1)),
url_maker=lambda page: url_for('rodelbahn_view', id=id, page=page),
items_per_page=25)
- return render_template('rodelbahn_view.html', sledding=sledding, paginator=paginator)
+ return render_template('rodelbahn_view.html', sledding=sledrun, paginator=paginator)
+
+ def view_wikitext(self, id: int) -> str:
+ """Displays a sled run as MediaWiki wiki text"""
+ q = db.session.query(WrSledrunCache)
+ sledrun = q.get(id)
+ if sledrun is None:
+ abort(404)
+ h = PylonsHelper()
+ sledrun_json_url = h.sledrun_json_url(sledrun.page_title)
+ sledrun_json_page = urllib.request.urlopen(sledrun_json_url) # might raise urllib.error.HTTPError
+ sledrun_json_str = sledrun_json_page.read()
+ sledrun_json = json.loads(sledrun_json_str)
+
+ map_json = None
+ map_url = h.sledrun_map_url(sledrun.page_title)
+ try:
+ map_page = urllib.request.urlopen(map_url)
+ map_str = map_page.read()
+ map_json = json.loads(map_str)
+ except urllib.error.HTTPError as e:
+ if e.code != 404: # accept "not found" as map not being present
+ raise
+ sledrun_wiki = wrpylib.wrmwmarkup.create_sledrun_wiki(sledrun_json=sledrun_json, map_json=map_json)
+ return render_template('rodelbahn_view_wikitext.html',
+ sledrun_name=sledrun.page_title, sledrun_wiki=sledrun_wiki)
+
+ def json_edit(self, sledrun_id):
+ q = db.session.query(WrSledrunCache)
+ sledrun = q.get(sledrun_id)
+ if sledrun is None:
+ abort(404)
+ h = PylonsHelper()
+ schema_url = h.sledrun_json_schema_url()
+ json_url = h.sledrun_json_url(sledrun.page_title)
+ return render_template('json_editor.html', schema_url=schema_url, json_url=json_url)
def update(self):
"""Updates the wrsledruncache table from the wiki"""
- c = model.meta.Session.connection()
+ c = db.session.connection()
try:
wrpylib.wrmwcache.update_wrsledruncache(c)
- model.meta.Session.commit()
+ db.session.commit()
flash('Die Rodelbahnliste wurde erfolgreich aktualisiert.', 'info')
except wrpylib.wrmwcache.UpdateCacheError as e:
title = str(e.args[1])
def update_regioncache(self):
"""Updates the wrregioncache table from the wiki"""
- c = model.meta.Session.connection()
+ c = db.session.connection()
try:
wrpylib.wrmwcache.update_wrregioncache(c)
- model.meta.Session.commit()
+ db.session.commit()
flash('Die Rodelbahneinträge in den Regionslisten wurden erfolgreich aktualisiert.', 'info')
except wrpylib.wrmwcache.UpdateCacheError as e:
flash(str(e), 'error')
def update_mapcache(self):
"""Updates the wrmappointcache and wrmappathcache tables from the wiki."""
- c = model.meta.Session.connection()
+ c = db.session.connection()
try:
wrpylib.wrmwcache.update_wrmapcache(c)
- model.meta.Session.commit()
+ db.session.commit()
flash('Die Landkarteninformationen aus dem Wiki wurden erfolgreich aktualisiesrt.', 'info')
except wrpylib.wrmwcache.UpdateCacheError as e:
flash(str(e), 'error')