Thu, 29 Mar 2018 23:55:36 +0300
updates
| 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 |
| 87 | 4 | from os import path, listdir, environ |
|
10
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 | |
| 87 | 8 | app = Flask(__name__) |
| 9 | ||
| 4 | 10 | from misc import * |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
11 | from busroute import reduce_schedule |
| 30 | 12 | import buses |
| 0 | 13 | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
14 | 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
|
15 | |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
16 | # Varmista ettei järjestelmän kieliasetukset sotke muotoiluja |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
17 | def reset_locale(): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
18 | locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()) |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
19 | |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
20 | def activate_locale(language = None): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
21 | language = language or language_for_page() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
22 | class result: |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
23 | def __enter__(self): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
24 | locale.setlocale(locale.LC_ALL, tr('locale', 'other', language = language)) |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
25 | def __exit__(self, *args): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
26 | reset_locale() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
27 | return result() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
28 | |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
29 | reset_locale() |
| 0 | 30 | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
31 | # Lataa käännökset |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
32 | class Translator: |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
33 | def __init__(self): |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
34 | self.languages = {} |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
35 | def load_language(self, file_path): |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
36 | 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
|
37 | ini = ConfigParser() |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
38 | ini.read(path.join(file_path)) |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
39 | 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
|
40 | 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
|
41 | 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
|
42 | for section in sections: |
|
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
43 | try: |
|
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
44 | 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
|
45 | except KeyError: |
| 72 | 46 | try: |
| 47 | return profile['tr:' + language + ':' + section][name] | |
| 48 | except KeyError: | |
| 49 | pass | |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
50 | else: |
| 72 | 51 | return name[:1].upper() + name[1:] |
| 5 | 52 | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
53 | tr = Translator() |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
54 | for file in listdir('tr'): |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
55 | tr.load_language(path.join('tr', file)) |
| 5 | 56 | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
57 | def language_for_page(): |
| 5 | 58 | from flask import request |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
59 | 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
|
60 | return None |
| 5 | 61 | else: |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
62 | for language_name in tr.languages: |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
63 | 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
|
64 | return language_name |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
65 | 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
|
66 | return request.accept_languages.best_match(tr.languages) |
| 5 | 67 | |
| 87 | 68 | def sign_elements(schedule_entry, format = 'medium'): |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
69 | from math import ceil |
| 87 | 70 | from busroute import greatly_simplify_name |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
71 | trip_length = schedule_entry['trip'].length - schedule_entry['stop'].traveled_distance |
| 87 | 72 | regions = schedule_entry['trip'].concise_schedule(schedule_entry['stop']) |
| 73 | if format == 'short': | |
| 74 | regions = [greatly_simplify_name(region) for region in regions] | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
75 | return reduce_schedule( |
| 87 | 76 | regions, |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
77 | trip_length = trip_length, |
| 87 | 78 | format = format) |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
79 | |
| 87 | 80 | def sign(schedule_entry, format = 'medium'): |
| 81 | sign = sign_elements(schedule_entry, format = format) | |
| 29 | 82 | if sign: |
| 72 | 83 | 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
|
84 | sign_representation += ''.join(' ' + tr(place, 'suffix-places') for place in sign if place in suffix_regions) |
| 29 | 85 | return sign_representation |
| 86 | else: | |
| 87 | 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
|
88 | |
| 87 | 89 | def long_form_sign(schedule_entry, format = 'long'): |
| 68 | 90 | from math import ceil |
| 91 | trip_length = schedule_entry['trip'].length - schedule_entry['stop'].traveled_distance | |
| 87 | 92 | sign = reduce_schedule(schedule_entry['trip'].concise_schedule(schedule_entry['stop']), trip_length = trip_length, format = format) |
| 68 | 93 | if sign: |
| 94 | return { | |
| 72 | 95 | 'destination': tr(sign[-1], 'places'), |
| 96 | 'via': [tr(place, 'places') for place in sign[:-1]], | |
| 68 | 97 | } |
| 98 | else: | |
| 99 | return { | |
| 100 | 'destination': schedule_entry['trip'].schedule[-1].stop.name, | |
| 101 | 'via': [], | |
| 102 | } | |
| 103 | ||
| 104 | ||
|
38
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
105 | def imminent(schedule_entry): |
|
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
106 | 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
|
107 | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
108 | 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
|
109 | for halt in trip.schedule: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
110 | if halt.stop.region == place: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
111 | return halt |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
112 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
113 | return None |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
114 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
115 | place_abbreviations = ConfigParser() |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
116 | place_abbreviations.read('abbreviations.ini') |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
117 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
118 | def place_abbreviation(place): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
119 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
120 | return place_abbreviations['abbreviations'][place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
121 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
122 | return place |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
123 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
124 | def trip_abbreviation(trip): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
125 | entries = [trip.from_place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
126 | old_places = None |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
127 | starting_halt = None |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
128 | while True: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
129 | remaining_length = trip.length |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
130 | if starting_halt: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
131 | remaining_length -= starting_halt.traveled_distance |
| 87 | 132 | places = reduce_schedule(trip.concise_schedule(starting_stop = starting_halt), trip_length = remaining_length, format = 'medium') |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
133 | new_places = set(places) - set(entries) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
134 | 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
|
135 | break |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
136 | for place in places: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
137 | if place in new_places: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
138 | 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
|
139 | entries += [place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
140 | break |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
141 | old_places = places |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
142 | if trip.to_place not in entries: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
143 | entries += [trip.to_place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
144 | return trip.route.reference + ':' + '-'.join(map(place_abbreviation, entries)) |
| 68 | 145 | |
| 77 | 146 | def split_route_ref(route_ref): |
| 147 | try: | |
| 148 | return list(parse_route_ref(route_ref)) | |
| 149 | except ValueError: | |
| 150 | return ['', route_ref, ''] | |
| 151 | ||
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
152 | @app.route('/stop/<reference>') |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
153 | def bus_stop_schedule(reference): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
154 | from buses import bus_stops |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
155 | schedule = [] |
| 3 | 156 | try: |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
157 | bus_stop = bus_stops[reference] |
| 3 | 158 | except KeyError: |
| 159 | abort(404) | |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
160 | for schedule_entry in bus_stop.schedule(max_amount = 100, arrivals = True): |
| 77 | 161 | route_ref = schedule_entry['trip'].route.reference |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
162 | schedule.append({ |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
163 | 'time': time_representation(schedule_entry['time']), |
| 77 | 164 | 'route': route_ref, |
| 165 | 'route-splice': split_route_ref(route_ref), | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
166 | 'sign': sign(schedule_entry), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
167 | 'trip': schedule_entry['stop'].trip.name, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
168 | '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
|
169 | 'imminent': imminent(schedule_entry), |
| 0 | 170 | }) |
| 5 | 171 | return render_template( |
|
25
cb423946cf33
Uudelleennimetty templaatit
Teemu Piippo <teemu@hecknology.net>
parents:
24
diff
changeset
|
172 | 'stop.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
173 | schedule = schedule, |
| 72 | 174 | 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
|
175 | link_to_map = bus_stop.location.link_to_map, |
| 72 | 176 | 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
|
177 | location = bus_stop.location, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
178 | 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
|
179 | tr = tr, |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
180 | ) |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
181 | |
| 74 | 182 | def week_schedule(bus_stop, **kwargs): |
| 183 | for i in range(-1, 7): | |
| 184 | yield from bus_stop.schedule_for_day(today() + timedelta(i), **kwargs) | |
| 185 | ||
| 186 | def route_key(route): | |
| 187 | match = re.search(r'^([a-zA-Z]*)(\d+)(.*)$', route) | |
| 188 | if match: | |
| 189 | groups = match.groups() | |
| 190 | return (groups[0], int(groups[1]), groups[2]) | |
| 191 | else: | |
| 192 | return (route,) | |
| 193 | ||
| 77 | 194 | def parse_route_ref(route_ref): |
| 195 | from re import search | |
| 196 | match = search(r'^([^0-9]*)([0-9]+)(.*)$', route_ref) | |
| 197 | try: | |
| 198 | return match.group(1), int(match.group(2)), match.group(3) | |
| 199 | except AttributeError: | |
| 200 | raise ValueError(route_ref) | |
| 201 | ||
| 87 | 202 | def condense_route_list(route_list): |
| 203 | def prepare_range_pool(range_pool): | |
| 204 | if len(range_pool) < 3: | |
| 205 | yield from map(str, range_pool) | |
| 206 | else: | |
| 207 | yield str(min(range_pool)) + '-' + str(max(range_pool)) | |
| 208 | range_pool = [] | |
| 209 | for route in route_list: | |
| 210 | try: | |
| 211 | route_int = int(route) | |
| 212 | except ValueError: | |
| 213 | yield from prepare_range_pool(range_pool) | |
| 214 | range_pool = [] | |
| 215 | yield route | |
| 216 | else: | |
| 217 | if not range_pool or route_int - 1 in range_pool: | |
| 218 | range_pool.append(route_int) | |
| 219 | else: | |
| 220 | yield from prepare_range_pool(range_pool) | |
| 221 | range_pool = [route_int] | |
| 222 | if range_pool: | |
| 223 | yield from prepare_range_pool(range_pool) | |
| 224 | ||
| 225 | def is_weekend_night(time): | |
| 226 | from datetime import timedelta | |
| 227 | adjusted_time = time - timedelta(hours = 4, minutes = 30) | |
| 228 | return adjusted_time.weekday() in [4, 5] and is_night_time(time) | |
| 229 | ||
| 230 | def describe(bus_stop): | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
231 | schedule = [] |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
232 | from collections import defaultdict, Counter |
| 87 | 233 | from busroute import greatly_simplify_name |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
234 | destinations_per_route = defaultdict(Counter) |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
235 | def route_key(route_ref): |
| 77 | 236 | try: |
| 237 | return parse_route_ref(route_ref) | |
| 238 | except ValueError: | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
239 | return () |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
240 | def filter_names(names): |
| 87 | 241 | if len(names) == 1 and names[0] == (bus_stop.region and greatly_simplify_name(bus_stop.region)): |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
242 | return type(names)() |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
243 | else: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
244 | return names |
| 74 | 245 | data = [] |
| 246 | names = [] | |
| 247 | from collections import defaultdict | |
| 248 | night_routes = defaultdict(lambda: True) | |
| 249 | num_leaves = 0 | |
| 87 | 250 | all_routes = Counter() |
| 74 | 251 | for schedule_entry in week_schedule(bus_stop, arrivals = True): #bus_stop.schedule(max_amount = 500, arrivals = True): |
| 87 | 252 | sign_tuple = tuple(sign_elements(schedule_entry, format = 'short')) |
| 253 | route = schedule_entry['trip'].route.reference | |
| 254 | night_routes[route] &= is_weekend_night(schedule_entry['time']) | |
| 255 | destinations_per_route[route][sign_tuple] += 1 | |
| 256 | all_routes[route] += 1 | |
| 74 | 257 | num_leaves += 1 |
| 258 | 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
|
259 | routes_per_destination = defaultdict(set) |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
260 | for route in destinations_per_route: |
| 74 | 261 | winner, count = destinations_per_route[route].most_common()[0] |
| 87 | 262 | if all_routes[route] >= 10 or all_routes[route] / num_leaves >= 0.01: |
| 74 | 263 | winner = filter_names(winner) |
| 264 | #destinations_per_route[route] = winner and ' - '.join(winner) or '' | |
| 265 | routes_per_destination[winner].add(route) | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
266 | for key in routes_per_destination: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
267 | routes_per_destination[key] = sorted(routes_per_destination[key], key = route_key) |
| 87 | 268 | def route_len(route): |
| 269 | length = 0 | |
| 270 | for char in route: | |
| 271 | if char.isdigit(): | |
| 272 | length += 1 | |
| 273 | else: | |
| 274 | break | |
| 275 | return length or len(route) | |
| 276 | from math import inf | |
| 277 | def route_key(route): | |
| 278 | return (route in night_routes, route_len(route), str(route)) | |
| 279 | def routes_key(routes): | |
| 280 | return min(route_key(route) for route in routes) | |
| 281 | result = [] | |
| 282 | for regions, routes in sorted( | |
| 283 | routes_per_destination.items(), | |
| 284 | key = lambda pair: routes_key(pair[1]) | |
| 285 | ): | |
| 286 | result.append(( | |
| 287 | list(condense_route_list(sorted(routes, key = route_key))), | |
| 288 | ' - '.join(tr(region, 'regions') for region in regions) | |
| 289 | )) | |
| 290 | return { | |
| 291 | 'night-routes': night_routes, | |
| 292 | 'all-night-routes': lambda entry, description: all(route in description['night-routes'] for route in entry[0]), | |
| 293 | 'simple': len(all_routes) <= 1, | |
| 294 | 'description': result, | |
| 295 | 'wtf': destinations_per_route, | |
| 296 | } | |
| 297 | ||
| 298 | @app.route('/stop_description/<reference>') | |
| 299 | def bus_stop_description(reference): | |
| 300 | from buses import bus_stops | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
301 | from pprint import pformat |
| 87 | 302 | try: |
| 303 | bus_stop = bus_stops[reference] | |
| 304 | except KeyError: | |
| 305 | abort(404) | |
| 306 | return '<pre>' + pformat(describe(bus_stop)) + '</pre>' | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
307 | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
308 | @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
|
309 | 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
|
310 | from buses import bus_stops, all_trips |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
311 | from busroute import simplify_name |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
312 | from flask import jsonify |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
313 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
314 | trip = all_trips[trip_reference] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
315 | bus_stop = bus_stops[stop] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
316 | 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
|
317 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
318 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
319 | except ValueError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
320 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
321 | 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
|
322 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
323 | @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
|
324 | 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
|
325 | from buses import trips_by_vehicle_info |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
326 | from flask import jsonify |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
327 | from datetime import timedelta |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
328 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
329 | 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
|
330 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
331 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
332 | return jsonify({ |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
333 | 'abbreviation': trip_abbreviation(trip), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
334 | }) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
335 | |
| 85 | 336 | def current_bus_day(): |
| 337 | from datetime import date, datetime, timedelta | |
| 338 | day = date.today() | |
| 339 | if datetime.now().hour < 5: | |
| 340 | day -= timedelta(1) | |
| 341 | return day | |
| 342 | ||
| 68 | 343 | @app.route('/stop_display/<reference>') |
| 344 | def stop_display(reference): | |
| 345 | from buses import bus_stops | |
| 346 | schedule = [] | |
| 347 | try: | |
| 348 | bus_stop = bus_stops[reference] | |
| 349 | except KeyError: | |
| 350 | abort(404) | |
| 85 | 351 | for i, schedule_entry in enumerate(bus_stop.schedule_for_day(current_bus_day(), arrivals = False)): |
| 68 | 352 | schedule.append({ |
| 353 | 'time_data': schedule_entry['time'], | |
| 354 | 'time': time_representation(schedule_entry['time']), | |
| 355 | 'route': schedule_entry['trip'].route.reference, | |
| 87 | 356 | 'sign': long_form_sign(schedule_entry, format = 'medium'), |
| 68 | 357 | 'trip': schedule_entry['stop'].trip.name, |
| 358 | 'night': is_night_time(schedule_entry['time']), | |
| 359 | 'imminent': imminent(schedule_entry), | |
| 360 | 'index': i, | |
| 361 | }) | |
| 362 | from pprint import pprint | |
| 363 | pprint(schedule) | |
| 76 | 364 | def destination_key(schedule_entry): |
| 365 | sign = schedule_entry['sign'] | |
| 366 | return (sign['destination'],) + tuple(sign['via']) | |
| 367 | def filter_schedule(schedule, *, key): | |
| 368 | used = set() | |
| 369 | for schedule_entry in schedule: | |
| 370 | key_value = key(schedule_entry) | |
| 371 | if key_value not in used: | |
| 372 | used.add(key_value) | |
| 373 | yield schedule_entry | |
| 374 | schedule = list(filter_schedule(schedule, key = destination_key))[:6] | |
| 68 | 375 | if schedule: |
| 376 | 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)])) | |
| 377 | else: | |
| 378 | num_imminent_leaves = 1 | |
| 379 | return render_template( | |
| 380 | 'stop_display.html', | |
| 381 | schedule = schedule, | |
| 382 | ref = bus_stop.code, | |
| 383 | name = tr(bus_stop.name, 'bus-stops'), | |
| 384 | link_to_map = bus_stop.location.link_to_map, | |
| 385 | region = bus_stop.region, | |
| 386 | location = bus_stop.location, | |
| 387 | cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, | |
| 388 | num_imminent_leaves = num_imminent_leaves, | |
| 389 | tr = tr, | |
| 390 | ) | |
| 391 | ||
| 392 | @app.route('/test') | |
| 393 | def test(): | |
| 394 | from buses import bus_stops | |
| 395 | bus_stop = bus_stops['16'] | |
| 396 | schedule = [{'imminent': True, | |
| 397 | 'index': 0, | |
| 398 | 'night': False, | |
| 399 | 'route': '2A', | |
| 400 | 'sign': {'destination': 'Kohmo', 'via': ['Nummenmäki', 'Kurala']}, | |
| 401 | 'time': '1m', | |
| 402 | 'trip': '00012501__3798generatedBlock'}, | |
| 403 | {'imminent': True, | |
| 404 | 'index': 1, | |
| 405 | 'night': False, | |
| 406 | 'route': '54', | |
| 407 | 'sign': {'destination': 'Ylioppilaskylä', 'via': []}, | |
| 408 | 'time': '2m', | |
| 409 | 'trip': '00014359__5656generatedBlock'}, | |
| 410 | {'imminent': True, | |
| 411 | 'index': 2, | |
| 412 | 'night': False, | |
| 413 | 'route': '1', | |
| 414 | 'sign': {'destination': 'Lentoasema ✈', 'via': ['Urusvuori']}, | |
| 415 | 'time': '3m', | |
| 416 | 'trip': '00010281__1281generatedBlock'}, | |
| 417 | {'imminent': False, | |
| 418 | 'index': 3, | |
| 419 | 'night': False, | |
| 420 | 'route': '56', | |
| 421 | 'sign': {'destination': 'Räntämäki', 'via': ['Nummenmäki', 'Halinen']}, | |
| 422 | 'time': '8m', | |
| 423 | 'trip': '00014686__5983generatedBlock'}, | |
| 424 | {'imminent': False, | |
| 425 | 'index': 4, | |
| 426 | 'night': False, | |
| 427 | 'route': '42', | |
| 428 | 'sign': {'destination': 'Varissuo', 'via': ['Kupittaa as', 'Itäharju']}, | |
| 429 | 'time': '18:30', | |
| 430 | 'trip': '00014010__5307generatedBlock'}, | |
| 431 | {'imminent': False, | |
| 432 | 'index': 5, | |
| 433 | 'night': False, | |
| 434 | 'route': '2B', | |
| 435 | 'sign': {'destination': 'Littoinen', | |
| 436 | 'via': ['Nummenmäki', 'Kurala', 'Kohmo']}, | |
| 437 | 'time': '18:35', | |
| 438 | 'trip': '00012629__3926generatedBlock'}] | |
| 439 | return render_template( | |
| 440 | 'stop_display.html', | |
| 441 | schedule = schedule, | |
| 442 | ref = bus_stop.code, | |
| 443 | name = tr(bus_stop.name, 'bus-stops'), | |
| 444 | link_to_map = bus_stop.location.link_to_map, | |
| 445 | region = bus_stop.region, | |
| 446 | location = bus_stop.location, | |
| 447 | cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, | |
| 448 | num_imminent_leaves = max(1, sum(schedule_entry['imminent'] for schedule_entry in schedule)), | |
| 449 | tr = tr, | |
| 450 | ) | |
| 451 | ||
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
452 | def time_representation(time, relative = True): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
453 | time_difference = time - now() |
|
42
0b53b7c70875
Näytä myös aikataulut jotka ovat minuutti sitten menneet
teemu
parents:
38
diff
changeset
|
454 | 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
|
455 | return tr('right-now', 'misc-text') |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
456 | 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
|
457 | return '%dm' % round(time_difference.seconds / 60) |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
458 | elif time.date() == today(): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
459 | return '%d:%02d' % (time.hour, time.minute) |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
460 | elif time_difference < timedelta(7): |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
461 | with activate_locale(): |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
462 | return time.strftime('%-a %H:%M').replace(' ', '\xa0') |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
463 | else: |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
464 | with activate_locale(): |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
465 | return time.strftime('%-d.%-m. %H:%M').replace(' ', '\xa0') |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
466 | |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
467 | @app.route('/stop_cluster/<cluster_name>') |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
468 | def cluster_schedule(cluster_name): |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
469 | from buses import bus_stops, clusters_by_name |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
470 | schedule = [] |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
471 | try: |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
472 | cluster = clusters_by_name[cluster_name] |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
473 | except KeyError: |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
474 | abort(404) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
475 | 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
|
476 | schedule.append({ |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
477 | 'time': time_representation(schedule_entry['time']), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
478 | 'route': schedule_entry['trip'].route.reference, |
| 77 | 479 | '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
|
480 | 'sign': sign(schedule_entry), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
481 | 'trip': schedule_entry['stop'].trip.name, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
482 | 'night': is_night_time(schedule_entry['time']), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
483 | 'stop_id': schedule_entry['stop'].stop.reference, |
| 29 | 484 | 'stop_code': schedule_entry['stop'].stop.code, |
| 72 | 485 | '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
|
486 | 'imminent': imminent(schedule_entry), |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
487 | }) |
| 27 | 488 | stops_in_cluster = sorted( |
| 489 | ({ | |
| 490 | 'id': stop.reference, | |
| 29 | 491 | 'code': stop.code, |
| 63 | 492 | 'name': tr(stop.name, 'bus-stops'), |
| 27 | 493 | } for stop in cluster.stops), |
| 494 | key = lambda stop: (len(stop['id']), stop['id']) | |
| 495 | ) | |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
496 | return render_template( |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
497 | 'cluster.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
498 | schedule = schedule, |
| 72 | 499 | 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
|
500 | link_to_map = cluster.center.link_to_map, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
501 | location = cluster.center, |
| 27 | 502 | stops_in_cluster = stops_in_cluster, |
| 503 | amount_of_stops_in_cluster = len(stops_in_cluster), | |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
504 | tr = tr, |
| 5 | 505 | ) |
| 0 | 506 | |
| 77 | 507 | def day_class(weekday): |
| 508 | if weekday < 5: | |
| 509 | return 'working-day' | |
| 510 | elif weekday == 5: | |
| 511 | return 'saturday' | |
| 512 | else: | |
| 513 | assert weekday == 6 | |
| 514 | return 'sunday' | |
| 515 | ||
| 516 | @app.route('/stop_week/<stop_reference>') | |
| 517 | def stop_week(stop_reference): | |
| 518 | from buses import bus_stops | |
| 519 | from flask import request | |
| 520 | if 'routes' in request.args: | |
| 521 | filtered_routes = set(request.args['routes'].split(';')) | |
| 522 | route_filter = lambda route: route in filtered_routes | |
| 523 | else: | |
| 524 | route_filter = lambda route: True | |
| 525 | if 'dest' in request.args: | |
| 526 | dests = {bus_stops.get(dest, None) for dest in request.args['dest'].split(';')} | |
| 527 | dests.discard(None) | |
| 528 | dest_filter = lambda trip: any(trip.contains_stop(dest) for dest in dests) | |
| 529 | else: | |
| 530 | dest_filter = lambda trip: True | |
| 531 | schedule = [] | |
| 532 | try: | |
| 533 | bus_stop = bus_stops[stop_reference] | |
| 534 | except KeyError: | |
| 535 | abort(404) | |
| 536 | week_model = {} | |
| 537 | for schedule_entry in week_schedule(bus_stop, arrivals = True): | |
| 538 | route_ref = schedule_entry['trip'].route.reference | |
| 539 | if route_filter(route_ref) and dest_filter(schedule_entry['trip']): | |
| 540 | time = schedule_entry['time'] | |
| 541 | date = schedule_entry['date'] | |
| 542 | if date not in week_model: | |
| 543 | week_model[date] = {} | |
| 544 | day_model = week_model[date] | |
| 545 | if time.hour not in day_model: | |
| 546 | day_model[time.hour] = [] | |
| 547 | hour_model = day_model[time.hour] | |
| 548 | hour_model.append({ | |
| 549 | 'route': route_ref, | |
| 550 | 'route-splice': split_route_ref(route_ref), | |
| 551 | 'trip': schedule_entry['stop'].trip.name, | |
| 552 | 'night': is_night_time(schedule_entry['time']), | |
| 553 | 'minute': time.minute, | |
| 554 | }) | |
|
79
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
555 | for day_offset in range(7): |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
556 | from datetime import date, datetime, timedelta |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
557 | day = date.today() + timedelta(day_offset) |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
558 | try: |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
559 | day_model = week_model[day] |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
560 | except KeyError: |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
561 | week_model[day] = {} |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
562 | else: |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
563 | def hour_key(x): |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
564 | return (x - 5) % 24 |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
565 | # Fill in missing hours from 5am to last active hour |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
566 | hours = set(day_model.keys()) | {5} |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
567 | sorted_hours = sorted(hours, key = hour_key) |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
568 | start_hour = sorted_hours[0] |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
569 | end_hour = sorted_hours[-1] + 1 |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
570 | for hour in range(start_hour, end_hour): |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
571 | hour_start = datetime(day.year, day.month, day.day, hour, 0) |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
572 | if hour not in day_model and hour_start >= datetime.now(): |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
573 | day_model[hour] = [] |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
574 | # Sort the hours, so that 5am is first and 4am is last. |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
575 | from collections import OrderedDict |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
576 | week_model[day] = OrderedDict( |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
577 | sorted( |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
578 | day_model.items(), |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
579 | key = lambda pair: hour_key(pair[0]), |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
580 | ) |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
581 | ) |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
582 | week_model = [ |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
583 | { |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
584 | 'day': day, |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
585 | 'schedule': schedule, |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
586 | 'day-class': day_class(day.weekday()) |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
587 | } for day, schedule in week_model.items() |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
588 | ] |
| 77 | 589 | week_model = sorted(week_model, key = lambda day: day['day']) |
| 590 | return render_template( | |
| 591 | 'stop_week.html', | |
| 592 | ref = bus_stop.code, | |
| 593 | name = tr(bus_stop.name, 'bus-stops'), | |
| 594 | tr = tr, | |
| 595 | week = week_model, | |
| 87 | 596 | description = describe(bus_stop), |
| 77 | 597 | ) |
| 598 | ||
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
599 | @app.route('/trip/<trip_reference>') |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
600 | def trip(trip_reference): |
| 2 | 601 | from flask import request |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
602 | 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
|
603 | from busroute import simplify_name |
| 3 | 604 | try: |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
605 | trip = all_trips[trip_reference] |
| 3 | 606 | except KeyError: |
| 607 | abort(404) | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
608 | schedule = [] |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
609 | region = '' |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
610 | for halt in trip.schedule: |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
611 | stop_time = datetime.combine(today(), time()) + halt.arrival_time |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
612 | formatted_time = time_representation(stop_time) |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
613 | if profile['regions']['use-regions']: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
614 | 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
|
615 | if len(schedule) and not schedule[-1]['name']: |
| 72 | 616 | 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
|
617 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
618 | schedule.append({ |
| 72 | 619 | '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
|
620 | 'time': formatted_time, |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
621 | 'stops': [], |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
622 | 'index': len(schedule), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
623 | }) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
624 | region = halt.stop.region |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
625 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
626 | schedule.append({ |
| 72 | 627 | '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
|
628 | 'time': formatted_time, |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
629 | 'stops': [], |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
630 | 'index': len(schedule), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
631 | }) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
632 | schedule[-1]['stops'].append({ |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
633 | 'time': formatted_time, |
| 29 | 634 | 'id': halt.stop.reference, |
| 635 | 'code': halt.stop.code, | |
| 72 | 636 | 'name': tr(halt.stop.name, 'bus-stops', 'places'), |
| 0 | 637 | }) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
638 | sign = trip.concise_schedule() |
| 29 | 639 | try: |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
640 | sign = [simplify_name(sign[0]), simplify_name(sign[-1])] |
| 29 | 641 | except IndexError: |
| 642 | sign = [trip.schedule[0].stop.name, trip.schedule[-1].stop.name] | |
|
25
cb423946cf33
Uudelleennimetty templaatit
Teemu Piippo <teemu@hecknology.net>
parents:
24
diff
changeset
|
643 | return render_template('trip.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
644 | schedule = schedule, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
645 | trip_reference = trip_reference, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
646 | route = trip.route.reference, |
| 72 | 647 | 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
|
648 | 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
|
649 | tr = tr, |
| 27 | 650 | length = trip.length / 1000, |
| 651 | ) | |
| 652 | ||
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
653 | @app.route('/route/<name>') |
| 27 | 654 | def route_page(name): |
| 655 | from buses import routes | |
| 656 | route = routes[name.upper()] | |
| 657 | schedule = [] | |
| 658 | for trip in route.trips: | |
| 659 | if trip.is_served_at(today()) and datetime.combine(today(), time()) + trip.schedule[-1].arrival_time < now(): | |
| 660 | schedule.append({ | |
| 661 | 'name': trip.reference, | |
| 662 | 'from': trip.from_place, | |
| 663 | 'to': trip.to_place, | |
| 664 | 'time': time_representation(datetime.combine(today(), time()) + trip.schedule[0].departure_time), | |
| 665 | }) | |
| 666 | return render_template('route.html', | |
| 667 | name = route.reference + ' ' + route.description, | |
| 668 | tr = tr, | |
| 669 | schedule = schedule, | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
670 | ) |
| 0 | 671 | |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
672 | @app.route('/') |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
673 | def index(): |
| 49 | 674 | return redirect('stop_cluster/kauppatori') |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
675 | |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
676 | @app.route('/pysäkki/<reference>') |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
677 | def redirect_pysäkki(reference): |
| 50 | 678 | return redirect('stop/' + str(reference)) |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
679 | |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
680 | @app.route('/pysäkkiryhmä/<reference>') |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
681 | def redirect_pysäkkiryhmä(reference): |
| 50 | 682 | return redirect('stop_cluster/' + str(reference)) |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
683 | |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
684 | @app.route('/ajovuoro/<reference>') |
|
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
685 | def redirect_ajovuoro(reference): |
| 50 | 686 | return redirect('trip/' + str(reference)) |
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
687 | |
|
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
|
688 | @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
|
689 | 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
|
690 | 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
|
691 | |
| 30 | 692 | from argparse import ArgumentParser |
| 693 | parser = ArgumentParser() | |
| 694 | parser.add_argument('gtfs_zip_path') | |
| 695 | parser.add_argument('profile_path') | |
| 696 | ||
| 0 | 697 | if __name__ == '__main__': |
| 2 | 698 | 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
|
699 | parser.add_argument('-d', '--debug', action = 'store_true') |
| 30 | 700 | |
| 701 | args = parser.parse_args() | |
| 702 | profile.read(args.profile_path) | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
703 | buses.load_buses(args.gtfs_zip_path) |
| 30 | 704 | |
| 705 | if __name__ == '__main__': | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
706 | app.run(debug = args.debug, port = args.port) |