4 from typing import List
6 from termcolor import cprint # python3-termcolor
9 from pywikibot import input_yn
11 from wrpylib.mwapi import WikiSite
12 from wrpylib.wrmwmarkup import create_sledrun_wiki
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())
21 if 'missing' in map_page:
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'])
28 if 'missing' in impression_page:
29 impression_title = None
31 impression_title = impression_page['title']
33 new_text = create_sledrun_wiki(sledrun_json, map_json, impression_title).strip()
35 previous_text = wiki_page['revisions'][0]['slots']['main']['content'].strip()
36 if new_text == previous_text:
39 cprint(wiki_page['title'], 'green')
40 pywikibot.showDiff(previous_text.strip(), new_text.strip(), context=2)
41 yn = input_yn('Do you accept the changes?', True)
47 pageid=wiki_page['pageid'],
49 summary='Rodelbahnbeschreibung aus JSON Daten aktualisiert.',
52 baserevid=wiki_page['revisions'][0]['revid'],
58 def update_sledrun_wikitext(ini_files: List[str], update_all: bool):
59 site = WikiSite(ini_files)
61 for wikitext_result in site.query(list='categorymembers', cmtitle='Kategorie:Rodelbahn', cmlimit=cm_limit):
62 wikitext_title_list = [page["title"] for page in wikitext_result['categorymembers']]
63 json_title_list = [f'{title}/Rodelbahn.json' for title in wikitext_title_list]
65 wikitext_result = query_revisions(site, wikitext_title_list, [])
66 json_result = query_revisions(site, json_title_list, [])
68 update_wikitext_title_list = []
69 update_json_title_list = []
70 for wikitext_page, json_page in zip(wikitext_result, json_result):
71 assert wikitext_page['title'] + '/Rodelbahn.json' == json_page['title']
72 if 'missing' in json_page:
74 if wikitext_page['revisions'][0]['timestamp'] < json_page['revisions'][0]['timestamp']:
75 update_wikitext_title_list.append(wikitext_page['title'])
76 update_json_title_list.append(json_page['title'])
78 if len(update_wikitext_title_list) == 0:
81 update_map_title_list = [f'{title}/Landkarte.json' for title in update_wikitext_title_list]
82 update_impression_title_list = [f'{title}/Impressionen' for title in update_wikitext_title_list]
84 update_wikitext_result = query_revisions(site, update_wikitext_title_list, ['content'])
85 update_json_result = query_revisions(site, update_json_title_list, ['content'])
86 update_map_result = query_revisions(site, update_map_title_list, ['content'])
87 update_impression_result = query_revisions(site, update_impression_title_list, ['content'])
89 for wikitext_page, json_page, map_page, impression_page in \
90 zip(update_wikitext_result, update_json_result, update_map_result, update_impression_result):
91 assert wikitext_page['title'] + '/Rodelbahn.json' == json_page['title']
92 update_sledrun(site, wikitext_page, json_page, map_page, impression_page)
95 def query_revisions(site: WikiSite, title_list: List[str], extra_rv_prop: List[str]) -> List[dict]:
96 rv_prop = ['timestamp', 'ids'] + extra_rv_prop
97 pages = next(site.query(prop='revisions', titles=title_list, rvslots='*', rvprop=rv_prop))['pages']
98 pages = sorted(pages, key=lambda p: title_list.index(p['title']))
99 assert len(title_list) == len(pages)
104 parser = argparse.ArgumentParser(description='Update sledrun wikitext from JSON')
105 parser.add_argument('--all', action='store_true',
106 help='update all sledruns regardless of modification date differences')
107 parser.add_argument('inifile', nargs='+', help='inifile.ini, see: https://www.winterrodeln.org/trac/wiki/ConfigIni')
108 args = parser.parse_args()
109 update_sledrun_wikitext(args.inifile, args.all)
112 if __name__ == '__main__':