+def wikipage_to_wrsleddingcache1_2(wiki_page):
+ """Converts a sledding route wiki page (wradmin.model.page_table)
+ to a sledding route wrsleddingcache database record (version 1.2) (wradmin.model.wrsleddingcache1_2_table)."""
+ sl = model.WrSleddingCache1_2()
+ sl.page_id = wiki_page.page_id
+ sl.page_title = to_title(wiki_page.page_title)
+
+ # Match Rodelbahnbox
+ wikitext = wiki_page.old_text
+ regexp = re.compile(u"\{\{(Rodelbahnbox[^\}]*)\}\}", re.DOTALL)
+ match = regexp.search(wikitext)
+ if not match:
+ raise Exception(u"No 'Rodelbahnbox' found")
+ box = match.group(1)
+
+ # Process Rodelbahnbox
+ for property in box.split('|'):
+ property = property.strip()
+ if property == u'Rodelbahnbox': continue
+ key_value = property.split('=')
+ if len(key_value) != 2:
+ raise Exception(u"Property '%s' has unexpected format" % key_value)
+ key = key_value[0].strip()
+ value = key_value[1].strip()
+ if key == u'Rodelbahnnummer': pass
+ elif key == u'Länge': sl.length = conv(to_unsigned, value, u'Länge')
+ elif key == u'Gehzeit': sl.walktime = conv(to_unsigned, value, u'Gehzeit')
+ elif key == u'Höhe oben': sl.height_top = conv(to_unsigned, value, u'Höhe oben')
+ elif key == u'Höhe unten': sl.height_bottom = conv(to_unsigned, value, u'Höhe unten')
+ elif key == u'Aufstieg getrennt': sl.walkup_separate = conv(to_bool, value, u'Aufstieg getrennt')
+ elif key == u'Lift': sl.lift = conv(to_bool, value, u'Lift')
+ elif key == u'Beleuchtung': sl.night_light = conv(to_bool, value, u'Beleuchtung')
+ elif key == u'Rodelverleih': sl.sledge_rental = conv(to_bool, value, u'Rodelverleih')
+ elif key == u'Öffentliche Anreise': sl.public_transport = conv(to_bool, value, u'Öffentliche Anreise')
+ elif key == u'Bild': sl.image = value
+ elif key == u'Position': (sl.position_latitude, sl.position_longitude) = conv(to_geo, value, u'Position') # '47.583333 N 15.75 E'
+ elif key == u'Auskunft': sl.information = conv(to_phone_info, value, u'Auskunft')
+ elif key == u'In Übersichtskarte': sl.show_in_overview = conv(to_bool, value, u'In Übersichtskarte')
+ elif key == u'Aufnahmedatum': sl.creation_date = conv(to_date, value, u'Aufnahmedatum') # '2006-03-15'
+ elif key == u'Lawinengefahr':
+ if not value in [u'kaum', u'selten', u'gelegentlich', u'häufig']: raise formencode.Invalid(u"No valid value for 'Lawinengefahr': '%s'" % value, value, None)
+ else: raise formencode.Invalid(u"Unbekannte Eigenschaft der Rodelbahnbox: '%s' (mit Wert '%s')" % (key, value), value, None)
+ sl.under_construction = None
+
+ # Match Forumlink (e.g. {{Forumlink|68}})
+ match = re.search(u"\{\{Forumlink\|(\d+)\}\}", wikitext)
+ if match: sl.forum_id = match.group(1)
+
+ return sl
+
+
+def wikipage_to_wrsleddingcache(wiki_page):
+ """Converts a sledding route wiki page (wradmin.model.page_table)
+ to a sledding route wrsleddingcache database record (wradmin.model.wrsleddingcache_table).
+ Raises a RuntimeError if the format is not OK
+ sledding_wiki is a column of tabe "page".
+ Returns the WrSleddingCache class"""
+ sl = model.WrSleddingCache()
+ sl.page_id = wiki_page.page_id
+ sl.page_title = to_title(wiki_page.page_title)
+ errors = [] # List of errors with localized messages
+
+ # Match Rodelbahnbox
+ wikitext = wiki_page.old_text
+ regexp = re.compile(u"\{\{(Rodelbahnbox[^\}]*)\}\}", re.DOTALL)
+ match = regexp.search(wikitext)
+ if not match:
+ raise RuntimeError(_(u"No 'Rodelbahnbox' found"))
+ box = match.group(1)
+
+ # Process Rodelbahnbox
+ for property in box.split('|'):
+ property = property.strip()
+ if property == u'Rodelbahnbox': continue
+ key_value = property.split('=')
+ if len(key_value) != 2:
+ raise RuntimeError(_(u"Property '%s' has unexpected format") % key_value)
+ key = key_value[0].strip()
+ value = key_value[1].strip()
+ if key in [u'Rodelbahnnummer', u'Lift']:
+ errors.append(_("Property '%s' is not supported anymore, see %s.") % (key, 'http://www.winterrodeln.org/wiki/Vorlage:Rodelbahnbox'))
+ elif key == u'Position': (sl.position_latitude, sl.position_longitude) = conv(to_geo, value, u'Position') # '47.583333 N 15.75 E'
+ elif key == u'Position oben': (sl.top_latitude, sl.top_longitude) = conv(to_geo, value, u'Position oben') # '47.583333 N 15.75 E'
+
+
+| Höhe oben = 1700
+| Position unten =
+| Höhe unten = 1200
+| Länge = 3500
+| Schwierigkeit = mittel
+| Lawinen = kaum
+| Betreiber = Max Mustermann
+| Öffentliche Anreise = Mittelmäßig
+| Gehzeit = 90
+| Aufstieg getrennt = Ja
+| Aufstiegshilfe = Gondel (unterer Teil)
+| Beleuchtungsanlage = Ja
+| Beleuchtungstage = 3 (Montag, Mittwoch, Freitag)
+| Rodelverleih = Ja (Talstation Serlesbahnan)
+| Gütesiegel = Tiroler Naturrodelbahn-Gütesiegel 2009 mittel
+| Webauskunft = http://www.nösslachhütte.at/page9.php
+| Telefonauskunft = +43-664-5487520 (Mitterer Alm)
+| Bild = Rodelbahn_Mitterer_Alm_04.jpg
+| In Übersichtskarte = Ja
+| Forumid = 33
+
+ sa.Column("top_elevation", types.Integer),
+ sa.Column("bottom_latitude", types.Float),
+ sa.Column("bottom_longitude", types.Float),
+ sa.Column("bottom_elevation", types.Integer),
+ sa.Column("length", types.Integer),
+ sa.Column("difficulty", types.Integer),
+ sa.Column("avalanches", types.Integer),
+ sa.Column("operator", types.Unicode(255)),
+ sa.Column("public_transport", types.Integer),
+ sa.Column("walkup_time", types.Integer),
+ sa.Column("walkup_separate", types.Float),
+ sa.Column("walkup_separate_comment", types.Unicode(255)),
+ sa.Column("lift", types.Boolean),
+ sa.Column("lift_details", types.Unicode(255)),
+ sa.Column("night_light", types.Float),
+ sa.Column("night_light_days", types.Integer),
+ sa.Column("night_light_days_comment", types.Unicode(255)),
+ sa.Column("sled_rental", types.Boolean),
+ sa.Column("cachet", types.Unicode(255)),
+ sa.Column("information_web", types.Unicode(255)),
+ sa.Column("information_phone", types.Unicode(255)),
+ sa.Column("image", types.Unicode(255)),
+ sa.Column("show_in_overview", types.Boolean),
+ sa.Column("forum_id", types.Integer),
+ sa.Column("under_construction", types.Boolean),
+ )
+
+
+
+
+
+
+
+ elif key == u'Bild': sl.image = value
+
+ elif key == u'Länge': sl.length = conv(to_unsigned, value, u'Länge')
+ elif key == u'Gehzeit': sl.walktime = conv(to_unsigned, value, u'Gehzeit')
+ elif key == u'Höhe oben': sl.height_top = conv(to_unsigned, value, u'Höhe oben')
+ elif key == u'Höhe unten': sl.height_bottom = conv(to_unsigned, value, u'Höhe unten')
+ elif key == u'Aufstieg getrennt':
+ tristate = conv(to_tristate, value, u'Aufstieg getrennt')
+ if tristate == (True, False): sl.walkup_separate = 1.0
+ elif tristate == (True, True): sl.walkup_separate = 0.5
+ elif tristate == (False, True): sl.walkup_separate = 0.0
+ elif key == u'Aufstiegshilfe':
+ valuecommentlist = conv(to_valuecommentlist, value, u'Aufstiegshilfe')
+ lift = len(valuecommentlist) > 0
+ for value, comment in valuecommentlist:
+ if value == u'Nein':
+ if len(valuecommentlist) != 1: raise formencode.Invalid('"Nein" kann mit keiner anderen Aufstiegshilfe kombiniert werden.', value, None)
+ lift = False
+ elif not value in [u'Sessellift', u'Gondel', u'Linienbus', u'Taxi', u'Sonstige']:
+ raise formencode.Invalid(u'"%s" ist keine gültige Aufstiegshilfe.' % value, value, None)
+ sl.lift = lift
+ sl.lift_detail = model.validators.ValueCommentList().from_python(valuecommentlist)
+ elif key == u'Beleuchtung': sl.night_light = conv(to_bool, value, u'Beleuchtung')
+ elif key == u'Rodelverleih': sl.sledge_rental = conv(to_bool, value, u'Rodelverleih')
+ elif key == u'Öffentliche Anreise': sl.public_transport = conv(to_bool, value, u'Öffentliche Anreise')
+ elif key == u'Auskunft': sl.information = conv(to_phone_info, value, u'Auskunft')
+ elif key == u'In Übersichtskarte': sl.show_in_overview = conv(to_bool, value, u'In Übersichtskarte')
+ elif key == u'Aufnahmedatum': sl.creation_date = conv(to_date, value, u'Aufnahmedatum') # '2006-03-15'
+ elif key == u'Lawinengefahr':
+ if not value in [u'kaum', u'selten', u'gelegentlich', u'häufig']: raise formencode.Invalid(u"No valid value for 'Lawinengefahr': '%s'" % value, value, None)
+ else: raise formencode.Invalid(u"Unbekannte Eigenschaft der Rodelbahnbox: '%s' (mit Wert '%s')" % (key, value), value, None)
+ sl.under_construction = None
+
+ # Match Forumlink (e.g. {{Forumlink|68}})
+ match = re.search(u"\{\{Forumlink\|(\d+)\}\}", wikitext)
+ if match: sl.forum_id = match.group(1)
+
+ return sl
+
+