Now showing walk distance and walk time for bus stops.
[philipp/winterrodeln/wrpylib.git] / scripts / update_intermaps.py
1 #!/usr/bin/python3
2 import argparse
3 import configparser
4 import datetime
5 import json
6 import os
7 from typing import Optional, Tuple
8 import urllib.request
9 from sqlalchemy.engine import create_engine
10 from sqlalchemy import orm
11 from wrpylib.wrintermaps import update_wrintermapssledrun, update_wrintermapsreport
12
13
14 INTERMAPS_URL = 'https://iski.intermaps.com/api/v1/winterrodeln_org.aspx'
15
16
17 def download(src: str) -> bytes:
18     with urllib.request.urlopen(src) as fp:
19         return fp.read()
20
21
22 def get_json_str(in_json: Optional[str]) -> Tuple[str, datetime.datetime]:
23     if in_json is None:
24         json_bytes = download(INTERMAPS_URL)
25         return json_bytes.decode(), datetime.datetime.now()
26     with open(in_json) as fp:
27         return fp.read(), datetime.datetime.fromtimestamp(os.path.getmtime(in_json))
28
29
30 def save_json_str(json_str: str, out_json: Optional[str]):
31     if out_json is not None:
32         with open(out_json, 'w') as fp:
33             fp.write(json_str)
34
35
36 def main(in_json: Optional[str], out_json: Optional[str], inifile: str):
37     json_str, in_date = get_json_str(in_json)
38     save_json_str(json_str, out_json)
39     content = json.loads(json_str)
40     config = configparser.ConfigParser()
41     config.read(inifile)
42     connection_string = config.get('mysql', 'sqlalchemy_user')
43     engine = create_engine(connection_string)
44     SessionMaker = orm.sessionmaker(bind=engine)
45     session = SessionMaker()
46     update_wrintermapssledrun(session, content)
47     update_wrintermapsreport(session, content, in_date)
48     session.commit()
49
50
51 if __name__ == '__main__':
52     parser = argparse.ArgumentParser(description='Downloads intermaps sledrun data (JSON) and updates the tables.')
53     parser.add_argument('--in-json', help='Don\'t download but use this file instead')
54     parser.add_argument('--out-json', help='Additionally save downloaded JSON data to this filename')
55     parser.add_argument('inifile', help='Configuration file, see https://www.winterrodeln.org/trac/wiki/ConfigIni')
56     args = parser.parse_args()
57     main(args.in_json, args.out_json, args.inifile)