From a30a69afb305b6c6be46b7902b875271f8345c50 Mon Sep 17 00:00:00 2001 From: John Mullins Date: Tue, 11 Jun 2024 14:08:29 +1000 Subject: [PATCH 1/6] Updated requirements.txt versions --- requirements.txt | Bin 446 -> 446 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index a1d589183173d5d81e1d414f35b02ee8a75bfce5..ca77fb22d270e7d0b13dd810ce98f54a891f4b66 100644 GIT binary patch delta 42 ucmdnTypLJ>|34RoEQUmeJce|Jd|34RoEQUmeJce|Jd Date: Tue, 11 Jun 2024 14:09:21 +1000 Subject: [PATCH 2/6] Added lookup filter as ID after version 5 dango update --- busManager/coord/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/busManager/coord/models.py b/busManager/coord/models.py index 6490a60..15ae53e 100644 --- a/busManager/coord/models.py +++ b/busManager/coord/models.py @@ -230,7 +230,7 @@ class Traveller(models.Model): new_start_date = None new_end_date = None - for travellerRoute in TravellerRoute.objects.filter(traveller=self): + for travellerRoute in TravellerRoute.objects.filter(traveller=self.id): route_start = travellerRoute.travel_start_date route_end = travellerRoute.travel_end_date if route_start is not None: From 00659568eebbe1701871fb2e4403d9bde731bf99 Mon Sep 17 00:00:00 2001 From: John Mullins Date: Wed, 12 Jun 2024 11:08:05 +1000 Subject: [PATCH 3/6] Added email emergency contacts to bus companies function --- busManager/coord/admin.py | 13 ++++++++---- busManager/coord/email_helpers.py | 34 ++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/busManager/coord/admin.py b/busManager/coord/admin.py index eef1e75..f8d9aed 100644 --- a/busManager/coord/admin.py +++ b/busManager/coord/admin.py @@ -12,7 +12,8 @@ from rangefilter.filters import DateRangeFilterBuilder from .adminClone import CloneModelAdmin from .context_helpers import * -from .email_helpers import email_companies_bus_roll, render_to_pdf, email_school_roll +from .email_helpers import email_companies_bus_roll, render_to_pdf, email_school_roll, \ + email_companies_emergency_contacts from .models import * from .utils.send_sms import send_sms @@ -25,10 +26,14 @@ class BusRollMixin: def show_emergency_contacts(self, request, queryset): return render_to_pdf('reports/emergency_contacts.html', emergency_contacts_context(queryset)) - def email_company(self, request, queryset): + def email_bus_roll(self, request, queryset): return email_companies_bus_roll(request, queryset) - email_company.short_description = "Email Bus Roll to Company" + def email_emergency_contacts(self, request, queryset): + return email_companies_emergency_contacts(request, queryset) + + email_bus_roll.short_description = "Email Bus Roll to Company" + email_emergency_contacts.short_description = "Email Emergency Contacts to Company" class ShuttleRollMixin: @@ -132,7 +137,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 = ["email_company", "show_bus_roll", "show_emergency_contacts"] + actions = ["show_bus_roll", "show_emergency_contacts", "email_bus_roll", "email_emergency_contacts"] inlines = [DriverInline, BusStopInline] fieldsets = [ (None, {'fields': [ diff --git a/busManager/coord/email_helpers.py b/busManager/coord/email_helpers.py index 3582a50..59c948d 100644 --- a/busManager/coord/email_helpers.py +++ b/busManager/coord/email_helpers.py @@ -6,8 +6,8 @@ from django.http import HttpResponse from django.template.loader import get_template from xhtml2pdf import pisa -from coord.context_helpers import bus_roll_context, school_roll_context -from coord.models import Company, School +from .models import Company, School +from .context_helpers import bus_roll_context, emergency_contacts_context, school_roll_context def render_to_pdf(template, context): @@ -47,6 +47,34 @@ def email_companies_bus_roll(request, query_set=None): return render_to_pdf(html_template, context) +def email_companies_emergency_contacts(request, query_set=None): + html_template = 'reports/emergency_contacts.html' + context = emergency_contacts_context(query_set) + + for company in Company.objects.all(): + if not company.contact_email: + continue + company_route = [] + + for route in context.get("routes"): + if route.get("bus").company == company: + company_route.append(route) + if not company_route: + continue + company_context = {'routes': company_route} + pdf = render_to_pdf(html_template, company_context) + + subject = "Echuca School Buses Emergency Contacts" + message = f"A new emergency contact list for {company.name} has been generated" + email_from = "bus.manager@education.vic.gov.au" + recipient = [company.contact_email] + email = EmailMessage(subject, message, email_from, recipient) + email.attach(f"school_bus_roll_{date.today()}.pdf", pdf.content) + email.send(fail_silently=True) + + return render_to_pdf(html_template, context) + + def email_school_roll(request, query_set): html_template = 'reports/school_roll.html' context = school_roll_context(query_set) @@ -71,4 +99,4 @@ def email_school_roll(request, query_set): email.attach(f"school_bus_roll_{date.today()}.pdf", pdf.content) email.send(fail_silently=True) - return render_to_pdf(html_template, context) \ No newline at end of file + return render_to_pdf(html_template, context) From 98019055f1353b82fefccab63c76e66a9c64f3b5 Mon Sep 17 00:00:00 2001 From: John Mullins Date: Wed, 12 Jun 2024 11:08:47 +1000 Subject: [PATCH 4/6] Formating changes for roll reports --- .../coord/templates/reports/bus_roll.html | 62 ++++++++++--------- .../coord/templates/reports/school_roll.html | 4 +- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/busManager/coord/templates/reports/bus_roll.html b/busManager/coord/templates/reports/bus_roll.html index 4777fc2..7fea2a0 100644 --- a/busManager/coord/templates/reports/bus_roll.html +++ b/busManager/coord/templates/reports/bus_roll.html @@ -43,38 +43,40 @@ {{ stop.pm }} - - - - - - - - - - - - - - - - {% for traveller in stop.travellers %} + {% if stop.travellers %} +
StudentFareMon AMMon PMTue AMTue PMWed AMWed PMThu AMThu PMFri AMFri PM
- - - - - - - - - - - - + + + + + + + + + + + + - {% endfor %} -
{{ traveller.display }}{{ traveller.isFared }} StudentFareMon AMMon PMTue AMTue PMWed AMWed PMThu AMThu PMFri AMFri PM
+ {% for traveller in stop.travellers %} + + {{ traveller.display }} + {{ traveller.isFared }} + + + + + + + + + + + + {% endfor %} + + {% endif %}
{% endfor %} {% if route.route_stops %} diff --git a/busManager/coord/templates/reports/school_roll.html b/busManager/coord/templates/reports/school_roll.html index 40e2ed7..3068167 100644 --- a/busManager/coord/templates/reports/school_roll.html +++ b/busManager/coord/templates/reports/school_roll.html @@ -18,8 +18,8 @@ Fare Shuttle Stop - AM Time - PM Time + Pickup + Drop off {% for traveller in route.travellers %} From f37827fd9da3481123355cfe7f67ba62144bbdd2 Mon Sep 17 00:00:00 2001 From: John Mullins Date: Wed, 12 Jun 2024 11:43:49 +1000 Subject: [PATCH 5/6] Added global BCC setting for emails --- busManager/coord/email_helpers.py | 15 +++++++++++---- busManager/coord/models.py | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/busManager/coord/email_helpers.py b/busManager/coord/email_helpers.py index 59c948d..df82698 100644 --- a/busManager/coord/email_helpers.py +++ b/busManager/coord/email_helpers.py @@ -6,10 +6,17 @@ from django.http import HttpResponse from django.template.loader import get_template from xhtml2pdf import pisa -from .models import Company, School +from .models import Company, School, Setting from .context_helpers import bus_roll_context, emergency_contacts_context, school_roll_context +def _getBCC(): + address = Setting.objects.filter(name="MAIL_BCC") + if address.exists(): + return [address.first().value] + return [] + + def render_to_pdf(template, context): html = get_template(template).render(context) result = BytesIO() @@ -40,7 +47,7 @@ def email_companies_bus_roll(request, query_set=None): message = f"A new bus roll for {company.name} has been generated" email_from = "bus.manager@education.vic.gov.au" recipient = [company.contact_email] - email = EmailMessage(subject, message, email_from, recipient) + email = EmailMessage(subject, message, email_from, recipient, _getBCC()) email.attach(f"school_bus_roll_{date.today()}.pdf", pdf.content) email.send(fail_silently=True) @@ -68,7 +75,7 @@ def email_companies_emergency_contacts(request, query_set=None): message = f"A new emergency contact list for {company.name} has been generated" email_from = "bus.manager@education.vic.gov.au" recipient = [company.contact_email] - email = EmailMessage(subject, message, email_from, recipient) + email = EmailMessage(subject, message, email_from, recipient, _getBCC()) email.attach(f"school_bus_roll_{date.today()}.pdf", pdf.content) email.send(fail_silently=True) @@ -95,7 +102,7 @@ def email_school_roll(request, query_set): message = f"A new bus roll for {school.name} has been generated" email_from = "bus.manager@education.vic.gov.au" recipient = [school.email] - email = EmailMessage(subject, message, email_from, recipient) + email = EmailMessage(subject, message, email_from, recipient, _getBCC()) email.attach(f"school_bus_roll_{date.today()}.pdf", pdf.content) email.send(fail_silently=True) diff --git a/busManager/coord/models.py b/busManager/coord/models.py index 15ae53e..e39e0fa 100644 --- a/busManager/coord/models.py +++ b/busManager/coord/models.py @@ -6,7 +6,7 @@ from django.db import models class Setting(models.Model): name = models.CharField(max_length=20, unique=True) - value = models.CharField(max_length=20, blank=True) + value = models.CharField(max_length=50, blank=True) def __str__(self): return self.name From 675962be9189d6ceef7a4c6aefb8e0f1b166f451 Mon Sep 17 00:00:00 2001 From: John Mullins Date: Wed, 12 Jun 2024 12:58:46 +1000 Subject: [PATCH 6/6] Added crontab tasks --- busManager/busManager/settings.py | 7 +++++++ requirements.txt | Bin 446 -> 492 bytes 2 files changed, 7 insertions(+) diff --git a/busManager/busManager/settings.py b/busManager/busManager/settings.py index 6fa65aa..1a956cf 100644 --- a/busManager/busManager/settings.py +++ b/busManager/busManager/settings.py @@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/4.2/ref/settings/ """ import os from pathlib import Path +import platform from dotenv import load_dotenv @@ -45,6 +46,12 @@ INSTALLED_APPS = [ 'rangefilter', ] +if platform.system() == "Linux": + INSTALLED_APPS.append('django_crontab') + CRONJOBS = [ + ('0 6 * * *', 'coord.scheduled_tasks.nightly_check_active_status') + ] + TWILIO = { "ACCOUNT_SID": os.environ.get('TWILIO_SID'), "AUTH_TOKEN": os.environ.get('TWILIO_TOKEN'), diff --git a/requirements.txt b/requirements.txt index ca77fb22d270e7d0b13dd810ce98f54a891f4b66..8a2e3c89b08cdeb8f87c4f1e6388df12f426328f 100644 GIT binary patch delta 54 zcmdnT{DyhMK1MxW1}=sahAf6ehCGIJhI|HHhGd2!Af3lh0u)PPumwT`20aFIAU0$G E09eHeTmS$7 delta 7 OcmaFEypMUqK1Kiy+yfv0