Thu, 06 Dec 2018 19:35:38 +0200
bus live information
| 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 |
| 87 | 7 | app = Flask(__name__) |
| 4 | 8 | from misc import * |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
9 | from busroute import reduce_schedule |
| 30 | 10 | import buses |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
11 | regions = {} |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
12 | |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
13 | def reset_locale(): |
| 127 | 14 | ''' |
| 15 | Resets the locale to system so that the system language settings | |
| 16 | do not mess with the formatting. | |
| 17 | ''' | |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
18 | locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()) |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
19 | |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
20 | def activate_locale(language = None): |
| 127 | 21 | ''' |
| 22 | Activates either the locale for the provided language, or the default locale. | |
| 23 | Returns such an object that resets the locale upon function exit. | |
| 24 | ''' | |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
25 | language = language or language_for_page() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
26 | class result: |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
27 | def __enter__(self): |
| 127 | 28 | if language: |
| 29 | locale.setlocale(locale.LC_ALL, tr('locale', 'other', language = language)) | |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
30 | def __exit__(self, *args): |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
31 | reset_locale() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
32 | return result() |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
33 | |
| 127 | 34 | def simplify_name(region_name, replace = False): |
| 35 | region = regions.get(region_name) | |
| 36 | if region: | |
| 37 | if replace and 'replacement' in region: | |
| 38 | return simplify_name(region['replacement']) | |
| 39 | return tr(region.get('name', region_name), 'region_short_name', default = region.get('short_name', region_name)) | |
| 40 | else: | |
| 41 | return tr(region_name, 'region_short_name') | |
| 42 | ||
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
43 | reset_locale() |
| 0 | 44 | |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
45 | # Load translations |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
46 | class Translator: |
| 127 | 47 | def __init__(self, languages = None): |
| 48 | self.languages = languages or dict() | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
49 | def load_language(self, file_path): |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
50 | 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
|
51 | ini = ConfigParser() |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
52 | ini.read(path.join(file_path)) |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
53 | self.languages[language_name] = ini |
| 127 | 54 | def __call__(self, name, *sections, language = None, default = None): |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
55 | 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
|
56 | for section in sections: |
|
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
57 | try: |
| 127 | 58 | print('Trying:', repr(language), repr(section), repr(name)) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
59 | 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
|
60 | except KeyError: |
| 72 | 61 | try: |
| 62 | return profile['tr:' + language + ':' + section][name] | |
| 63 | except KeyError: | |
| 64 | pass | |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
65 | else: |
| 127 | 66 | return default or (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
|
67 | def load_region(self, region): |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
68 | 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
|
69 | if ':' in key: |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
70 | name_type, language = key.split(':', 1) |
| 127 | 71 | if name_type.endswith('name') and language != '': |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
72 | section = 'region_' + name_type |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
73 | 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
|
74 | self.languages[language][section] = {} |
| 127 | 75 | print(repr(language), repr(section), repr(region['name']), '=', repr(value)) |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
76 | 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
|
77 | def load_regions(self, regions): |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
78 | for region in regions.values(): |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
79 | self.load_region(region) |
| 127 | 80 | def __repr__(self): |
| 81 | return 'Translator(languages = ' + repr(self.languages) + ')' | |
| 5 | 82 | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
83 | tr = Translator() |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
84 | for file in listdir('tr'): |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
85 | tr.load_language(path.join('tr', file)) |
| 5 | 86 | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
87 | def language_for_page(): |
| 127 | 88 | ''' |
| 89 | Returns the code of which language to use for the page. | |
| 90 | ''' | |
| 5 | 91 | from flask import request |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
92 | 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
|
93 | return None |
| 5 | 94 | else: |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
95 | for language_name in tr.languages: |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
96 | 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
|
97 | return language_name |
|
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
98 | 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
|
99 | return request.accept_languages.best_match(tr.languages) |
| 5 | 100 | |
| 87 | 101 | def sign_elements(schedule_entry, format = 'medium'): |
| 127 | 102 | ''' |
| 103 | For an entry in a bus stop schedule, find out where the connection is leading to. | |
| 104 | Returns a list of places, possibly empty. | |
| 105 | ''' | |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
106 | from math import ceil |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
107 | trip_length = schedule_entry['trip'].length - schedule_entry['stop'].traveled_distance |
| 87 | 108 | 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
|
109 | return [ |
| 90 | 110 | name |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
111 | for name in reduce_schedule( |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
112 | regions, |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
113 | trip_length = trip_length, |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
114 | format = format |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
115 | ) |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
116 | ] |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
117 | |
| 87 | 118 | def sign(schedule_entry, format = 'medium'): |
| 127 | 119 | ''' |
| 120 | For an entry in a bus stop schedule, find out where the connection is leading to. | |
| 121 | Returns a string. | |
| 122 | ''' | |
| 87 | 123 | sign = sign_elements(schedule_entry, format = format) |
| 29 | 124 | if sign: |
| 127 | 125 | return ' - '.join(tr(simplify_name(place), 'region_name', 'region_short_name') for place in sign) |
| 29 | 126 | else: |
| 127 | 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
|
128 | |
| 87 | 129 | def long_form_sign(schedule_entry, format = 'long'): |
| 68 | 130 | from math import ceil |
| 131 | trip_length = schedule_entry['trip'].length - schedule_entry['stop'].traveled_distance | |
| 87 | 132 | sign = reduce_schedule(schedule_entry['trip'].concise_schedule(schedule_entry['stop']), trip_length = trip_length, format = format) |
| 68 | 133 | if sign: |
| 134 | return { | |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
135 | '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
|
136 | 'via': [tr(place, 'region_short_name') for place in sign[:-1]], |
| 68 | 137 | } |
| 138 | else: | |
| 139 | return { | |
| 140 | 'destination': schedule_entry['trip'].schedule[-1].stop.name, | |
| 141 | 'via': [], | |
| 142 | } | |
| 143 | ||
| 144 | ||
|
38
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
145 | def imminent(schedule_entry): |
|
d0ae1996abdd
Lisätty vilkkuvat merkit hetken päästä lähteville
Teemu Piippo <teemu@hecknology.net>
parents:
31
diff
changeset
|
146 | 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
|
147 | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
148 | 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
|
149 | for halt in trip.schedule: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
150 | if halt.stop.region == place: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
151 | return halt |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
152 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
153 | return None |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
154 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
155 | place_abbreviations = ConfigParser() |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
156 | place_abbreviations.read('abbreviations.ini') |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
157 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
158 | def place_abbreviation(place): |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
159 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
160 | return place_abbreviations['abbreviations'][place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
161 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
162 | return place |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
163 | |
|
94
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
164 | def trip_description(trip): |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
165 | entries = [trip.from_place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
166 | old_places = None |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
167 | starting_halt = None |
|
98
c07a77c8a070
fixes, updates, new regions + priorities
Teemu Piippo <teemu@hecknology.net>
parents:
94
diff
changeset
|
168 | while len(entries) < 3: |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
169 | remaining_length = trip.length |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
170 | if starting_halt: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
171 | remaining_length -= starting_halt.traveled_distance |
|
98
c07a77c8a070
fixes, updates, new regions + priorities
Teemu Piippo <teemu@hecknology.net>
parents:
94
diff
changeset
|
172 | places = reduce_schedule(trip.concise_schedule(starting_stop = starting_halt), trip_length = remaining_length, format = 'short') |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
173 | new_places = set(places) - set(entries) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
174 | 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
|
175 | break |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
176 | for place in places: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
177 | if place in new_places: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
178 | 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
|
179 | entries += [place] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
180 | break |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
181 | old_places = places |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
182 | if trip.to_place not in entries: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
183 | entries += [trip.to_place] |
|
94
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
184 | return entries |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
185 | |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
186 | def trip_abbreviation(trip): |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
187 | return trip.route.reference + ':' + '-'.join(map(place_abbreviation, trip_description(trip))) |
| 68 | 188 | |
| 77 | 189 | def split_route_ref(route_ref): |
| 190 | try: | |
| 191 | return list(parse_route_ref(route_ref)) | |
| 192 | except ValueError: | |
| 193 | return ['', route_ref, ''] | |
| 194 | ||
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
195 | @app.route('/stop/<reference>') |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
196 | def bus_stop_schedule(reference): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
197 | from buses import bus_stops |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
198 | schedule = [] |
| 3 | 199 | try: |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
200 | bus_stop = bus_stops[reference] |
| 3 | 201 | except KeyError: |
| 202 | abort(404) | |
| 127 | 203 | for schedule_entry in bus_stop.schedule(max_amount = 100, max_past = 4, arrivals = True): |
| 77 | 204 | route_ref = schedule_entry['trip'].route.reference |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
205 | schedule.append({ |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
206 | 'time': time_representation(schedule_entry['time']), |
| 127 | 207 | 'timestamp': int(schedule_entry['time'].timestamp()), |
| 77 | 208 | 'route': route_ref, |
| 209 | 'route-splice': split_route_ref(route_ref), | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
210 | 'sign': sign(schedule_entry), |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
211 | 'trip': schedule_entry['stop'].trip.name, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
212 | '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
|
213 | 'imminent': imminent(schedule_entry), |
| 127 | 214 | 'id': str(schedule_entry['stop'].uuid), |
| 215 | 'gone': schedule_entry['gone'], | |
| 0 | 216 | }) |
| 5 | 217 | return render_template( |
|
25
cb423946cf33
Uudelleennimetty templaatit
Teemu Piippo <teemu@hecknology.net>
parents:
24
diff
changeset
|
218 | 'stop.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
219 | schedule = schedule, |
| 109 | 220 | ref = bus_stop.code, |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
221 | 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
|
222 | 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
|
223 | 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
|
224 | location = bus_stop.location, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
225 | 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
|
226 | tr = tr, |
| 90 | 227 | typename = bus_stop.typename, |
| 93 | 228 | service = min(bus_stop.services), |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
229 | ) |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
230 | |
| 105 | 231 | def week_schedule(bus_stop, start_date = today(), **kwargs): |
| 109 | 232 | for i in range(7): |
| 90 | 233 | try: |
| 105 | 234 | yield from bus_stop.schedule_for_day(start_date + timedelta(i), **kwargs) |
| 90 | 235 | except ValueError: |
| 236 | # went outside bounds | |
| 237 | return | |
| 74 | 238 | |
| 239 | def route_key(route): | |
| 240 | match = re.search(r'^([a-zA-Z]*)(\d+)(.*)$', route) | |
| 241 | if match: | |
| 242 | groups = match.groups() | |
| 243 | return (groups[0], int(groups[1]), groups[2]) | |
| 244 | else: | |
| 245 | return (route,) | |
| 246 | ||
| 77 | 247 | def parse_route_ref(route_ref): |
| 248 | from re import search | |
| 249 | match = search(r'^([^0-9]*)([0-9]+)(.*)$', route_ref) | |
| 250 | try: | |
| 251 | return match.group(1), int(match.group(2)), match.group(3) | |
| 252 | except AttributeError: | |
| 253 | raise ValueError(route_ref) | |
| 254 | ||
| 87 | 255 | def condense_route_list(route_list): |
| 256 | def prepare_range_pool(range_pool): | |
| 257 | if len(range_pool) < 3: | |
| 258 | yield from map(str, range_pool) | |
| 259 | else: | |
| 260 | yield str(min(range_pool)) + '-' + str(max(range_pool)) | |
| 261 | range_pool = [] | |
| 262 | for route in route_list: | |
| 263 | try: | |
| 264 | route_int = int(route) | |
| 265 | except ValueError: | |
| 266 | yield from prepare_range_pool(range_pool) | |
| 267 | range_pool = [] | |
| 268 | yield route | |
| 269 | else: | |
| 270 | if not range_pool or route_int - 1 in range_pool: | |
| 271 | range_pool.append(route_int) | |
| 272 | else: | |
| 273 | yield from prepare_range_pool(range_pool) | |
| 274 | range_pool = [route_int] | |
| 275 | if range_pool: | |
| 276 | yield from prepare_range_pool(range_pool) | |
| 277 | ||
| 278 | def is_weekend_night(time): | |
| 279 | from datetime import timedelta | |
| 280 | adjusted_time = time - timedelta(hours = 4, minutes = 30) | |
| 281 | return adjusted_time.weekday() in [4, 5] and is_night_time(time) | |
| 282 | ||
| 127 | 283 | encircled = '⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵' |
| 284 | #encircled = 'ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ' | |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
285 | |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
286 | def encircle(char): |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
287 | from string import ascii_uppercase |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
288 | try: |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
289 | return encircled[ascii_uppercase.index(char.upper())] |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
290 | except IndexError: |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
291 | return char |
|
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 variant_abbreviations(variants): |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
294 | '''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
|
295 | suggestion = [variant[-1][0].upper() for variant in variants] |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
296 | if len(set(suggestion)) != len(suggestion): |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
297 | from string import ascii_uppercase |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
298 | suggestion = ascii_uppercase |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
299 | return dict(zip(variants, suggestion)) |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
300 | |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
301 | def schedule_entry_hash(schedule_entry): |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
302 | return schedule_entry['trip'].name, schedule_entry['time'] |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
303 | |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
304 | def describe(bus_stop, week_schedule): |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
305 | schedule = [] |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
306 | 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
|
307 | from busroute import simplify_name |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
308 | destinations_per_route = defaultdict(Counter) |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
309 | counts_per_variant = {} |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
310 | def route_key(route_ref): |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
311 | from math import log |
| 77 | 312 | try: |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
313 | return () + parse_route_ref(route_ref) |
| 77 | 314 | except ValueError: |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
315 | return () |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
316 | def filter_names(names): |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
317 | 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
|
318 | return type(names)() |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
319 | else: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
320 | return names |
| 74 | 321 | data = [] |
| 322 | names = [] | |
| 323 | from collections import defaultdict | |
| 324 | night_routes = defaultdict(lambda: True) | |
| 325 | num_leaves = 0 | |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
326 | trip_mapping = {} |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
327 | for schedule_entry in week_schedule: |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
328 | from busroute import greatly_simplify_name |
| 87 | 329 | 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
|
330 | sign_tuple = tuple(greatly_simplify_name(k) for k in sign_tuple) |
| 87 | 331 | route = schedule_entry['trip'].route.reference |
| 109 | 332 | night_routes[route] &= is_night_time(schedule_entry['time']) |
| 87 | 333 | destinations_per_route[route][sign_tuple] += 1 |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
334 | trip_mapping[schedule_entry_hash(schedule_entry)] = (route, sign_tuple) |
| 74 | 335 | num_leaves += 1 |
| 336 | 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
|
337 | routes_per_destination = defaultdict(set) |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
338 | all_variants = [] |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
339 | variant_names = {} |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
340 | # Collect all variants |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
341 | for route, tally in destinations_per_route.items(): |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
342 | variants = variant_abbreviations(tally.keys()) |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
343 | winner, count = tally.most_common()[0] |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
344 | for destination, count in tally.items(): |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
345 | route_name = route |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
346 | if destination != winner: |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
347 | route_name += encircle(variants[destination]) |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
348 | if route in night_routes: |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
349 | night_routes.add(route_name) |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
350 | variant_names[route, destination] = route_name |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
351 | all_variants.append({ |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
352 | 'name': route_name, |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
353 | 'destination': filter_names(destination), |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
354 | 'count': count |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
355 | }) |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
356 | counts_per_variant[route_name] = count |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
357 | all_variants.sort(key = lambda k: k['count']) |
| 127 | 358 | def route_limit(route): |
| 359 | return (route in night_routes) and 6 or 20 | |
| 360 | rare_variants = {variant['name'] for variant in all_variants if variant['count'] < route_limit(variant['name'])} | |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
361 | route_variant_count = len(all_variants) |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
362 | for variant in all_variants: |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
363 | routes_per_destination[variant['destination']].add(variant['name']) |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
364 | for key in routes_per_destination: |
|
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
365 | routes_per_destination[key] = sorted(routes_per_destination[key], key = route_key) |
| 87 | 366 | def route_len(route): |
| 367 | length = 0 | |
| 368 | for char in route: | |
| 369 | if char.isdigit(): | |
| 370 | length += 1 | |
| 371 | else: | |
| 372 | break | |
| 373 | return length or len(route) | |
| 374 | from math import inf | |
| 375 | def route_key(route): | |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
376 | from math import log |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
377 | return ( |
| 127 | 378 | counts_per_variant.get(route, 0) < route_limit(route), |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
379 | route in night_routes, |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
380 | route_len(route), |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
381 | str(route) |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
382 | ) |
| 87 | 383 | def routes_key(routes): |
| 384 | return min(route_key(route) for route in routes) | |
| 127 | 385 | # Convert routes per destination to item pairs so that we can split it into rare and non-rare |
| 386 | route_destination_pairs = list() | |
| 387 | for regions, routes in routes_per_destination.items(): | |
| 388 | common_routes = set(route for route in routes if counts_per_variant[route] >= route_limit(route)) | |
| 389 | rare_routes = set(routes) - common_routes | |
| 390 | if common_routes: | |
| 391 | route_destination_pairs.append((regions, common_routes)) | |
| 392 | if rare_routes: | |
| 393 | route_destination_pairs.append((regions, rare_routes)) | |
| 87 | 394 | result = [] |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
395 | rare_variant_groups = set() |
| 127 | 396 | for regions, routes in sorted(route_destination_pairs, key = lambda pair: routes_key(pair[1])): |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
397 | routes_tuple = tuple(condense_route_list(sorted(routes, key = route_key))) |
| 87 | 398 | result.append(( |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
399 | routes_tuple, |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
400 | ' - '.join(tr(region, 'region_short_name') for region in regions) |
| 87 | 401 | )) |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
402 | if all(variant in rare_variants for variant in routes): |
|
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
403 | rare_variant_groups.add(routes_tuple) |
| 87 | 404 | return { |
| 405 | 'night-routes': night_routes, | |
| 406 | '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
|
407 | 'simple': route_variant_count <= 1, |
| 87 | 408 | 'description': result, |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
409 | 'variant-map': {k:variant_names[v] for k, v in trip_mapping.items()}, |
|
92
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
410 | 'rare-variants': rare_variants, |
|
16a5c37e4e67
stop_week now shows rare variants with less emphasis
Teemu Piippo <teemu@hecknology.net>
parents:
91
diff
changeset
|
411 | 'rare-variant-groups': rare_variant_groups, |
| 87 | 412 | } |
| 413 | ||
| 414 | @app.route('/stop_description/<reference>') | |
| 415 | def bus_stop_description(reference): | |
| 416 | from buses import bus_stops | |
|
73
c56b0ef96514
stop_description ja muuta roinaa
Teemu Piippo <teemu@hecknology.net>
parents:
72
diff
changeset
|
417 | from pprint import pformat |
| 87 | 418 | try: |
| 419 | bus_stop = bus_stops[reference] | |
| 420 | except KeyError: | |
| 421 | abort(404) | |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
422 | 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
|
423 | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
424 | @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
|
425 | 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
|
426 | from buses import bus_stops, all_trips |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
427 | from busroute import simplify_name |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
428 | from flask import jsonify |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
429 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
430 | trip = all_trips[trip_reference] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
431 | bus_stop = bus_stops[stop] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
432 | 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
|
433 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
434 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
435 | except ValueError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
436 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
437 | 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
|
438 | |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
439 | @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
|
440 | 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
|
441 | from buses import trips_by_vehicle_info |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
442 | from flask import jsonify |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
443 | from datetime import timedelta |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
444 | try: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
445 | 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
|
446 | except KeyError: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
447 | abort(404) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
448 | return jsonify({ |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
449 | 'abbreviation': trip_abbreviation(trip), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
450 | }) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
451 | |
| 127 | 452 | |
| 453 | def service_start_time(): | |
| 454 | from datetime import date, datetime, timedelta | |
| 455 | result = datetime.now().replace(hour = 0, minute = 0, second = 0, microsecond = 0) | |
| 456 | if datetime.now().hour < 4: | |
| 457 | result -= timedelta(1) | |
| 458 | return result | |
| 459 | ||
| 460 | @app.route('/find_halt/<stop_reference>/<blockref>/<int:originalaimeddeparturetime>') | |
| 461 | def find_halt(stop_reference, blockref, originalaimeddeparturetime): | |
| 462 | from datetime import datetime | |
| 463 | from flask import jsonify | |
| 464 | info = (blockref, datetime.fromtimestamp(originalaimeddeparturetime) - service_start_time()) | |
| 465 | trip = buses.trips_by_vehicle_info[info] | |
| 466 | try: | |
| 467 | return jsonify({ | |
| 468 | 'id': [str(halt.uuid) for halt in buses.trips_by_vehicle_info[info].schedule if halt.stop.reference == stop_reference][0], | |
| 469 | }) | |
| 470 | except: | |
| 471 | abort(404) | |
| 472 | ||
| 473 | ||
| 85 | 474 | def current_bus_day(): |
| 475 | from datetime import date, datetime, timedelta | |
| 476 | day = date.today() | |
| 477 | if datetime.now().hour < 5: | |
| 478 | day -= timedelta(1) | |
| 479 | return day | |
| 480 | ||
| 68 | 481 | @app.route('/stop_display/<reference>') |
| 482 | def stop_display(reference): | |
| 483 | from buses import bus_stops | |
| 484 | schedule = [] | |
| 485 | try: | |
| 486 | bus_stop = bus_stops[reference] | |
| 487 | except KeyError: | |
| 488 | abort(404) | |
| 85 | 489 | for i, schedule_entry in enumerate(bus_stop.schedule_for_day(current_bus_day(), arrivals = False)): |
| 68 | 490 | schedule.append({ |
| 491 | 'time_data': schedule_entry['time'], | |
| 492 | 'time': time_representation(schedule_entry['time']), | |
| 127 | 493 | 'timestamp': int(schedule_entry['time'].timestamp()), |
| 68 | 494 | 'route': schedule_entry['trip'].route.reference, |
| 87 | 495 | 'sign': long_form_sign(schedule_entry, format = 'medium'), |
| 68 | 496 | 'trip': schedule_entry['stop'].trip.name, |
| 497 | 'night': is_night_time(schedule_entry['time']), | |
| 498 | 'imminent': imminent(schedule_entry), | |
| 499 | 'index': i, | |
| 500 | }) | |
| 501 | from pprint import pprint | |
| 502 | pprint(schedule) | |
| 76 | 503 | def destination_key(schedule_entry): |
| 504 | sign = schedule_entry['sign'] | |
| 505 | return (sign['destination'],) + tuple(sign['via']) | |
| 506 | def filter_schedule(schedule, *, key): | |
| 507 | used = set() | |
| 508 | for schedule_entry in schedule: | |
| 509 | key_value = key(schedule_entry) | |
| 510 | if key_value not in used: | |
| 511 | used.add(key_value) | |
| 512 | yield schedule_entry | |
| 513 | schedule = list(filter_schedule(schedule, key = destination_key))[:6] | |
| 68 | 514 | if schedule: |
| 515 | 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)])) | |
| 516 | else: | |
| 517 | num_imminent_leaves = 1 | |
| 518 | return render_template( | |
| 519 | 'stop_display.html', | |
| 520 | schedule = schedule, | |
| 521 | ref = bus_stop.code, | |
| 522 | name = tr(bus_stop.name, 'bus-stops'), | |
| 523 | link_to_map = bus_stop.location.link_to_map, | |
| 524 | region = bus_stop.region, | |
| 525 | location = bus_stop.location, | |
| 526 | cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, | |
| 527 | num_imminent_leaves = num_imminent_leaves, | |
| 528 | tr = tr, | |
| 529 | ) | |
| 530 | ||
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
531 | def time_representation(time, relative = True): |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
532 | time_difference = time - now() |
| 127 | 533 | #if relative and timedelta(minutes = -1) < time_difference < timedelta(minutes = 1): |
| 534 | # return tr('right-now', 'misc-text') | |
| 535 | #elif relative and time_difference > timedelta(0) and time_difference < timedelta(minutes = 10): | |
| 536 | # return '%dm' % round(time_difference.seconds / 60) | |
| 537 | if time.date() == today(): | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
538 | return '%d:%02d' % (time.hour, time.minute) |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
539 | elif time_difference < timedelta(7): |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
540 | with activate_locale(): |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
541 | return time.strftime('%-a %H:%M').replace(' ', '\xa0') |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
542 | else: |
|
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
543 | with activate_locale(): |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
544 | return time.strftime('%-d.%-m. %H:%M').replace(' ', '\xa0') |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
545 | |
| 109 | 546 | def make_cluster(cluster): |
| 547 | schedule = list({ | |
| 548 | 'time': time_representation(schedule_entry['time']), | |
| 549 | 'route': schedule_entry['trip'].route.reference, | |
| 550 | 'route-splice': split_route_ref(schedule_entry['trip'].route.reference), | |
| 551 | 'sign': sign(schedule_entry), | |
| 552 | 'trip': schedule_entry['stop'].trip.name, | |
| 553 | 'night': is_night_time(schedule_entry['time']), | |
| 554 | 'stop': schedule_entry['stop'].stop, | |
| 555 | 'stop_id': schedule_entry['stop'].stop.reference, | |
| 556 | 'stop_code': schedule_entry['stop'].stop.code, | |
| 557 | 'stop_name': tr(schedule_entry['stop'].stop.name, 'bus-stops', 'places'), | |
| 558 | 'imminent': imminent(schedule_entry), | |
| 559 | 'typename': schedule_entry['stop'].stop.typename, | |
| 560 | } for schedule_entry in cluster.schedule(max_amount = 100)) | |
| 27 | 561 | stops_in_cluster = sorted( |
| 562 | ({ | |
| 563 | 'id': stop.reference, | |
| 29 | 564 | 'code': stop.code, |
| 63 | 565 | 'name': tr(stop.name, 'bus-stops'), |
| 27 | 566 | } for stop in cluster.stops), |
| 567 | key = lambda stop: (len(stop['id']), stop['id']) | |
| 568 | ) | |
|
19
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
569 | return render_template( |
|
16fa9fb20b32
Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents:
18
diff
changeset
|
570 | 'cluster.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
571 | schedule = schedule, |
| 72 | 572 | 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
|
573 | link_to_map = cluster.center.link_to_map, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
574 | location = cluster.center, |
| 27 | 575 | stops_in_cluster = stops_in_cluster, |
| 576 | amount_of_stops_in_cluster = len(stops_in_cluster), | |
|
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
19
diff
changeset
|
577 | tr = tr, |
| 93 | 578 | service = min(set.union(*[bus_stop.services for bus_stop in cluster.stops])), |
| 5 | 579 | ) |
| 0 | 580 | |
| 109 | 581 | @app.route('/stop_cluster/<cluster_name>') |
| 582 | def cluster_schedule(cluster_name): | |
| 583 | from buses import bus_stops, clusters_by_name | |
| 584 | try: | |
| 585 | cluster = clusters_by_name[cluster_name] | |
| 586 | except KeyError: | |
| 587 | abort(404) | |
| 588 | else: | |
| 589 | return make_cluster(cluster) | |
| 590 | ||
| 127 | 591 | @app.route('/cluster') |
| 109 | 592 | def custom_cluster(): |
| 593 | from flask import request | |
| 594 | from buses import bus_stops, CustomBusStopCluster | |
| 595 | if 'stops' in request.args: | |
| 596 | cluster = CustomBusStopCluster( | |
| 597 | name = request.args.get('name', 'Aikataulu'), | |
| 598 | stops = {bus_stops[stop_code] for stop_code in str.split(request.args['stops'], ';')}, | |
| 599 | ) | |
| 600 | return make_cluster(cluster) | |
| 601 | else: | |
| 602 | return render_template('custom_cluster.html') | |
| 603 | ||
| 77 | 604 | def day_class(weekday): |
| 605 | if weekday < 5: | |
| 606 | return 'working-day' | |
| 607 | elif weekday == 5: | |
| 608 | return 'saturday' | |
| 609 | else: | |
| 610 | assert weekday == 6 | |
| 611 | return 'sunday' | |
| 612 | ||
| 105 | 613 | class Week: |
| 614 | def __init__(self, year, weeknumber): | |
| 109 | 615 | self.year, self.weeknumber = int(year), int(weeknumber) |
| 105 | 616 | def normalize(self): |
| 617 | while self.weeknumber > 52: | |
| 618 | self.weeknumber -= 52 | |
| 619 | self.year += 1 | |
| 620 | while self.weeknumber < 1: | |
| 621 | self.weeknumber += 52 | |
| 622 | self.year -= 1 | |
| 623 | def __repr__(self): | |
| 624 | return str.format( | |
| 625 | 'Week({year}, {weeknumber})', | |
| 626 | year = self.year, | |
| 627 | weeknumber = self.weeknumber | |
| 628 | ) | |
| 629 | def __add__(self, numweeks): | |
| 630 | newweek = Week(year = self.year, weeknumber = self.weeknumber + numweeks) | |
| 631 | newweek.normalize() | |
| 632 | return newweek | |
| 633 | def __sub__(self, numweeks): | |
| 634 | newweek = Week(year = self.year, weeknumber = self.weeknumber - numweeks) | |
| 635 | newweek.normalize() | |
| 636 | return newweek | |
| 637 | def monday(self): | |
| 638 | from datetime import datetime | |
| 639 | datestring = str.format( | |
| 640 | '{year}-W{weeknumber}-1', | |
| 641 | year = self.year, | |
| 642 | weeknumber = self.weeknumber, | |
| 643 | ) | |
| 644 | return datetime.strptime(datestring, "%Y-W%W-%w").date() | |
| 645 | @staticmethod | |
| 646 | def fromstring(string): | |
| 647 | try: | |
| 648 | year, weeknumber = string.split('W', 1) | |
| 649 | return Week(year = int(year), weeknumber = int(weeknumber)) | |
| 650 | except ValueError: | |
| 651 | raise ValueError('bad week string: ' + repr(string)) | |
| 109 | 652 | def __str__(self): |
| 653 | return str(self.year) + 'W' + str(self.weeknumber) | |
| 105 | 654 | @staticmethod |
| 655 | def now(): | |
| 656 | from datetime import date | |
| 657 | cal = date.today().isocalendar() | |
| 658 | return Week(year = cal[0], weeknumber = cal[1]) | |
| 659 | ||
| 77 | 660 | @app.route('/stop_week/<stop_reference>') |
| 661 | def stop_week(stop_reference): | |
| 662 | from buses import bus_stops | |
| 663 | from flask import request | |
| 105 | 664 | from datetime import date |
| 665 | if 'week' in request.args: | |
| 666 | try: | |
| 667 | week = Week.fromstring(request.args['week']) | |
| 668 | except ValueError: | |
| 669 | abort(400) | |
| 670 | else: | |
| 671 | week = Week.now() | |
| 77 | 672 | if 'routes' in request.args: |
| 673 | filtered_routes = set(request.args['routes'].split(';')) | |
| 674 | route_filter = lambda route: route in filtered_routes | |
| 675 | else: | |
| 676 | route_filter = lambda route: True | |
| 677 | if 'dest' in request.args: | |
| 678 | dests = {bus_stops.get(dest, None) for dest in request.args['dest'].split(';')} | |
| 679 | dests.discard(None) | |
| 680 | dest_filter = lambda trip: any(trip.contains_stop(dest) for dest in dests) | |
| 681 | else: | |
| 682 | dest_filter = lambda trip: True | |
| 683 | schedule = [] | |
| 684 | try: | |
| 685 | bus_stop = bus_stops[stop_reference] | |
| 686 | except KeyError: | |
| 687 | abort(404) | |
| 688 | week_model = {} | |
| 109 | 689 | bus_stop_schedule = list(week_schedule(bus_stop, start_date = week.monday(), arrivals = True, allow_gone = True)) |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
690 | description = describe(bus_stop, bus_stop_schedule) |
|
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
691 | for schedule_entry in bus_stop_schedule: |
| 77 | 692 | route_ref = schedule_entry['trip'].route.reference |
| 693 | if route_filter(route_ref) and dest_filter(schedule_entry['trip']): | |
| 694 | time = schedule_entry['time'] | |
| 695 | date = schedule_entry['date'] | |
| 696 | if date not in week_model: | |
| 109 | 697 | week_model[date] = dict() |
| 77 | 698 | day_model = week_model[date] |
| 699 | if time.hour not in day_model: | |
| 109 | 700 | day_model[time.hour] = list() |
| 77 | 701 | hour_model = day_model[time.hour] |
| 109 | 702 | list.append(hour_model, { |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
703 | 'route': description['variant-map'][schedule_entry_hash(schedule_entry)], |
| 77 | 704 | 'route-splice': split_route_ref(route_ref), |
| 705 | 'trip': schedule_entry['stop'].trip.name, | |
| 706 | 'night': is_night_time(schedule_entry['time']), | |
| 707 | 'minute': time.minute, | |
| 708 | }) | |
|
79
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
709 | 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
|
710 | from datetime import date, datetime, timedelta |
| 105 | 711 | day = week.monday() + timedelta(day_offset) |
|
79
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
712 | try: |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
713 | 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
|
714 | except KeyError: |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
715 | week_model[day] = {} |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
716 | else: |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
717 | def hour_key(x): |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
718 | return (x - 5) % 24 |
| 109 | 719 | # Fill in missing hours |
| 720 | hours = set(dict.keys(day_model)) | |
|
79
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
721 | 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
|
722 | 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
|
723 | 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
|
724 | 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
|
725 | 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
|
726 | 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
|
727 | day_model[hour] = [] |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
728 | # 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
|
729 | from collections import OrderedDict |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
730 | week_model[day] = OrderedDict( |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
731 | sorted( |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
732 | day_model.items(), |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
733 | 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
|
734 | ) |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
735 | ) |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
736 | week_model = [ |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
737 | { |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
738 | 'day': day, |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
739 | 'schedule': schedule, |
|
ba854da8c424
stop_week: järjestä tunnit ja paikkaa tyhjät tunnit
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
740 | '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
|
741 | } 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
|
742 | ] |
| 77 | 743 | week_model = sorted(week_model, key = lambda day: day['day']) |
| 744 | return render_template( | |
| 745 | 'stop_week.html', | |
| 746 | ref = bus_stop.code, | |
| 747 | name = tr(bus_stop.name, 'bus-stops'), | |
| 748 | tr = tr, | |
| 749 | week = week_model, | |
|
91
209f5930d038
show variants in week schedules
Teemu Piippo <teemu@hecknology.net>
parents:
90
diff
changeset
|
750 | description = description, |
| 90 | 751 | typename = bus_stop.typename, |
| 105 | 752 | curweek = week, |
| 109 | 753 | next_week = week + 1, |
| 754 | previous_week = week - 1, | |
| 77 | 755 | ) |
| 756 | ||
|
48
428cfdf64ccc
Lisätty uudelleenohjauksia
Teemu Piippo <teemu@hecknology.net>
parents:
42
diff
changeset
|
757 | @app.route('/trip/<trip_reference>') |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
758 | def trip(trip_reference): |
| 2 | 759 | from flask import request |
| 114 | 760 | from buses import all_trips, shapes |
| 761 | from busroute import simplify_name,greatly_simplify_name | |
| 3 | 762 | try: |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
763 | trip = all_trips[trip_reference] |
| 3 | 764 | except KeyError: |
| 765 | abort(404) | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
766 | schedule = [] |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
767 | region = '' |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
768 | for halt in trip.schedule: |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
769 | stop_time = datetime.combine(today(), time()) + halt.arrival_time |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
770 | formatted_time = time_representation(stop_time) |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
771 | if profile['regions']['use-regions']: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
772 | 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
|
773 | 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
|
774 | 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
|
775 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
776 | schedule.append({ |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
777 | '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
|
778 | 'time': formatted_time, |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
779 | 'stops': [], |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
780 | 'index': len(schedule), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
781 | }) |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
782 | region = halt.stop.region |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
783 | else: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
784 | schedule.append({ |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
785 | '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
|
786 | 'time': formatted_time, |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
787 | 'stops': [], |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
788 | 'index': len(schedule), |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
789 | }) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
790 | schedule[-1]['stops'].append({ |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
791 | 'time': formatted_time, |
| 29 | 792 | 'id': halt.stop.reference, |
| 793 | 'code': halt.stop.code, | |
| 114 | 794 | 'ref': halt.stop.code or halt.stop.reference, |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
795 | 'name': tr(halt.stop.name, 'bus-stops'), |
| 90 | 796 | 'typename': halt.stop.typename, |
| 114 | 797 | 'arrival_time': time_representation(datetime.combine(today(), time()) + halt.arrival_time), |
| 798 | 'departure_time': time_representation(datetime.combine(today(), time()) + halt.departure_time), | |
| 799 | 'location': str(halt.stop.location), | |
| 0 | 800 | }) |
|
31
60045b362d71
- Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents:
30
diff
changeset
|
801 | sign = trip.concise_schedule() |
| 29 | 802 | try: |
|
88
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
803 | sign = [sign[0], sign[-1]] |
| 29 | 804 | except IndexError: |
| 805 | sign = [trip.schedule[0].stop.name, trip.schedule[-1].stop.name] | |
|
25
cb423946cf33
Uudelleennimetty templaatit
Teemu Piippo <teemu@hecknology.net>
parents:
24
diff
changeset
|
806 | return render_template('trip.html', |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
807 | schedule = schedule, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
808 | trip_reference = trip_reference, |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
809 | route = trip.route.reference, |
| 114 | 810 | #description = ' - '.join(tr(place, 'region_name') for place in sign), |
| 811 | description = greatly_simplify_name(sign[-1]), | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
812 | 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
|
813 | tr = tr, |
| 27 | 814 | length = trip.length / 1000, |
| 93 | 815 | service = trip.route.service, |
| 114 | 816 | shape = ','.join(str.format('[{}, {}]', point[0], point[1]) for point in shapes[trip.shape]), |
| 817 | stops = list( | |
| 818 | dict( | |
| 819 | ref = halt.stop.reference, | |
| 820 | name = halt.stop.name, | |
| 821 | position = str.format('[{}]', str(halt.stop.location)), | |
| 822 | ) for halt in trip.schedule | |
| 823 | ), | |
| 27 | 824 | ) |
| 825 | ||
| 109 | 826 | @app.route('/route/<names>') |
| 827 | def route_page(names): | |
| 828 | from buses import routes | |
| 829 | from collections import defaultdict | |
| 830 | from busroute import greatly_simplify_name | |
| 831 | routes = {routes[name.upper()] for name in names.split(';')} | |
| 832 | schedules = defaultdict(list) | |
| 833 | for route in routes: | |
| 834 | for trip in route.trips: | |
| 835 | if trip.is_served_at(today()): | |
| 836 | schedules[trip.schedule[0].stop].append({ | |
| 837 | 'name': trip.reference, | |
| 838 | 'from': trip.from_place, | |
| 839 | 'to': trip.to_place, | |
| 840 | 'description': ' - '.join( | |
| 841 | greatly_simplify_name(place) | |
| 842 | for place in trip_description(trip) | |
| 843 | ), | |
| 844 | 'gone': datetime.combine(today(), time()) + trip.schedule[-1].arrival_time < now(), | |
| 845 | 'time': time_representation(datetime.combine(today(), time()) + trip.schedule[0].departure_time), | |
| 846 | 'route': route.reference, | |
| 847 | }) | |
| 848 | return render_template('route.html', | |
| 849 | name = route.reference + ' ' + route.description, | |
| 850 | tr = tr, | |
| 851 | schedules = schedules, | |
| 852 | ) | |
| 0 | 853 | |
|
94
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
854 | @app.route('/interesting') |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
855 | def interesting(): |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
856 | from buses import all_trips, services_for_day |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
857 | from busroute import simplify_name |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
858 | from collections import Counter, defaultdict |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
859 | from datetime import datetime |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
860 | trip_counts = Counter() |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
861 | interesting_trips = defaultdict(list) |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
862 | for trip_reference, trip in all_trips.items(): |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
863 | if len(trip.service.dates) <= 3: |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
864 | for date in trip.service.dates: |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
865 | moment = trip.schedule[0].departure_datetime(date) |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
866 | if moment > datetime.now(): |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
867 | interesting_trips[date].append((trip, moment)) |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
868 | for date in interesting_trips: |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
869 | interesting_trips[date].sort(key = lambda tuple: tuple[1]) |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
870 | interesting_trips = [(date, interesting_trips[date]) for date in sorted(interesting_trips.keys())] |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
871 | data = [ |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
872 | { |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
873 | 'date': date, |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
874 | 'leaves': [{ |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
875 | 'route': trip.route.reference, |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
876 | 'departure': moment, |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
877 | 'trip': trip.reference, |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
878 | 'stop': trip.schedule[0].stop, |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
879 | 'description': ' - '.join( |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
880 | simplify_name(place, replace = True) |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
881 | for place in trip_description(trip) |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
882 | ), |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
883 | } for trip, moment in leaves] |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
884 | } |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
885 | for date, leaves in interesting_trips |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
886 | ] |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
887 | return render_template( |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
888 | 'interesting.html', |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
889 | data = data, |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
890 | tr = tr, |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
891 | ) |
|
e27c18f080d1
added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents:
93
diff
changeset
|
892 | |
|
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
|
893 | @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
|
894 | 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
|
895 | 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
|
896 | |
| 30 | 897 | from argparse import ArgumentParser |
| 898 | parser = ArgumentParser() | |
| 899 | parser.add_argument('gtfs_zip_path') | |
| 900 | parser.add_argument('profile_path') | |
| 901 | ||
| 0 | 902 | if __name__ == '__main__': |
| 2 | 903 | 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
|
904 | parser.add_argument('-d', '--debug', action = 'store_true') |
| 30 | 905 | |
| 906 | args = parser.parse_args() | |
| 907 | 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
|
908 | if profile['regions']['use-regions']: |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
909 | from regions import parse_regions |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
910 | 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
|
911 | tr.load_regions(regions) |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
912 | import busroute |
|
3b86597c5a88
major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
913 | busroute.regions = regions |
| 93 | 914 | buses.load_buses(args.gtfs_zip_path) |
| 30 | 915 | |
| 916 | if __name__ == '__main__': | |
|
10
843c6ee340e7
Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti
Teemu Piippo <teemu@hecknology.net>
parents:
9
diff
changeset
|
917 | app.run(debug = args.debug, port = args.port) |