--- a/buses.py Tue Sep 25 22:22:10 2018 +0300 +++ b/buses.py Thu Dec 06 19:35:38 2018 +0200 @@ -5,6 +5,7 @@ from copy import copy from misc import * from geometry import * +import uuid def transform_trip_reference(reference): return reference @@ -73,7 +74,7 @@ self.services = set() def __repr__(self): return 'bus_stops[%r]' % self.reference - def schedule(self, *, max_amount = 50, arrivals = False): + def schedule(self, *, max_amount = 50, max_past = 0, arrivals = False): ''' Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, halt), @@ -87,17 +88,25 @@ result = [] # -1 päivää yövuoroja varten date = today() - timedelta(days = 1) + gone_list = [] # Niin kauan kuin aikatauluja ei ole vielä tarpeeksi, while len(result) < max_amount: try: # hae nykyisen päivän aikataulut ja lisää ne, - result += self.schedule_for_day(date, arrivals = arrivals) + schedule = self.schedule_for_day(date, arrivals = arrivals, allow_gone = True) + for entry in schedule: + if entry['gone']: + gone_list.append(entry) + else: + result.append(entry) except ValueError: # paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan, break # ja siirry seuraavaan päivään. date += timedelta(1) # Typistä lopputulos haluttuun tulosmäärään. + if gone_list: + result = gone_list[-max_past:] + result return result[:max_amount] def schedule_for_day(self, date, *, arrivals = False, allow_gone = False): ''' @@ -118,7 +127,8 @@ if stop and (arrivals or not stop.is_arrival) and stop is not trip.schedule[-1]: # ja jos tämä halt on tulevaisuudessa, stop_time = datetime.combine(date, time()) + stop.departure_time - if allow_gone or (stop_time + timedelta(minutes = 1) >= now()): + gone = stop_time + timedelta(minutes = 1) < now() + if allow_gone or not gone: # lisää halt listaan. result.append({ 'date': date, @@ -126,6 +136,7 @@ 'time': stop_time, 'trip': trip, 'stop': stop, + 'gone': gone, }) # Lajittele lopputulos saapumisajan mukaan. result.sort(key = lambda schedule_entry: schedule_entry['time']) @@ -146,6 +157,7 @@ self.arrival_time, self.departure_time, self.stop, self.trip = arrival_time, departure_time, \ stop, trip self.traveled_distance = traveled_distance + self.uuid = uuid.uuid4() @property def is_arrival(self): if profile['regions']['use-regions']: