]> ToastFreeware Gitweb - philipp/winterrodeln/wrpylib.git/blob - scripts/update_sledrun_wikitext.py
Implement parameter "all".
[philipp/winterrodeln/wrpylib.git] / scripts / update_sledrun_wikitext.py
1 #!/usr/bin/python
2 import argparse
3 import json
4 import sys
5 from typing import List
6
7 from termcolor import cprint  # python3-termcolor
8 import jsonschema
9
10 from wrpylib.cli_tools import unified_diff, input_yes_no_quit, Choice
11 from wrpylib.mwapi import WikiSite
12 from wrpylib.wrmwmarkup import create_sledrun_wiki
13
14
15 def update_sledrun(site: WikiSite, wiki_page: dict, json_page: dict, map_page: dict, impression_page: dict):
16     json_page_main_slot = json_page['revisions'][0]['slots']['main']
17     assert json_page_main_slot['contentmodel'] == 'json'
18     sledrun_json = json.loads(json_page_main_slot['content'])
19     jsonschema.validate(instance=sledrun_json, schema=site.sledrun_schema())
20
21     if 'missing' in map_page:
22         map_json = None
23     else:
24         map_page_main_slot = map_page['revisions'][0]['slots']['main']
25         assert map_page_main_slot['contentmodel'] == 'json'
26         map_json = json.loads(map_page_main_slot['content'])
27
28     if 'missing' in impression_page:
29         impression_title = None
30     else:
31         impression_title = impression_page['title']
32
33     new_text = create_sledrun_wiki(sledrun_json, map_json, impression_title).strip()
34
35     previous_text = wiki_page['revisions'][0]['slots']['main']['content'].strip()
36     if new_text == previous_text:
37         return
38
39     cprint(wiki_page['title'], 'green')
40     unified_diff(previous_text, new_text)
41     choice = input_yes_no_quit('Do you accept the changes [yes, no, quit]? ', None)
42     if choice == Choice.no:
43         return
44
45     if choice == Choice.quit:
46         sys.exit(0)
47
48     site(
49         'edit',
50         pageid=wiki_page['pageid'],
51         text=new_text,
52         summary='Rodelbahnbeschreibung aus JSON Daten aktualisiert.',
53         minor=1,
54         bot=1,
55         baserevid=wiki_page['revisions'][0]['revid'],
56         nocreate=1,
57         token=site.token(),
58     )
59
60
61 def update_sledrun_wikitext(ini_files: List[str], update_all: bool):
62     site = WikiSite(ini_files)
63     cm_limit = 5  # 'max'
64     for wikitext_result in site.query(list='categorymembers', cmtitle='Kategorie:Rodelbahn', cmlimit=cm_limit):
65         wikitext_title_list = [page["title"] for page in wikitext_result['categorymembers']]
66         json_title_list = [f'{title}/Rodelbahn.json' for title in wikitext_title_list]
67
68         wikitext_result = query_revisions(site, wikitext_title_list, [])
69         json_result = query_revisions(site, json_title_list, [])
70
71         update_wikitext_title_list = []
72         update_json_title_list = []
73         for wikitext_page, json_page in zip(wikitext_result, json_result):
74             assert wikitext_page['title'] + '/Rodelbahn.json' == json_page['title']
75             if 'missing' in json_page:
76                 continue
77             if update_all or (wikitext_page['revisions'][0]['timestamp'] < json_page['revisions'][0]['timestamp']):
78                 update_wikitext_title_list.append(wikitext_page['title'])
79                 update_json_title_list.append(json_page['title'])
80
81         if len(update_wikitext_title_list) == 0:
82             continue
83
84         update_map_title_list = [f'{title}/Landkarte.json' for title in update_wikitext_title_list]
85         update_impression_title_list = [f'{title}/Impressionen' for title in update_wikitext_title_list]
86
87         update_wikitext_result = query_revisions(site, update_wikitext_title_list, ['content'])
88         update_json_result = query_revisions(site, update_json_title_list, ['content'])
89         update_map_result = query_revisions(site, update_map_title_list, ['content'])
90         update_impression_result = query_revisions(site, update_impression_title_list, ['content'])
91
92         for wikitext_page, json_page, map_page, impression_page in \
93                 zip(update_wikitext_result, update_json_result, update_map_result, update_impression_result):
94             assert wikitext_page['title'] + '/Rodelbahn.json' == json_page['title']
95             update_sledrun(site, wikitext_page, json_page, map_page, impression_page)
96
97
98 def query_revisions(site: WikiSite, title_list: List[str], extra_rv_prop: List[str]) -> List[dict]:
99     rv_prop = ['timestamp', 'ids'] + extra_rv_prop
100     pages = next(site.query(prop='revisions', titles=title_list, rvslots='*', rvprop=rv_prop))['pages']
101     pages = sorted(pages, key=lambda p: title_list.index(p['title']))
102     assert len(title_list) == len(pages)
103     return pages
104
105
106 def main():
107     parser = argparse.ArgumentParser(description='Update sledrun wikitext from JSON')
108     parser.add_argument('--all', action='store_true',
109                         help='update all sledruns regardless of modification date differences')
110     parser.add_argument('inifile', nargs='+', help='inifile.ini, see: https://www.winterrodeln.org/trac/wiki/ConfigIni')
111     args = parser.parse_args()
112     update_sledrun_wikitext(args.inifile, args.all)
113
114
115 if __name__ == '__main__':
116     main()