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
| Route Name |
- Number of Students |
+ Driver |
+ Route Travellers |
+ Shuttle |
+ Shuttle Travellers |
+ Seating Max |
{% for bus in buses %}
| {{ bus.route_name }} |
- {{ bus.num_travellers }} |
+ {{ bus.drivers }} |
+ {{ bus.route_travellers }} |
+ {{ bus.shuttle }} |
+ {{ bus.shuttle_travellers }} |
+ {% if bus.over_capacity %}
+ {{ bus.seating_capacity }} |
+ {% else %}
+ {{ bus.seating_capacity }} |
+ {% endif %}
{% endfor %}
\ 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 name |
+ Driver |
+
+
+ | {{ route.bus.route_name }} |
+ {{ route.drivers }} |
+
+
+
+
+ | Stop # |
+ Address |
+
+ {% for stop in route.stops %}
+
+ | {{ stop.get_stop_number }} |
+ {{ stop.address }} |
+
+ {% endfor %}
+
+
+{% 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})"