# HG changeset patch # User Teemu Piippo # Date 1536269022 -10800 # Node ID 88a5110b66ba1d02b18757447ec460dcbb94138c # Parent 4b09d8a597f8533ab6c6070353249b4394468731 added some features diff -r 4b09d8a597f8 -r 88a5110b66ba buses.py --- a/buses.py Mon Aug 13 22:56:30 2018 +0300 +++ b/buses.py Fri Sep 07 00:23:42 2018 +0300 @@ -98,7 +98,7 @@ date += timedelta(1) # Typistä lopputulos haluttuun tulosmäärään. return result[:max_amount] - def schedule_for_day(self, date, *, arrivals = False): + def schedule_for_day(self, date, *, arrivals = False, allow_gone = False): ''' Hakee pysäkin aikataulut tiettynä päivänä. ''' @@ -117,7 +117,7 @@ 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 stop_time + timedelta(minutes = 1) >= now(): + if allow_gone or (stop_time + timedelta(minutes = 1) >= now()): # lisää halt listaan. result.append({ 'date': date, @@ -181,6 +181,57 @@ long = long, ) +class BusStopCluster: + def __init__(self): + self.stops = set() + self.cached_center = None + self.name = None + @property + def url_name(self): + return self.name.lower().replace('(', '').replace(')', '').replace(' ', '-') + def add_stop(self, stop): + assert not stop.cluster + stop.cluster = self + self.stops.add(stop) + self.cached_center = None + @property + def center(self): + if not self.cached_center: + if self.stops: + from statistics import median + pointtype = type(next(iter(self.stops)).location) + self.cached_center = pointtype( + median(stop.location.x for stop in self.stops), + median(stop.location.y for stop in self.stops), + ) + else: + raise ValueError('an empty cluster has no center point') + return self.cached_center + def merge(self, other): + for bus_stop in other.stops: + bus_stop.cluster = self + self.stops |= other.stops + other.stops = set() + other.cached_center = None + def schedule(self, *, max_amount = 50): + result = [] + for stop in self.stops: + result += stop.schedule(max_amount = max_amount) + result.sort(key = lambda schedule_entry: schedule_entry['time']) + return result[:max_amount] + +class CustomBusStopCluster(BusStopCluster): + def __init__(self, *, name, stops): + super().__init__() + self.name = name + self.stops = stops + def add_stop(self, stop): + return NotImplemented + @property + def url_name(self): + from urllib.request import quote + return 'custom?stops=' + ';'.join(stop.code for stop in self.stops) + '&name=' + quote(self.name) + routes = {} routes_per_id = {} all_trips = {} @@ -320,45 +371,6 @@ bus_stop.region = None print('%d stops' % len(bus_stops), file = stderr) - class BusStopCluster: - def __init__(self): - self.stops = set() - self.cached_center = None - self.name = None - @property - def url_name(self): - return self.name.lower().replace('(', '').replace(')', '').replace(' ', '-') - def add_stop(self, stop): - assert not stop.cluster - stop.cluster = self - self.stops.add(stop) - self.cached_center = None - @property - def center(self): - if not self.cached_center: - if self.stops: - from statistics import median - pointtype = type(next(iter(self.stops)).location) - self.cached_center = pointtype( - median(stop.location.x for stop in self.stops), - median(stop.location.y for stop in self.stops), - ) - else: - raise ValueError('an empty cluster has no center point') - return self.cached_center - def merge(self, other): - for bus_stop in other.stops: - bus_stop.cluster = self - self.stops |= other.stops - other.stops = set() - other.cached_center = None - def schedule(self, *, max_amount = 50): - result = [] - for stop in self.stops: - result += stop.schedule(max_amount = 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) for bus_stop in bus_stops.values(): diff -r 4b09d8a597f8 -r 88a5110b66ba föli.osm --- a/föli.osm Mon Aug 13 22:56:30 2018 +0300 +++ b/föli.osm Fri Sep 07 00:23:42 2018 +0300 @@ -139,8 +139,8 @@ - - + + @@ -452,8 +452,8 @@ - - + + @@ -1578,992 +1578,996 @@ - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2575,7 +2579,7 @@ - + @@ -2587,7 +2591,7 @@ - + @@ -2600,7 +2604,7 @@ - + @@ -2614,7 +2618,7 @@ - + @@ -2626,11 +2630,11 @@ - + - - - + + + @@ -2641,7 +2645,7 @@ - + @@ -2651,7 +2655,7 @@ - + @@ -2668,7 +2672,7 @@ - + @@ -2688,9 +2692,9 @@ - + - + @@ -2698,7 +2702,7 @@ - + @@ -2709,7 +2713,7 @@ - + @@ -2726,18 +2730,18 @@ - + - - + + - - - + + + @@ -2745,7 +2749,7 @@ - + @@ -2754,7 +2758,7 @@ - + @@ -2768,7 +2772,7 @@ - + @@ -2779,27 +2783,27 @@ - + - - - - + + + + - + - + @@ -2807,7 +2811,7 @@ - + @@ -2818,7 +2822,7 @@ - + @@ -2829,9 +2833,9 @@ - + - + @@ -2840,19 +2844,19 @@ - + - + - + @@ -2865,7 +2869,7 @@ - + @@ -2875,7 +2879,7 @@ - + @@ -2887,7 +2891,7 @@ - + @@ -2898,7 +2902,7 @@ - + @@ -2909,7 +2913,7 @@ - + @@ -2922,21 +2926,21 @@ - + - + - + - + @@ -2954,7 +2958,7 @@ - + @@ -2967,7 +2971,7 @@ - + @@ -2986,7 +2990,7 @@ - + @@ -3005,7 +3009,7 @@ - + @@ -3025,7 +3029,7 @@ - + @@ -3039,21 +3043,21 @@ - + - - - - + + + + - + @@ -3065,21 +3069,21 @@ - - - + + + - + - + @@ -3091,12 +3095,12 @@ - + - - - - + + + + @@ -3105,7 +3109,7 @@ - + @@ -3119,7 +3123,7 @@ - + @@ -3129,12 +3133,12 @@ - + - - + + @@ -3143,21 +3147,21 @@ - + - + - + @@ -3175,7 +3179,7 @@ - + @@ -3186,7 +3190,7 @@ - + @@ -3197,7 +3201,7 @@ - + @@ -3207,7 +3211,7 @@ - + @@ -3219,24 +3223,24 @@ - + - + - - + + + - - + - + @@ -3247,7 +3251,7 @@ - + @@ -3260,7 +3264,7 @@ - + @@ -3269,7 +3273,7 @@ - + @@ -3282,7 +3286,7 @@ - + @@ -3293,7 +3297,7 @@ - + @@ -3306,7 +3310,7 @@ - + @@ -3317,7 +3321,7 @@ - + @@ -3328,7 +3332,7 @@ - + @@ -3340,7 +3344,7 @@ - + @@ -3349,9 +3353,9 @@ - + - + @@ -3361,7 +3365,7 @@ - + @@ -3371,10 +3375,10 @@ - + - + @@ -3383,20 +3387,20 @@ - + - + - + @@ -3406,7 +3410,7 @@ - + @@ -3422,7 +3426,7 @@ - + @@ -3436,7 +3440,7 @@ - + @@ -3453,7 +3457,7 @@ - + @@ -3466,7 +3470,7 @@ - + @@ -3476,7 +3480,7 @@ - + @@ -3489,7 +3493,7 @@ - + @@ -3500,7 +3504,7 @@ - + @@ -3513,7 +3517,7 @@ - + @@ -3527,8 +3531,9 @@ - + + @@ -3537,7 +3542,7 @@ - + @@ -3548,13 +3553,13 @@ - + - + @@ -3565,7 +3570,7 @@ - + @@ -3580,7 +3585,7 @@ - + @@ -3594,7 +3599,7 @@ - + @@ -3607,7 +3612,7 @@ - + @@ -3623,7 +3628,7 @@ - + @@ -3635,7 +3640,7 @@ - + @@ -3651,7 +3656,7 @@ - + @@ -3660,7 +3665,7 @@ - + @@ -3677,7 +3682,7 @@ - + @@ -3695,7 +3700,7 @@ - + @@ -3713,7 +3718,7 @@ - + @@ -3731,7 +3736,7 @@ - + @@ -3743,7 +3748,7 @@ - + @@ -3755,7 +3760,7 @@ - + @@ -3765,7 +3770,7 @@ - + @@ -3778,7 +3783,7 @@ - + @@ -3788,7 +3793,7 @@ - + @@ -3797,7 +3802,7 @@ - + @@ -3809,7 +3814,7 @@ - + @@ -3820,7 +3825,7 @@ - + @@ -3840,7 +3845,7 @@ - + @@ -3853,7 +3858,7 @@ - + @@ -3862,7 +3867,7 @@ - + @@ -3872,7 +3877,7 @@ - + @@ -3883,7 +3888,7 @@ - + @@ -3897,7 +3902,7 @@ - + @@ -3905,7 +3910,7 @@ - + @@ -3916,7 +3921,7 @@ - + @@ -3925,7 +3930,7 @@ - + @@ -3935,7 +3940,7 @@ - + @@ -3950,7 +3955,7 @@ - + @@ -3960,7 +3965,7 @@ - + @@ -3971,7 +3976,7 @@ - + @@ -3983,7 +3988,7 @@ - + @@ -3996,7 +4001,7 @@ - + @@ -4006,7 +4011,7 @@ - + @@ -4017,7 +4022,7 @@ - + @@ -4028,7 +4033,7 @@ - + @@ -4038,7 +4043,7 @@ - + @@ -4048,7 +4053,7 @@ - + @@ -4060,7 +4065,7 @@ - + @@ -4070,7 +4075,7 @@ - + @@ -4080,7 +4085,7 @@ - + @@ -4089,7 +4094,7 @@ - + @@ -4100,7 +4105,7 @@ - + @@ -4115,7 +4120,7 @@ - + @@ -4126,7 +4131,7 @@ - + @@ -4139,7 +4144,7 @@ - + @@ -4150,7 +4155,7 @@ - + @@ -4162,7 +4167,7 @@ - + @@ -4171,7 +4176,7 @@ - + @@ -4181,7 +4186,7 @@ - + @@ -4190,7 +4195,7 @@ - + @@ -4204,7 +4209,7 @@ - + @@ -4216,7 +4221,7 @@ - + @@ -4226,7 +4231,7 @@ - + @@ -4237,7 +4242,7 @@ - + @@ -4251,7 +4256,7 @@ - + @@ -4262,7 +4267,7 @@ - + @@ -4272,7 +4277,7 @@ - + @@ -4288,7 +4293,7 @@ - + @@ -4299,7 +4304,7 @@ - + @@ -4309,7 +4314,7 @@ - + @@ -4320,26 +4325,28 @@ - + + - + + - + @@ -4349,6 +4356,7 @@ + @@ -4356,7 +4364,7 @@ - + @@ -4366,10 +4374,11 @@ + - + @@ -4377,10 +4386,11 @@ + - + @@ -4389,10 +4399,11 @@ + - + @@ -4400,10 +4411,11 @@ + - + @@ -4412,10 +4424,11 @@ + - + @@ -4423,19 +4436,21 @@ + - + + - + @@ -4448,7 +4463,7 @@ - + @@ -4469,7 +4484,7 @@ - + @@ -4481,7 +4496,7 @@ - + @@ -4492,7 +4507,7 @@ - + @@ -4504,7 +4519,7 @@ - + @@ -4513,7 +4528,7 @@ - + @@ -4522,7 +4537,7 @@ - + @@ -4533,7 +4548,7 @@ - + @@ -4543,7 +4558,7 @@ - + @@ -4555,11 +4570,12 @@ + - + @@ -4567,11 +4583,12 @@ + - + @@ -4579,21 +4596,23 @@ - - - + + + + + - + @@ -4605,10 +4624,11 @@ + - + @@ -4619,7 +4639,7 @@ - + @@ -4628,7 +4648,7 @@ - + @@ -4638,7 +4658,7 @@ - + @@ -4650,7 +4670,7 @@ - + @@ -4662,7 +4682,7 @@ - + @@ -4673,7 +4693,7 @@ - + @@ -4683,7 +4703,7 @@ - + @@ -4698,7 +4718,7 @@ - + @@ -4714,35 +4734,37 @@ - + - - - - + + + + + - + + - + - + @@ -4753,7 +4775,7 @@ - + @@ -4764,17 +4786,18 @@ - + + - + @@ -4785,7 +4808,7 @@ - + @@ -4793,11 +4816,12 @@ + - + @@ -4809,7 +4833,7 @@ - + @@ -4820,7 +4844,7 @@ - + @@ -4830,7 +4854,7 @@ - + @@ -4843,7 +4867,7 @@ - + @@ -4851,15 +4875,16 @@ + - + - + @@ -4869,7 +4894,7 @@ - + @@ -4878,19 +4903,19 @@ - + - + - + @@ -4904,11 +4929,11 @@ - + - - + + @@ -4920,7 +4945,7 @@ - + @@ -4931,11 +4956,11 @@ - + - + - + @@ -4947,7 +4972,7 @@ - + @@ -4965,7 +4990,7 @@ - + @@ -4978,7 +5003,7 @@ - + @@ -4989,43 +5014,46 @@ - + - + + - + + - + + - + - + @@ -5035,13 +5063,13 @@ - + - + @@ -5050,7 +5078,7 @@ - + @@ -5063,7 +5091,7 @@ - + @@ -5075,7 +5103,7 @@ - + @@ -5088,7 +5116,7 @@ - + @@ -5110,7 +5138,7 @@ - + @@ -5118,7 +5146,7 @@ - + @@ -5129,7 +5157,7 @@ - + @@ -5146,10 +5174,9 @@ - - - - + + + @@ -5158,7 +5185,7 @@ - + @@ -5173,7 +5200,7 @@ - + @@ -5183,7 +5210,7 @@ - + @@ -5200,7 +5227,7 @@ - + @@ -5211,11 +5238,11 @@ - + - - - + + + @@ -5223,26 +5250,26 @@ - + - + - + - + - + @@ -5253,7 +5280,7 @@ - + @@ -5262,12 +5289,12 @@ - + - + @@ -5279,7 +5306,7 @@ - + @@ -5289,38 +5316,41 @@ - + + - + + - + + - + @@ -5329,7 +5359,7 @@ - + @@ -5338,7 +5368,7 @@ - + @@ -5346,10 +5376,9 @@ - - - - + + + @@ -5360,7 +5389,7 @@ - + @@ -5375,7 +5404,7 @@ - + @@ -5386,7 +5415,7 @@ - + @@ -5398,7 +5427,7 @@ - + @@ -5407,7 +5436,7 @@ - + @@ -5418,7 +5447,7 @@ - + @@ -5432,7 +5461,7 @@ - + @@ -5446,11 +5475,11 @@ - + - - + + @@ -5460,7 +5489,7 @@ - + @@ -5471,19 +5500,19 @@ - + - - - - - - + + + + + + @@ -5492,7 +5521,7 @@ - + @@ -5509,7 +5538,7 @@ - + @@ -5529,7 +5558,7 @@ - + @@ -5538,11 +5567,11 @@ - + - - + + @@ -5550,7 +5579,7 @@ - + @@ -5562,7 +5591,7 @@ - + @@ -5575,7 +5604,7 @@ - + @@ -5585,7 +5614,7 @@ - + @@ -5597,7 +5626,7 @@ - + @@ -5608,7 +5637,7 @@ - + @@ -5618,7 +5647,7 @@ - + @@ -5628,7 +5657,7 @@ - + @@ -5638,7 +5667,7 @@ - + @@ -5647,7 +5676,7 @@ - + @@ -5656,7 +5685,7 @@ - + @@ -5665,7 +5694,7 @@ - + @@ -5674,9 +5703,9 @@ - + - + @@ -5684,7 +5713,7 @@ - + @@ -5694,7 +5723,7 @@ - + @@ -5706,12 +5735,12 @@ - + - + @@ -5720,7 +5749,7 @@ - + @@ -5741,17 +5770,17 @@ - + - + - + @@ -5760,7 +5789,7 @@ - + @@ -5769,7 +5798,7 @@ - + @@ -5781,884 +5810,896 @@ - + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + + - - - - - - - - + + + + + - - - - - + + + + - - - - - - - - - + - + + + + + + + + + + + + - - - - - - - - + + + + + + - - - - - - - - - - - + + - + + + + + - - - - - + - + + + + + + + + + + - - - - + + + + - - - - - + + + + - - - - - + + + + + + + - - - - - - - + + + + + + - - - - - - + - - - - - + - - + + + + + + + + + + + - - - - - - - - - - - + - - + + + - + + + + + + + + + + + - - - - - - + + + + + - - - - + + + + + - - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + + + - - - - - - + + + + + + - - - - - - - + + + + - - - - - + + + + + + - - - - - - + + + + + + - - - - - - - + - + + + + + + - - - - - - + + + + + - - - + + + + + + - - - - - - + + + - - - + + + + + + - - - - - - - + + + + + - - - - - + + + + + + - + + - + - + + - + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + + + - - + - + + + - + - - - - + - - - - - - + + + + + + - - - - + + + + - - - - - + + + + - - - - - + + + + + + - - - - + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - - - + + + + + + - - - - - + + + + + + + + - - - - - - - + + + + + + - - - - - + + + - - - + + + + + - - - - - + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - + + + + + - - - - - + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + + - - - - - + + + + + + - - - - - - - - + + + + + + - - - - - - - - - - + + + - + + + + + + + + + + + - - - - - + + + + + + - - - - - + + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + - - - - - + + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - - + + + + + - - - - - + + + + + + - - - - - @@ -6672,29 +6713,29 @@ + + + + + + + - - - - - - - + + + + + + + - - - - - - - @@ -6702,982 +6743,994 @@ - - - - - + + + + + + + + + + - - - - + + + + - - - - - - - - - - + + + + + + + + + + + + - - - - - - - + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + + + - - - - - - - + + + + + - - - - - + - + + + + + + - - - - - - + + + + + + + - - - - - + + + + + - - - - - + + + + - - - - + + + + - - - - + + + + + - - - - + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + - - - - + + + + - - - - + + + + + - - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + + - - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + + - - - - - + + + + - - - - - + + + + + + - - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - - - - + + + + - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + + + - - - - - - + - - - + + + + + - - - - - + + + + + + + + - - - - - + + + + + + - - - - - - - + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - - - - - - - + - - + + + + + + + + + + - - - - - - + + + + + + - - - - - + + + + + + - - - - - + + + + + + - - - - - - + + + + + + - - - - + + + + + - - - - - - - - - + + + + + - - - - - - - - - - + + + - + + + + + + + + + + + + - - + + - - + - - - - - - - + + + + + + + - - - - - - + + + + + - - - - - - + + + + + - - - - - - - - - - + + - + + + + + + + + + + - - - - + + + + - - - - + + + + - - - - - + + + + - - - - - + - - - - - + - + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + diff -r 4b09d8a597f8 -r 88a5110b66ba regions.py --- a/regions.py Mon Aug 13 22:56:30 2018 +0300 +++ b/regions.py Fri Sep 07 00:23:42 2018 +0300 @@ -36,4 +36,6 @@ if 'region' in way and 'name' in way: way['priority'] = int(way.get('priority', 1)) regions[way['name']] = way + if 'external' in way: + way['priority'] = -1 return regions diff -r 4b09d8a597f8 -r 88a5110b66ba service.py --- a/service.py Mon Aug 13 22:56:30 2018 +0300 +++ b/service.py Fri Sep 07 00:23:42 2018 +0300 @@ -210,6 +210,7 @@ return render_template( 'stop.html', schedule = schedule, + ref = bus_stop.code, name = bus_stop.code + ' ' + tr(bus_stop.name, 'bus-stops'), link_to_map = bus_stop.location.link_to_map, region = hasattr(bus_stop, 'region_name') and bus_stop.region or None, @@ -221,7 +222,7 @@ ) def week_schedule(bus_stop, start_date = today(), **kwargs): - for i in range(-1, 7): + for i in range(7): try: yield from bus_stop.schedule_for_day(start_date + timedelta(i), **kwargs) except ValueError: @@ -324,7 +325,7 @@ sign_tuple = tuple(sign_elements(schedule_entry, format = 'short')) sign_tuple = tuple(greatly_simplify_name(k) for k in sign_tuple) route = schedule_entry['trip'].route.reference - night_routes[route] &= is_weekend_night(schedule_entry['time']) + night_routes[route] &= is_night_time(schedule_entry['time']) destinations_per_route[route][sign_tuple] += 1 trip_mapping[schedule_entry_hash(schedule_entry)] = (route, sign_tuple) num_leaves += 1 @@ -575,28 +576,21 @@ with activate_locale(): return time.strftime('%-d.%-m. %H:%M').replace(' ', '\xa0') -@app.route('/stop_cluster/') -def cluster_schedule(cluster_name): - from buses import bus_stops, clusters_by_name - schedule = [] - try: - cluster = clusters_by_name[cluster_name] - except KeyError: - abort(404) - for schedule_entry in cluster.schedule(max_amount = 100): - schedule.append({ - 'time': time_representation(schedule_entry['time']), - 'route': schedule_entry['trip'].route.reference, - 'route-splice': split_route_ref(schedule_entry['trip'].route.reference), - 'sign': sign(schedule_entry), - 'trip': schedule_entry['stop'].trip.name, - 'night': is_night_time(schedule_entry['time']), - 'stop_id': schedule_entry['stop'].stop.reference, - 'stop_code': schedule_entry['stop'].stop.code, - 'stop_name': tr(schedule_entry['stop'].stop.name, 'bus-stops', 'places'), - 'imminent': imminent(schedule_entry), - 'typename': schedule_entry['stop'].stop.typename, - }) +def make_cluster(cluster): + schedule = list({ + 'time': time_representation(schedule_entry['time']), + 'route': schedule_entry['trip'].route.reference, + 'route-splice': split_route_ref(schedule_entry['trip'].route.reference), + 'sign': sign(schedule_entry), + 'trip': schedule_entry['stop'].trip.name, + 'night': is_night_time(schedule_entry['time']), + 'stop': schedule_entry['stop'].stop, + 'stop_id': schedule_entry['stop'].stop.reference, + 'stop_code': schedule_entry['stop'].stop.code, + 'stop_name': tr(schedule_entry['stop'].stop.name, 'bus-stops', 'places'), + 'imminent': imminent(schedule_entry), + 'typename': schedule_entry['stop'].stop.typename, + } for schedule_entry in cluster.schedule(max_amount = 100)) stops_in_cluster = sorted( ({ 'id': stop.reference, @@ -617,6 +611,29 @@ service = min(set.union(*[bus_stop.services for bus_stop in cluster.stops])), ) +@app.route('/stop_cluster/') +def cluster_schedule(cluster_name): + from buses import bus_stops, clusters_by_name + try: + cluster = clusters_by_name[cluster_name] + except KeyError: + abort(404) + else: + return make_cluster(cluster) + +@app.route('/custom') +def custom_cluster(): + from flask import request + from buses import bus_stops, CustomBusStopCluster + if 'stops' in request.args: + cluster = CustomBusStopCluster( + name = request.args.get('name', 'Aikataulu'), + stops = {bus_stops[stop_code] for stop_code in str.split(request.args['stops'], ';')}, + ) + return make_cluster(cluster) + else: + return render_template('custom_cluster.html') + def day_class(weekday): if weekday < 5: return 'working-day' @@ -628,7 +645,7 @@ class Week: def __init__(self, year, weeknumber): - self.year, self.weeknumber = year, weeknumber + self.year, self.weeknumber = int(year), int(weeknumber) def normalize(self): while self.weeknumber > 52: self.weeknumber -= 52 @@ -665,6 +682,8 @@ return Week(year = int(year), weeknumber = int(weeknumber)) except ValueError: raise ValueError('bad week string: ' + repr(string)) + def __str__(self): + return str(self.year) + 'W' + str(self.weeknumber) @staticmethod def now(): from datetime import date @@ -700,7 +719,7 @@ except KeyError: abort(404) week_model = {} - bus_stop_schedule = list(week_schedule(bus_stop, start_date = week.monday(), arrivals = True)) + bus_stop_schedule = list(week_schedule(bus_stop, start_date = week.monday(), arrivals = True, allow_gone = True)) description = describe(bus_stop, bus_stop_schedule) for schedule_entry in bus_stop_schedule: route_ref = schedule_entry['trip'].route.reference @@ -708,12 +727,12 @@ time = schedule_entry['time'] date = schedule_entry['date'] if date not in week_model: - week_model[date] = {} + week_model[date] = dict() day_model = week_model[date] if time.hour not in day_model: - day_model[time.hour] = [] + day_model[time.hour] = list() hour_model = day_model[time.hour] - hour_model.append({ + list.append(hour_model, { 'route': description['variant-map'][schedule_entry_hash(schedule_entry)], 'route-splice': split_route_ref(route_ref), 'trip': schedule_entry['stop'].trip.name, @@ -730,8 +749,8 @@ else: def hour_key(x): return (x - 5) % 24 - # Fill in missing hours from 5am to last active hour - hours = set(day_model.keys()) | {5} + # Fill in missing hours + hours = set(dict.keys(day_model)) sorted_hours = sorted(hours, key = hour_key) start_hour = sorted_hours[0] end_hour = sorted_hours[-1] + 1 @@ -764,6 +783,8 @@ description = description, typename = bus_stop.typename, curweek = week, + next_week = week + 1, + previous_week = week - 1, ) @app.route('/trip/') @@ -822,31 +843,33 @@ service = trip.route.service, ) -@app.route('/route/') -def route_page(name): - from buses import routes - from collections import defaultdict - from busroute import greatly_simplify_name - route = routes[name.upper()] - schedules = defaultdict(list) - for trip in route.trips: - if trip.is_served_at(today()): - schedules[trip.schedule[0].stop].append({ - 'name': trip.reference, - 'from': trip.from_place, - 'to': trip.to_place, - 'description': ' - '.join( - greatly_simplify_name(place) - for place in trip_description(trip) - ), - 'gone': datetime.combine(today(), time()) + trip.schedule[-1].arrival_time < now(), - 'time': time_representation(datetime.combine(today(), time()) + trip.schedule[0].departure_time), - }) - return render_template('route.html', - name = route.reference + ' ' + route.description, - tr = tr, - schedules = schedules, - ) +@app.route('/route/') +def route_page(names): + from buses import routes + from collections import defaultdict + from busroute import greatly_simplify_name + routes = {routes[name.upper()] for name in names.split(';')} + schedules = defaultdict(list) + for route in routes: + for trip in route.trips: + if trip.is_served_at(today()): + schedules[trip.schedule[0].stop].append({ + 'name': trip.reference, + 'from': trip.from_place, + 'to': trip.to_place, + 'description': ' - '.join( + greatly_simplify_name(place) + for place in trip_description(trip) + ), + 'gone': datetime.combine(today(), time()) + trip.schedule[-1].arrival_time < now(), + 'time': time_representation(datetime.combine(today(), time()) + trip.schedule[0].departure_time), + 'route': route.reference, + }) + return render_template('route.html', + name = route.reference + ' ' + route.description, + tr = tr, + schedules = schedules, + ) @app.route('/interesting') def interesting(): diff -r 4b09d8a597f8 -r 88a5110b66ba templates/cluster.html --- a/templates/cluster.html Mon Aug 13 22:56:30 2018 +0300 +++ b/templates/cluster.html Fri Sep 07 00:23:42 2018 +0300 @@ -1,8 +1,9 @@ -{% from "macros.html" import route_rep %} +{% from "macros.html" import route_rep, bus_stop_rep %} + {{name}} @@ -56,7 +57,7 @@ 📌 {% if cluster %} - 🞊 + 🞊 {% endif %} @@ -71,13 +72,14 @@ {{halt['time']}} - {{halt['stop_code']}} + + {{bus_stop_rep(halt['stop'])}} - {{route_rep(halt['route-splice'])}} + {{route_rep(halt['route-splice'])}} - {{halt['sign']}} + {{halt['sign']}} {% endfor %} diff -r 4b09d8a597f8 -r 88a5110b66ba templates/stop.html --- a/templates/stop.html Mon Aug 13 22:56:30 2018 +0300 +++ b/templates/stop.html Fri Sep 07 00:23:42 2018 +0300 @@ -31,6 +31,7 @@ {% if cluster %} 🞊 {% endif %} + diff -r 4b09d8a597f8 -r 88a5110b66ba templates/stop_week.html --- a/templates/stop_week.html Mon Aug 13 22:56:30 2018 +0300 +++ b/templates/stop_week.html Fri Sep 07 00:23:42 2018 +0300 @@ -202,7 +202,9 @@ + {{ref}} {{name}} + @@ -211,7 +213,7 @@ {% for entry in description['description'] %} - {% for route in entry[0] %}{{ route }}{{ route != entry[0][-1] and ' ' or '' }}{% endfor %} + {% for route in entry[0] %}{{ route }}{{ route != entry[0][-1] and '.' or '' }}{% endfor %} {{ entry[1] }}