]> ToastFreeware Gitweb - philipp/winterrodeln/wradmin.git/commitdiff
Start creating render view of sledrun-JSON.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Mon, 26 Jul 2021 20:29:55 +0000 (22:29 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Mon, 26 Jul 2021 20:33:10 +0000 (22:33 +0200)
wradmin/__init__.py
wradmin/controllers/rodelbahn.py
wradmin/templates/rodelbahn_view_wikitext.html [new file with mode: 0644]

index 7284a176b40b9ce2a6b110484c9532c60e43b2f3..4dd0ebec06c0d4f47c30e0b4d19460403137dc94 100644 (file)
@@ -38,6 +38,11 @@ def rodelbahn_view(id):
     return RodelbahnController().view(id)
 
 
+@app.route("/rodelbahn/view_wikitext/<int:id>")
+def rodelbahn_view_wikitext(id):
+    return RodelbahnController().view_wikitext(id)
+
+
 @app.route("/rodelbahn/json/edit/<int:id>")
 @login_required
 @admin_permission.require(403)
index a4c2a6404a0e99ac98b3276921ee42e2ced594cb..b0a2e00bbe4c360fcd9cd3216e8f144dbe556c7c 100644 (file)
@@ -1,8 +1,12 @@
-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
@@ -10,6 +14,9 @@ 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, lonlat_none
 
 
 class RodelbahnController:
@@ -36,14 +43,123 @@ 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):
diff --git a/wradmin/templates/rodelbahn_view_wikitext.html b/wradmin/templates/rodelbahn_view_wikitext.html
new file mode 100644 (file)
index 0000000..b41a68d
--- /dev/null
@@ -0,0 +1,119 @@
+{% 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 %}