Updated function update_wrmapcache to work with <wrmap> instead of <googlemap>.
[philipp/winterrodeln/wrpylib.git] / wrpylib / wrmwcache.py
index f71566f9ef75a129099d511d1a17ae54e30767bc..ba384b517ec466c0c6018936f71fa29a183ec582 100644 (file)
@@ -1,9 +1,8 @@
-#!/usr/bin/python2.6
+#!/usr/bin/python2.7
 # -*- coding: iso-8859-15 -*-
 # $Id$
 # $HeadURL$
 """Contains functions that maintain/update the cache tables."""
-from xml.etree import ElementTree
 from sqlalchemy import schema
 from sqlalchemy.sql import select
 import formencode
@@ -19,7 +18,7 @@ def update_wrsledruncache(connection):
     is raised. No other exception type should be raised under normal circumstances.
     
     >>> from sqlalchemy.engine import create_engine
-    >>> engine = create_engine('mysql://philipp@localhost:3306/winterrodeln_wiki?charset=utf8&use_unicode=0')
+    >>> engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8&use_unicode=1')
     >>> update_wrsledruncache(engine.connect())
     """
     metadata = schema.MetaData()
@@ -61,7 +60,7 @@ def update_wrinncache(connection):
     is raised. No other exception type should be raised under normal circumstances.
     
     >>> from sqlalchemy.engine import create_engine
-    >>> engine = create_engine('mysql://philipp@localhost:3306/winterrodeln_wiki?charset=utf8&use_unicode=0')
+    >>> engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8&use_unicode=1')
     >>> update_wrinncache(engine.connect())
     """
     metadata = schema.MetaData()
@@ -103,7 +102,7 @@ def update_wrreportcache(connection, page_id=None):
         with the specified page_id. Use None for this parameter to update the whole table.
 
     >>> from sqlalchemy.engine import create_engine
-    >>> engine = create_engine('mysql://philipp@localhost:3306/winterrodeln_wiki?charset=utf8&use_unicode=1')
+    >>> engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8&use_unicode=1')
     >>> update_wrreportcache(engine.connect())
     """
     metadata = schema.MetaData()
@@ -111,33 +110,19 @@ def update_wrreportcache(connection, page_id=None):
     wrreportcache = wrmwdb.wrreportcache_table(metadata)
     transaction = connection.begin()
 
-    # Delte the datasets we are going to update
+    # Delete the datasets we are going to update
     sql_del = wrreportcache.delete()
     if not page_id is None: sql_del = sql_del.where(wrreportcache.c.page_id == page_id)
     connection.execute(sql_del)
 
     def insert_row(connection, rowlist):
         if len(rowlist) == 0: return
-        # Build XML
-        reports_xml = ElementTree.Element('reports')
-        for row in rowlist:
-            report_xml = ElementTree.SubElement(reports_xml, 'report')
-            report_xml.set('report_id', unicode(row.report_id))
-            report_xml.set('date_report', unicode(row.report_date_report))
-            report_xml.set('condition', unicode(row.report_condition))
-            report_xml.set('author_name', unicode(row.report_author_name))
-            report_xml.set('author_username', unicode(row.report_author_username))
-            report_xml.text = unicode(row.report_description)
-        reports_xml.set('page_id', unicode(row.page_id))
-        reports_xml.set('page_title', row.page_title)
-        reports_xml = unicode(ElementTree.tostring(reports_xml, 'utf8'), 'utf8') # there is not ElementTree.tounicode())
-        # Insert the report(s)
+        # Insert the report
         row = dict(rowlist[0])
-        row['reports_xml'] = reports_xml
         connection.execute(wrreportcache.insert(values=row))
 
     # Select the rows to update
-    sql = 'select page_id, page_title, wrreport.id as report_id, date_report as report_date_report, `condition` as report_condition, description as report_description, author_name as report_author_name, if(author_userid is null, null, author_username) as report_author_username from wrreport where {0}`condition` is not null and date_invalid > now() and delete_date is null order by page_id, date_report desc, date_entry desc'.format('' if page_id is None else 'page_id={0} and '.format(page_id))
+    sql = 'select page_id, page_title, wrreport.id as report_id, date_report, `condition`, description, author_name, if(author_userid is null, null, author_username) as author_username from wrreport where {0}`condition` is not null and date_invalid > now() and delete_date is null order by page_id, date_report desc, date_entry desc'.format('' if page_id is None else 'page_id={0} and '.format(page_id))
     cursor = connection.execute(sql)
     page_id = None
     rowlist = []
@@ -156,7 +141,8 @@ def update_wrmapcache(connection):
     is raised. No other exception type should be raised under normal circumstances.
     
     >>> from sqlalchemy.engine import create_engine
-    >>> engine = create_engine('mysql://philipp@localhost:3306/winterrodeln_wiki?charset=utf8&use_unicode=0')
+    >>> engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8&use_unicode=1')
+    >>> # or: engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8&use_unicode=1&passwd=XXXXX')
     >>> update_wrmapcache(engine.connect())
     """
     metadata = schema.MetaData()
@@ -181,17 +167,36 @@ def update_wrmapcache(connection):
     # Refill wrmappointcache and wrmappathcache tables
     for sledrun_page in sledrun_pages:
         try: 
-            result = mwmarkup.parse_googlemap(sledrun_page.old_text)
-            if not result is None:
-                center, zoom, coords, paths = result
-                for coord in coords:
-                    lon, lat, point_type, label = coord
-                    point_types = {u'Gasthaus': u'hut', u'Haltestelle': u'busstop', u'Parkplatz': u'carpark', u'Achtung': u'warning'}
-                    if not point_type is None:
-                        if not point_types.has_key(point_type): raise RuntimeError('Unknown point type {0}'.format(point_type))
-                        point_type = point_types[point_type]
-                        sql = 'insert into wrmappointcache (page_id, type, point, label) values (%s, %s, POINT(%s, %s), %s)'
-                        connection.execute(sql, (sledrun_page.page_id, point_type, lon, lat, None))
+            start, content, endtag, end = mwmarkup.find_tag(sledrun_page.old_text, 'wrmap')
+            if content is None:
+                continue
+            geojson = wrmwmarkup.parse_wrmap(sledrun_page.old_text[start:end])
+
+            for feature in geojson['features']:
+                properties = feature['properties']
+                coordinates = feature['geometry']['coordinates']
+
+                # Points
+                if properties['type'] in wrmwmarkup.WRMAP_POINT_TYPES:
+                    lon, lat = coordinates
+                    label = properties.get('name')
+                    point_types = {u'gasthaus': u'hut', u'haltestelle': u'busstop', u'parkplatz': u'carpark', u'achtung': u'warning', u'punkt': u'point'}
+                    point_type = point_types[properties['type']]
+                    sql = u'insert into wrmappointcache (page_id, type, point, label) values (%s, %s, POINT(%s, %s), %s)'
+                    connection.execute(sql, (sledrun_page.page_id, point_type, lon, lat, label))
+
+                # Paths
+                elif properties['type'] in wrmwmarkup.WRMAP_LINE_TYPES:
+                    path_types = {u'rodelbahn': u'sledrun', u'gehweg': u'walkup', u'alternative': u'alternative', u'lift': u'lift', u'anfahrt': u'recommendedcarroute', u'linie': u'line'}
+                    path_type = path_types[properties['type']]
+                    path = u", ".join(["{0} {1}".format(lon, lat) for lon, lat in coordinates])
+                    path = u'LineString({0})'.format(path)
+                    if path_type == u'recommendedcarroute': continue
+                    sql = u'insert into wrmappathcache (path, page_id, type) values (GeomFromText(%s), %s, %s)'
+                    connection.execute(sql, (path, sledrun_page.page_id, path_type))
+
+                else:
+                    raise RuntimeError(u'Unknown feature type {0}'.format(properties['type']))
         except RuntimeError as e:
             error_msg = u"Error at sledrun '{0}': {1}".format(sledrun_page.page_title, unicode(e))
             transaction.rollback()