]> ToastFreeware Gitweb - philipp/winterrodeln/wrpylib.git/blob - scripts/update_wrgeojson_properties_to_wr_properties.py
VAO is missing important streets in Switzerland.
[philipp/winterrodeln/wrpylib.git] / scripts / update_wrgeojson_properties_to_wr_properties.py
1 #!/usr/bin/python3
2 import argparse
3 import json
4 import sys
5 from copy import deepcopy
6 from typing import List, Iterable, NamedTuple, Optional, Final
7
8 from termcolor import cprint
9
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
13
14 PROPERTIES: Final = 'properties'
15 WR_PROPERTIES: Final = 'wr_properties'
16 SIMPLIFIED = 'simplified'
17
18
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
29     return wrgeojson
30
31
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']:
35             yield page["title"]
36
37
38 class WrGeoJsonInfo(NamedTuple):
39     title: str
40     page_id: int
41     revision_id: int
42     wrgeojson: dict
43
44
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']:
49             if 'missing' in page:
50                 yield None
51             else:
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)
56
57
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:
63             continue
64         wrgeojson_new = convert_wrgeojson(wrgeojson_info.wrgeojson)
65         if wrgeojson_new == wrgeojson_info.wrgeojson:
66             continue
67
68         wrgeojson_old_str = format_json(wrgeojson_info.wrgeojson)
69         wrgeojson_new_str = format_json(wrgeojson_new)
70
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)
74
75         if choice == Choice.no:
76             return
77         elif choice == Choice.quit:
78             sys.exit(0)
79
80         site(
81             'edit',
82             pageid=wrgeojson_info.page_id,
83             text=wrgeojson_new_str,
84             summary='GeoJSON Karteneigenschaften von "properties" zu "wr_properties" umbenannt.',
85             minor=1,
86             bot=1,
87             baserevid=wrgeojson_info.revision_id,
88             nocreate=1,
89             token=site.token(),
90         )
91
92
93 def main():
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)
100
101
102 if __name__ == '__main__':
103     main()