-from urllib.parse import quote_plus
+import json
+import subprocess
+import urllib.request
+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, current_app
+from flask import request, abort, redirect, url_for, flash, render_template
import wrpylib.mwmarkup
import wrpylib.wrmwcache
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, lonlat_none
class RodelbahnController:
items_per_page=25)
return render_template('rodelbahn_view.html', sledding=sledrun, paginator=paginator)
+ def view_wikitext(self, id):
+ """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)
+ sledrun_json_str = sledrun_json_page.read()
+ sledrun_json = json.loads(sledrun_json_str)
+
+ def markdown_to_mediawiki(markdown: str) -> str:
+ return subprocess.check_output(['pandoc', '--to', 'mediawiki'], input=markdown, encoding='utf-8')
+
+ def position_to_lon_lat(value: Optional[dict]) -> LonLat:
+ if value is not None:
+ lon = value.get('longitude')
+ lat = value.get('latitude')
+ if lon is not None and lat is not None:
+ return LonLat(lon, lat)
+ return lonlat_none
+
+ def position_ele_to_lon_lat(value: Optional[dict]) -> LonLat:
+ if value is not None:
+ return position_to_lon_lat(value.get("position"))
+ return lonlat_none
+
+ def position_ele_to_ele(value: Optional[dict]) -> Optional[int]:
+ if value is not None:
+ ele = value.get('elevation')
+ if ele is not None:
+ return int(ele)
+ return None
+
+ def aufstiegshilfe() -> Optional[List[Tuple[str, Optional[str]]]]:
+ ws = sledrun_json.get('walkup_supports')
+ if ws is None:
+ return None
+ return [(w['type'], w.get('comment')) for w in ws]
+
+ def rodelverleih() -> Optional[List[Tuple[str, Optional[str]]]]:
+ sr = sledrun_json.get('sled_rental_direct')
+ if sr is None:
+ return None
+ return [('Ja', None)] if sr else []
+
+ def webauskunft() -> Tuple[Optional[bool], Optional[str]]:
+ info_web = sledrun_json.get('info_web')
+ if info_web is None:
+ return None, None
+ if len(info_web) == 0:
+ return False, None
+ return True, info_web[0]['url']
+
+ def telefonauskunft() -> Optional[List[Tuple[str, str]]]:
+ info_phone = sledrun_json.get('info_phone')
+ if info_phone is None:
+ return None
+ return [(pc['phone'], pc['name']) for pc in info_phone]
+
+ def betreiber() -> str:
+ has_operator = sledrun_json.get('has_operator')
+ if has_operator is None:
+ return sledrun_json.get('operator')
+ if has_operator:
+ return sledrun_json.get('operator')
+ return 'Nein'
+
+ sledrun_rbb_json = OrderedDict([
+ ('Position', position_to_lon_lat(sledrun_json.get('position'))),
+ ('Position oben', position_ele_to_lon_lat(sledrun_json.get('top'))),
+ ('Höhe oben', position_ele_to_ele(sledrun_json.get('top'))),
+ ('Position unten', position_ele_to_lon_lat(sledrun_json.get('bottom'))),
+ ('Höhe unten', position_ele_to_ele(sledrun_json.get('bottom'))),
+ ('Länge', sledrun_json.get('length')),
+ ('Schwierigkeit', difficulty_german_from_str(sledrun_json.get('difficulty', ''))),
+ ('Lawinen', avalanches_german_from_str(sledrun_json.get('avalanches', ''))),
+ ('Betreiber', betreiber()),
+ ('Öffentliche Anreise', public_transport_german_from_str(sledrun_json.get('public_transport', ''))),
+ ('Aufstieg möglich', sledrun_json.get('walkup_possible')),
+ ('Aufstieg getrennt', opt_tristate_german_comment_from_str(sledrun_json.get('walkup_separate', ''))),
+ ('Gehzeit', sledrun_json.get('walkup_time')),
+ ('Aufstiegshilfe', aufstiegshilfe()),
+ ('Beleuchtungsanlage', opt_tristate_german_comment_from_str(sledrun_json.get('nightlight_possible'))),
+ ('Beleuchtungstage', nightlightdays_from_str(sledrun_json.get('nightlight_weekdays', ''))),
+ ('Rodelverleih', rodelverleih()),
+ ('Gütesiegel', None),
+ ('Webauskunft', webauskunft()),
+ ('Telefonauskunft', telefonauskunft()),
+ ('Bild', sledrun_json.get('image')),
+ ('In Übersichtskarte', sledrun_json.get('show_in_overview')),
+ ('Forumid', sledrun_json.get('forum_id'))
+ ])
+
+ def get_markdown_field(key: str) -> str:
+ if key in sledrun_json:
+ return markdown_to_mediawiki(sledrun_json[key])
+ return ''
+
+ description = get_markdown_field('description').strip()
+ night_light = get_markdown_field('night_light').strip()
+ sled_rental_description = get_markdown_field('sled_rental_description').strip()
+
+ rodelbahnbox = rodelbahnbox_to_str(sledrun_rbb_json)
+ return render_template('rodelbahn_view_wikitext.html', sledrun=sledrun, sledrun_json=sledrun_json,
+ rodelbahnbox=rodelbahnbox, description=description, night_light=night_light,
+ sled_rental_description=sled_rental_description, operator=betreiber())
+
def json_edit(self, sledrun_id):
q = db.session.query(WrSledrunCache)
sledrun = q.get(sledrun_id)
if sledrun is None:
abort(404)
- mediawiki_index = f'{current_app.config["MEDIAWIKI_ROOT"]}/index.php'
- schema_url = f'{mediawiki_index}?title=Winterrodeln:Datenschema/Rodelbahn/V1.json&action=raw'
- json_url = f'{mediawiki_index}?title={quote_plus(sledrun.page_title)}/Rodelbahn.json&action=raw'
+ 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):
--- /dev/null
+{% extends "master.html" %}
+{% block title %}Rodelbahn {{sledrun.page_title}}{% endblock %}
+
+{% block content %}
+<pre>
+== Allgemeines ==
+{{ rodelbahnbox }}
+{{ description }}
+{% raw %}
+* {{Position oben}}
+* {{Position unten}}
+* {{Höhenunterschied}}
+* {{Bahnlänge}}
+* {{Gehzeit}}
+* '''Beleuchtung''': {% endraw %}{{ night_light }}{% raw %}
+* '''Rodelverleih''': {% endraw %}{{ sled_rental_description }}
+* '''Schneelage - Auskunft''':{% for info in sledrun_json.get('info_phone', []) %}
+** {{ info['phone'] }} ({{ info['name'] }}){% endfor %}{% for info in sledrun_json.get('info_web', []) %}
+** {% if 'text' in info %}[{{ info['url'] }} {{ info['text'] }}]{% else %}{{ info['url'] }}{% endif %}{% endfor %}
+* '''Betreiber''': {{ operator }}
+* '''Hütten''':{% for info in sledrun_json.get('gastronomy', []) %}
+** {% if 'wr_page' in info %}{% if 'name' in info %}[[{{ info['name'] }}|{{ info['wr_page']['title'] }}]]{% else %}{{ info['wr_page'] }}{% endif %}{% endif %}{% endfor %}
+* '''Andere Rodelbahnen''':
+** [[Untermarkter Alm]]
+* '''Siehe auch''':{% for info in sledrun_json.get('see_also', []) %}
+** {% if 'text' in info %}[{{ info['url'] }} {{ info['text'] }}]{% else %}{{ info['url'] }}{% endif %}{% endfor %}
+
+
+{Buttonleiste|Bericht=Ja|ForumId=170|Wetter=Ja|Korrektur=Seite|Regiocard=Ja}}
+{Clear}}
+
+== Landkarte ==
+<wrmap lat="47.25495005" lon="10.713226985" zoom="14">
+
+<gasthaus name="Latschenhütte" wiki="Latschenhütte (Gasthaus)">47.257628 N 10.688077 E</gasthaus>
+<parkplatz>47.255415 N 10.738377 E</parkplatz>
+
+<rodelbahn>
+47.257962 N 10.688081 E
+47.258005 N 10.688402 E
+47.257590 N 10.688706 E
+47.257189 N 10.689888 E
+47.256868 N 10.689642 E
+47.255072 N 10.691495 E
+47.254187 N 10.692994 E
+47.252399 N 10.694954 E
+47.252205 N 10.696199 E
+47.252398 N 10.698193 E
+47.251425 N 10.695816 E
+47.251646 N 10.700060 E
+47.252280 N 10.701494 E
+47.252711 N 10.701935 E
+47.253288 N 10.704018 E
+47.253649 N 10.704199 E
+47.253892 N 10.705659 E
+47.254662 N 10.707657 E
+47.255164 N 10.708073 E
+47.255730 N 10.708088 E
+47.256003 N 10.708921 E
+47.255401 N 10.710403 E
+47.256161 N 10.713536 E
+47.256524 N 10.713556 E
+47.256291 N 10.715532 E
+47.257742 N 10.720200 E
+47.257928 N 10.722706 E
+47.258556 N 10.724411 E
+47.258508 N 10.724764 E
+47.257824 N 10.724747 E
+47.255990 N 10.722698 E
+47.255682 N 10.724402 E
+47.254975 N 10.725161 E
+47.254403 N 10.725299 E
+47.253625 N 10.726169 E
+47.252756 N 10.729158 E
+47.253270 N 10.729620 E
+47.254430 N 10.734014 E
+47.255339 N 10.735147 E
+47.255382 N 10.735946 E
+47.255177 N 10.736435 E
+47.255478 N 10.738000 E
+</rodelbahn>
+
+<lift>
+47.241962 N 10.721678 E
+47.248786 N 10.693678 E
+</lift>
+
+</wrmap>
+{Landkarte Legende}}<br/>{GoogleMaps Hinweis}}
+
+
+== Anreise mit öffentlichen Verkehrsmitteln ==
+Man kann entweder die Linien ''Imst Linie 2'' oder ''4266'' benützen, die beide vom ''Terminal Post'' abfahren.
+
+* {Haltestelle|Imst|Rastbühel/Hochbehälter|47.255415 N 10.738377 E|975}}
+** {Fahrplan Abfahrtsmonitor VVT|Imst|Rastbühel/Hochbehälter|62295}}
+** {Fahrplan Hinfahrt VVT|Imst|Rastbühel/Hochbehälter}}
+** {Fahrplan Rückfahrt VVT|Imst|Rastbühel/Hochbehälter}}
+* '''Fahrplan''':
+** {Fahrplan Linie VVT|Imst Linie 2|Imst, Rastbühel/Hochbehälter}}
+** {Fahrplan Linie VVT|4266|Imst, Rastbühel/Hochbehälter}}
+
+
+== Anreise mit dem Auto ==
+Über die Autobahn ''A12'' bis zur Ausfahrt Imst (bzw. über die Bundesstraße ''B171''), weiter auf der ''B189'' (Mieminger Straße) Richtung Norden fast an Imst vorbei bis zur Abzweigung zum ''Hahntennjoch'' (''L246''). Der Straße bis zu einer Rechtskurve mit Hochbehälter im Ortsteil Rastbühel folgen; dort zweigt die Rodelbahn genau in der Kurve ab (bei der Tafel der Muttekopfhütte).
+Der Parkplatz bietet Platz für ca. 40 Autos.
+
+* '''Parkplatz''': {Parkplatz|47.255415 N 10.738377 E|975}}
+* '''Entfernung''':
+** von '''Innsbruck''' (Hauptbahnhof): 61.9 km (über Autobahn '''A12''')
+** von '''Landeck''': 21.5 km (über '''B171''')
+
+
+{Rodelbahnzustand|Forumlink=170}}
+
+[[Kategorie:Rodelbahn]]
+</pre>
+
+{% endblock %}