diff --git a/busManager/coord/admin.py b/busManager/coord/admin.py index 62428e7..1ecf238 100644 --- a/busManager/coord/admin.py +++ b/busManager/coord/admin.py @@ -4,7 +4,8 @@ from datetime import date from django.contrib.admin import DateFieldListFilter, BooleanFieldListFilter from django.forms import widgets from django.contrib import admin -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render from django.urls import reverse from django.utils.html import format_html from django.utils.http import urlencode @@ -15,6 +16,7 @@ from .adminClone import CloneModelAdmin from .context_helpers import bus_roll_context, emergency_contacts_context, traveller_roll_context, \ traveller_route_context, school_roll_context from .email_helpers import email_companies_bus_roll, render_to_pdf, email_school_roll +from .form import SMSForm from .models import * @@ -60,6 +62,19 @@ class SchoolRollMixin: class TravellerRollMixin: + def send_sms(self, request, queryset): + if 'send' in request.POST: + message = request.POST["message"] + total = 0 + for traveller in queryset: + total += traveller.send_sms(message, parents=True) + self.message_user(request, f"SMS has been sent to {total} recipients") + return HttpResponseRedirect(request.get_full_path()) + + form = SMSForm(initial={'_selected_action': queryset.values_list('id', flat=True)}) + + return render(request, 'admin/sms_form.html', context={'form': form, 'items': queryset}) + def export_to_csv(self, request, queryset): traveller_list = traveller_roll_context(queryset) response = HttpResponse(content_type="text/csv") @@ -182,7 +197,7 @@ class TravellerAdmin(MyImportExportModelAdmin, CloneModelAdmin, admin.ModelAdmin "emergency_contact_B_phone", "emergency_contact_B_relation"] inlines = [TravellerRouteInline] readonly_fields = ["fare_paying", "created_on", "last_edit", "is_archived"] - actions = ["export_to_csv", "yearly_rollover"] + actions = ["export_to_csv", "send_sms", "yearly_rollover"] fieldsets = [ (None, { 'fields': [ diff --git a/busManager/coord/form.py b/busManager/coord/form.py new file mode 100644 index 0000000..39ade0b --- /dev/null +++ b/busManager/coord/form.py @@ -0,0 +1,8 @@ +from django import forms + + +class SMSForm(forms.Form): + _selected_action = forms.CharField(widget=forms.MultipleHiddenInput) + send_to_parents = forms.BooleanField(required=False) + send_to_emergency_contacts = forms.BooleanField(required=False) + message = forms.CharField(label="Message", max_length=320, widget=forms.Textarea) diff --git a/busManager/coord/models.py b/busManager/coord/models.py index de55a54..f4090a3 100644 --- a/busManager/coord/models.py +++ b/busManager/coord/models.py @@ -1,6 +1,9 @@ from datetime import datetime +import phonenumbers +from django.conf import settings from django.db import models +from twilio.rest import Client class Setting(models.Model): @@ -261,6 +264,27 @@ class Traveller(models.Model): stops = 1 return f"${str(cost * stops)}" + def send_sms(self, message, parents=False, emergency=False): + numbers = [] + if parents and self.parent_A_phone: + numbers.append(self.parent_A_phone) + if parents and self.parent_B_phone: + numbers.append(self.parent_B_phone) + if emergency and self.emergency_contact_A_phone: + numbers.append(self.emergency_contact_A_phone) + if emergency and self.emergency_contact_B_phone: + numbers.append(self.emergency_contact_B_phone) + + count = 0 + for number in numbers: + num = phonenumbers.parse(number, "AU") + if phonenumbers.is_valid_number(num): + count += 1 + # num = f"+{num.country_code}{num.national_number}" + # client = Client(settings.TWILIO['ACCOUNT_SID'], settings.TWILIO['AUTH_TOKEN']) + # client.messages.create(num, from_=settings.TWILIO['SENDER'], body=message) + return count + class TravellerRoute(models.Model): traveller = models.ForeignKey(Traveller, on_delete=models.CASCADE) diff --git a/busManager/coord/templates/admin/sms_form.html b/busManager/coord/templates/admin/sms_form.html new file mode 100644 index 0000000..39b2d97 --- /dev/null +++ b/busManager/coord/templates/admin/sms_form.html @@ -0,0 +1,36 @@ +{% extends "admin/base_site.html" %} + +{% block content %} +
| Traveller | +Parent A | +Parent B | +Emergency A | +Emergency B | +
|---|---|---|---|---|
| {{ item }} | +{{ item.parent_A_phone }} | +{{ item.parent_B_phone }} | +{{ item.emergency_contact_A_phone }} | +{{ item.emergency_contact_B_phone }} | +