-class RodelbahnboxDictValidator(OrderedSchema):
- """Takes the fields of the Rodelbahnbox as dict of strings and returns them as dict of appropriet types."""
- def __init__(self):
- self.add_field('Position', GeoNone()) # '47.583333 N 15.75 E'
- self.add_field('Position oben', GeoNone()) # '47.583333 N 15.75 E'
- self.add_field('Höhe oben', UnsignedNone()) # '2000'
- self.add_field('Position unten', GeoNone()) # '47.583333 N 15.75 E'
- self.add_field('Höhe unten', UnsignedNone()) # '1200'
- self.add_field('Länge', UnsignedNone()) # 3500
- self.add_field('Schwierigkeit', GermanDifficulty()) # 'mittel'
- self.add_field('Lawinen', GermanAvalanches()) # 'kaum'
- self.add_field('Betreiber', UnicodeNone()) # 'Max Mustermann'
- self.add_field('Öffentliche Anreise', GermanPublicTransport()) # 'Mittelmäßig'
- self.add_field('Aufstieg möglich', GermanBoolNone()) # 'Ja'
- self.add_field('Aufstieg getrennt', GermanTristateFloatComment()) # 'Ja'
- self.add_field('Gehzeit', UnsignedNone()) # 90
- self.add_field('Aufstiegshilfe', GermanLift()) # 'Gondel (unterer Teil)'
- self.add_field('Beleuchtungsanlage', GermanTristateFloatComment())
- self.add_field('Beleuchtungstage', UnsignedCommentNone(7)) # '3 (Montag, Mittwoch, Freitag)'
- self.add_field('Rodelverleih', SledRental()) # 'Talstation Serlesbahnan'
- self.add_field('Gütesiegel', GermanCachet()) # 'Tiroler Naturrodelbahn-Gütesiegel 2009 mittel'
- self.add_field('Webauskunft', UrlNeinNone()) # 'http://www.nösslachhütte.at/page9.php'
- self.add_field('Telefonauskunft', PhoneCommentListNeinLoopNone(comments_are_optional=False)) # '+43-664-5487520 (Mitterer Alm)'
- self.add_field('Bild', UnicodeNone())
- self.add_field('In Übersichtskarte', GermanBoolNone())
- self.add_field('Forumid', UnsignedNeinNone())
-
-
-class GasthausboxDictValidator(OrderedSchema):
- """Takes the fields of the Gasthausbox as dict of strings and returns them as dict of appropriet types."""
- def __init__(self):
- self.add_field('Position', GeoNone()) # '47.583333 N 15.75 E'
- self.add_field('Höhe', UnsignedNone())
- self.add_field('Betreiber', UnicodeNone())
- self.add_field('Sitzplätze', UnsignedNone())
- self.add_field('Übernachtung', BoolUnicodeTupleValidator())
- self.add_field('Rauchfrei', GermanTristateTuple())
- self.add_field('Rodelverleih', BoolUnicodeTupleValidator())
- self.add_field('Handyempfang', ValueCommentListNeinLoopNone())
- self.add_field('Homepage', UrlNeinNone())
- self.add_field('E-Mail', EmailCommentListNeinLoopNone(allow_masked_email=True))
- self.add_field('Telefon', PhoneCommentListNeinLoopNone(comments_are_optional=True))
- self.add_field('Bild', UnicodeNone())
- self.add_field('Rodelbahnen', WikiPageListLoopNone())
+
+lift_german_converter = FromToConverter(lift_german_from_str, lift_german_to_str)
+
+
+def sledrental_from_str(value):
+ """The value can be an empty string, 'Nein' or a semicolon-separated list of strings with optional comments.
+ '' => None
+ 'Nein' => []
+ 'Talstation (nur mit Ticket); Schneealm' => [('Talstation', 'nur mit Ticket'), ('Schneealm', None)]"""
+ return opt_no_german_from_str(value, lambda val: enum_from_str(val, lambda v: value_comment_from_str(v, req_str_from_str, opt_str_from_str, True)), False, [], None)
+
+
+def sledrental_to_str(value):
+ return opt_no_german_to_str(value, lambda val: enum_to_str(val, lambda v: value_comment_to_str(v, str_to_str, opt_str_to_str, True)), False, [], None)
+
+
+sledrental_converter = FromToConverter(sledrental_from_str, sledrental_to_str)
+
+
+class ValueErrorList(ValueError):
+ pass
+
+
+def box_from_template(template, name, converter_dict):
+ if template.name.strip() != name:
+ raise ValueError('Box name has to be "{}"'.format(name))
+ result = OrderedDict()
+ exceptions_dict = OrderedDict()
+ # check values
+ for key, converter in converter_dict.items():
+ try:
+ if not template.has(key):
+ raise ValueError('Missing parameter "{}"'.format(key))
+ result[key] = converter.from_str(str(template.get(key).value.strip()))
+ except ValueError as e:
+ exceptions_dict[key] = e
+ # check if keys are superfluous
+ superfluous_keys = {str(p.name.strip()) for p in template.params} - set(converter_dict.keys())
+ for key in superfluous_keys:
+ exceptions_dict[key] = ValueError('Superfluous parameter: "{}"'.format(key))
+ if len(exceptions_dict) > 0:
+ raise ValueErrorList('{} error(s) occurred when parsing template parameters.'.format(len(exceptions_dict)), exceptions_dict)
+ return result
+
+
+def box_to_template(value, name, converter_dict):
+ template = mwparserfromhell.nodes.template.Template(name)
+ for key, converter in converter_dict.items():
+ template.add(key, converter.to_str(value[key]))
+ return template
+
+
+def template_from_str(value, name):
+ wikicode = mwparserfromhell.parse(value)
+ template_list = wikicode.filter_templates(name)
+ if len(name) == 0:
+ raise ValueError('No "{}" template was found'.format(name))
+ if len(template_list) > 1:
+ raise ValueError('{} "{}" templates were found'.format(len(template_list), name))
+ return template_list[0]
+
+
+def box_from_str(value, name, converter_dict):
+ template = template_from_str(value, name)
+ return box_from_template(template, name, converter_dict)
+
+
+def box_to_str(value, name, converter_dict):
+ return str(box_to_template(value, name, converter_dict))
+
+
+RODELBAHNBOX_TEMPLATE_NAME = 'Rodelbahnbox'
+
+
+RODELBAHNBOX_DICT = OrderedDict([
+ ('Position', opt_lonlat_converter), # '47.583333 N 15.75 E'
+ ('Position oben', opt_lonlat_converter), # '47.583333 N 15.75 E'
+ ('Höhe oben', opt_meter_converter), # '2000'
+ ('Position unten', opt_lonlat_converter), # '47.583333 N 15.75 E'
+ ('Höhe unten', opt_meter_converter), # '1200'
+ ('Länge', opt_meter_converter), # 3500
+ ('Schwierigkeit', opt_difficulty_german_converter), # 'mittel'
+ ('Lawinen', opt_avalanches_german_converter), # 'kaum'
+ ('Betreiber', opt_str_converter), # 'Max Mustermann'
+ ('Öffentliche Anreise', opt_public_transport_german_converter), # 'Mittelmäßig'
+ ('Aufstieg möglich', opt_bool_german_converter), # 'Ja'
+ ('Aufstieg getrennt', opt_tristate_german_comment_converter), # 'Ja'
+ ('Gehzeit', opt_minutes_converter), # 90
+ ('Aufstiegshilfe', lift_german_converter), # 'Gondel (unterer Teil)'
+ ('Beleuchtungsanlage', opt_tristate_german_comment_converter),
+ ('Beleuchtungstage', nightlightdays_converter), # '3 (Montag, Mittwoch, Freitag)'
+ ('Rodelverleih', sledrental_converter), # 'Talstation Serlesbahnan'
+ ('Gütesiegel', cachet_german_converter), # 'Tiroler Naturrodelbahn-Gütesiegel 2009 mittel'
+ ('Webauskunft', webauskunft_converter), # 'http://www.nösslachhütte.at/page9.php'
+ ('Telefonauskunft', telefonauskunft_converter), # '+43-664-5487520 (Mitterer Alm)'
+ ('Bild', opt_str_converter),
+ ('In Übersichtskarte', opt_bool_german_converter),
+ ('Forumid', opt_int_converter)
+])
+
+
+def rodelbahnbox_from_template(template):
+ return box_from_template(template, RODELBAHNBOX_TEMPLATE_NAME, RODELBAHNBOX_DICT)
+
+
+def rodelbahnbox_to_template(value):
+ return box_to_template(value, RODELBAHNBOX_TEMPLATE_NAME, RODELBAHNBOX_DICT)
+
+
+def rodelbahnbox_from_str(value):
+ return box_from_str(value, RODELBAHNBOX_TEMPLATE_NAME, RODELBAHNBOX_DICT)
+
+
+def rodelbahnbox_to_str(value):
+ template = rodelbahnbox_to_template(value)
+ template_to_table(template, 20)
+ return str(template)
+
+
+GASTHAUSBOX_TEMPLATE_NAME = 'Gasthausbox'
+
+
+'''
+GASTHAUSBOX_DICT = OrderedDict([
+ ('Position', opt_lonlat_converter), # '47.583333 N 15.75 E'
+ ('Höhe', opt_meter_converter),
+ ('Betreiber', opt_str_converter),
+ ('Sitzplätze', opt_int_converter),
+ ('Übernachtung', BoolUnicodeTupleValidator()),
+ ('Rauchfrei', opt_tristate_german_validator),
+ ('Rodelverleih', BoolUnicodeTupleValidator()),
+ ('Handyempfang', ValueCommentListNeinLoopNone()),
+ ('Homepage', webauskunft_converter),
+ ('E-Mail', EmailCommentListNeinLoopNone(allow_masked_email=True)),
+ ('Telefon', PhoneCommentListNeinLoopNone(comments_are_optional=True)),
+ ('Bild', opt_str_converter),
+ ('Rodelbahnen', WikiPageListLoopNone())])
+'''