buses.py

changeset 127
2bc0529d44a5
parent 114
b736478416d4
child 134
4ac0f2e2ec4e
equal deleted inserted replaced
126:369e242edc5d 127:2bc0529d44a5
3 from sys import stderr 3 from sys import stderr
4 from datetime import date, time, datetime, timedelta 4 from datetime import date, time, datetime, timedelta
5 from copy import copy 5 from copy import copy
6 from misc import * 6 from misc import *
7 from geometry import * 7 from geometry import *
8 import uuid
8 9
9 def transform_trip_reference(reference): 10 def transform_trip_reference(reference):
10 return reference 11 return reference
11 12
12 class BusTrip: 13 class BusTrip:
71 self.pairs = set() # samannimiset lähellä olevat pysäkit 72 self.pairs = set() # samannimiset lähellä olevat pysäkit
72 self.involved_trips = set() 73 self.involved_trips = set()
73 self.services = set() 74 self.services = set()
74 def __repr__(self): 75 def __repr__(self):
75 return 'bus_stops[%r]' % self.reference 76 return 'bus_stops[%r]' % self.reference
76 def schedule(self, *, max_amount = 50, arrivals = False): 77 def schedule(self, *, max_amount = 50, max_past = 0, arrivals = False):
77 ''' 78 '''
78 Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei 79 Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei
79 lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, halt), 80 lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, halt),
80 jossa: 81 jossa:
81 - `aika` on saapumishetki muotoa datetime ja 82 - `aika` on saapumishetki muotoa datetime ja
85 jää alimittaiseksi, mahdollisesti jopa tyhjäksi. 86 jää alimittaiseksi, mahdollisesti jopa tyhjäksi.
86 ''' 87 '''
87 result = [] 88 result = []
88 # -1 päivää yövuoroja varten 89 # -1 päivää yövuoroja varten
89 date = today() - timedelta(days = 1) 90 date = today() - timedelta(days = 1)
91 gone_list = []
90 # Niin kauan kuin aikatauluja ei ole vielä tarpeeksi, 92 # Niin kauan kuin aikatauluja ei ole vielä tarpeeksi,
91 while len(result) < max_amount: 93 while len(result) < max_amount:
92 try: 94 try:
93 # hae nykyisen päivän aikataulut ja lisää ne, 95 # hae nykyisen päivän aikataulut ja lisää ne,
94 result += self.schedule_for_day(date, arrivals = arrivals) 96 schedule = self.schedule_for_day(date, arrivals = arrivals, allow_gone = True)
97 for entry in schedule:
98 if entry['gone']:
99 gone_list.append(entry)
100 else:
101 result.append(entry)
95 except ValueError: 102 except ValueError:
96 # paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan, 103 # paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan,
97 break 104 break
98 # ja siirry seuraavaan päivään. 105 # ja siirry seuraavaan päivään.
99 date += timedelta(1) 106 date += timedelta(1)
100 # Typistä lopputulos haluttuun tulosmäärään. 107 # Typistä lopputulos haluttuun tulosmäärään.
108 if gone_list:
109 result = gone_list[-max_past:] + result
101 return result[:max_amount] 110 return result[:max_amount]
102 def schedule_for_day(self, date, *, arrivals = False, allow_gone = False): 111 def schedule_for_day(self, date, *, arrivals = False, allow_gone = False):
103 ''' 112 '''
104 Hakee pysäkin aikataulut tiettynä päivänä. 113 Hakee pysäkin aikataulut tiettynä päivänä.
105 ''' 114 '''
116 # päätepysäkille, 125 # päätepysäkille,
117 stop = trip.contains_stop(self) 126 stop = trip.contains_stop(self)
118 if stop and (arrivals or not stop.is_arrival) and stop is not trip.schedule[-1]: 127 if stop and (arrivals or not stop.is_arrival) and stop is not trip.schedule[-1]:
119 # ja jos tämä halt on tulevaisuudessa, 128 # ja jos tämä halt on tulevaisuudessa,
120 stop_time = datetime.combine(date, time()) + stop.departure_time 129 stop_time = datetime.combine(date, time()) + stop.departure_time
121 if allow_gone or (stop_time + timedelta(minutes = 1) >= now()): 130 gone = stop_time + timedelta(minutes = 1) < now()
131 if allow_gone or not gone:
122 # lisää halt listaan. 132 # lisää halt listaan.
123 result.append({ 133 result.append({
124 'date': date, 134 'date': date,
125 'offset': stop.departure_time, 135 'offset': stop.departure_time,
126 'time': stop_time, 136 'time': stop_time,
127 'trip': trip, 137 'trip': trip,
128 'stop': stop, 138 'stop': stop,
139 'gone': gone,
129 }) 140 })
130 # Lajittele lopputulos saapumisajan mukaan. 141 # Lajittele lopputulos saapumisajan mukaan.
131 result.sort(key = lambda schedule_entry: schedule_entry['time']) 142 result.sort(key = lambda schedule_entry: schedule_entry['time'])
132 return result 143 return result
133 @property 144 @property
144 class BusHalt: 155 class BusHalt:
145 def __init__(self, arrival_time, departure_time, stop, trip, traveled_distance): 156 def __init__(self, arrival_time, departure_time, stop, trip, traveled_distance):
146 self.arrival_time, self.departure_time, self.stop, self.trip = arrival_time, departure_time, \ 157 self.arrival_time, self.departure_time, self.stop, self.trip = arrival_time, departure_time, \
147 stop, trip 158 stop, trip
148 self.traveled_distance = traveled_distance 159 self.traveled_distance = traveled_distance
160 self.uuid = uuid.uuid4()
149 @property 161 @property
150 def is_arrival(self): 162 def is_arrival(self):
151 if profile['regions']['use-regions']: 163 if profile['regions']['use-regions']:
152 if not hasattr(self, 'cachedIsArrival'): 164 if not hasattr(self, 'cachedIsArrival'):
153 if self.stop.region: 165 if self.stop.region:

mercurial