Draft helper script for intermap tables.
[philipp/winterrodeln/wrpylib.git] / wrpylib / wrintermaps.py
1 import itertools
2 import json
3 from sqlalchemy import schema, orm
4 from wrpylib import mwdb, wrmwdb
5
6
7 def main():
8     filename = '/home/philipp/daten/Winterrodeln/Intermaps/intermaps_winterrodeln_2019-12-06_090501.json'
9     with open(filename) as fp:
10         content = json.load(fp)
11     regions = content['items']
12     sledruns = list(itertools.chain.from_iterable(region['sledruns']['items'] for region in regions))
13     sledrun_ids_list = [sledrun['id'] for sledrun in sledruns]
14     sledrun_ids_set = set(sledrun_ids_list)
15     duplicates = {sledrun_id for sledrun_id in sledrun_ids_set if sum(sr_id == sledrun_id for sr_id in sledrun_ids_list) >= 2}
16     print(duplicates)
17     print(max(map(len, sledrun_ids_set)))  # 36
18     with open(filename, 'w') as fp:
19         json.dump(content, fp, indent='\t')
20
21
22 class UpdateError(RuntimeError):
23     pass
24
25
26 def find_intermaps_sledrun(intermaps_sledrun_id: str, json_content: dict):
27     """Returns iterator of tuples (region, sledrun) for given sledrun_id"""
28     regions = json_content['items']
29     for region in regions:
30         for sledrun in region['sledruns']['items']:
31             if sledrun['id'] == intermaps_sledrun_id:
32                 yield region, sledrun
33
34
35 def update_wrintermapssledrun(engine, json_content: dict):
36     """Updates the wrintermapssledrun table from the wiki. If convert errors occur, an UpdateError exception
37     is raised. No other exception type should be raised under normal circumstances.
38
39     >>> import json
40     >>> from sqlalchemy.engine import create_engine
41     >>> engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8&use_unicode=1')
42     >>> with open('2019-12-06_090500.json') as fp:
43     >>>     content = json.load(fp)
44     >>> update_wrintermapssledrun(engine, content)
45     """
46     class Page:
47         pass
48
49     class IntermapsSledrun:
50         pass
51
52     metadata = schema.MetaData()
53     wrintermapssledrun_table = wrmwdb.wrintermapssledrun_table(metadata)
54     page_table = mwdb.page_table(metadata)
55
56     Session = orm.sessionmaker(bind=engine)
57     session = Session()
58     orm.mapper(IntermapsSledrun, wrintermapssledrun_table)
59     orm.mapper(Page, page_table)
60
61     q = session.query(IntermapsSledrun)
62     for intermaps_sledrun in q:
63         if intermaps_sledrun.intermaps_sledrun_name is None or intermaps_sledrun.intermaps_region_id is None or \
64                 intermaps_sledrun.intermaps_region_name is None or intermaps_sledrun.intermaps_country is None:
65             region_json, sledrun_json = \
66                 next(find_intermaps_sledrun(intermaps_sledrun.intermaps_sledrun_id, json_content), (None, None))
67             if region_json is None:
68                 raise UpdateError(
69                     f'Sledrun with intermaps id {intermaps_sledrun.intermaps_sledrun_id} not found in JSON')
70         if intermaps_sledrun.intermaps_sledrun_name is None:
71             intermaps_sledrun.intermaps_sledrun_name = sledrun_json['name']
72         if intermaps_sledrun.intermaps_region_id is None:
73             intermaps_sledrun.intermaps_region_id = region_json['id']
74         if intermaps_sledrun.intermaps_region_name is None:
75             intermaps_sledrun.intermaps_region_name = region_json['names']['de']
76         if intermaps_sledrun.intermaps_country is None:
77             intermaps_sledrun.intermaps_country = region_json['countryCode']
78
79         if intermaps_sledrun.wr_page_title is None:
80             page = session.query(Page).get(intermaps_sledrun.wr_page_id)
81             intermaps_sledrun.wr_page_title = page.page_title
82
83     session.commit()
84
85
86 if __name__ == '__main__':
87     from sqlalchemy.engine import create_engine
88     engine = create_engine('mysql://philipp@localhost:3306/philipp_winterrodeln_wiki?charset=utf8&use_unicode=1')
89     filename = '/home/philipp/daten/Winterrodeln/Intermaps/intermaps_winterrodeln_2019-12-06_090501.json'
90     with open(filename) as fp:
91         content = json.load(fp)
92     update_wrintermapssledrun(engine, content)