]> ToastFreeware Gitweb - philipp/winterrodeln/wrpylib.git/commitdiff
Add script update_wiki_wrgeojson_add_simplified.py.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Tue, 30 Aug 2022 20:14:57 +0000 (22:14 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Tue, 30 Aug 2022 20:14:57 +0000 (22:14 +0200)
scripts/update_wiki_wrgeojson_add_simplified.py [new file with mode: 0644]
wrpylib/mwapi.py [new file with mode: 0644]

diff --git a/scripts/update_wiki_wrgeojson_add_simplified.py b/scripts/update_wiki_wrgeojson_add_simplified.py
new file mode 100644 (file)
index 0000000..7ee6f42
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+import argparse
+from typing import List
+
+from wrpylib.json_tools import format_json
+from wrpylib.mwapi import WikiSite, page_json
+
+
+def update_wrgeojson(site: WikiSite, title: str):
+    wrgeojson_page = site.query_page(title)
+    if 'missing' in wrgeojson_page:
+        return
+    wrgeojson_json = page_json(wrgeojson_page)
+    wrgeojson_orig = wrgeojson_json.copy()
+
+    properties = wrgeojson_json.pop('properties', {}).copy()
+    if "simplified" not in properties:
+        properties["simplified"] = True
+    wrgeojson_json['properties'] = properties
+    if wrgeojson_json == wrgeojson_orig:
+        return
+
+    site(
+        'edit',
+        pageid=wrgeojson_page['pageid'],
+        text=format_json(wrgeojson_json),
+        summary=f'Eigenschaft "simplified" eingefügt.',
+        minor=1,
+        bot=1,
+        baserevid=wrgeojson_page['revisions'][0]['revid'],
+        nocreate=1,
+        token=site.token(),
+    )
+
+
+def update_wiki_wrgeojson(ini_files: List[str]):
+    site = WikiSite(ini_files)
+    for result in site.query(list='categorymembers', cmtitle='Kategorie:Rodelbahn'):
+        for title in result['categorymembers']:
+            wrgeojson_title = f'{title["title"]}/Landkarte.json'
+            update_wrgeojson(site, wrgeojson_title)
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Update wrgeojson Wiki pages: Add attribute "simplified".')
+    parser.add_argument('inifile', nargs='+', help='inifile.ini, see: https://www.winterrodeln.org/trac/wiki/ConfigIni')
+    args = parser.parse_args()
+    update_wiki_wrgeojson(args.inifile)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/wrpylib/mwapi.py b/wrpylib/mwapi.py
new file mode 100644 (file)
index 0000000..bf4df3d
--- /dev/null
@@ -0,0 +1,34 @@
+"""Helper functions for using the MediaWiki API."""
+import configparser
+import json
+from functools import lru_cache
+from typing import List
+
+from pywikiapi import Site
+
+
+def page_json(page: dict) -> dict:
+    slot = page['revisions'][0]['slots']['main']
+    assert slot['contentmodel'] == 'json'
+    return json.loads(slot['content'])
+
+
+class WikiSite(Site):
+    def __init__(self, ini_files: List[str]):
+        config = configparser.ConfigParser()
+        config.read(ini_files)
+
+        api_url = config.get('robot', 'wikiurl')
+        api_user = config.get('robot', 'botpassword_bot')
+        api_password = config.get('robot', 'botpassword_password')
+        super().__init__(api_url)
+        self.login(api_user, api_password, True)
+
+    def query_page(self, title: str) -> dict:
+        rv_props = ['ids', 'contentmodel', 'content']
+        return next(self.query_pages(titles=title, prop='revisions', rvprop=rv_props, rvslots='main'))
+
+    @lru_cache
+    def sledrun_schema(self) -> dict:
+        schema = self.query_page('Winterrodeln:Datenschema/Rodelbahn/V1.json')
+        return page_json(schema)