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