diff --git a/busManager/coord/admin.py b/busManager/coord/admin.py index 671a413..e77d4fe 100644 --- a/busManager/coord/admin.py +++ b/busManager/coord/admin.py @@ -147,6 +147,10 @@ class TravellerAdmin(MyImportExportModelAdmin, CloneModelAdmin, admin.ModelAdmin "travel_end_date", "eligibility_status", "fare_paying", + "term_1_paid", + "term_2_paid", + "term_3_paid", + "term_4_paid", "assessment_date", "application_form_completed", "parent_notified", @@ -199,5 +203,11 @@ class SettingAdmin(MyImportExportModelAdmin, admin.ModelAdmin): list_display = ["name", "value"] -admin.site.register(Shuttle) -admin.site.register(Driver) +@admin.register(Shuttle) +class ShuttleAdmin(MyImportExportModelAdmin, admin.ModelAdmin): + list_display = ["__str__", "school", "bus"] + + +@admin.register(Driver) +class DriverAdmin(MyImportExportModelAdmin, admin.ModelAdmin): + pass diff --git a/busManager/coord/models.py b/busManager/coord/models.py index 9625ff9..24d6bc3 100644 --- a/busManager/coord/models.py +++ b/busManager/coord/models.py @@ -93,7 +93,7 @@ class Shuttle(models.Model): ordering = ["school__name"] def __str__(self): - return f"{self.bus.route_name} -> {self.school.shortName}" + return f"{self.school.shortName} <-> {self.bus.route_name}" class Driver(models.Model): @@ -187,6 +187,10 @@ class Traveller(models.Model): eligibility_status = models.CharField(max_length=1, choices=ELIGIBILITY_STATUS) assessment_date = models.DateField(blank=True, null=True) fee_per_term = models.DecimalField(decimal_places=2, max_digits=5, blank=True, null=True) + term_1_paid = models.BooleanField(default=False) + term_2_paid = models.BooleanField(default=False) + term_3_paid = models.BooleanField(default=False) + term_4_paid = models.BooleanField(default=False) application_form_completed = models.BooleanField() parent_notified = models.BooleanField() seat_number = models.CharField(max_length=5, blank=True) diff --git a/busManager/coord/templates/reports/bus_numbers.html b/busManager/coord/templates/reports/bus_numbers.html index 72a8e1f..ac05fec 100644 --- a/busManager/coord/templates/reports/bus_numbers.html +++ b/busManager/coord/templates/reports/bus_numbers.html @@ -1,13 +1,34 @@ + +

Bus Numbers

- + + + + + {% for bus in buses %} - + + + + + {% if bus.over_capacity %} + + {% else %} + + {% endif %} {% endfor %}
Route NameNumber of StudentsDriverRoute TravellersShuttleShuttle TravellersSeating Max
{{ bus.route_name }}{{ bus.num_travellers }}{{ bus.drivers }}{{ bus.route_travellers }}{{ bus.shuttle }}{{ bus.shuttle_travellers }}{{ bus.seating_capacity }}{{ bus.seating_capacity }}
\ No newline at end of file diff --git a/busManager/coord/templates/reports/bus_roll_old.html b/busManager/coord/templates/reports/bus_roll_old.html deleted file mode 100644 index d283545..0000000 --- a/busManager/coord/templates/reports/bus_roll_old.html +++ /dev/null @@ -1,33 +0,0 @@ -{% for route in routes %} -

{{ route.route_name }}

- {% for stop in route.stops %} - - Stop Number - Address - Pickup Time - Drop-off Time - - - {{ stop.stop_num }} - {{ stop.name }} - {{ stop.am }} - {{ stop.pm }} - - {% for traveller in stop.travellers %} - - Student - Mon AM - Mon PM - Tue AM - Tue PM - - - {{ traveller.traveller }} - {{ traveller.mon_am }} - {{ traveller.mon_pm }} - {{ traveller.tue_am }} - {{ traveller.tue_pm }} - - {% endfor %} - {% endfor %} -{% endfor %} \ No newline at end of file diff --git a/busManager/coord/templates/reports/bus_summary.html b/busManager/coord/templates/reports/bus_summary.html new file mode 100644 index 0000000..487c244 --- /dev/null +++ b/busManager/coord/templates/reports/bus_summary.html @@ -0,0 +1,26 @@ +{% for route in routes %} +

{{ route.bus.company }}

+ + + + + + + + + +
Route nameDriver
{{ route.bus.route_name }}{{ route.drivers }}
+ + + + + + {% for stop in route.stops %} + + + + + {% endfor %} +
Stop #Address
{{ stop.get_stop_number }}{{ stop.address }}
+

+{% endfor %} \ No newline at end of file diff --git a/busManager/coord/urls.py b/busManager/coord/urls.py index c62b889..affe351 100644 --- a/busManager/coord/urls.py +++ b/busManager/coord/urls.py @@ -3,7 +3,8 @@ from django.urls import path from . import views urlpatterns = [ - path("", views.bus_numbers, name="index"), path("roll", views.bus_roll, name="Student Roll"), - path("contacts", views.emergency_contacts, name="Emergency Contacts") + path("contacts", views.emergency_contacts, name="Emergency Contacts"), + path("stops", views.bus_summary, name="Stop Summary"), + path("summary", views.bus_numbers, name="Bus Summary") ] diff --git a/busManager/coord/views.py b/busManager/coord/views.py index 910694e..c2c31b2 100644 --- a/busManager/coord/views.py +++ b/busManager/coord/views.py @@ -13,8 +13,34 @@ from .models import Company, Bus, Traveller, BusStop, TravellerRoute, Shuttle, D def bus_numbers(request): buses = [] for bus in Bus.objects.all(): - num_travellers = Traveller.objects.filter(bus_stops__bus=bus).count() - buses.append({'route_name': bus.route_name, 'num_travellers': num_travellers}) + + drivers = "" + for driver in Driver.objects.filter(bus=bus): + driver_name = f"{driver.first_name} {driver.last_name}" + if drivers == "": + drivers = driver_name + else: + drivers += f", {driver_name}" + + route_travellers = Traveller.objects.filter(bus_stops__bus=bus).count() + over_capacity = route_travellers > bus.seating_capacity + shuttle = Shuttle.objects.filter(bus=bus).first() + if shuttle: + shuttle = shuttle.school.shortName + shuttle_travellers = Traveller.objects.filter(shuttle__bus=bus).count() + over_capacity = over_capacity or int(shuttle_travellers) > bus.seating_capacity + else: + shuttle = "" + shuttle_travellers = "" + buses.append({ + 'route_name': bus.route_name, + 'drivers': drivers, + 'route_travellers': route_travellers, + 'shuttle': shuttle, + 'shuttle_travellers': shuttle_travellers, + 'seating_capacity': bus.seating_capacity, + 'over_capacity': over_capacity, + }) return render(request, 'reports/bus_numbers.html', {'buses': buses}) @@ -52,11 +78,43 @@ def bus_roll(request, queryset=None): # print(traveller_list) bus_route.append(stop_result) + # Todo Add shuttles + bus_routes.append({'route_name': bus.route_name, 'stops': bus_route}) return render(request, 'reports/bus_roll.html', {'routes': bus_routes}) +@staff_member_required +def bus_summary(request, queryset=None): + bus_routes = [] + if queryset is None: + buses = Bus.objects.all() + else: + buses = queryset + + for bus in buses: + + drivers = "" + for driver in Driver.objects.filter(bus=bus): + driver_name = f"{driver.first_name} {driver.last_name}" + if drivers == "": + drivers = driver_name + else: + drivers += f", {driver_name}" + + stops = [] + for bus_stop in BusStop.objects.filter(bus=bus): + stops.append(bus_stop) + + bus_routes.append({ + 'bus': bus, + 'drivers': drivers, + 'stops': stops + }) + return render(request, 'reports/bus_summary.html', {'routes': bus_routes}) + + @staff_member_required def emergency_contacts(request, queryset=None): if queryset is None: @@ -70,11 +128,11 @@ def emergency_contacts(request, queryset=None): for travellerRoute in TravellerRoute.objects.filter(busStop__bus=bus): traveller = travellerRoute.traveller parent_a = "" - if travellerRoute.traveller.guardian_A_firstname: - parent_a = f"{traveller.guardian_A_firstname} {traveller.guardian_A_lastname} ({traveller.guardian_A_phone})" + if travellerRoute.traveller.parent_A_firstname: + parent_a = f"{traveller.parent_A_firstname} {traveller.parent_A_lastname} ({traveller.parent_A_phone})" parent_b = "" - if travellerRoute.traveller.guardian_B_firstname: - parent_b = f"{traveller.guardian_B_firstname} {traveller.guardian_B_lastname} ({traveller.guardian_B_phone})" + if travellerRoute.traveller.parent_B_firstname: + parent_b = f"{traveller.parent_B_firstname} {traveller.parent_B_lastname} ({traveller.parent_B_phone})" contact_a = "" if travellerRoute.traveller.emergency_contact_A_firstname: contact_a = f"{traveller.emergency_contact_A_firstname} {traveller.emergency_contact_A_lastname} ({traveller.emergency_contact_A_phone})"