5 from copy import deepcopy
6 from typing import List, Iterable, NamedTuple, Optional, Final
8 from termcolor import cprint
10 from wrpylib.cli_tools import unified_diff, input_yes_no_quit, Choice
11 from wrpylib.json_tools import format_json
12 from wrpylib.mwapi import WikiSite
14 PROPERTIES: Final = 'properties'
15 WR_PROPERTIES: Final = 'wr_properties'
16 SIMPLIFIED = 'simplified'
19 def convert_wrgeojson(wrgeojson: dict) -> dict:
20 """replace 'properties' with 'wr_properties'."""
21 wrgeojson = deepcopy(wrgeojson)
22 if PROPERTIES in wrgeojson:
23 if WR_PROPERTIES in wrgeojson:
24 wrgeojson[PROPERTIES].update(WR_PROPERTIES)
25 wrgeojson[WR_PROPERTIES] = wrgeojson[PROPERTIES]
26 del wrgeojson[PROPERTIES]
27 if SIMPLIFIED not in wrgeojson[WR_PROPERTIES]:
28 wrgeojson[WR_PROPERTIES][SIMPLIFIED] = False
32 def query_all_sledrun_titles(site: WikiSite) -> Iterable[str]:
33 for query_result in site.query(list='categorymembers', cmtitle='Kategorie:Rodelbahn'):
34 for page in query_result['categorymembers']:
38 class WrGeoJsonInfo(NamedTuple):
45 def query_wrgeojson(site: WikiSite, sledrun_titles: Iterable[str]) -> Iterable[Optional[WrGeoJsonInfo]]:
46 wrgeojson_titles = [f'{title}/Landkarte.json' for title in sledrun_titles]
47 for query_result in site.query(titles=wrgeojson_titles, prop='revisions', rvprop='ids|content', rvslots='main'):
48 for page in query_result['pages']:
52 revision = page['revisions'][0]
53 content_str = revision['slots']['main']['content']
54 content_json = json.loads(content_str)
55 yield WrGeoJsonInfo(page['title'], page['pageid'], revision['revid'], content_json)
58 def update_wrgeojson_properties_to_wr_properties(ini_files: List[str]):
59 site = WikiSite(ini_files)
60 sledrun_titles = list(query_all_sledrun_titles(site))
61 for wrgeojson_info in query_wrgeojson(site, sledrun_titles):
62 if wrgeojson_info is None:
64 wrgeojson_new = convert_wrgeojson(wrgeojson_info.wrgeojson)
65 if wrgeojson_new == wrgeojson_info.wrgeojson:
68 wrgeojson_old_str = format_json(wrgeojson_info.wrgeojson)
69 wrgeojson_new_str = format_json(wrgeojson_new)
71 cprint(wrgeojson_info.title, 'green')
72 unified_diff(wrgeojson_old_str, wrgeojson_new_str)
73 choice = input_yes_no_quit('Do you accept the changes [yes, no, quit]? ', None)
75 if choice == Choice.no:
77 elif choice == Choice.quit:
82 pageid=wrgeojson_info.page_id,
83 text=wrgeojson_new_str,
84 summary='GeoJSON Karteneigenschaften von "properties" zu "wr_properties" umbenannt.',
87 baserevid=wrgeojson_info.revision_id,
94 parser = argparse.ArgumentParser(
95 description='Updates sledrun wrgeojson maps map properties to wr_properties.')
96 parser.add_argument('ini_file', nargs='+',
97 help='inifile.ini, see: https://www.winterrodeln.org/trac/wiki/ConfigIni')
98 args = parser.parse_args()
99 update_wrgeojson_properties_to_wr_properties(args.ini_file)
102 if __name__ == '__main__':