diff --git a/.gitignore b/.gitignore index ae1d867..efc551a 100644 --- a/.gitignore +++ b/.gitignore @@ -132,5 +132,4 @@ GitHub.sublime-settings /media /static /busManager/busManager/settings.py -/busManager/coord/migrations -/busManager/busManager/templates/admin/base.html \ No newline at end of file +/busManager/coord/migrations \ No newline at end of file diff --git a/busManager/busManager/templates/admin/base.html b/busManager/busManager/templates/admin/base.html new file mode 100644 index 0000000..3813615 --- /dev/null +++ b/busManager/busManager/templates/admin/base.html @@ -0,0 +1,21 @@ +{% extends 'admin/base.html' %} {% block extrahead %}{{ block.super }} +{% load i18n static %} + +{% endblock %} +{% block userlinks %} + Emergency Contacts / + Bus Roll / + Bus Routes / + Resources / +
+ {% include "admin/color_theme_toggle.html" %} +{% endblock %} \ No newline at end of file diff --git a/busManager/busManager/urls.py b/busManager/busManager/urls.py index 69cd1d1..93c5ef3 100644 --- a/busManager/busManager/urls.py +++ b/busManager/busManager/urls.py @@ -22,7 +22,7 @@ admin.site.site_header = "Bus Portal Admin" urlpatterns = [ path('report/', include("coord.urls")), - path('admin/logout/', azure_auth_logout), - path('admin/', admin.site.urls), + path('logout/', azure_auth_logout), path('auth/', include("azure_auth.urls"),), + path('', admin.site.urls), ] diff --git a/busManager/coord/context_helpers.py b/busManager/coord/context_helpers.py index 6dfd2f6..2fc368a 100644 --- a/busManager/coord/context_helpers.py +++ b/busManager/coord/context_helpers.py @@ -1,4 +1,4 @@ -from coord.models import Bus, BusStop, TravellerRoute, Driver +from coord.models import Bus, BusStop, TravellerRoute, Driver, Traveller, Shuttle def bus_roll_context(queryset=None): @@ -78,3 +78,48 @@ def emergency_contacts_context(queryset=None): bus_routes.append({'bus': bus, 'drivers': drivers, 'travellers': traveller_list}) return {'routes': bus_routes} + + +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} diff --git a/busManager/coord/templates/reports/bus_summary.html b/busManager/coord/templates/reports/bus_summary.html index 487c244..63fcc63 100644 --- a/busManager/coord/templates/reports/bus_summary.html +++ b/busManager/coord/templates/reports/bus_summary.html @@ -1,24 +1,61 @@ + + +| Route Name | +Driver | +Route Travellers | +Shuttle | +Shuttle Travellers | +Seating Max | +|
|---|---|---|---|---|---|---|
| {{ route.bus.route_name }} | +
+ {% for driver in route.drivers %}
+ {{ driver }} + {% endfor %} + |
+ {{ route.traveller_count }} | +{{ route.shuttle_name }} | +{{ route.shuttle_count }} | + {% if route.over_capacity %} +{{ route.seating_capacity }} | + {% else %} +{{ route.seating_capacity }} | + {% endif %} +
+ {% for route in routes %} -
| Route name | -Driver | -
|---|---|
| {{ route.bus.route_name }} | -{{ route.drivers }} | -
Driver: {{ driver }} ({{ driver.phone_number }})
+ {% endfor %}| Stop # | Address | +AM Time | +PM Time |
|---|---|---|---|
| {{ stop.get_stop_number }} | {{ stop.address }} | +{{ stop.am_time }} | +{{ stop.pm_time }} |
Driver: {{ driver }} ({{ driver.phone_number }})
- {% endfor %} -| Student | +Parent A | +Parent B | +Emergency Contact A | +Emergency Contact B | +Driver notes | +||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Student | -Parent A | -Parent B | -Emergency Contact A | -Emergency Contact B | -Driver notes | +{{ traveller.traveller.last_name }}, {{ traveller.traveller.first_name }} ({{ traveller.traveller.school.shortName }}) | +{{ traveller.parent_a }} | +{{ traveller.parent_b }} | +{{ traveller.contact_a }} | +{{ traveller.contact_b }} | +{{ traveller.note }} |
| {{ traveller.traveller.last_name }}, {{ traveller.traveller.first_name }} ({{ traveller.traveller.school.shortName }}) | -{{ traveller.parent_a }} | -{{ traveller.parent_b }} | -{{ traveller.contact_a }} | -{{ traveller.contact_b }} | -{{ traveller.note }} | -
{% endfor %} \ No newline at end of file diff --git a/busManager/coord/urls.py b/busManager/coord/urls.py index a52d748..5ca41e4 100644 --- a/busManager/coord/urls.py +++ b/busManager/coord/urls.py @@ -2,8 +2,9 @@ from django.urls import path from . import views +app_name = "report" urlpatterns = [ - path("contacts", views.emergency_contacts, name="Emergency Contacts"), - path("stops", views.bus_summary, name="Stop Summary"), - path("summary", views.bus_numbers, name="Bus Summary"), + path("contacts", views.emergency_contacts, name="emergency_contacts"), + path("roll", views.bus_roll, name="bus_roll"), + path("summary", views.bus_summary, name="bus_summary"), ] diff --git a/busManager/coord/views.py b/busManager/coord/views.py index 721ef41..b879c28 100644 --- a/busManager/coord/views.py +++ b/busManager/coord/views.py @@ -2,80 +2,24 @@ from django.contrib.admin.views.decorators import staff_member_required from django.shortcuts import render from django.views.generic import ListView -from .context_helpers import bus_roll_context, emergency_contacts_context +from .context_helpers import * from .email_helpers import render_to_pdf from .models import Company, Bus, Traveller, BusStop, TravellerRoute, Shuttle, Driver @staff_member_required -def bus_numbers(request): - buses = [] - for bus in Bus.objects.all(): - - 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}) +def bus_summary(request): + return render(request, 'reports/bus_summary.html', bus_summary_context()) @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}) +def emergency_contacts(request): + return render_to_pdf('reports/emergency_contacts.html', emergency_contacts_context()) @staff_member_required -def emergency_contacts(request, queryset=None): - pdf = render_to_pdf('reports/emergency_contacts.html', emergency_contacts_context(queryset)) - return pdf +def bus_roll(request): + return render_to_pdf('reports/bus_roll.html', bus_roll_context()) @staff_member_required