import datetime from transport.models import Bus, Shuttle, BusStop from traveller.models import TravellerRoute, Traveller def route_paged_context(bus, date=None): table_header_size = 5 page_max_size = 45 page_size = 3 # Account for traveller numbers at the top of the first page route_stops = [] for bus_stop in BusStop.objects.filter(bus=bus): traveller_routes = TravellerRoute.objects.filter(busStop=bus_stop) traveller_list = [] for trav_route in traveller_routes: traveller = trav_route.traveller if not traveller._is_active(date): continue is_fared = "---" if traveller.eligibility_status == "2": is_fared = "Y" traveller_list.append({ 'display': f"{traveller} ({traveller.get_year_level_display()}, {traveller.school.shortName})", 'isFared': is_fared }) traveller_list.sort(key=lambda t: t["display"].lower()) stop_size = len(traveller_list) page_break = False page_size += table_header_size + stop_size if page_size > page_max_size: if len(route_stops) > 0: # Don't break the page if it's the first stop page_break = True page_size = table_header_size + stop_size route_stops.append({ 'stop_num': bus_stop.get_stop_number(), 'name': bus_stop.address, 'am': bus_stop.am_time, 'pm': bus_stop.pm_time, 'travellers': traveller_list, 'page_break': page_break }) return route_stops def shuttle_route_context(shuttle, date=None): shuttle_travellers = [] for traveller in Traveller.objects.filter(shuttle=shuttle): if traveller._is_active(date): shuttle_travellers.append({ 'display': f"{traveller} ({traveller.get_year_level_display()}, {traveller.school})", }) shuttle_travellers.sort(key=lambda t: t["display"].lower()) return {'shuttle': shuttle, 'shuttle_travellers': shuttle_travellers, 'traveller_count': shuttle.traveller_count(date)} def bus_roll_context(queryset=None, include_bus_stops=True, date=None): bus_routes = [] if queryset is None: buses = Bus.objects.all() else: buses = queryset for bus in buses: route_stops = [] if include_bus_stops: route_stops = route_paged_context(bus=bus, date=date) shuttle_routes = [] for shuttle in Shuttle.objects.filter(bus=bus): shuttle_routes.append(shuttle_route_context(shuttle, date)) bus_routes.append({'name': bus.route_name, 'traveller_count': bus.traveller_count(date), 'seating_capacity': bus.seating_capacity, 'bus': bus, 'route_stops': route_stops, 'shuttle_routes': shuttle_routes}) if date is None: date = datetime.date.today() return {'routes': bus_routes, 'date': date.strftime('%Y-%m-%d')}