| 89 |
89 |
| 90 |
90 |
| 91 def imminent(schedule_entry): |
91 def imminent(schedule_entry): |
| 92 return (schedule_entry['time'] - now()) <= timedelta(minutes = 3) |
92 return (schedule_entry['time'] - now()) <= timedelta(minutes = 3) |
| 93 |
93 |
| |
94 def first_halt_in_trip_in_place(trip, place): |
| |
95 for halt in trip.schedule: |
| |
96 if halt.stop.region == place: |
| |
97 return halt |
| |
98 else: |
| |
99 return None |
| |
100 |
| |
101 place_abbreviations = ConfigParser() |
| |
102 place_abbreviations.read('abbreviations.ini') |
| |
103 |
| |
104 def place_abbreviation(place): |
| |
105 try: |
| |
106 return place_abbreviations['abbreviations'][place] |
| |
107 except KeyError: |
| |
108 return place |
| |
109 |
| |
110 def trip_abbreviation(trip): |
| |
111 entries = [trip.from_place] |
| |
112 old_places = None |
| |
113 starting_halt = None |
| |
114 while True: |
| |
115 remaining_length = trip.length |
| |
116 if starting_halt: |
| |
117 remaining_length -= starting_halt.traveled_distance |
| |
118 places = reduce_schedule(trip.concise_schedule(starting_stop = starting_halt), trip_length = remaining_length, long = False) |
| |
119 new_places = set(places) - set(entries) |
| |
120 if not new_places or places == old_places: |
| |
121 break |
| |
122 for place in places: |
| |
123 if place in new_places: |
| |
124 starting_halt = first_halt_in_trip_in_place(trip, place) |
| |
125 entries += [place] |
| |
126 break |
| |
127 old_places = places |
| |
128 if trip.to_place not in entries: |
| |
129 entries += [trip.to_place] |
| |
130 return trip.route.reference + ':' + '-'.join(map(place_abbreviation, entries)) |
| 94 |
131 |
| 95 @app.route('/stop/<reference>') |
132 @app.route('/stop/<reference>') |
| 96 def bus_stop_schedule(reference): |
133 def bus_stop_schedule(reference): |
| 97 from buses import bus_stops |
134 from buses import bus_stops |
| 98 schedule = [] |
135 schedule = [] |
| 117 region = bus_stop.region, |
154 region = bus_stop.region, |
| 118 location = bus_stop.location, |
155 location = bus_stop.location, |
| 119 cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, |
156 cluster = bus_stop.cluster.url_name if len(bus_stop.cluster.stops) > 1 else None, |
| 120 tr = tr, |
157 tr = tr, |
| 121 ) |
158 ) |
| |
159 |
| |
160 @app.route('/api/describe_destination/<trip_reference>/<stop_reference>/<int:index>') |
| |
161 def describe_destination(trip_reference, stop_reference, index): |
| |
162 from buses import bus_stops, all_trips |
| |
163 from busroute import simplify_name |
| |
164 from flask import jsonify |
| |
165 try: |
| |
166 trip = all_trips[trip_reference] |
| |
167 bus_stop = bus_stops[stop] |
| |
168 schedule_entry = [schedule_entry for schedule_entry in trip.schedule if schedule_entry.stop.reference == stop_reference][index] |
| |
169 except KeyError: |
| |
170 abort(404) |
| |
171 except ValueError: |
| |
172 abort(404) |
| |
173 return jsonify(long_form_sign({'trip': trip, 'stop': schedule_entry})) |
| |
174 |
| |
175 @app.route('/api/trip_abbreviation/<block_id>/<int:arrival_time_offset>') |
| |
176 def api_trip_abbreviation(block_id, arrival_time_offset): |
| |
177 from buses import trips_by_vehicle_info |
| |
178 from flask import jsonify |
| |
179 from datetime import timedelta |
| |
180 try: |
| |
181 trip = trips_by_vehicle_info[block_id, timedelta(seconds = arrival_time_offset)] |
| |
182 except KeyError: |
| |
183 abort(404) |
| |
184 return jsonify({ |
| |
185 'abbreviation': trip_abbreviation(trip), |
| |
186 }) |
| 122 |
187 |
| 123 @app.route('/stop_display/<reference>') |
188 @app.route('/stop_display/<reference>') |
| 124 def stop_display(reference): |
189 def stop_display(reference): |
| 125 from buses import bus_stops |
190 from buses import bus_stops |
| 126 schedule = [] |
191 schedule = [] |
| 284 schedule = [] |
349 schedule = [] |
| 285 region = '' |
350 region = '' |
| 286 for halt in trip.schedule: |
351 for halt in trip.schedule: |
| 287 stop_time = datetime.combine(today(), time()) + halt.arrival_time |
352 stop_time = datetime.combine(today(), time()) + halt.arrival_time |
| 288 formatted_time = time_representation(stop_time) |
353 formatted_time = time_representation(stop_time) |
| 289 if halt.stop.region != region and not (region and not halt.stop.region): |
354 if profile['regions']['use-regions']: |
| 290 if len(schedule) and not schedule[-1]['name']: |
355 if halt.stop.region != region and not (region and not halt.stop.region): |
| 291 schedule[-1]['name'] = tr(halt.stop.region or '', 'paikat') |
356 if len(schedule) and not schedule[-1]['name']: |
| 292 else: |
357 schedule[-1]['name'] = tr(halt.stop.region or '', 'paikat') |
| 293 schedule.append({ |
358 else: |
| 294 'name': tr(halt.stop.region or '', 'paikat'), |
359 schedule.append({ |
| 295 'time': formatted_time, |
360 'name': tr(halt.stop.region or '', 'paikat'), |
| 296 'stops': [], |
361 'time': formatted_time, |
| 297 'index': len(schedule), |
362 'stops': [], |
| 298 }) |
363 'index': len(schedule), |
| 299 region = halt.stop.region |
364 }) |
| |
365 region = halt.stop.region |
| |
366 else: |
| |
367 schedule.append({ |
| |
368 'name': tr(halt.stop.name or '', 'bus-stops'), |
| |
369 'time': formatted_time, |
| |
370 'stops': [], |
| |
371 'index': len(schedule), |
| |
372 }) |
| 300 schedule[-1]['stops'].append({ |
373 schedule[-1]['stops'].append({ |
| 301 'time': formatted_time, |
374 'time': formatted_time, |
| 302 'id': halt.stop.reference, |
375 'id': halt.stop.reference, |
| 303 'code': halt.stop.code, |
376 'code': halt.stop.code, |
| 304 'name': tr(halt.stop.name, 'bus-stops'), |
377 'name': tr(halt.stop.name, 'bus-stops'), |
| 365 if __name__ == '__main__': |
438 if __name__ == '__main__': |
| 366 parser.add_argument('-p', '--port', type = int, default = 5000) |
439 parser.add_argument('-p', '--port', type = int, default = 5000) |
| 367 parser.add_argument('-d', '--debug', action = 'store_true') |
440 parser.add_argument('-d', '--debug', action = 'store_true') |
| 368 |
441 |
| 369 args = parser.parse_args() |
442 args = parser.parse_args() |
| 370 profile = ConfigParser() |
|
| 371 profile.read(args.profile_path) |
443 profile.read(args.profile_path) |
| 372 buses.load_buses(args.gtfs_zip_path, profile = profile) |
444 buses.load_buses(args.gtfs_zip_path) |
| 373 |
445 |
| 374 if __name__ == '__main__': |
446 if __name__ == '__main__': |
| 375 app.run(debug = args.debug, port = args.port) |
447 app.run(debug = args.debug, port = args.port) |