1 #!/usr/bin/env python3 |
1 #!/usr/bin/env python3 |
2 from flask import Flask, render_template, abort |
2 from flask import Flask, render_template, abort |
3 from datetime import datetime, date, time, timedelta |
3 from datetime import datetime, date, time, timedelta |
|
4 from os import path, listdir |
|
5 from configparser import ConfigParser |
|
6 import locale |
|
7 |
4 from misc import * |
8 from misc import * |
5 import locale |
|
6 from busroute import supista_reitti |
9 from busroute import supista_reitti |
7 from configparser import ConfigParser |
|
8 from os import path |
|
9 |
10 |
10 app = Flask(__name__) |
11 app = Flask(__name__) |
|
12 |
|
13 # Varmista ettei järjestelmän kieliasetukset sotke muotoiluja |
11 locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()) |
14 locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()) |
12 |
15 |
13 kielet = ['fi', 'sv', 'en', 'ru'] |
16 # Lataa käännökset |
14 kieli_ini = {} |
17 class Translator: |
15 for kieli in kielet: |
18 def __init__(self): |
16 ini = ConfigParser() |
19 self.languages = {} |
17 ini.read(path.join('tr', kieli + '.ini')) |
20 def load_language(self, file_path): |
18 kieli_ini[kieli] = ini |
21 language_name = path.splitext(path.basename(file_path))[0] |
|
22 ini = ConfigParser() |
|
23 ini.read(path.join(file_path)) |
|
24 self.languages[language_name] = ini |
|
25 def __call__(self, name, section, language = None): |
|
26 language = language or language_for_page() |
|
27 try: |
|
28 return self.languages[language][section][name] |
|
29 except KeyError: |
|
30 return name |
19 |
31 |
20 def käännä(nimi, osio): |
32 tr = Translator() |
21 kieli = sivun_kieli() |
33 for file in listdir('tr'): |
22 try: |
34 tr.load_language(path.join('tr', file)) |
23 return kieli_ini[kieli][osio][nimi] |
|
24 except KeyError: |
|
25 return nimi |
|
26 |
35 |
27 def sivun_kieli(): |
36 def language_for_page(): |
28 from flask import request |
37 from flask import request |
29 if request.args.get('sv') is not None: |
38 if request.args.get('kääntämätön') is not None: |
30 return 'sv' |
39 return None |
31 elif request.args.get('en') is not None: |
|
32 return 'en' |
|
33 elif request.args.get('ru') is not None: |
|
34 return 'ru' |
|
35 elif request.args.get('kääntämätön') is None: |
|
36 return 'fi' |
|
37 else: |
40 else: |
38 return None |
41 for language_name in tr.languages: |
|
42 if request.args.get(language_name) is not None: |
|
43 return language_name |
|
44 else: |
|
45 return None |
39 |
46 |
40 @app.route('/pysäkki/<tunniste>') |
47 @app.route('/pysäkki/<tunniste>') |
41 def pysäkkiaikataulu(tunniste): |
48 def pysäkkiaikataulu(tunniste): |
42 from buses import pysäkit |
49 from buses import pysäkit |
43 from math import ceil |
50 from math import ceil |
46 pysäkki = pysäkit[tunniste] |
53 pysäkki = pysäkit[tunniste] |
47 except KeyError: |
54 except KeyError: |
48 abort(404) |
55 abort(404) |
49 for (aika, pysähdys) in pysäkki.aikataulu(100): |
56 for (aika, pysähdys) in pysäkki.aikataulu(100): |
50 kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys)) |
57 kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys)) |
51 kyltti = [käännä(paikka, 'paikat') for paikka in kyltti] |
58 kyltti = [tr(paikka, 'paikat') for paikka in kyltti] |
52 kylttiesitys = ' - '.join(kyltti) |
59 kylttiesitys = ' - '.join(kyltti) |
53 if len(kylttiesitys) > 25: |
60 if len(kylttiesitys) > 25: |
54 k = ceil(len(kyltti) / 2) |
61 k = ceil(len(kyltti) / 2) |
55 kylttiesitys = ' - '.join(kyltti[:k]) + '\n' + ' - '.join(kyltti[k:]) |
62 kylttiesitys = ' - '.join(kyltti[:k]) + '\n' + ' - '.join(kyltti[k:]) |
56 aikataulu.append({ |
63 aikataulu.append({ |
62 }) |
69 }) |
63 return render_template( |
70 return render_template( |
64 'pysäkki.html', |
71 'pysäkki.html', |
65 aikataulu = aikataulu, |
72 aikataulu = aikataulu, |
66 viite = tunniste, |
73 viite = tunniste, |
67 nimi = käännä(pysäkki.nimi, 'pysäkit'), |
74 nimi = tr(pysäkki.nimi, 'pysäkit'), |
68 linkki_karttaan = pysäkki.linkki_karttaan, |
75 linkki_karttaan = pysäkki.linkki_karttaan, |
69 alue = pysäkki.alue, |
76 alue = pysäkki.alue, |
70 sijainti = pysäkki.sijainti, |
77 sijainti = pysäkki.sijainti, |
71 ) |
78 ) |
72 |
79 |
86 aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika |
93 aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika |
87 muotoiltu_aika = muotoile_aika(aika) |
94 muotoiltu_aika = muotoile_aika(aika) |
88 reitti.append({ |
95 reitti.append({ |
89 'aika': muotoiltu_aika, |
96 'aika': muotoiltu_aika, |
90 'tunniste': pysähdys.pysäkki.tunniste, |
97 'tunniste': pysähdys.pysäkki.tunniste, |
91 'alue': käännä(pysähdys.pysäkki.alue or '', 'paikat'), |
98 'alue': tr(pysähdys.pysäkki.alue or '', 'paikat'), |
92 'nimi': käännä(pysähdys.pysäkki.nimi, 'pysäkit'), |
99 'nimi': tr(pysähdys.pysäkki.nimi, 'pysäkit'), |
93 }) |
100 }) |
94 alue = pysähdys.pysäkki.alue |
101 alue = pysähdys.pysäkki.alue |
95 if alue: |
102 if alue: |
96 if alue not in käydyt_alueet: |
103 if alue not in käydyt_alueet: |
97 suppea_reitti.append({ |
104 suppea_reitti.append({ |
101 käydyt_alueet.add(alue) |
108 käydyt_alueet.add(alue) |
102 kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True) |
109 kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True) |
103 sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html' |
110 sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html' |
104 return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti, |
111 return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti, |
105 numero = numero, linja = ajovuoro.linja.viite, |
112 numero = numero, linja = ajovuoro.linja.viite, |
106 selite = ' - '.join(käännä(paikka, 'paikat') for paikka in kyltti), |
113 selite = ' - '.join(tr(paikka, 'paikat') for paikka in kyltti), |
107 yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika), |
114 yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika), |
108 ) |
115 ) |
109 |
116 |
110 if __name__ == '__main__': |
117 if __name__ == '__main__': |
111 from argparse import ArgumentParser |
118 from argparse import ArgumentParser |
112 parser = ArgumentParser() |
119 parser = ArgumentParser() |
113 parser.add_argument('-p', '--port', type = int, default = 5000) |
120 parser.add_argument('-p', '--port', type = int, default = 5000) |
|
121 parser.add_argument('-d', '--debug', action = 'store_true') |
114 args = parser.parse_args() |
122 args = parser.parse_args() |
115 app.run(debug = True, port = args.port) |
123 app.run(debug = args.debug, port = args.port) |