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