Draft helper script for intermap tables.
[philipp/winterrodeln/wrpylib.git] / wrpylib / wrmwcache.py
index 1540dc8fe58181311832d0c3793608de3401df7d..95e0e96805f3d0ba8a5af4ff1e97c23890b372c1 100644 (file)
@@ -6,7 +6,7 @@ from sqlalchemy import schema
 from sqlalchemy.sql import select
 from sqlalchemy.sql.expression import func as sqlfunc
 from osgeo import ogr
 from sqlalchemy.sql import select
 from sqlalchemy.sql.expression import func as sqlfunc
 from osgeo import ogr
-from wrpylib import mwdb, wrmwdb, mwmarkup, wrmwmarkup, wrvalidators
+from wrpylib import mwdb, wrmwdb, wrmwmarkup, wrvalidators
 
 
 class UpdateCacheError(RuntimeError):
 
 
 class UpdateCacheError(RuntimeError):
@@ -50,7 +50,7 @@ def update_wrsledruncache(connection):
             sledrun.page_id = sledrun_page.page_id
             sledrun.page_title = sledrun_page.page_title
             sledrun.name_url = wrvalidators.sledrun_page_title_to_pretty_url(sledrun_page.page_title)
             sledrun.page_id = sledrun_page.page_id
             sledrun.page_title = sledrun_page.page_title
             sledrun.name_url = wrvalidators.sledrun_page_title_to_pretty_url(sledrun_page.page_title)
-            sledrun.under_construction = connection.execute(select([categorylinks], (categorylinks.c.cl_from==sledrun_page.page_id) & (categorylinks.c.cl_to == 'In_Arbeit')).alias('x').count()).fetchone()[0] > 0
+            sledrun.under_construction = connection.execute(select([sqlfunc.count()], (categorylinks.c.cl_from==sledrun_page.page_id) & (categorylinks.c.cl_to == 'In_Arbeit')).alias('x')).fetchone()[0] > 0
             connection.execute(wrsledruncache.insert(sledrun.__dict__))
         except ValueError as e:
             transaction.rollback()
             connection.execute(wrsledruncache.insert(sledrun.__dict__))
         except ValueError as e:
             transaction.rollback()
@@ -93,7 +93,7 @@ def update_wrinncache(connection):
             inn = wrmwmarkup.inn_from_gasthausbox(gasthausbox, Inn())
             inn.page_id = inn_page.page_id
             inn.page_title = inn_page.page_title
             inn = wrmwmarkup.inn_from_gasthausbox(gasthausbox, Inn())
             inn.page_id = inn_page.page_id
             inn.page_title = inn_page.page_title
-            inn.under_construction = connection.execute(select([categorylinks], (categorylinks.c.cl_from==inn_page.page_id) & (categorylinks.c.cl_to == 'In_Arbeit')).alias('x').count()).fetchone()[0] > 0 # It would be better to do this in the query above
+            inn.under_construction = connection.execute(select([sqlfunc.count()], (categorylinks.c.cl_from==inn_page.page_id) & (categorylinks.c.cl_to == 'In_Arbeit')).alias('x')).fetchone()[0] > 0 # It would be better to do this in the query above
             connection.execute(wrinncache.insert(inn.__dict__))
         except ValueError as e:
             transaction.rollback()
             connection.execute(wrinncache.insert(inn.__dict__))
         except ValueError as e:
             transaction.rollback()
@@ -172,11 +172,16 @@ def update_wrmapcache(connection):
     
     # Refill wrmappointcache and wrmappathcache tables
     for sledrun_page in sledrun_pages:
     
     # Refill wrmappointcache and wrmappathcache tables
     for sledrun_page in sledrun_pages:
-        try: 
-            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])
+        try:
+            import mwparserfromhell
+            wikicode = mwparserfromhell.parse(sledrun_page.old_text)
+            wrmap_list = wikicode.filter_tags(recursive=False, matches=lambda tag: tag.tag == 'wrmap')
+            if len(wrmap_list) == 0:
+                continue  # not wrmap in page
+            if len(wrmap_list) > 1:
+                raise UpdateCacheError('{} <wrmap ...> entries found in article "{}"'.format(len(wrmap_list), sledrun_page.page_title))
+            wrmap = wrmap_list[0]
+            geojson = wrmwmarkup.parse_wrmap(str(wrmap))
 
             for feature in geojson['features']:
                 properties = feature['properties']
 
             for feature in geojson['features']:
                 properties = feature['properties']