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