# HG changeset patch # User Teemu Piippo # Date 1497123055 -10800 # Node ID 16fa9fb20b324d14ffc0e41172f72be34a189fb4 # Parent 1c8ff93fbfaca01202ad960cec61d793359b4a5f Lisätty pysäkkiryhmän aikataulunäkymä diff -r 1c8ff93fbfac -r 16fa9fb20b32 buses.py --- a/buses.py Sat Jun 10 21:09:11 2017 +0300 +++ b/buses.py Sat Jun 10 22:30:55 2017 +0300 @@ -120,9 +120,6 @@ # Lajittele lopputulos saapumisajan mukaan. result.sort(key = lambda schedule_entry: schedule_entry['time']) return result - @property - def linkki_karttaan(self): - return 'http://www.openstreetmap.org/#map=19/%f/%f' % (self.sijainti.leveys, self.sijainti.pituus) class Pysähdys: def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo): @@ -230,6 +227,12 @@ self.stops |= other.stops other.stops = set() other._center = None + def schedule(self, max_amount = 50): + result = [] + for stop in self.stops: + result += stop.schedule(max_amount) + result.sort(key = lambda schedule_entry: schedule_entry['time']) + return result[:max_amount] from collections import defaultdict bus_stops_by_name = defaultdict(set) @@ -326,6 +329,11 @@ cluster_bus_stops() name_clusters() +clusters_by_name = {} +for cluster in all_clusters: + assert cluster.name not in clusters_by_name + clusters_by_name[cluster.name] = cluster + print('Ladataan aikataulut... ', end = '', flush = True, file = stderr) with open('gtfs/stop_times.txt') as file: rivimäärä = sum(line.count('\n') for line in file) diff -r 1c8ff93fbfac -r 16fa9fb20b32 geometry.py --- a/geometry.py Sat Jun 10 21:09:11 2017 +0300 +++ b/geometry.py Sat Jun 10 22:30:55 2017 +0300 @@ -18,6 +18,9 @@ @property def y(self): return self.pituus + @property + def link_to_map(self): + return 'http://www.openstreetmap.org/#map=19/%f/%f' % (self.leveys, self.pituus) class Rengas: def __init__(tämä, säiliö): diff -r 1c8ff93fbfac -r 16fa9fb20b32 service.py --- a/service.py Sat Jun 10 21:09:11 2017 +0300 +++ b/service.py Sat Jun 10 22:30:55 2017 +0300 @@ -44,37 +44,73 @@ else: return 'fi' +def sign(schedule_entry): + from math import ceil + sign = supista_reitti(schedule_entry['trip'].suppea_reitti(schedule_entry['stop'])) + sign = [tr(paikka, 'paikat') for paikka in sign] + sign_representation = ' - '.join(sign) + if len(sign_representation) > 25: + k = ceil(len(sign) / 2) + sign_representation = ' - '.join(sign[:k]) + '\n' + ' - '.join(sign[k:]) + return sign_representation + @app.route('/pysäkki/') def pysäkkiaikataulu(tunniste): from buses import pysäkit - from math import ceil aikataulu = [] try: pysäkki = pysäkit[tunniste] except KeyError: abort(404) for schedule_entry in pysäkki.schedule(100): - sign = supista_reitti(schedule_entry['trip'].suppea_reitti(schedule_entry['stop'])) - sign = [tr(paikka, 'paikat') for paikka in sign] - sign_representation = ' - '.join(sign) - if len(sign_representation) > 25: - k = ceil(len(sign) / 2) - sign_representation = ' - '.join(sign[:k]) + '\n' + ' - '.join(sign[k:]) aikataulu.append({ 'aika': time_representation(schedule_entry['time']), 'linja': schedule_entry['trip'].linja.viite, - 'kyltti': sign_representation, + 'kyltti': sign(schedule_entry), 'ajovuoro': schedule_entry['stop'].ajo.nimi, 'yö': is_night_time(schedule_entry['time']), }) return render_template( 'pysäkki.html', aikataulu = aikataulu, - viite = tunniste, - nimi = tr(pysäkki.nimi, 'pysäkit'), - linkki_karttaan = pysäkki.linkki_karttaan, + nimi = tunniste + ' ' + tr(pysäkki.nimi, 'pysäkit'), + linkki_karttaan = pysäkki.sijainti.link_to_map, alue = pysäkki.alue, sijainti = pysäkki.sijainti, + cluster = pysäkki.cluster.name, + ) + +@app.route('/pysäkkiryhmä/') +def cluster_schedule(cluster_name): + from buses import pysäkit, clusters_by_name + aikataulu = [] + try: + cluster = clusters_by_name[cluster_name] + except KeyError: + abort(404) + for schedule_entry in cluster.schedule(100): + aikataulu.append({ + 'aika': time_representation(schedule_entry['time']), + 'linja': schedule_entry['trip'].linja.viite, + 'kyltti': sign(schedule_entry), + 'ajovuoro': schedule_entry['stop'].ajo.nimi, + 'yö': is_night_time(schedule_entry['time']), + 'stop_id': schedule_entry['stop'].pysäkki.tunniste, + 'stop_name': tr(schedule_entry['stop'].pysäkki.nimi, 'pysäkit'), + }) + return render_template( + 'cluster.html', + aikataulu = aikataulu, + nimi = 'Yhdistetty pysäkkiaikataulu ' + cluster_name, + linkki_karttaan = cluster.center.link_to_map, + sijainti = cluster.center, + stops_in_cluster = sorted( + ({ + 'id': stop.tunniste, + 'name': tr(stop.nimi, 'pysäkit'), + } for stop in cluster.stops), + key = lambda stop: (len(stop['id']), stop['id']) + ) ) @app.route('/ajovuoro/') diff -r 1c8ff93fbfac -r 16fa9fb20b32 static/style.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/static/style.css Sat Jun 10 22:30:55 2017 +0300 @@ -0,0 +1,113 @@ +body +{ + font-family: "Oxygen-Sans", "Latin Modern Sans", Tahoma, FreeSans, Arial, sans-serif; + background: white; + color: black; + margin: 0; + padding: 0; + font-size: 24pt; +} +a +{ + color: inherit; + text-decoration: none; +} +a:hover +{ + text-decoration: underline; +} +h1 +{ + padding-top: 10pt; + padding-bottom: 10pt; + text-align: center; + background: #dc9e00; + background: linear-gradient(to bottom, #dc9e00 0%,#eaaf19 49%,#dc9e00 92%,#906700 100%); + color: white; +} +#aikataulu +{ + width:100%; + margin: auto; +} + +.sarake-aika, .sarake-linja +{ + text-align: center; +} + +.sarake-määränpää +{ + text-align: left; +} + +td, th, body +{ + font-size: 24pt; +} + +.sarake-aika, .sarake-linja +{ + width: 25%; +} + +h1 +{ + font-variant: small-caps; +} + +.sarake-määränpää a +{ + white-space: pre-wrap; +} + +#aikataulu tr td +{ + padding-bottom: 10px; + padding-top: 10px; + padding-left: 0px; + padding-right: 0px; + margin: 0px; + border-top: 1px solid gray; +} + +#aikataulu tr:nth-child(even) { + background-color: #F8F8F8; +} + +#aikataulu tr.yö td +{ + /* + background-color: #d8d8ff; + color: #008; + border-bottom: 1px solid #00A; + */ + background-color: #004; + color: #bef; + border-top: 1px solid #008; +} + +#aikataulu tr.yö:nth-child(even) td +{ + background-color: #003; +} + +#pysäkki-info +{ + text-align: center +} + +.pysäkki-sijainti +{ + font-size: smaller; +} + +.sarake-määränpää +{ + text-align: center; +} + +.sarake-pysäkki +{ + text-align: center; +} diff -r 1c8ff93fbfac -r 16fa9fb20b32 templates/cluster.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/cluster.html Sat Jun 10 22:30:55 2017 +0300 @@ -0,0 +1,46 @@ + + + + + + {{nimi}} + + + +

{{nimi}}

+

+ 📌 ({{sijainti}}) +

+

Pysäkit ryhmässä: +

+

+ + + + + + + + {% for rivi in aikataulu %} + + + + + + + {% endfor %} +
AikaLinjaMääränpääPysäkki
{{rivi['aika']}} + {{rivi['linja']}} + + {{rivi['kyltti']}} + + {{rivi['stop_id']}} +
+ + diff -r 1c8ff93fbfac -r 16fa9fb20b32 templates/pysäkki.html --- a/templates/pysäkki.html Sat Jun 10 21:09:11 2017 +0300 +++ b/templates/pysäkki.html Sat Jun 10 22:30:55 2017 +0300 @@ -1,127 +1,23 @@ + - + {{nimi}} - {{viite}} {{nimi}} -

{{viite}} {{nimi}}

+

{{nimi}}

{{alue or ""}} — 📌 ({{sijainti}})

+

+ Lähialueen aikataulu +

Aika