1 #!/usr/bin/env python3 |
|
2 from flask import Flask, render_template, abort |
|
3 from datetime import datetime, date, time, timedelta |
|
4 from misc import * |
|
5 import locale |
|
6 from bussireitti import supista_reitti |
|
7 from configparser import ConfigParser |
|
8 |
|
9 app = Flask(__name__) |
|
10 locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()) |
|
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 |
|
39 @app.route('/pysäkki/<tunniste>') |
|
40 def pysäkkiaikataulu(tunniste): |
|
41 from bussit import pysäkit |
|
42 from math import ceil |
|
43 aikataulu = [] |
|
44 try: |
|
45 pysäkki = pysäkit[tunniste] |
|
46 except KeyError: |
|
47 abort(404) |
|
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:]) |
|
55 aikataulu.append({ |
|
56 'aika': muotoile_aika(aika), |
|
57 'linja': pysähdys.ajo.linja.viite, |
|
58 'kyltti': kylttiesitys, |
|
59 'ajovuoro': pysähdys.ajo.nimi, |
|
60 'yö': yö(aika), |
|
61 }) |
|
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 ) |
|
71 |
|
72 @app.route('/ajovuoro/<numero>') |
|
73 def ajoreitti(numero): |
|
74 from flask import request |
|
75 from bussit import ajot |
|
76 try: |
|
77 ajovuoro = ajot[numero] |
|
78 except KeyError: |
|
79 abort(404) |
|
80 suppea = request.args.get('suppea') is not None |
|
81 reitti = [] |
|
82 suppea_reitti = [] |
|
83 käydyt_alueet = set() |
|
84 for pysähdys in ajovuoro.reitti: |
|
85 aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika |
|
86 muotoiltu_aika = muotoile_aika(aika) |
|
87 reitti.append({ |
|
88 'aika': muotoiltu_aika, |
|
89 'tunniste': pysähdys.pysäkki.tunniste, |
|
90 'alue': käännä(pysähdys.pysäkki.alue or '', 'paikat'), |
|
91 'nimi': käännä(pysähdys.pysäkki.nimi, 'pysäkit'), |
|
92 }) |
|
93 alue = pysähdys.pysäkki.alue |
|
94 if alue: |
|
95 if alue not in käydyt_alueet: |
|
96 suppea_reitti.append({ |
|
97 'aika': muotoiltu_aika, |
|
98 'alue': alue, |
|
99 }) |
|
100 käydyt_alueet.add(alue) |
|
101 kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True) |
|
102 sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html' |
|
103 return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti, |
|
104 numero = numero, linja = ajovuoro.linja.viite, |
|
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 ) |
|
108 |
|
109 if __name__ == '__main__': |
|
110 from argparse import ArgumentParser |
|
111 parser = ArgumentParser() |
|
112 parser.add_argument('-p', '--port', type = int, default = 5000) |
|
113 args = parser.parse_args() |
|
114 app.run(debug = True, port = args.port) |
|