Thu, 07 Dec 2017 16:55:44 +0200
Stop_display muutoksia
| 0 | 1 | #!/usr/bin/env python3 |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
2 | from flask import Flask, render_template, abort, send_from_directory, redirect |
| 0 | 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 | 8 | from misc import * |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
9 | from busroute import reduce_schedule |
| 30 | 10 | import buses |
| 0 | 11 | |
| 12 | app = Flask(__name__) | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
13 | suffix_regions = {'naantalin pikatie', 'helsingin valtatie', 'kansanpuisto'} |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
14 | |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
15 | # Varmista ettei järjestelmän kieliasetukset sotke muotoiluja |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
16 | def reset_locale(): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
17 | locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()) |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
18 | |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
19 | def activate_locale(language = None): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
20 | language = language or language_for_page() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
21 | class result: |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
22 | def __enter__(self): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
23 | locale.setlocale(locale.LC_ALL, tr('locale', 'other', language = language)) |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
24 | def __exit__(self, *args): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
25 | reset_locale() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
26 | return result() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
27 | |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
28 | reset_locale() |
| 0 | 29 | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
30 | # Lataa käännökset |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
31 | class Translator: |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
32 | def __init__(self): |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
33 | self.languages = {} |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
34 | def load_language(self, file_path): |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
35 | 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
|
36 | ini = ConfigParser() |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
37 | ini.read(path.join(file_path)) |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
38 | self.languages[language_name] = ini |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
39 | def __call__(self, name, *sections, language = None): |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
40 | language = language or language_for_page() |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
41 | for section in sections: |
|
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
42 | try: |
|
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
43 | return self.languages[language][section][name] |
|
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
44 | except KeyError: |
| 72 | 45 | try: |
| 46 | return profile['tr:' + language + ':' + section][name] | |
| 47 | except KeyError: | |
| 48 | pass | |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
49 | else: |
| 72 | 50 | return name[:1].upper() + name[1:] |
| 5 | 51 | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
52 | tr = Translator() |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
53 | for file in listdir('tr'): |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
54 | tr.load_language(path.join('tr', file)) |
| 5 | 55 | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
56 | def language_for_page(): |
| 5 | 57 | from flask import request |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
58 | 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
|
59 | return None |
| 5 | 60 | else: |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
61 | for language_name in tr.languages: |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
62 | 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
|
63 | return language_name |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
64 | else: |
|
61
0c9b09f694f3
Kielituki käyttöön. Kauhean monimutkaista koodia tähänkin vaadittiin viime kädessä
Teemu Piippo <teemu@hecknology.net>
parents:
55
diff
changeset
|
65 | return request.accept_languages.best_match(tr.languages) |
| 5 | 66 | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
67 | def sign_elements(schedule_entry, long = False): |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
68 | from math import ceil |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
69 | trip_length = schedule_entry['trip'].length - schedule_entry['stop'].traveled_distance |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
70 | return reduce_schedule( |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
71 | schedule_entry['trip'].concise_schedule(schedule_entry['stop']), |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
72 | trip_length = trip_length, |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
73 | long = long) |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
74 | |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
75 | def sign(schedule_entry, long = False): |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
76 | sign = sign_elements(schedule_entry, long = long) |
| 29 | 77 | if sign: |
| 72 | 78 | sign_representation = ' - '.join(tr(place, 'places') for place in sign if place not in suffix_regions) |
|
55
0f1d046b3f78
Suppeampi näkymä, pikatiet ja mootoritiet
Teemu Piippo <teemu@hecknology.net>
parents:
53
diff
changeset
|
79 | sign_representation += ''.join(' ' + tr(place, 'suffix-places') for place in sign if place in suffix_regions) |
| 29 | 80 | return sign_representation |
| 81 | else: | |
| 82 | return schedule_entry['trip'].schedule[-1].stop.name | |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
83 | |
| 68 | 84 | def long_form_sign(schedule_entry): |
| 85 | from math import ceil | |
| 86 | trip_length = schedule_entry['trip'].length - schedule_entry['stop'].traveled_distance | |
| 87 | sign = reduce_schedule(schedule_entry['trip'].concise_schedule(schedule_entry['stop']), trip_length = trip_length, long = True) | |
| 88 | if sign: | |
| 89 | return { | |
| 72 | 90 | 'destination': tr(sign[-1], 'places'), |
| 91 | 'via': [tr(place, 'places') for place in sign[:-1]], | |
| 68 | 92 | } |
| 93 | else: | |
| 94 | return { | |
| 95 | 'destination': schedule_entry['trip'].schedule[-1].stop.name, | |
| 96 | 'via': [], | |
| 97 | } | |
| 98 | ||
| 99 | ||
|
38
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
100 | def imminent(schedule_entry): |
|
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
101 | return (schedule_entry['time'] - now()) <= timedelta(minutes = 3) |
|
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
102 | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
103 | def first_halt_in_trip_in_place(trip, place): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
104 | for halt in trip.schedule: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
105 | if halt.stop.region == place: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
106 | return halt |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
107 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
108 | return None |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
109 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
110 | place_abbreviations = ConfigParser() |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
111 | place_abbreviations.read('abbreviations.ini') |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
112 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
113 | def place_abbreviation(place): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
114 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
115 | return place_abbreviations['abbreviations'][place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
116 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
117 | return place |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
118 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
119 | def trip_abbreviation(trip): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
120 | entries = [trip.from_place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
121 | old_places = None |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
122 | starting_halt = None |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
123 | while True: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
124 | remaining_length = trip.length |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
125 | if starting_halt: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
126 | remaining_length -= starting_halt.traveled_distance |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
127 | places = reduce_schedule(trip.concise_schedule(starting_stop = starting_halt), trip_length = remaining_length, long = False) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
128 | new_places = set(places) - set(entries) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
129 | if not new_places or places == old_places: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
130 | break |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
131 | for place in places: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
132 | if place in new_places: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
133 | starting_halt = first_halt_in_trip_in_place(trip, place) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
134 | entries += [place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
135 | break |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
136 | old_places = places |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
137 | if trip.to_place not in entries: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
138 | entries += [trip.to_place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
139 | return trip.route.reference + ':' + '-'.join(map(place_abbreviation, entries)) |
| 68 | 140 | |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
141 | @app.route('/stop/<reference>') |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
142 | def bus_stop_schedule(reference): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
143 | from buses import bus_stops |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
144 | schedule = [] |
| 3 | 145 | try: |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
146 | bus_stop = bus_stops[reference] |
| 3 | 147 | except KeyError: |
| 148 | abort(404) | |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
149 | for schedule_entry in bus_stop.schedule(max_amount = 100, arrivals = True): |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
150 | schedule.append({ |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
151 | 'time': time_representation(schedule_entry['time']), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
152 | 'route': schedule_entry['trip'].route.reference, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
153 | 'sign': sign(schedule_entry), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
154 | 'trip': schedule_entry['stop'].trip.name, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
155 | 'night': is_night_time(schedule_entry['time']), |
|
38
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
156 | 'imminent': imminent(schedule_entry), |
| 0 | 157 | }) |
| 5 | 158 | return render_template( |
|
25
cb423946cf33
Uudelleennimetty templaatit
Teemu Piippo <teemu@hecknology.net>
parents:
24
diff
changeset
|
159 | 'stop.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
160 | schedule = schedule, |
| 72 | 161 | name = bus_stop.code + ' ' + tr(bus_stop.name, 'bus-stops', 'places'), |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
162 | link_to_map = bus_stop.location.link_to_map, |
| 72 | 163 | region = hasattr(bus_stop, 'region') and bus_stop.region or None, |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
164 | location = bus_stop.location, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
165 | cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
166 | tr = tr, |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
167 | ) |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
168 | |
| 74 | 169 | def week_schedule(bus_stop, **kwargs): |
| 170 | for i in range(-1, 7): | |
| 171 | yield from bus_stop.schedule_for_day(today() + timedelta(i), **kwargs) | |
| 172 | ||
| 173 | def route_key(route): | |
| 174 | match = re.search(r'^([a-zA-Z]*)(\d+)(.*)$', route) | |
| 175 | if match: | |
| 176 | groups = match.groups() | |
| 177 | return (groups[0], int(groups[1]), groups[2]) | |
| 178 | else: | |
| 179 | return (route,) | |
| 180 | ||
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
181 | @app.route('/stop_description/<reference>') |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
182 | def bus_stop_description(reference): |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
183 | from buses import bus_stops |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
184 | schedule = [] |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
185 | try: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
186 | bus_stop = bus_stops[reference] |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
187 | except KeyError: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
188 | abort(404) |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
189 | from collections import defaultdict, Counter |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
190 | from busroute import simplify_name |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
191 | destinations_per_route = defaultdict(Counter) |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
192 | def route_key(route_ref): |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
193 | from re import search |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
194 | match = search(r'^([^0-9]*)([0-9]+)(.*)$', route_ref).groups() |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
195 | if match: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
196 | return match[0], int(match[1]), match[2] |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
197 | else: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
198 | return () |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
199 | def filter_names(names): |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
200 | if len(names) == 1 and names[0] == (bus_stop.region and simplify_name(bus_stop.region)): |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
201 | return type(names)() |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
202 | else: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
203 | return names |
| 74 | 204 | data = [] |
| 205 | names = [] | |
| 206 | from collections import defaultdict | |
| 207 | night_routes = defaultdict(lambda: True) | |
| 208 | num_leaves = 0 | |
| 209 | for schedule_entry in week_schedule(bus_stop, arrivals = True): #bus_stop.schedule(max_amount = 500, arrivals = True): | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
210 | sign_tuple = tuple(sign_elements(schedule_entry)) |
| 74 | 211 | night_routes[schedule_entry['trip'].route.reference] &= is_night_time(schedule_entry['time']) |
| 212 | #for entry in sign_tuple: | |
| 213 | # if entry not in names: | |
| 214 | # names.append(entry) | |
| 215 | #sign_tuple = tuple(names.index(place) for place in sign_tuple) | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
216 | destinations_per_route[schedule_entry['trip'].route.reference][sign_tuple] += 1 |
| 74 | 217 | num_leaves += 1 |
| 218 | night_routes = {key for key, value in night_routes.items() if value} | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
219 | routes_per_destination = defaultdict(set) |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
220 | for route in destinations_per_route: |
| 74 | 221 | winner, count = destinations_per_route[route].most_common()[0] |
| 222 | if count >= 10 or count / num_leaves >= 0.01: | |
| 223 | winner = filter_names(winner) | |
| 224 | #destinations_per_route[route] = winner and ' - '.join(winner) or '' | |
| 225 | routes_per_destination[winner].add(route) | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
226 | for key in routes_per_destination: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
227 | routes_per_destination[key] = sorted(routes_per_destination[key], key = route_key) |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
228 | from pprint import pformat |
| 74 | 229 | return '<pre>' + \ |
| 230 | 'names: ' + str(names) + '\n '+ \ | |
| 231 | 'night_routes: ' + str(night_routes) + '\n '+ \ | |
| 232 | 'destinations_per_route: ' + pformat(dict(destinations_per_route)) + '\n' + \ | |
| 233 | 'routes_per_destination: ' + pformat(dict(routes_per_destination)) + '</pre>' | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
234 | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
235 | @app.route('/api/describe_destination/<trip_reference>/<stop_reference>/<int:index>') |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
236 | def describe_destination(trip_reference, stop_reference, index): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
237 | from buses import bus_stops, all_trips |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
238 | from busroute import simplify_name |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
239 | from flask import jsonify |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
240 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
241 | trip = all_trips[trip_reference] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
242 | bus_stop = bus_stops[stop] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
243 | schedule_entry = [schedule_entry for schedule_entry in trip.schedule if schedule_entry.stop.reference == stop_reference][index] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
244 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
245 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
246 | except ValueError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
247 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
248 | return jsonify(long_form_sign({'trip': trip, 'stop': schedule_entry})) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
249 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
250 | @app.route('/api/trip_abbreviation/<block_id>/<int:arrival_time_offset>') |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
251 | def api_trip_abbreviation(block_id, arrival_time_offset): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
252 | from buses import trips_by_vehicle_info |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
253 | from flask import jsonify |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
254 | from datetime import timedelta |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
255 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
256 | trip = trips_by_vehicle_info[block_id, timedelta(seconds = arrival_time_offset)] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
257 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
258 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
259 | return jsonify({ |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
260 | 'abbreviation': trip_abbreviation(trip), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
261 | }) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
262 | |
| 68 | 263 | @app.route('/stop_display/<reference>') |
| 264 | def stop_display(reference): | |
| 265 | from buses import bus_stops | |
| 266 | schedule = [] | |
| 267 | try: | |
| 268 | bus_stop = bus_stops[reference] | |
| 269 | except KeyError: | |
| 270 | abort(404) | |
| 76 | 271 | for i, schedule_entry in enumerate(bus_stop.schedule_for_day(today(), arrivals = False)): |
| 68 | 272 | schedule.append({ |
| 273 | 'time_data': schedule_entry['time'], | |
| 274 | 'time': time_representation(schedule_entry['time']), | |
| 275 | 'route': schedule_entry['trip'].route.reference, | |
| 276 | 'sign': long_form_sign(schedule_entry), | |
| 277 | 'trip': schedule_entry['stop'].trip.name, | |
| 278 | 'night': is_night_time(schedule_entry['time']), | |
| 279 | 'imminent': imminent(schedule_entry), | |
| 280 | 'index': i, | |
| 281 | }) | |
| 282 | from pprint import pprint | |
| 283 | pprint(schedule) | |
| 76 | 284 | def destination_key(schedule_entry): |
| 285 | sign = schedule_entry['sign'] | |
| 286 | return (sign['destination'],) + tuple(sign['via']) | |
| 287 | def filter_schedule(schedule, *, key): | |
| 288 | used = set() | |
| 289 | for schedule_entry in schedule: | |
| 290 | key_value = key(schedule_entry) | |
| 291 | if key_value not in used: | |
| 292 | used.add(key_value) | |
| 293 | yield schedule_entry | |
| 294 | schedule = list(filter_schedule(schedule, key = destination_key))[:6] | |
| 68 | 295 | if schedule: |
| 296 | num_imminent_leaves = max(1, len([schedule_entry for schedule_entry in schedule if schedule_entry['time_data'] - schedule[0]['time_data'] < timedelta(minutes = 3)])) | |
| 297 | else: | |
| 298 | num_imminent_leaves = 1 | |
| 299 | return render_template( | |
| 300 | 'stop_display.html', | |
| 301 | schedule = schedule, | |
| 302 | ref = bus_stop.code, | |
| 303 | name = tr(bus_stop.name, 'bus-stops'), | |
| 304 | link_to_map = bus_stop.location.link_to_map, | |
| 305 | region = bus_stop.region, | |
| 306 | location = bus_stop.location, | |
| 307 | cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, | |
| 308 | num_imminent_leaves = num_imminent_leaves, | |
| 309 | tr = tr, | |
| 310 | ) | |
| 311 | ||
| 312 | @app.route('/test') | |
| 313 | def test(): | |
| 314 | from buses import bus_stops | |
| 315 | bus_stop = bus_stops['16'] | |
| 316 | schedule = [{'imminent': True, | |
| 317 | 'index': 0, | |
| 318 | 'night': False, | |
| 319 | 'route': '2A', | |
| 320 | 'sign': {'destination': 'Kohmo', 'via': ['Nummenmäki', 'Kurala']}, | |
| 321 | 'time': '1m', | |
| 322 | 'trip': '00012501__3798generatedBlock'}, | |
| 323 | {'imminent': True, | |
| 324 | 'index': 1, | |
| 325 | 'night': False, | |
| 326 | 'route': '54', | |
| 327 | 'sign': {'destination': 'Ylioppilaskylä', 'via': []}, | |
| 328 | 'time': '2m', | |
| 329 | 'trip': '00014359__5656generatedBlock'}, | |
| 330 | {'imminent': True, | |
| 331 | 'index': 2, | |
| 332 | 'night': False, | |
| 333 | 'route': '1', | |
| 334 | 'sign': {'destination': 'Lentoasema ✈', 'via': ['Urusvuori']}, | |
| 335 | 'time': '3m', | |
| 336 | 'trip': '00010281__1281generatedBlock'}, | |
| 337 | {'imminent': False, | |
| 338 | 'index': 3, | |
| 339 | 'night': False, | |
| 340 | 'route': '56', | |
| 341 | 'sign': {'destination': 'Räntämäki', 'via': ['Nummenmäki', 'Halinen']}, | |
| 342 | 'time': '8m', | |
| 343 | 'trip': '00014686__5983generatedBlock'}, | |
| 344 | {'imminent': False, | |
| 345 | 'index': 4, | |
| 346 | 'night': False, | |
| 347 | 'route': '42', | |
| 348 | 'sign': {'destination': 'Varissuo', 'via': ['Kupittaa as', 'Itäharju']}, | |
| 349 | 'time': '18:30', | |
| 350 | 'trip': '00014010__5307generatedBlock'}, | |
| 351 | {'imminent': False, | |
| 352 | 'index': 5, | |
| 353 | 'night': False, | |
| 354 | 'route': '2B', | |
| 355 | 'sign': {'destination': 'Littoinen', | |
| 356 | 'via': ['Nummenmäki', 'Kurala', 'Kohmo']}, | |
| 357 | 'time': '18:35', | |
| 358 | 'trip': '00012629__3926generatedBlock'}] | |
| 359 | return render_template( | |
| 360 | 'stop_display.html', | |
| 361 | schedule = schedule, | |
| 362 | ref = bus_stop.code, | |
| 363 | name = tr(bus_stop.name, 'bus-stops'), | |
| 364 | link_to_map = bus_stop.location.link_to_map, | |
| 365 | region = bus_stop.region, | |
| 366 | location = bus_stop.location, | |
| 367 | cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, | |
| 368 | num_imminent_leaves = max(1, sum(schedule_entry['imminent'] for schedule_entry in schedule)), | |
| 369 | tr = tr, | |
| 370 | ) | |
| 371 | ||
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
372 | def time_representation(time, relative = True): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
373 | time_difference = time - now() |
|
42
0b53b7c70875
Näytä myös aikataulut jotka ovat minuutti sitten menneet
teemu
parents:
38
diff
changeset
|
374 | if relative and timedelta(minutes = -1) < time_difference < timedelta(minutes = 1): |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
375 | return tr('right-now', 'misc-text') |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
376 | elif relative and time_difference > timedelta(0) and time_difference < timedelta(minutes = 10): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
377 | return '%dm' % round(time_difference.seconds / 60) |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
378 | elif time.date() == today(): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
379 | return '%d:%02d' % (time.hour, time.minute) |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
380 | elif time_difference < timedelta(7): |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
381 | with activate_locale(): |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
382 | return time.strftime('%-a %H:%M').replace(' ', '\xa0') |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
383 | else: |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
384 | with activate_locale(): |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
385 | return time.strftime('%-d.%-m. %H:%M').replace(' ', '\xa0') |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
386 | |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
387 | @app.route('/stop_cluster/<cluster_name>') |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
388 | def cluster_schedule(cluster_name): |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
389 | from buses import bus_stops, clusters_by_name |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
390 | schedule = [] |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
391 | try: |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
392 | cluster = clusters_by_name[cluster_name] |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
393 | except KeyError: |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
394 | abort(404) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
395 | for schedule_entry in cluster.schedule(max_amount = 100): |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
396 | schedule.append({ |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
397 | 'time': time_representation(schedule_entry['time']), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
398 | 'route': schedule_entry['trip'].route.reference, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
399 | 'sign': sign(schedule_entry), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
400 | 'trip': schedule_entry['stop'].trip.name, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
401 | 'night': is_night_time(schedule_entry['time']), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
402 | 'stop_id': schedule_entry['stop'].stop.reference, |
| 29 | 403 | 'stop_code': schedule_entry['stop'].stop.code, |
| 72 | 404 | 'stop_name': tr(schedule_entry['stop'].stop.name, 'bus-stops', 'places'), |
|
38
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
405 | 'imminent': imminent(schedule_entry), |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
406 | }) |
| 27 | 407 | stops_in_cluster = sorted( |
| 408 | ({ | |
| 409 | 'id': stop.reference, | |
| 29 | 410 | 'code': stop.code, |
| 63 | 411 | 'name': tr(stop.name, 'bus-stops'), |
| 27 | 412 | } for stop in cluster.stops), |
| 413 | key = lambda stop: (len(stop['id']), stop['id']) | |
| 414 | ) | |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
415 | return render_template( |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
416 | 'cluster.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
417 | schedule = schedule, |
| 72 | 418 | name = tr(cluster.name, 'places', 'place-clusters', 'bus-stops'), |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
419 | link_to_map = cluster.center.link_to_map, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
420 | location = cluster.center, |
| 27 | 421 | stops_in_cluster = stops_in_cluster, |
| 422 | amount_of_stops_in_cluster = len(stops_in_cluster), | |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
423 | tr = tr, |
| 5 | 424 | ) |
| 0 | 425 | |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
426 | @app.route('/trip/<trip_reference>') |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
427 | def trip(trip_reference): |
| 2 | 428 | from flask import request |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
429 | from buses import all_trips |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
430 | from busroute import simplify_name |
| 3 | 431 | try: |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
432 | trip = all_trips[trip_reference] |
| 3 | 433 | except KeyError: |
| 434 | abort(404) | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
435 | schedule = [] |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
436 | region = '' |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
437 | for halt in trip.schedule: |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
438 | stop_time = datetime.combine(today(), time()) + halt.arrival_time |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
439 | formatted_time = time_representation(stop_time) |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
440 | if profile['regions']['use-regions']: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
441 | if halt.stop.region != region and not (region and not halt.stop.region): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
442 | if len(schedule) and not schedule[-1]['name']: |
| 72 | 443 | schedule[-1]['name'] = tr(halt.stop.region or '', 'places') |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
444 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
445 | schedule.append({ |
| 72 | 446 | 'name': tr(halt.stop.region or '', 'places'), |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
447 | 'time': formatted_time, |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
448 | 'stops': [], |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
449 | 'index': len(schedule), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
450 | }) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
451 | region = halt.stop.region |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
452 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
453 | schedule.append({ |
| 72 | 454 | 'name': tr(halt.stop.name or '', 'bus-stops', 'places'), |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
455 | 'time': formatted_time, |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
456 | 'stops': [], |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
457 | 'index': len(schedule), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
458 | }) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
459 | schedule[-1]['stops'].append({ |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
460 | 'time': formatted_time, |
| 29 | 461 | 'id': halt.stop.reference, |
| 462 | 'code': halt.stop.code, | |
| 72 | 463 | 'name': tr(halt.stop.name, 'bus-stops', 'places'), |
| 0 | 464 | }) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
465 | sign = trip.concise_schedule() |
| 29 | 466 | try: |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
467 | sign = [simplify_name(sign[0]), simplify_name(sign[-1])] |
| 29 | 468 | except IndexError: |
| 469 | sign = [trip.schedule[0].stop.name, trip.schedule[-1].stop.name] | |
|
25
cb423946cf33
Uudelleennimetty templaatit
Teemu Piippo <teemu@hecknology.net>
parents:
24
diff
changeset
|
470 | return render_template('trip.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
471 | schedule = schedule, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
472 | trip_reference = trip_reference, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
473 | route = trip.route.reference, |
| 72 | 474 | description = ' - '.join(tr(place, 'places') for place in sign), |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
475 | night = is_night_time(datetime.combine(today(), time()) + trip.schedule[-1].arrival_time), |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
476 | tr = tr, |
| 27 | 477 | length = trip.length / 1000, |
| 478 | ) | |
| 479 | ||
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
480 | @app.route('/route/<name>') |
| 27 | 481 | def route_page(name): |
| 482 | from buses import routes | |
| 483 | route = routes[name.upper()] | |
| 484 | schedule = [] | |
| 485 | for trip in route.trips: | |
| 486 | if trip.is_served_at(today()) and datetime.combine(today(), time()) + trip.schedule[-1].arrival_time < now(): | |
| 487 | schedule.append({ | |
| 488 | 'name': trip.reference, | |
| 489 | 'from': trip.from_place, | |
| 490 | 'to': trip.to_place, | |
| 491 | 'time': time_representation(datetime.combine(today(), time()) + trip.schedule[0].departure_time), | |
| 492 | }) | |
| 493 | return render_template('route.html', | |
| 494 | name = route.reference + ' ' + route.description, | |
| 495 | tr = tr, | |
| 496 | schedule = schedule, | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
497 | ) |
| 0 | 498 | |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
499 | @app.route('/') |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
500 | def index(): |
| 49 | 501 | return redirect('stop_cluster/kauppatori') |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
502 | |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
503 | @app.route('/pysäkki/<reference>') |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
504 | def redirect_pysäkki(reference): |
| 50 | 505 | return redirect('stop/' + str(reference)) |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
506 | |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
507 | @app.route('/pysäkkiryhmä/<reference>') |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
508 | def redirect_pysäkkiryhmä(reference): |
| 50 | 509 | return redirect('stop_cluster/' + str(reference)) |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
510 | |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
511 | @app.route('/ajovuoro/<reference>') |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
512 | def redirect_ajovuoro(reference): |
| 50 | 513 | return redirect('trip/' + str(reference)) |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
514 | |
|
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
|
515 | @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
|
516 | 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
|
517 | 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
|
518 | |
| 30 | 519 | from argparse import ArgumentParser |
| 520 | parser = ArgumentParser() | |
| 521 | parser.add_argument('gtfs_zip_path') | |
| 522 | parser.add_argument('profile_path') | |
| 523 | ||
| 0 | 524 | if __name__ == '__main__': |
| 2 | 525 | 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
|
526 | parser.add_argument('-d', '--debug', action = 'store_true') |
| 30 | 527 | |
| 528 | args = parser.parse_args() | |
| 529 | profile.read(args.profile_path) | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
530 | buses.load_buses(args.gtfs_zip_path) |
| 30 | 531 | |
| 532 | if __name__ == '__main__': | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
533 | app.run(debug = args.debug, port = args.port) |