#!/usr/bin/python3 import argparse import json import sys from copy import deepcopy from typing import List, Iterable, NamedTuple, Optional, Final from termcolor import cprint from wrpylib.cli_tools import unified_diff, input_yes_no_quit, Choice from wrpylib.json_tools import format_json from wrpylib.mwapi import WikiSite PROPERTIES: Final = 'properties' WR_PROPERTIES: Final = 'wr_properties' SIMPLIFIED = 'simplified' def convert_wrgeojson(wrgeojson: dict) -> dict: """replace 'properties' with 'wr_properties'.""" wrgeojson = deepcopy(wrgeojson) if PROPERTIES in wrgeojson: if WR_PROPERTIES in wrgeojson: wrgeojson[PROPERTIES].update(WR_PROPERTIES) wrgeojson[WR_PROPERTIES] = wrgeojson[PROPERTIES] del wrgeojson[PROPERTIES] if SIMPLIFIED not in wrgeojson[WR_PROPERTIES]: wrgeojson[WR_PROPERTIES][SIMPLIFIED] = False return wrgeojson def query_all_sledrun_titles(site: WikiSite) -> Iterable[str]: for query_result in site.query(list='categorymembers', cmtitle='Kategorie:Rodelbahn'): for page in query_result['categorymembers']: yield page["title"] class WrGeoJsonInfo(NamedTuple): title: str page_id: int revision_id: int wrgeojson: dict def query_wrgeojson(site: WikiSite, sledrun_titles: Iterable[str]) -> Iterable[Optional[WrGeoJsonInfo]]: wrgeojson_titles = [f'{title}/Landkarte.json' for title in sledrun_titles] for query_result in site.query(titles=wrgeojson_titles, prop='revisions', rvprop='ids|content', rvslots='main'): for page in query_result['pages']: if 'missing' in page: yield None else: revision = page['revisions'][0] content_str = revision['slots']['main']['content'] content_json = json.loads(content_str) yield WrGeoJsonInfo(page['title'], page['pageid'], revision['revid'], content_json) def update_wrgeojson_properties_to_wr_properties(ini_files: List[str]): site = WikiSite(ini_files) sledrun_titles = list(query_all_sledrun_titles(site)) for wrgeojson_info in query_wrgeojson(site, sledrun_titles): if wrgeojson_info is None: continue wrgeojson_new = convert_wrgeojson(wrgeojson_info.wrgeojson) if wrgeojson_new == wrgeojson_info.wrgeojson: continue wrgeojson_old_str = format_json(wrgeojson_info.wrgeojson) wrgeojson_new_str = format_json(wrgeojson_new) cprint(wrgeojson_info.title, 'green') unified_diff(wrgeojson_old_str, wrgeojson_new_str) choice = input_yes_no_quit('Do you accept the changes [yes, no, quit]? ', None) if choice == Choice.no: return elif choice == Choice.quit: sys.exit(0) site( 'edit', pageid=wrgeojson_info.page_id, text=wrgeojson_new_str, summary='GeoJSON Karteneigenschaften von "properties" zu "wr_properties" umbenannt.', minor=1, bot=1, baserevid=wrgeojson_info.revision_id, nocreate=1, token=site.token(), ) def main(): parser = argparse.ArgumentParser( description='Updates sledrun wrgeojson maps map properties to wr_properties.') parser.add_argument('ini_file', nargs='+', help='inifile.ini, see: https://www.winterrodeln.org/trac/wiki/ConfigIni') args = parser.parse_args() update_wrgeojson_properties_to_wr_properties(args.ini_file) if __name__ == '__main__': main()