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: |