Mon, 11 Dec 2017 12:55:00 +0200
stop_week
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 | |
77 | 141 | def split_route_ref(route_ref): |
142 | try: | |
143 | return list(parse_route_ref(route_ref)) | |
144 | except ValueError: | |
145 | return ['', route_ref, ''] | |
146 | ||
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
147 | @app.route('/stop/<reference>') |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
148 | def bus_stop_schedule(reference): |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
149 | from buses import bus_stops |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
150 | schedule = [] |
3 | 151 | try: |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
152 | bus_stop = bus_stops[reference] |
3 | 153 | except KeyError: |
154 | abort(404) | |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
155 | for schedule_entry in bus_stop.schedule(max_amount = 100, arrivals = True): |
77 | 156 | route_ref = schedule_entry['trip'].route.reference |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
157 | schedule.append({ |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
158 | 'time': time_representation(schedule_entry['time']), |
77 | 159 | 'route': route_ref, |
160 | 'route-splice': split_route_ref(route_ref), | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
161 | 'sign': sign(schedule_entry), |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
162 | 'trip': schedule_entry['stop'].trip.name, |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
163 | '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
|
164 | 'imminent': imminent(schedule_entry), |
0 | 165 | }) |
5 | 166 | return render_template( |
25
cb423946cf33
Uudelleennimetty templaatit
Teemu Piippo <teemu@hecknology.net>
parents:
24
diff
changeset
|
167 | 'stop.html', |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
168 | schedule = schedule, |
72 | 169 | 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
|
170 | link_to_map = bus_stop.location.link_to_map, |
72 | 171 | 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
|
172 | location = bus_stop.location, |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
173 | 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
|
174 | tr = tr, |
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
175 | ) |
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
176 | |
74 | 177 | def week_schedule(bus_stop, **kwargs): |
178 | for i in range(-1, 7): | |
179 | yield from bus_stop.schedule_for_day(today() + timedelta(i), **kwargs) | |
180 | ||
181 | def route_key(route): | |
182 | match = re.search(r'^([a-zA-Z]*)(\d+)(.*)$', route) | |
183 | if match: | |
184 | groups = match.groups() | |
185 | return (groups[0], int(groups[1]), groups[2]) | |
186 | else: | |
187 | return (route,) | |
188 | ||
77 | 189 | def parse_route_ref(route_ref): |
190 | from re import search | |
191 | match = search(r'^([^0-9]*)([0-9]+)(.*)$', route_ref) | |
192 | try: | |
193 | return match.group(1), int(match.group(2)), match.group(3) | |
194 | except AttributeError: | |
195 | raise ValueError(route_ref) | |
196 | ||
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
197 | @app.route('/stop_description/<reference>') |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
198 | def bus_stop_description(reference): |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
199 | from buses import bus_stops |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
200 | schedule = [] |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
201 | try: |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
202 | bus_stop = bus_stops[reference] |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
203 | except KeyError: |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
204 | abort(404) |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
205 | from collections import defaultdict, Counter |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
206 | from busroute import simplify_name |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
207 | destinations_per_route = defaultdict(Counter) |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
208 | def route_key(route_ref): |
77 | 209 | try: |
210 | return parse_route_ref(route_ref) | |
211 | except ValueError: | |
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
212 | return () |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
213 | def filter_names(names): |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
214 | 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
|
215 | return type(names)() |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
216 | else: |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
217 | return names |
74 | 218 | data = [] |
219 | names = [] | |
220 | from collections import defaultdict | |
221 | night_routes = defaultdict(lambda: True) | |
222 | num_leaves = 0 | |
223 | 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
|
224 | sign_tuple = tuple(sign_elements(schedule_entry)) |
74 | 225 | night_routes[schedule_entry['trip'].route.reference] &= is_night_time(schedule_entry['time']) |
226 | #for entry in sign_tuple: | |
227 | # if entry not in names: | |
228 | # names.append(entry) | |
229 | #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
|
230 | destinations_per_route[schedule_entry['trip'].route.reference][sign_tuple] += 1 |
74 | 231 | num_leaves += 1 |
232 | 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
|
233 | routes_per_destination = defaultdict(set) |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
234 | for route in destinations_per_route: |
74 | 235 | winner, count = destinations_per_route[route].most_common()[0] |
236 | if count >= 10 or count / num_leaves >= 0.01: | |
237 | winner = filter_names(winner) | |
238 | #destinations_per_route[route] = winner and ' - '.join(winner) or '' | |
239 | routes_per_destination[winner].add(route) | |
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
240 | for key in routes_per_destination: |
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
241 | 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
|
242 | from pprint import pformat |
74 | 243 | return '<pre>' + \ |
244 | 'names: ' + str(names) + '\n '+ \ | |
245 | 'night_routes: ' + str(night_routes) + '\n '+ \ | |
246 | 'destinations_per_route: ' + pformat(dict(destinations_per_route)) + '\n' + \ | |
247 | '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
|
248 | |
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
249 | @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
|
250 | 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
|
251 | from buses import bus_stops, all_trips |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
252 | from busroute import simplify_name |
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 | try: |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
255 | trip = all_trips[trip_reference] |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
256 | bus_stop = bus_stops[stop] |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
257 | 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
|
258 | except KeyError: |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
259 | abort(404) |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
260 | except ValueError: |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
261 | abort(404) |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
262 | 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
|
263 | |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
264 | @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
|
265 | 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
|
266 | from buses import trips_by_vehicle_info |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
267 | from flask import jsonify |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
268 | from datetime import timedelta |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
269 | try: |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
270 | 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
|
271 | except KeyError: |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
272 | abort(404) |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
273 | return jsonify({ |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
274 | 'abbreviation': trip_abbreviation(trip), |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
275 | }) |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
276 | |
68 | 277 | @app.route('/stop_display/<reference>') |
278 | def stop_display(reference): | |
279 | from buses import bus_stops | |
280 | schedule = [] | |
281 | try: | |
282 | bus_stop = bus_stops[reference] | |
283 | except KeyError: | |
284 | abort(404) | |
76 | 285 | for i, schedule_entry in enumerate(bus_stop.schedule_for_day(today(), arrivals = False)): |
68 | 286 | schedule.append({ |
287 | 'time_data': schedule_entry['time'], | |
288 | 'time': time_representation(schedule_entry['time']), | |
289 | 'route': schedule_entry['trip'].route.reference, | |
290 | 'sign': long_form_sign(schedule_entry), | |
291 | 'trip': schedule_entry['stop'].trip.name, | |
292 | 'night': is_night_time(schedule_entry['time']), | |
293 | 'imminent': imminent(schedule_entry), | |
294 | 'index': i, | |
295 | }) | |
296 | from pprint import pprint | |
297 | pprint(schedule) | |
76 | 298 | def destination_key(schedule_entry): |
299 | sign = schedule_entry['sign'] | |
300 | return (sign['destination'],) + tuple(sign['via']) | |
301 | def filter_schedule(schedule, *, key): | |
302 | used = set() | |
303 | for schedule_entry in schedule: | |
304 | key_value = key(schedule_entry) | |
305 | if key_value not in used: | |
306 | used.add(key_value) | |
307 | yield schedule_entry | |
308 | schedule = list(filter_schedule(schedule, key = destination_key))[:6] | |
68 | 309 | if schedule: |
310 | 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)])) | |
311 | else: | |
312 | num_imminent_leaves = 1 | |
313 | return render_template( | |
314 | 'stop_display.html', | |
315 | schedule = schedule, | |
316 | ref = bus_stop.code, | |
317 | name = tr(bus_stop.name, 'bus-stops'), | |
318 | link_to_map = bus_stop.location.link_to_map, | |
319 | region = bus_stop.region, | |
320 | location = bus_stop.location, | |
321 | cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, | |
322 | num_imminent_leaves = num_imminent_leaves, | |
323 | tr = tr, | |
324 | ) | |
325 | ||
326 | @app.route('/test') | |
327 | def test(): | |
328 | from buses import bus_stops | |
329 | bus_stop = bus_stops['16'] | |
330 | schedule = [{'imminent': True, | |
331 | 'index': 0, | |
332 | 'night': False, | |
333 | 'route': '2A', | |
334 | 'sign': {'destination': 'Kohmo', 'via': ['Nummenmäki', 'Kurala']}, | |
335 | 'time': '1m', | |
336 | 'trip': '00012501__3798generatedBlock'}, | |
337 | {'imminent': True, | |
338 | 'index': 1, | |
339 | 'night': False, | |
340 | 'route': '54', | |
341 | 'sign': {'destination': 'Ylioppilaskylä', 'via': []}, | |
342 | 'time': '2m', | |
343 | 'trip': '00014359__5656generatedBlock'}, | |
344 | {'imminent': True, | |
345 | 'index': 2, | |
346 | 'night': False, | |
347 | 'route': '1', | |
348 | 'sign': {'destination': 'Lentoasema ✈', 'via': ['Urusvuori']}, | |
349 | 'time': '3m', | |
350 | 'trip': '00010281__1281generatedBlock'}, | |
351 | {'imminent': False, | |
352 | 'index': 3, | |
353 | 'night': False, | |
354 | 'route': '56', | |
355 | 'sign': {'destination': 'Räntämäki', 'via': ['Nummenmäki', 'Halinen']}, | |
356 | 'time': '8m', | |
357 | 'trip': '00014686__5983generatedBlock'}, | |
358 | {'imminent': False, | |
359 | 'index': 4, | |
360 | 'night': False, | |
361 | 'route': '42', | |
362 | 'sign': {'destination': 'Varissuo', 'via': ['Kupittaa as', 'Itäharju']}, | |
363 | 'time': '18:30', | |
364 | 'trip': '00014010__5307generatedBlock'}, | |
365 | {'imminent': False, | |
366 | 'index': 5, | |
367 | 'night': False, | |
368 | 'route': '2B', | |
369 | 'sign': {'destination': 'Littoinen', | |
370 | 'via': ['Nummenmäki', 'Kurala', 'Kohmo']}, | |
371 | 'time': '18:35', | |
372 | 'trip': '00012629__3926generatedBlock'}] | |
373 | return render_template( | |
374 | 'stop_display.html', | |
375 | schedule = schedule, | |
376 | ref = bus_stop.code, | |
377 | name = tr(bus_stop.name, 'bus-stops'), | |
378 | link_to_map = bus_stop.location.link_to_map, | |
379 | region = bus_stop.region, | |
380 | location = bus_stop.location, | |
381 | cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, | |
382 | num_imminent_leaves = max(1, sum(schedule_entry['imminent'] for schedule_entry in schedule)), | |
383 | tr = tr, | |
384 | ) | |
385 | ||
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
386 | def time_representation(time, relative = True): |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
387 | time_difference = time - now() |
42
0b53b7c70875
Näytä myös aikataulut jotka ovat minuutti sitten menneet
teemu
parents:
38
diff
changeset
|
388 | 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
|
389 | return tr('right-now', 'misc-text') |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
390 | 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
|
391 | return '%dm' % round(time_difference.seconds / 60) |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
392 | elif time.date() == today(): |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
393 | return '%d:%02d' % (time.hour, time.minute) |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
394 | elif time_difference < timedelta(7): |
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
395 | with activate_locale(): |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
396 | return time.strftime('%-a %H:%M').replace(' ', '\xa0') |
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
397 | else: |
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
398 | with activate_locale(): |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
399 | return time.strftime('%-d.%-m. %H:%M').replace(' ', '\xa0') |
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
400 | |
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
401 | @app.route('/stop_cluster/<cluster_name>') |
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
402 | def cluster_schedule(cluster_name): |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
403 | from buses import bus_stops, clusters_by_name |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
404 | schedule = [] |
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
405 | try: |
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
406 | cluster = clusters_by_name[cluster_name] |
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
407 | except KeyError: |
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
408 | abort(404) |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
409 | 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
|
410 | schedule.append({ |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
411 | 'time': time_representation(schedule_entry['time']), |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
412 | 'route': schedule_entry['trip'].route.reference, |
77 | 413 | 'route-splice': split_route_ref(schedule_entry['trip'].route.reference), |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
414 | 'sign': sign(schedule_entry), |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
415 | 'trip': schedule_entry['stop'].trip.name, |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
416 | 'night': is_night_time(schedule_entry['time']), |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
417 | 'stop_id': schedule_entry['stop'].stop.reference, |
29 | 418 | 'stop_code': schedule_entry['stop'].stop.code, |
72 | 419 | '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
|
420 | 'imminent': imminent(schedule_entry), |
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
421 | }) |
27 | 422 | stops_in_cluster = sorted( |
423 | ({ | |
424 | 'id': stop.reference, | |
29 | 425 | 'code': stop.code, |
63 | 426 | 'name': tr(stop.name, 'bus-stops'), |
27 | 427 | } for stop in cluster.stops), |
428 | key = lambda stop: (len(stop['id']), stop['id']) | |
429 | ) | |
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
430 | return render_template( |
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
431 | 'cluster.html', |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
432 | schedule = schedule, |
72 | 433 | 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
|
434 | link_to_map = cluster.center.link_to_map, |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
435 | location = cluster.center, |
27 | 436 | stops_in_cluster = stops_in_cluster, |
437 | amount_of_stops_in_cluster = len(stops_in_cluster), | |
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
438 | tr = tr, |
5 | 439 | ) |
0 | 440 | |
77 | 441 | |
442 | def hour_key(hour): | |
443 | return (hour - 5) % 24 | |
444 | ||
445 | def day_class(weekday): | |
446 | if weekday < 5: | |
447 | return 'working-day' | |
448 | elif weekday == 5: | |
449 | return 'saturday' | |
450 | else: | |
451 | assert weekday == 6 | |
452 | return 'sunday' | |
453 | ||
454 | @app.route('/stop_week/<stop_reference>') | |
455 | def stop_week(stop_reference): | |
456 | from buses import bus_stops | |
457 | from flask import request | |
458 | if 'routes' in request.args: | |
459 | filtered_routes = set(request.args['routes'].split(';')) | |
460 | route_filter = lambda route: route in filtered_routes | |
461 | else: | |
462 | route_filter = lambda route: True | |
463 | if 'dest' in request.args: | |
464 | dests = {bus_stops.get(dest, None) for dest in request.args['dest'].split(';')} | |
465 | dests.discard(None) | |
466 | dest_filter = lambda trip: any(trip.contains_stop(dest) for dest in dests) | |
467 | else: | |
468 | dest_filter = lambda trip: True | |
469 | schedule = [] | |
470 | try: | |
471 | bus_stop = bus_stops[stop_reference] | |
472 | except KeyError: | |
473 | abort(404) | |
474 | week_model = {} | |
475 | for schedule_entry in week_schedule(bus_stop, arrivals = True): | |
476 | route_ref = schedule_entry['trip'].route.reference | |
477 | if route_filter(route_ref) and dest_filter(schedule_entry['trip']): | |
478 | time = schedule_entry['time'] | |
479 | date = schedule_entry['date'] | |
480 | if date not in week_model: | |
481 | week_model[date] = {} | |
482 | day_model = week_model[date] | |
483 | if time.hour not in day_model: | |
484 | day_model[time.hour] = [] | |
485 | hour_model = day_model[time.hour] | |
486 | hour_model.append({ | |
487 | 'route': route_ref, | |
488 | 'route-splice': split_route_ref(route_ref), | |
489 | 'trip': schedule_entry['stop'].trip.name, | |
490 | 'night': is_night_time(schedule_entry['time']), | |
491 | 'minute': time.minute, | |
492 | }) | |
493 | week_model = [{'day': day, 'schedule': schedule, 'day-class': day_class(day.weekday())} for day, schedule in week_model.items()] | |
494 | week_model = sorted(week_model, key = lambda day: day['day']) | |
495 | from pprint import pprint | |
496 | pprint(week_model) | |
497 | return render_template( | |
498 | 'stop_week.html', | |
499 | ref = bus_stop.code, | |
500 | name = tr(bus_stop.name, 'bus-stops'), | |
501 | tr = tr, | |
502 | week = week_model, | |
503 | ) | |
504 | ||
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
505 | @app.route('/trip/<trip_reference>') |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
506 | def trip(trip_reference): |
2 | 507 | from flask import request |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
508 | 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
|
509 | from busroute import simplify_name |
3 | 510 | try: |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
511 | trip = all_trips[trip_reference] |
3 | 512 | except KeyError: |
513 | abort(404) | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
514 | schedule = [] |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
515 | region = '' |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
516 | for halt in trip.schedule: |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
517 | stop_time = datetime.combine(today(), time()) + halt.arrival_time |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
518 | formatted_time = time_representation(stop_time) |
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
519 | if profile['regions']['use-regions']: |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
520 | 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
|
521 | if len(schedule) and not schedule[-1]['name']: |
72 | 522 | 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
|
523 | else: |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
524 | schedule.append({ |
72 | 525 | '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
|
526 | 'time': formatted_time, |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
527 | 'stops': [], |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
528 | 'index': len(schedule), |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
529 | }) |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
530 | region = halt.stop.region |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
531 | else: |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
532 | schedule.append({ |
72 | 533 | '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
|
534 | 'time': formatted_time, |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
535 | 'stops': [], |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
536 | 'index': len(schedule), |
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
537 | }) |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
538 | schedule[-1]['stops'].append({ |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
539 | 'time': formatted_time, |
29 | 540 | 'id': halt.stop.reference, |
541 | 'code': halt.stop.code, | |
72 | 542 | 'name': tr(halt.stop.name, 'bus-stops', 'places'), |
0 | 543 | }) |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
544 | sign = trip.concise_schedule() |
29 | 545 | try: |
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
546 | sign = [simplify_name(sign[0]), simplify_name(sign[-1])] |
29 | 547 | except IndexError: |
548 | sign = [trip.schedule[0].stop.name, trip.schedule[-1].stop.name] | |
25
cb423946cf33
Uudelleennimetty templaatit
Teemu Piippo <teemu@hecknology.net>
parents:
24
diff
changeset
|
549 | return render_template('trip.html', |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
550 | schedule = schedule, |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
551 | trip_reference = trip_reference, |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
552 | route = trip.route.reference, |
72 | 553 | 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
|
554 | 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
|
555 | tr = tr, |
27 | 556 | length = trip.length / 1000, |
557 | ) | |
558 | ||
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
559 | @app.route('/route/<name>') |
27 | 560 | def route_page(name): |
561 | from buses import routes | |
562 | route = routes[name.upper()] | |
563 | schedule = [] | |
564 | for trip in route.trips: | |
565 | if trip.is_served_at(today()) and datetime.combine(today(), time()) + trip.schedule[-1].arrival_time < now(): | |
566 | schedule.append({ | |
567 | 'name': trip.reference, | |
568 | 'from': trip.from_place, | |
569 | 'to': trip.to_place, | |
570 | 'time': time_representation(datetime.combine(today(), time()) + trip.schedule[0].departure_time), | |
571 | }) | |
572 | return render_template('route.html', | |
573 | name = route.reference + ' ' + route.description, | |
574 | tr = tr, | |
575 | schedule = schedule, | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
576 | ) |
0 | 577 | |
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
578 | @app.route('/') |
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
579 | def index(): |
49 | 580 | return redirect('stop_cluster/kauppatori') |
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
581 | |
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
582 | @app.route('/pysäkki/<reference>') |
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
583 | def redirect_pysäkki(reference): |
50 | 584 | return redirect('stop/' + str(reference)) |
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
585 | |
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
586 | @app.route('/pysäkkiryhmä/<reference>') |
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
587 | def redirect_pysäkkiryhmä(reference): |
50 | 588 | return redirect('stop_cluster/' + str(reference)) |
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
589 | |
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
590 | @app.route('/ajovuoro/<reference>') |
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
591 | def redirect_ajovuoro(reference): |
50 | 592 | return redirect('trip/' + str(reference)) |
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
593 | |
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
|
594 | @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
|
595 | 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
|
596 | 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
|
597 | |
30 | 598 | from argparse import ArgumentParser |
599 | parser = ArgumentParser() | |
600 | parser.add_argument('gtfs_zip_path') | |
601 | parser.add_argument('profile_path') | |
602 | ||
0 | 603 | if __name__ == '__main__': |
2 | 604 | 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
|
605 | parser.add_argument('-d', '--debug', action = 'store_true') |
30 | 606 | |
607 | args = parser.parse_args() | |
608 | profile.read(args.profile_path) | |
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
609 | buses.load_buses(args.gtfs_zip_path) |
30 | 610 | |
611 | if __name__ == '__main__': | |
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
612 | app.run(debug = args.debug, port = args.port) |