diff --git a/busManager/coord/admin.py b/busManager/coord/admin.py index 3c767b9..234ee17 100644 --- a/busManager/coord/admin.py +++ b/busManager/coord/admin.py @@ -14,6 +14,7 @@ from .adminClone import CloneModelAdmin from .context_helpers import * from .email_helpers import email_companies_bus_roll, render_to_pdf, email_school_roll, \ email_companies_emergency_contacts +from .forms import roll_date_selector from .models import * from .utils.send_sms import send_sms @@ -23,6 +24,9 @@ class BusRollMixin: def show_bus_roll(self, request, queryset): return render_to_pdf('reports/bus_roll.html', bus_roll_context(queryset)) + def show_bus_roll_on_date(self, request, queryset): + return roll_date_selector(self, request, queryset) + def show_emergency_contacts(self, request, queryset): return render_to_pdf('reports/emergency_contacts.html', emergency_contacts_context(queryset)) @@ -67,6 +71,9 @@ class SchoolRollMixin: def show_school_travellers(self, request, queryset): return render_to_pdf('reports/school_roll.html', school_roll_context(queryset)) + def show_school_travellers_on_date(self, request, queryset): + return render_to_pdf('reports/school_roll.html', school_roll_context(queryset)) + def export_travellers_to_csv(self, request, queryset): traveller_list = [] for school in queryset: @@ -147,7 +154,7 @@ class BusesAdmin(MyImportExportModelAdmin, admin.ModelAdmin, BusRollMixin): list_filter = ["company"] list_display = ["route_name", "company", "contract_number", "seating_capacity", "route_travellers"] readonly_fields = ["traveller_count"] - actions = ["show_bus_roll", "show_emergency_contacts", "sms_traveller_contacts", "email_bus_roll", "email_emergency_contacts"] + actions = ["show_bus_roll", "show_bus_roll_on_date", "show_emergency_contacts", "sms_traveller_contacts", "email_bus_roll", "email_emergency_contacts"] inlines = [DriverInline, BusStopInline] fieldsets = [ (None, {'fields': [ diff --git a/busManager/coord/context_helpers.py b/busManager/coord/context_helpers.py index 9b7f0ed..aebd3b6 100644 --- a/busManager/coord/context_helpers.py +++ b/busManager/coord/context_helpers.py @@ -5,8 +5,7 @@ from django.db.models import Q from .models import Bus, BusStop, TravellerRoute, Driver, Traveller, Shuttle -def bus_roll_context(queryset=None, include_bus_stops=True): - date = datetime.date.today().strftime('%Y-%m-%d') +def bus_roll_context(queryset=None, include_bus_stops=True, date=None): bus_routes = [] if queryset is None: buses = Bus.objects.all() @@ -16,17 +15,19 @@ def bus_roll_context(queryset=None, include_bus_stops=True): for bus in buses: route_stops = [] if include_bus_stops: - route_stops = route_paged_context(bus) + 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)) bus_routes.append({'bus': bus, 'route_stops': route_stops, 'shuttle_routes': shuttle_routes}) - return {'routes': bus_routes, 'date': date} + if date is None: + date = datetime.date.today() + return {'routes': bus_routes, 'date': date.strftime('%Y-%m-%d')} -def school_roll_context(queryset): +def school_roll_context(queryset, date=None): school_list = [] for school in queryset: @@ -36,7 +37,7 @@ def school_roll_context(queryset): travellers = [] for trav_route in TravellerRoute.objects.filter(query).filter(busStop__bus=bus).order_by('busStop__am_time'): traveller = trav_route.traveller - if not traveller._is_active(): + if not traveller._is_active(date): continue bus_stop = trav_route.busStop @@ -75,7 +76,7 @@ def traveller_roll_context(queryset): return travellers -def route_paged_context(bus): +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 @@ -85,7 +86,7 @@ def route_paged_context(bus): traveller_list = [] for trav_route in traveller_routes: traveller = trav_route.traveller - if not traveller._is_active(): + if not traveller._is_active(date): continue is_fared = "---" if traveller.eligibility_status == "2": @@ -124,11 +125,11 @@ def shuttle_route_context(shuttle): return {'shuttle': shuttle, 'shuttle_travellers': shuttle_travellers} -def school_travellerRoute_context(school): +def school_travellerRoute_context(school, date=None): travellers = [] for travellerRoute in TravellerRoute.objects.filter(traveller__school=school): traveller = travellerRoute.traveller - if not traveller._is_active(): + if not traveller._is_active(date): continue travellers.append(traveller_route_context(travellerRoute)) return travellers diff --git a/busManager/coord/forms.py b/busManager/coord/forms.py new file mode 100644 index 0000000..d8e945d --- /dev/null +++ b/busManager/coord/forms.py @@ -0,0 +1,23 @@ +from datetime import datetime + +from django.shortcuts import render +from django import forms + +from .context_helpers import bus_roll_context +from .email_helpers import render_to_pdf + + +class RollDateSelector(forms.Form): + _selected_action = forms.CharField(widget=forms.MultipleHiddenInput) + + +def roll_date_selector(mixin, request, queryset): + if 'generate' in request.POST: + date = request.POST.get("date") + if date: + date = datetime.strptime(date, '%Y-%m-%d') + else: + date = None + return render_to_pdf('reports/bus_roll.html', bus_roll_context(queryset, date=date)) + form = RollDateSelector(initial={'_selected_action': queryset.values_list('id', flat=True)}) + return render(request, 'admin/date_selector.html', context={'form': form}) diff --git a/busManager/coord/models.py b/busManager/coord/models.py index d80899b..78c562f 100644 --- a/busManager/coord/models.py +++ b/busManager/coord/models.py @@ -216,16 +216,18 @@ class Traveller(models.Model): self._repopulate_address() super(Traveller, self).save(*args, **kwargs) - def _is_active(self): - today = datetime.today() - today = datetime(today.year, today.month, today.day) - if not self.travel_start_date or datetime(self.travel_start_date.year, self.travel_start_date.month, self.travel_start_date.day) > today: + def _is_active(self, date=None): + if date is None: + today = datetime.today() + date = datetime(today.year, today.month, today.day) + + if not self.travel_start_date or datetime(self.travel_start_date.year, self.travel_start_date.month, self.travel_start_date.day) > date: return False if not self.travel_end_date: return True end_date = datetime(self.travel_end_date.year, self.travel_end_date.month, self.travel_end_date.day) - return end_date >= today + return end_date >= date def _update_active_status(self): new_start_date = None diff --git a/busManager/coord/templates/admin/date_selector.html b/busManager/coord/templates/admin/date_selector.html new file mode 100644 index 0000000..79ccecd --- /dev/null +++ b/busManager/coord/templates/admin/date_selector.html @@ -0,0 +1,11 @@ +{% extends "admin/base_site.html" %} + +{% block content %} +
+ {% csrf_token %} + {{ form }} + + + +
+{% endblock %} \ No newline at end of file