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 misc import * |
4 from misc import * |
5 import locale |
5 import locale |
|
6 from bussireitti import supista_reitti |
|
7 from configparser import ConfigParser |
6 |
8 |
7 app = Flask(__name__) |
9 app = Flask(__name__) |
8 locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()) |
10 locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()) |
9 |
11 |
|
12 kielet = ['fi', 'sv', 'en', 'ru'] |
|
13 kieli_ini = {} |
|
14 for kieli in kielet: |
|
15 ini = ConfigParser() |
|
16 ini.read(kieli + '.ini') |
|
17 kieli_ini[kieli] = ini |
|
18 |
|
19 def käännä(nimi, osio): |
|
20 kieli = sivun_kieli() |
|
21 try: |
|
22 return kieli_ini[kieli][osio][nimi] |
|
23 except KeyError: |
|
24 return nimi |
|
25 |
|
26 def sivun_kieli(): |
|
27 from flask import request |
|
28 if request.args.get('sv') is not None: |
|
29 return 'sv' |
|
30 elif request.args.get('en') is not None: |
|
31 return 'en' |
|
32 elif request.args.get('ru') is not None: |
|
33 return 'ru' |
|
34 elif request.args.get('kääntämätön') is None: |
|
35 return 'fi' |
|
36 else: |
|
37 return None |
|
38 |
10 @app.route('/pysäkki/<tunniste>') |
39 @app.route('/pysäkki/<tunniste>') |
11 def pysäkkiaikataulu(tunniste): |
40 def pysäkkiaikataulu(tunniste): |
12 from bussit import pysäkit |
41 from bussit import pysäkit |
|
42 from math import ceil |
13 aikataulu = [] |
43 aikataulu = [] |
14 try: |
44 try: |
15 pysäkki = pysäkit[tunniste] |
45 pysäkki = pysäkit[tunniste] |
16 except KeyError: |
46 except KeyError: |
17 abort(404) |
47 abort(404) |
18 for (aika, pysähdys) in pysäkki.aikataulu(100): |
48 for (aika, pysähdys) in pysäkki.aikataulu(100): |
|
49 kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys)) |
|
50 kyltti = [käännä(paikka, 'paikat') for paikka in kyltti] |
|
51 kylttiesitys = ' - '.join(kyltti) |
|
52 if len(kylttiesitys) > 25: |
|
53 k = ceil(len(kyltti) / 2) |
|
54 kylttiesitys = ' - '.join(kyltti[:k]) + '\n' + ' - '.join(kyltti[k:]) |
19 aikataulu.append({ |
55 aikataulu.append({ |
20 'aika': muotoile_aika(aika), |
56 'aika': muotoile_aika(aika), |
21 'linja': pysähdys.ajo.linja.viite, |
57 'linja': pysähdys.ajo.linja.viite, |
22 'kyltti': pysähdys.ajo.kyltti, |
58 'kyltti': kylttiesitys, |
23 'ajovuoro': pysähdys.ajo.nimi, |
59 'ajovuoro': pysähdys.ajo.nimi, |
24 'yö': yö(aika), |
60 'yö': yö(aika), |
25 }) |
61 }) |
26 return render_template('pysäkki.html', aikataulu = aikataulu, viite = tunniste, nimi = pysäkki.nimi) |
62 return render_template( |
|
63 'pysäkki.html', |
|
64 aikataulu = aikataulu, |
|
65 viite = tunniste, |
|
66 nimi = käännä(pysäkki.nimi, 'pysäkit'), |
|
67 linkki_karttaan = pysäkki.linkki_karttaan, |
|
68 alue = pysäkki.alue, |
|
69 sijainti = pysäkki.sijainti, |
|
70 ) |
27 |
71 |
28 @app.route('/ajovuoro/<numero>') |
72 @app.route('/ajovuoro/<numero>') |
29 def ajoreitti(numero): |
73 def ajoreitti(numero): |
30 from flask import request |
74 from flask import request |
31 from bussit import ajot |
75 from bussit import ajot |
41 aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika |
85 aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika |
42 muotoiltu_aika = muotoile_aika(aika) |
86 muotoiltu_aika = muotoile_aika(aika) |
43 reitti.append({ |
87 reitti.append({ |
44 'aika': muotoiltu_aika, |
88 'aika': muotoiltu_aika, |
45 'tunniste': pysähdys.pysäkki.tunniste, |
89 'tunniste': pysähdys.pysäkki.tunniste, |
46 'alue': pysähdys.pysäkki.alue, |
90 'alue': käännä(pysähdys.pysäkki.alue or '', 'paikat'), |
47 'nimi': pysähdys.pysäkki.nimi, |
91 'nimi': käännä(pysähdys.pysäkki.nimi, 'pysäkit'), |
48 }) |
92 }) |
49 alue = pysähdys.pysäkki.alue |
93 alue = pysähdys.pysäkki.alue |
50 if alue: |
94 if alue: |
51 if alue not in käydyt_alueet: |
95 if alue not in käydyt_alueet: |
52 suppea_reitti.append({ |
96 suppea_reitti.append({ |
53 'aika': muotoiltu_aika, |
97 'aika': muotoiltu_aika, |
54 'alue': alue |
98 'alue': alue, |
55 }) |
99 }) |
56 käydyt_alueet.add(alue) |
100 käydyt_alueet.add(alue) |
|
101 kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True) |
57 sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html' |
102 sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html' |
58 return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti, |
103 return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti, |
59 numero = numero, linja = ajovuoro.linja.viite, selite = ajovuoro.kyltti, |
104 numero = numero, linja = ajovuoro.linja.viite, |
60 yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika)) |
105 selite = ' - '.join(käännä(paikka, 'paikat') for paikka in kyltti), |
|
106 yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika), |
|
107 ) |
61 |
108 |
62 if __name__ == '__main__': |
109 if __name__ == '__main__': |
63 from argparse import ArgumentParser |
110 from argparse import ArgumentParser |
64 parser = ArgumentParser() |
111 parser = ArgumentParser() |
65 parser.add_argument('-p', '--port', type = int, default = 5000) |
112 parser.add_argument('-p', '--port', type = int, default = 5000) |