buses.py

changeset 127
2bc0529d44a5
parent 114
b736478416d4
child 134
4ac0f2e2ec4e
--- 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']:

mercurial