from django.db.models import Prefetch from transport.models import Bus, Driver, BusStop, Shuttle from traveller.models import TravellerRoute, Traveller, Family def bus_summary_context(): bus_routes = [] for bus in Bus.objects.all(): drivers = [] for driver in Driver.objects.filter(bus=bus): drivers.append(driver) stops = [] for bus_stop in BusStop.objects.filter(bus=bus): stops.append(bus_stop) traveller_count = 0 for travellerRoute in TravellerRoute.objects.filter(busStop__bus=bus): if travellerRoute.traveller._is_active(): traveller_count += 1 shuttle_name = "" shuttle_count = 0 for shuttle in Shuttle.objects.filter(bus=bus): if shuttle_name == "": shuttle_name = shuttle.school.shortName else: shuttle_name += f", {shuttle.school.shortName}" for traveller in Traveller.objects.filter(shuttle=shuttle): if traveller._is_active(): shuttle_count += 1 over_capacity = traveller_count > bus.seating_capacity or shuttle_count > bus.seating_capacity if shuttle_count == 0: shuttle_count = "" bus_routes.append({ 'bus': bus, 'drivers': drivers, 'stops': stops, 'traveller_count': traveller_count, 'shuttle_name': shuttle_name, 'shuttle_count': shuttle_count, 'over_capacity': over_capacity, }) return {'routes': bus_routes} def emergency_contacts_context(queryset=None): if queryset is None: buses = Bus.objects.all() else: buses = queryset buses = buses.prefetch_related( Prefetch( "driver_set", queryset=Driver.objects.all() ), Prefetch( "busstop_set__traverseroute_set", queryset=TravellerRoute.objects.select_related( "traveller", "busStop" ).prefetch_related( Prefetch( "traveller__family_set", queryset=Family.objects.select_related( "contact_A", "contact_B", "emergency_contact_A", "emergency_contact_B", ) ) ) ) ) bus_routes = [] for bus in buses: drivers = list(bus.driver_set.all()) traveller_list = [] traveller_routes = TravellerRoute.objects.filter( busStop__bus=bus ).select_related( "traveller" ) for travellerRoute in traveller_routes: traveller = travellerRoute.traveller if not traveller.is_active: continue for family in traveller.family_set.all(): parent_a = "" parent_b = "" contact_a = "" contact_b = "" if family.contact_A: parent_a = f"{family.contact_A.first_name} {family.contact_A.last_name} ({family.contact_A.phone})" if family.contact_B: parent_b = f"{family.contact_B.first_name} {family.contact_B.last_name} ({family.contact_B.phone})" if family.emergency_contact_A: contact_a = f"{family.emergency_contact_A.first_name} {family.emergency_contact_A.last_name} ({family.emergency_contact_A.phone})" if family.emergency_contact_B: contact_b = f"{family.emergency_contact_B.first_name} {family.emergency_contact_B.last_name} ({family.emergency_contact_B.phone})" traveller_list.append({ "traveller": traveller, "parent_a": parent_a, "parent_b": parent_b, "contact_a": contact_a, "contact_b": contact_b, "note": travellerRoute.notes }) bus_routes.append({ "bus": bus, "drivers": drivers, "travellers": traveller_list }) return {"routes": bus_routes}