service.py

changeset 10
843c6ee340e7
parent 9
f95892def64e
child 11
e18ad36fbbf5
equal deleted inserted replaced
9:f95892def64e 10:843c6ee340e7
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)

mercurial