service.py

Sat, 10 Jun 2017 18:06:27 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Sat, 10 Jun 2017 18:06:27 +0300
changeset 14
b4fbc92cd915
parent 11
e18ad36fbbf5
child 17
fa3c822859b5
permissions
-rwxr-xr-x

Hienosäätöä

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)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
56 for (aika, pysähdys) in pysäkki.aikataulu(100):
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
57 kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys))
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
58 kyltti = [tr(paikka, 'paikat') for paikka in kyltti]
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
59 kylttiesitys = ' - '.join(kyltti)
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
60 if len(kylttiesitys) > 25:
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
61 k = ceil(len(kyltti) / 2)
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
62 kylttiesitys = ' - '.join(kyltti[:k]) + '\n' + ' - '.join(kyltti[k:])
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 aikataulu.append({
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
64 'aika': muotoile_aika(aika),
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
65 'linja': pysähdys.ajo.linja.viite,
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
66 'kyltti': kylttiesitys,
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
67 'ajovuoro': pysähdys.ajo.nimi,
4
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
68 'yö': yö(aika),
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
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
94 muotoiltu_aika = muotoile_aika(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'
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
111 return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti,
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
112 numero = numero, linja = ajovuoro.linja.viite,
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
113 selite = ' - '.join(tr(paikka, 'paikat') for paikka in kyltti),
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
114 yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika),
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
115 )
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
116
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
117 @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
118 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
119 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
120
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
121 if __name__ == '__main__':
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
122 from argparse import ArgumentParser
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
123 parser = ArgumentParser()
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
124 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
125 parser.add_argument('-d', '--debug', action = 'store_true')
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
126 args = parser.parse_args()
10
843c6ee340e7 Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents: 9
diff changeset
127 app.run(debug = args.debug, port = args.port)

mercurial