Used set literal instead of converting a list to a set.
[philipp/winterrodeln/wrpylib.git] / wrpylib / wrmwmarkup.py
index f17f255bfd872972d36377b78570b2f42aff22b6..f626f2b42476d0128351d2b1643f19fcd43c45e9 100644 (file)
@@ -1,8 +1,8 @@
-#!/usr/bin/python2.7
+#!/usr/bin/python3.4
 # -*- coding: iso-8859-15 -*-
 # $Id$
 # $HeadURL$
-"""This module contains winterrodeln specific functions that are prcocessing the MediaWiki markup.
+"""This module contains winterrodeln specific functions that are processing the MediaWiki markup.
 """
 import re
 import xml.etree.ElementTree
@@ -20,13 +20,6 @@ class ParseError(RuntimeError):
     pass
 
 
-def _conv(fnct, value, fieldname):
-    """Internal function.
-    Like one of the to_xxx functions (e.g. to_bool), but adds the field name to the error message"""
-    try: return fnct(value)
-    except formencode.Invalid as e: raise formencode.Invalid(u"Conversion error in field '%s': %s" % (fieldname, unicode(e)), e.value, e.state)
-
-
 class RodelbahnboxDictConverter(formencode.Validator):
     """Converts a dict with Rodelbahnbox properties to a Sledrun class. Does no validation."""
 
@@ -39,59 +32,59 @@ class RodelbahnboxDictConverter(formencode.Validator):
             class Sledrun(object):
                 pass
             sledrun = Sledrun()
-        for k, v in props.iteritems():
-            if   k == u'Position': sledrun.position_latitude, sledrun.position_longitude = v
-            elif k == u'Position oben': sledrun.top_latitude, sledrun.top_longitude = v
-            elif k == u'Höhe oben': sledrun.top_elevation = v
-            elif k == u'Position unten': sledrun.bottom_latitude, sledrun.bottom_longitude = v
-            elif k == u'Höhe unten': sledrun.bottom_elevation = v
-            elif k == u'Länge': sledrun.length = v
-            elif k == u'Schwierigkeit': sledrun.difficulty = v
-            elif k == u'Lawinen': sledrun.avalanches = v
-            elif k == u'Betreiber': sledrun.operator = v
-            elif k == u'Öffentliche Anreise': sledrun.public_transport = v
-            elif k == u'Aufstieg möglich': sledrun.walkup_possible = v
-            elif k == u'Aufstieg getrennt': sledrun.walkup_separate, sledrun.walkup_separate_comment = v
-            elif k == u'Gehzeit': sledrun.walkup_time = v
-            elif k == u'Aufstiegshilfe': sledrun.lift, sledrun.lift_details = v
-            elif k == u'Beleuchtungsanlage': sledrun.night_light, sledrun.night_light_comment = v
-            elif k == u'Beleuchtungstage': sledrun.night_light_days, sledrun.night_light_days_comment = v
-            elif k == u'Rodelverleih': sledrun.sled_rental, sledrun.sled_rental_comment = v
-            elif k == u'Gütesiegel': sledrun.cachet = v
-            elif k == u'Webauskunft': sledrun.information_web = v
-            elif k == u'Telefonauskunft': sledrun.information_phone = v
-            elif k == u'Bild': sledrun.image = v
-            elif k == u'In Übersichtskarte': sledrun.show_in_overview = v
-            elif k == u'Forumid': sledrun.forum_id = v
+        for k, v in props.items():
+            if   k == 'Position': sledrun.position_latitude, sledrun.position_longitude = v
+            elif k == 'Position oben': sledrun.top_latitude, sledrun.top_longitude = v
+            elif k == 'Höhe oben': sledrun.top_elevation = v
+            elif k == 'Position unten': sledrun.bottom_latitude, sledrun.bottom_longitude = v
+            elif k == 'Höhe unten': sledrun.bottom_elevation = v
+            elif k == 'Länge': sledrun.length = v
+            elif k == 'Schwierigkeit': sledrun.difficulty = v
+            elif k == 'Lawinen': sledrun.avalanches = v
+            elif k == 'Betreiber': sledrun.operator = v
+            elif k == 'Öffentliche Anreise': sledrun.public_transport = v
+            elif k == 'Aufstieg möglich': sledrun.walkup_possible = v
+            elif k == 'Aufstieg getrennt': sledrun.walkup_separate, sledrun.walkup_separate_comment = v
+            elif k == 'Gehzeit': sledrun.walkup_time = v
+            elif k == 'Aufstiegshilfe': sledrun.lift, sledrun.lift_details = v
+            elif k == 'Beleuchtungsanlage': sledrun.night_light, sledrun.night_light_comment = v
+            elif k == 'Beleuchtungstage': sledrun.night_light_days, sledrun.night_light_days_comment = v
+            elif k == 'Rodelverleih': sledrun.sled_rental, sledrun.sled_rental_comment = v
+            elif k == 'Gütesiegel': sledrun.cachet = v
+            elif k == 'Webauskunft': sledrun.information_web = v
+            elif k == 'Telefonauskunft': sledrun.information_phone = v
+            elif k == 'Bild': sledrun.image = v
+            elif k == 'In Übersichtskarte': sledrun.show_in_overview = v
+            elif k == 'Forumid': sledrun.forum_id = v
         return sledrun
 
     def from_python(self, value, state=None):
         """Converts a sledrun class to a dict of Rodelbahnbox properties. value is a sledrun instance."""
         sledrun = value
         r = collections.OrderedDict()
-        r[u'Position'] = (sledrun.position_latitude, sledrun.position_longitude)
-        r[u'Position oben'] = (sledrun.top_latitude, sledrun.top_longitude)
-        r[u'Höhe oben'] = sledrun.top_elevation
-        r[u'Position unten'] = (sledrun.bottom_latitude, sledrun.bottom_longitude)
-        r[u'Höhe unten'] = sledrun.bottom_elevation
-        r[u'Länge'] = sledrun.length
-        r[u'Schwierigkeit'] = sledrun.difficulty
-        r[u'Lawinen'] = sledrun.avalanches
-        r[u'Betreiber'] = sledrun.operator
-        r[u'Öffentliche Anreise'] = sledrun.public_transport
-        r[u'Aufstieg möglich'] = sledrun.walkup_possible
-        r[u'Aufstieg getrennt'] = (sledrun.walkup_separate, sledrun.walkup_separate_comment)
-        r[u'Gehzeit'] = sledrun.walkup_time
-        r[u'Aufstiegshilfe'] = (sledrun.lift, sledrun.lift_details)
-        r[u'Beleuchtungsanlage'] = (sledrun.night_light, sledrun.night_light_comment)
-        r[u'Beleuchtungstage'] = (sledrun.night_light_days, sledrun.night_light_days_comment)
-        r[u'Rodelverleih'] = (sledrun.sled_rental, sledrun.sled_rental_comment)
-        r[u'Gütesiegel'] = sledrun.cachet
-        r[u'Webauskunft'] = sledrun.information_web
-        r[u'Telefonauskunft'] = sledrun.information_phone
-        r[u'Bild'] = sledrun.image
-        r[u'In Übersichtskarte'] = sledrun.show_in_overview
-        r[u'Forumid'] = sledrun.forum_id
+        r['Position'] = (sledrun.position_latitude, sledrun.position_longitude)
+        r['Position oben'] = (sledrun.top_latitude, sledrun.top_longitude)
+        r['Höhe oben'] = sledrun.top_elevation
+        r['Position unten'] = (sledrun.bottom_latitude, sledrun.bottom_longitude)
+        r['Höhe unten'] = sledrun.bottom_elevation
+        r['Länge'] = sledrun.length
+        r['Schwierigkeit'] = sledrun.difficulty
+        r['Lawinen'] = sledrun.avalanches
+        r['Betreiber'] = sledrun.operator
+        r['Öffentliche Anreise'] = sledrun.public_transport
+        r['Aufstieg möglich'] = sledrun.walkup_possible
+        r['Aufstieg getrennt'] = (sledrun.walkup_separate, sledrun.walkup_separate_comment)
+        r['Gehzeit'] = sledrun.walkup_time
+        r['Aufstiegshilfe'] = (sledrun.lift, sledrun.lift_details)
+        r['Beleuchtungsanlage'] = (sledrun.night_light, sledrun.night_light_comment)
+        r['Beleuchtungstage'] = (sledrun.night_light_days, sledrun.night_light_days_comment)
+        r['Rodelverleih'] = (sledrun.sled_rental, sledrun.sled_rental_comment)
+        r['Gütesiegel'] = sledrun.cachet
+        r['Webauskunft'] = sledrun.information_web
+        r['Telefonauskunft'] = sledrun.information_phone
+        r['Bild'] = sledrun.image
+        r['In Übersichtskarte'] = sledrun.show_in_overview
+        r['Forumid'] = sledrun.forum_id
         return r
 
 
@@ -103,9 +96,9 @@ class WinterrodelnTemplateDict(formencode.Validator):
     def to_python(self, value, state):
         title, anonym_params, named_params = value
         if title != self.template_title:
-            raise Invalud(u'Template title has to be "{}".'.format(self.template_title), value, state)
+            raise formencode.Invalid('Template title has to be "{}".'.format(self.template_title), value, state)
         if len(anonym_params) > 0:
-            raise Invalid(u'No anonymous parameters are allowed in "{}".'.format(self.template_title), value, state)
+            raise formencode.Invalid('No anonymous parameters are allowed in "{}".'.format(self.template_title), value, state)
         return named_params
 
     def from_python(self, value, state):
@@ -115,7 +108,7 @@ class WinterrodelnTemplateDict(formencode.Validator):
 class RodelbahnboxValidator(wrpylib.wrvalidators.RodelbahnboxDictValidator):
     def __init__(self):
         wrpylib.wrvalidators.RodelbahnboxDictValidator.__init__(self)
-        self.pre_validators=[wrpylib.mwmarkup.TemplateValidator(as_table=True, as_table_keylen=20), WinterrodelnTemplateDict(u'Rodelbahnbox')]
+        self.pre_validators=[wrpylib.mwmarkup.TemplateValidator(as_table=True, as_table_keylen=20), WinterrodelnTemplateDict('Rodelbahnbox')]
         self.chained_validators = [RodelbahnboxDictConverter()]
 
 
@@ -125,8 +118,8 @@ def rodelbahnbox_to_sledrun(wikitext, sledrun=None):
     Raises a formencode.Invalid exception if the format is not OK or the Rodelbahnbox is not found.
     :return: (start, end, sledrun) tuple of the Rodelbahnbox."""
     # find Rodelbahnbox
-    start, end = wrpylib.mwmarkup.find_template(wikitext, u'Rodelbahnbox')
-    if start is None: raise formencode.Invalid(u"Rodelbahnbox nicht gefunden", wikitext, None)
+    start, end = wrpylib.mwmarkup.find_template(wikitext, 'Rodelbahnbox')
+    if start is None: raise formencode.Invalid("Rodelbahnbox nicht gefunden", wikitext, None)
 
     # convert to sledrun
     if sledrun is None:
@@ -157,51 +150,51 @@ class GasthausboxDictConverter(formencode.Validator):
         """value is a dict of properties. If state is an object with the attribute inn, this inn class will be populated or updated."""
         props = value
         if isinstance(state, object) and hasattr(state, 'inn'):
-            sledrun = state.sledrun
+            inn = state.inn
         else:
             class Inn(object):
                 pass
             inn = Inn()
-        for k, v in props.iteritems():
-            if   k == u'Position': inn.position_latitude, inn.position_longitude = v
-            elif k == u'Höhe': inn.position_elevation = v
-            elif k == u'Betreiber': inn.operator = v
-            elif k == u'Sitzplätze': inn.seats = v
-            elif k == u'Übernachtung': inn.overnight, inn.overnight_comment = v
-            elif k == u'Rauchfrei': inn.nonsmoker_area, inn.smoker_area = v
-            elif k == u'Rodelverleih': inn.sled_rental, inn.sled_rental_comment = v
-            elif k == u'Handyempfang': inn.mobile_provider = v
-            elif k == u'Homepage': inn.homepage = v
-            elif k == u'E-Mail': inn.email_list = v
-            elif k == u'Telefon': inn.phone_list = v
-            elif k == u'Bild': inn.image = v
-            elif k == u'Rodelbahnen': inn.sledding_list = v
+        for k, v in props.items():
+            if   k == 'Position': inn.position_latitude, inn.position_longitude = v
+            elif k == 'Höhe': inn.position_elevation = v
+            elif k == 'Betreiber': inn.operator = v
+            elif k == 'Sitzplätze': inn.seats = v
+            elif k == 'Übernachtung': inn.overnight, inn.overnight_comment = v
+            elif k == 'Rauchfrei': inn.nonsmoker_area, inn.smoker_area = v
+            elif k == 'Rodelverleih': inn.sled_rental, inn.sled_rental_comment = v
+            elif k == 'Handyempfang': inn.mobile_provider = v
+            elif k == 'Homepage': inn.homepage = v
+            elif k == 'E-Mail': inn.email_list = v
+            elif k == 'Telefon': inn.phone_list = v
+            elif k == 'Bild': inn.image = v
+            elif k == 'Rodelbahnen': inn.sledding_list = v
         return inn
 
     def from_python(self, value, state=None):
         """Converts an inn class to a dict of Gasthausbox properties. value is an Inn instance."""
         inn = value
         r = collections.OrderedDict()
-        r[u'Position'] = (inn.position_latitude, inn.position_longitude)
-        r[u'Höhe'] = inn.position_elevation
-        r[u'Betreiber'] = inn.operator
-        r[u'Sitzplätze'] = inn.seats
-        r[u'Übernachtung'] = (inn.overnight, inn.overnight_comment)
-        r[u'Rauchfrei'] = (inn.nonsmoker_area, inn.smoker_area)
-        r[u'Rodelverleih'] = (inn.sled_rental, inn.sled_rental_comment)
-        r[u'Handyempfang'] = inn.mobile_provider
-        r[u'Homepage'] = inn.homepage
-        r[u'E-Mail'] = inn.email_list
-        r[u'Telefon'] = inn.phone_list
-        r[u'Bild'] = inn.image
-        r[u'Rodelbahnen'] = inn.sledding_list
+        r['Position'] = (inn.position_latitude, inn.position_longitude)
+        r['Höhe'] = inn.position_elevation
+        r['Betreiber'] = inn.operator
+        r['Sitzplätze'] = inn.seats
+        r['Übernachtung'] = (inn.overnight, inn.overnight_comment)
+        r['Rauchfrei'] = (inn.nonsmoker_area, inn.smoker_area)
+        r['Rodelverleih'] = (inn.sled_rental, inn.sled_rental_comment)
+        r['Handyempfang'] = inn.mobile_provider
+        r['Homepage'] = inn.homepage
+        r['E-Mail'] = inn.email_list
+        r['Telefon'] = inn.phone_list
+        r['Bild'] = inn.image
+        r['Rodelbahnen'] = inn.sledding_list
         return r
 
 
 class GasthausboxValidator(wrpylib.wrvalidators.GasthausboxDictValidator):
     def __init__(self):
         wrpylib.wrvalidators.GasthausboxDictValidator.__init__(self)
-        self.pre_validators=[wrpylib.mwmarkup.TemplateValidator(as_table=True, as_table_keylen=17), WinterrodelnTemplateDict(u'Gasthausbox')]
+        self.pre_validators=[wrpylib.mwmarkup.TemplateValidator(as_table=True, as_table_keylen=17), WinterrodelnTemplateDict('Gasthausbox')]
         self.chained_validators = [GasthausboxDictConverter()]
 
 
@@ -211,8 +204,8 @@ def gasthausbox_to_inn(wikitext, inn=None):
     raises a formencode.Invalid exception if the format is not OK or the Gasthausbox is not found.
     :return: (start, end, inn) tuple."""
     # find Gasthausbox
-    start, end = wrpylib.mwmarkup.find_template(wikitext, u'Gasthausbox')
-    if start is None: raise formencode.Invalid(u"No 'Gasthausbox' found", wikitext, None)
+    start, end = wrpylib.mwmarkup.find_template(wikitext, 'Gasthausbox')
+    if start is None: raise formencode.Invalid("No 'Gasthausbox' found", wikitext, None)
 
     # convert to inn
     if inn is None:
@@ -237,31 +230,31 @@ def find_template_latlon_ele(wikitext, template_title):
     start, end = wrpylib.mwmarkup.find_template(wikitext, template_title)
     if start is None: return (None,) * 5
     title, params = wrpylib.mwmarkup.split_template(wikitext[start:end])
-    lat, lon = wrpylib.wrvalidators.GeoNone().to_python(params[u'1'].strip())
-    ele = wrpylib.wrvalidators.UnsignedNone().to_python(params[u'2'].strip())
+    lat, lon = wrpylib.wrvalidators.GeoNone().to_python(params['1'].strip())
+    ele = wrpylib.wrvalidators.UnsignedNone().to_python(params['2'].strip())
     return start, end, lat, lon, ele
 
 
 def create_template_latlon_ele(template_title, lat, lon, ele):
     geo = wrpylib.wrvalidators.GeoNone().from_python((lat, lon))
-    if len(geo) == 0: geo = u' '
+    if len(geo) == 0: geo = ' '
     ele = wrpylib.wrvalidators.UnsignedNone().from_python(ele)
-    if len(ele) == 0: ele = u' '
+    if len(ele) == 0: ele = ' '
     return wrpylib.mwmarkup.create_template(template_title, [geo, ele])
 
 
 def find_template_PositionOben(wikitext):
     """Same as find_template_latlon_ele with template '{{Position oben|47.076207 N 11.453553 E|1890}}'"""
-    return find_template_latlon_ele(wikitext, u'Position oben')
+    return find_template_latlon_ele(wikitext, 'Position oben')
 
 
 def create_template_PositionOben(lat, lon, ele):
-    return create_template_latlon_ele(u'Position, oben', lat, lon, ele)
+    return create_template_latlon_ele('Position, oben', lat, lon, ele)
 
 
 def find_template_PositionUnten(wikitext):
     """Same as find_template_latlon_ele with template '{{Position unten|47.076207 N 11.453553 E|1890}}'"""
-    return find_template_latlon_ele(wikitext, u'Position unten')
+    return find_template_latlon_ele(wikitext, 'Position unten')
 
 
 def find_template_unsigned(wikitext, template_title):
@@ -271,50 +264,50 @@ def find_template_unsigned(wikitext, template_title):
     start, end = wrpylib.mwmarkup.find_template(wikitext, template_title)
     if start is None: return (None,) * 3
     title, params = wrpylib.mwmarkup.split_template(wikitext[start:end])
-    unsigned_value = wrpylib.wrvalidators.UnsignedNone().to_python(params[u'1'].strip())
+    unsigned_value = wrpylib.wrvalidators.UnsignedNone().to_python(params['1'].strip())
     return start, end, unsigned_value
 
 
 def create_template_unsigned(template_title, unsigned):
     unsigned = wrpylib.wrvalidators.UnsignedNone().from_python(unsigned)
-    if len(unsigned) == 0: unsigned = u' '
+    if len(unsigned) == 0: unsigned = ' '
     return wrpylib.mwmarkup.create_template(template_title, [unsigned])
 
 
 def find_template_Hoehenunterschied(wikitext):
     """Same as find_template_unsigned with template '{{Höhenunterschied|350}}'"""
-    return find_template_unsigned(wikitext, u'Höhenunterschied')
+    return find_template_unsigned(wikitext, 'Höhenunterschied')
 
 
 def create_template_Hoehenunterschied(ele_diff):
-    return create_template_unsigned(u'Höhenunterschied', ele_diff)
+    return create_template_unsigned('Höhenunterschied', ele_diff)
 
 
 def find_template_Bahnlaenge(wikitext):
     """Same as find_template_unsigned with template '{{Bahnlänge|4500}}'"""
-    return find_template_unsigned(wikitext, u'Bahnlänge')
+    return find_template_unsigned(wikitext, 'Bahnlänge')
 
 
 def create_template_Bahnlaenge(length):
-    return create_template_unsigned(u'Bahnlänge', length)
+    return create_template_unsigned('Bahnlänge', length)
 
 
 def find_template_Gehzeit(wikitext):
     """Same as find_template_unsigned with template '{{Gehzeit|60}}'"""
-    return find_template_unsigned(wikitext, u'Gehzeit')
+    return find_template_unsigned(wikitext, 'Gehzeit')
 
 
 def create_template_Gehzeit(walkup_time):
-    return create_template_unsigned(u'Gehzeit', walkup_time)
+    return create_template_unsigned('Gehzeit', walkup_time)
 
 
 def find_template_Forumlink(wikitext):
     """Same as find_template_unsigned with template '{{Forumlink|26}}'"""
-    start, end = wrpylib.mwmarkup.find_template(wikitext, u'Forumlink')
+    start, end = wrpylib.mwmarkup.find_template(wikitext, 'Forumlink')
     if start is None: return (None,) * 3
     title, params = wrpylib.mwmarkup.split_template(wikitext[start:end])
-    forumid = params[u'1'].strip()
-    if forumid == u'<nummer einfügen>': unsigned_value = None
+    forumid = params['1'].strip()
+    if forumid == '<nummer einfügen>': unsigned_value = None
     else: unsigned_value = wrpylib.wrvalidators.UnsignedNone().to_python(forumid)
     return start, end, unsigned_value
     # return find_template_unsigned(wikitext, u'Forumlink')
@@ -322,27 +315,27 @@ def find_template_Forumlink(wikitext):
 
 def find_template_Parkplatz(wikitext):
     """Same as find_template_latlon_ele with template '{{Parkplatz|47.076207 N 11.453553 E|1890}}'"""
-    return find_template_latlon_ele(wikitext, u'Parkplatz')
+    return find_template_latlon_ele(wikitext, 'Parkplatz')
 
 
 def find_template_Haltestelle(wikitext):
     """Finds the first occurance of the '{{Haltestelle|Ortsname|Haltestellenname|47.076207 N 11.453553 E|1890}}' template
     and returns the tuple (start, end, city, stop, lat, lon, ele) or (None, None, None, None, None, None, None) if the
     template was not found. If the template has no valid format, an exception is thrown."""
-    start, end = wrpylib.mwmarkup.find_template(wikitext, u'Haltestelle')
+    start, end = wrpylib.mwmarkup.find_template(wikitext, 'Haltestelle')
     if start is None: return (None,) * 7
     title, params = wrpylib.mwmarkup.split_template(wikitext[start:end])
-    city = wrpylib.wrvalidators.UnicodeNone().to_python(params[u'1'].strip())
-    stop = wrpylib.wrvalidators.UnicodeNone().to_python(params[u'2'].strip())
-    lat, lon = wrpylib.wrvalidators.GeoNone().to_python(params[u'3'].strip())
-    ele = wrpylib.wrvalidators.UnsignedNone().to_python(params[u'4'].strip())
+    city = wrpylib.wrvalidators.UnicodeNone().to_python(params['1'].strip())
+    stop = wrpylib.wrvalidators.UnicodeNone().to_python(params['2'].strip())
+    lat, lon = wrpylib.wrvalidators.GeoNone().to_python(params['3'].strip())
+    ele = wrpylib.wrvalidators.UnsignedNone().to_python(params['4'].strip())
     return start, end, city, stop, lat, lon, ele
 
 
 def find_all_templates(wikitext, find_func):
     """Returns a list of return values of find_func that searches for a template.
     Example:
-    >>> find_all_tempaltes(wikitext, find_template_Haltestelle)
+    >>> find_all_templates(wikitext, find_template_Haltestelle)
     Returns an empty list if the template was not found at all.
     """
     results = []
@@ -380,8 +373,8 @@ def googlemap_to_wrmap(attributes, coords, paths):
     for path in paths:
         style, entries = path
         style = style.lower()
-        PATH_TYPES = {u'6#ff014e9a': u'rodelbahn', u'6#ffe98401': u'gehweg', u'6#ff7f7fff': u'alternative', u'3#ff000000': u'lift', u'3#ffe1e100': u'anfahrt'}
-        if PATH_TYPES.has_key(style):
+        PATH_TYPES = {'6#ff014e9a': 'rodelbahn', '6#ffe98401': 'gehweg', '6#ff7f7fff': 'alternative', '3#ff000000': 'lift', '3#ffe1e100': 'anfahrt'}
+        if style in PATH_TYPES:
             properties = {'type': PATH_TYPES[style]}
         else:
             properties = {'type': 'line'}
@@ -464,7 +457,7 @@ def parse_wrmap(wikitext):
         # point
         if is_point:
             properties = {'type': feature.tag}
-            allowed_properties = set(['name', 'wiki'])
+            allowed_properties = {'name', 'wiki'}
             wrong_properties = set(feature.attrib.keys()) - allowed_properties
             if len(wrong_properties) > 0:
                 raise ParseError("The attribute '{}' is not allowed at <{}>.".format(list(wrong_properties)[0], feature.tag))
@@ -480,15 +473,15 @@ def parse_wrmap(wikitext):
         # line
         if is_line:
             properties = {'type': feature.tag}
-            allowed_properties = set(['farbe', 'dicke'])
+            allowed_properties = {'farbe', 'dicke'}
             wrong_properties = set(feature.attrib.keys()) - allowed_properties
             if len(wrong_properties) > 0:
                 raise ParseError("The attribute '{}' is not allowed at <{}>.".format(list(wrong_properties)[0], feature.tag))
-            if feature.attrib.has_key('farbe')
+            if 'farbe' in feature.attrib
                 if not re.match('#[0-9a-fA-F]{6}$', feature.attrib['farbe']):
                     raise ParseError('The attribute "farbe" has to have a format like "#a0bb43".')
                 properties['strokeColor'] = feature.attrib['farbe'] # e.g. #a200b7
-            if feature.attrib.has_key('dicke'):
+            if 'dicke' in feature.attrib:
                 try:
                     properties['strokeWidth'] = int(feature.attrib['dicke']) # e.g. 6
                 except ValueError:
@@ -500,7 +493,7 @@ def parse_wrmap(wikitext):
 
     # attributes
     properties = {}
-    for k, v in wrmap_xml.attrib.iteritems():
+    for k, v in wrmap_xml.attrib.items():
         if k in ['lat', 'lon']:
             try:
                 properties[k] = float(v)
@@ -533,7 +526,7 @@ def create_wrmap(geojson):
     """Creates a <wrmap> wikitext from geojson (as python types)."""
     wrmap_xml = xml.etree.ElementTree.Element('wrmap')
     wrmap_xml.text = '\n\n'
-    for k, v in geojson['properties'].iteritems():
+    for k, v in geojson['properties'].items():
         if k in ['lon', 'lat']:
             wrmap_xml.attrib[k] = '{:.6f}'.format(v)
         else: