service.py

Sat, 10 Jun 2017 21:09:11 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Sat, 10 Jun 2017 21:09:11 +0300
changeset 18
1c8ff93fbfac
parent 17
fa3c822859b5
child 19
16fa9fb20b32
permissions
-rwxr-xr-x

Lisää käännöstä

0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python3
11
e18ad36fbbf5 Lisätty favicon, korjattu tr()-funktio joka ei olettunut suomen kieleen (vaan kääntämättömään)
Teemu Piippo <teemu@hecknology.net>
parents: 10
diff changeset
2 from flask import Flask, render_template, abort, send_from_directory
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
3 from datetime import datetime, date, time, timedelta
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
4 from os import path, listdir
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
5 from configparser import ConfigParser
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
6 import locale
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
7
4
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
8 from misc import *
7
f3791dccfd03 Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 5
diff changeset
9 from busroute import supista_reitti
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
10
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11 app = Flask(__name__)
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
12
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
13 # Varmista ettei järjestelmän kieliasetukset sotke muotoiluja
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
14 locale.setlocale(locale.LC_ALL, locale.getdefaultlocale())
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
15
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
16 # Lataa käännökset
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
17 class Translator:
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
18 def __init__(self):
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
19 self.languages = {}
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
20 def load_language(self, file_path):
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
21 language_name = path.splitext(path.basename(file_path))[0]
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
22 ini = ConfigParser()
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
23 ini.read(path.join(file_path))
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
24 self.languages[language_name] = ini
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
25 def __call__(self, name, section, language = None):
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
26 language = language or language_for_page()
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
27 try:
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
28 return self.languages[language][section][name]
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
29 except KeyError:
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
30 return name
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
31
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
32 tr = Translator()
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
33 for file in listdir('tr'):
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
34 tr.load_language(path.join('tr', file))
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
35
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
36 def language_for_page():
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
37 from flask import request
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
38 if request.args.get('kääntämätön') is not None:
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
39 return None
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
40 else:
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
41 for language_name in tr.languages:
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
42 if request.args.get(language_name) is not None:
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
43 return language_name
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
44 else:
11
e18ad36fbbf5 Lisätty favicon, korjattu tr()-funktio joka ei olettunut suomen kieleen (vaan kääntämättömään)
Teemu Piippo <teemu@hecknology.net>
parents: 10
diff changeset
45 return 'fi'
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
46
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
47 @app.route('/pysäkki/<tunniste>')
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
48 def pysäkkiaikataulu(tunniste):
7
f3791dccfd03 Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 5
diff changeset
49 from buses import pysäkit
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
50 from math import ceil
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
51 aikataulu = []
3
ca2df60215ff Lisätty alueita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
52 try:
ca2df60215ff Lisätty alueita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
53 pysäkki = pysäkit[tunniste]
ca2df60215ff Lisätty alueita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
54 except KeyError:
ca2df60215ff Lisätty alueita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
55 abort(404)
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
56 for schedule_entry in pysäkki.schedule(100):
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
57 sign = supista_reitti(schedule_entry['trip'].suppea_reitti(schedule_entry['stop']))
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
58 sign = [tr(paikka, 'paikat') for paikka in sign]
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
59 sign_representation = ' - '.join(sign)
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
60 if len(sign_representation) > 25:
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
61 k = ceil(len(sign) / 2)
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
62 sign_representation = ' - '.join(sign[:k]) + '\n' + ' - '.join(sign[k:])
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 aikataulu.append({
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
64 'aika': time_representation(schedule_entry['time']),
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
65 'linja': schedule_entry['trip'].linja.viite,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
66 'kyltti': sign_representation,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
67 'ajovuoro': schedule_entry['stop'].ajo.nimi,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
68 'yö': is_night_time(schedule_entry['time']),
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
69 })
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
70 return render_template(
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
71 'pysäkki.html',
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
72 aikataulu = aikataulu,
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
73 viite = tunniste,
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
74 nimi = tr(pysäkki.nimi, 'pysäkit'),
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
75 linkki_karttaan = pysäkki.linkki_karttaan,
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
76 alue = pysäkki.alue,
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
77 sijainti = pysäkki.sijainti,
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
78 )
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
79
4
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
80 @app.route('/ajovuoro/<numero>')
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
81 def ajoreitti(numero):
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
82 from flask import request
7
f3791dccfd03 Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 5
diff changeset
83 from buses import ajot
3
ca2df60215ff Lisätty alueita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
84 try:
ca2df60215ff Lisätty alueita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
85 ajovuoro = ajot[numero]
ca2df60215ff Lisätty alueita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
86 except KeyError:
ca2df60215ff Lisätty alueita
Teemu Piippo <teemu@hecknology.net>
parents: 2
diff changeset
87 abort(404)
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
88 suppea = request.args.get('suppea') is not None
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
89 reitti = []
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
90 suppea_reitti = []
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
91 käydyt_alueet = set()
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
92 for pysähdys in ajovuoro.reitti:
4
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
93 aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
94 muotoiltu_aika = time_representation(aika)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
95 reitti.append({
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
96 'aika': muotoiltu_aika,
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
97 'tunniste': pysähdys.pysäkki.tunniste,
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
98 'alue': tr(pysähdys.pysäkki.alue or '', 'paikat'),
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
99 'nimi': tr(pysähdys.pysäkki.nimi, 'pysäkit'),
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
100 })
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
101 alue = pysähdys.pysäkki.alue
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
102 if alue:
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
103 if alue not in käydyt_alueet:
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
104 suppea_reitti.append({
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
105 'aika': muotoiltu_aika,
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
106 'alue': alue,
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
107 })
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
108 käydyt_alueet.add(alue)
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
109 kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True)
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
110 sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html'
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
111 return render_template(sivu,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
112 reitti = reitti,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
113 suppea_reitti = suppea_reitti,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
114 numero = numero,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
115 linja = ajovuoro.linja.viite,
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
116 selite = ' - '.join(tr(paikka, 'paikat') for paikka in kyltti),
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
117 yö = time_representation(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika),
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
118 )
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
119
11
e18ad36fbbf5 Lisätty favicon, korjattu tr()-funktio joka ei olettunut suomen kieleen (vaan kääntämättömään)
Teemu Piippo <teemu@hecknology.net>
parents: 10
diff changeset
120 @app.route('/static/<path:path>')
e18ad36fbbf5 Lisätty favicon, korjattu tr()-funktio joka ei olettunut suomen kieleen (vaan kääntämättömään)
Teemu Piippo <teemu@hecknology.net>
parents: 10
diff changeset
121 def static_file(path):
e18ad36fbbf5 Lisätty favicon, korjattu tr()-funktio joka ei olettunut suomen kieleen (vaan kääntämättömään)
Teemu Piippo <teemu@hecknology.net>
parents: 10
diff changeset
122 return send_from_directory(path.join('static', path))
e18ad36fbbf5 Lisätty favicon, korjattu tr()-funktio joka ei olettunut suomen kieleen (vaan kääntämättömään)
Teemu Piippo <teemu@hecknology.net>
parents: 10
diff changeset
123
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
124 if __name__ == '__main__':
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
125 from argparse import ArgumentParser
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
126 parser = ArgumentParser()
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
127 parser.add_argument('-p', '--port', type = int, default = 5000)
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
128 parser.add_argument('-d', '--debug', action = 'store_true')
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
129 args = parser.parse_args()
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
130 app.run(debug = args.debug, port = args.port)

mercurial