Added Send SMS function to traveller contacts. The send command is commented out.

This commit is contained in:
John Mullins
2023-09-07 15:42:11 +10:00
parent 49dae4892b
commit 43c23498bf
5 changed files with 103 additions and 2 deletions
+17 -2
View File
@@ -4,7 +4,8 @@ from datetime import date
from django.contrib.admin import DateFieldListFilter, BooleanFieldListFilter from django.contrib.admin import DateFieldListFilter, BooleanFieldListFilter
from django.forms import widgets from django.forms import widgets
from django.contrib import admin 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.urls import reverse
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.http import urlencode 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, \ from .context_helpers import bus_roll_context, emergency_contacts_context, traveller_roll_context, \
traveller_route_context, school_roll_context traveller_route_context, school_roll_context
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
from .form import SMSForm
from .models import * from .models import *
@@ -60,6 +62,19 @@ class SchoolRollMixin:
class TravellerRollMixin: 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): def export_to_csv(self, request, queryset):
traveller_list = traveller_roll_context(queryset) traveller_list = traveller_roll_context(queryset)
response = HttpResponse(content_type="text/csv") response = HttpResponse(content_type="text/csv")
@@ -182,7 +197,7 @@ class TravellerAdmin(MyImportExportModelAdmin, CloneModelAdmin, admin.ModelAdmin
"emergency_contact_B_phone", "emergency_contact_B_relation"] "emergency_contact_B_phone", "emergency_contact_B_relation"]
inlines = [TravellerRouteInline] inlines = [TravellerRouteInline]
readonly_fields = ["fare_paying", "created_on", "last_edit", "is_archived"] 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 = [ fieldsets = [
(None, { (None, {
'fields': [ 'fields': [
+8
View File
@@ -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)
+24
View File
@@ -1,6 +1,9 @@
from datetime import datetime from datetime import datetime
import phonenumbers
from django.conf import settings
from django.db import models from django.db import models
from twilio.rest import Client
class Setting(models.Model): class Setting(models.Model):
@@ -261,6 +264,27 @@ class Traveller(models.Model):
stops = 1 stops = 1
return f"${str(cost * stops)}" 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): class TravellerRoute(models.Model):
traveller = models.ForeignKey(Traveller, on_delete=models.CASCADE) traveller = models.ForeignKey(Traveller, on_delete=models.CASCADE)
@@ -0,0 +1,36 @@
{% extends "admin/base_site.html" %}
{% block content %}
<table>
<tr>
<th>Traveller</th>
<th>Parent A</th>
<th>Parent B</th>
<th>Emergency A</th>
<th>Emergency B</th>
</tr>
{% for item in items %}
<tr>
<td>{{ item }}</td>
<td>{{ item.parent_A_phone }}</td>
<td>{{ item.parent_B_phone }}</td>
<td>{{ item.emergency_contact_A_phone }}</td>
<td>{{ item.emergency_contact_B_phone }}</td>
</tr>
{% endfor %}
</table>
<br>
<hr style="height:4px">
<br>
<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="action" value="send_sms">
<table>
{{ form.as_table }}
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="send" value="Send"></td>
</tr>
</table>
</form>
{% endblock %}
+18
View File
@@ -1,8 +1,10 @@
from django.contrib.admin.views.decorators import staff_member_required from django.contrib.admin.views.decorators import staff_member_required
from django.http import HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
from .context_helpers import * from .context_helpers import *
from .email_helpers import render_to_pdf from .email_helpers import render_to_pdf
from .form import SMSForm
@staff_member_required @staff_member_required
@@ -18,3 +20,19 @@ def emergency_contacts(request):
@staff_member_required @staff_member_required
def bus_roll(request): def bus_roll(request):
return render_to_pdf('reports/bus_roll.html', bus_roll_context()) return render_to_pdf('reports/bus_roll.html', bus_roll_context())
def sms_message(request, queryset):
if request.method == 'POST':
form = SMSForm(request.POST)
if form.is_valid():
print("Hello world")
HttpResponseRedirect(request.get_full_path())
else:
print("Form not valid")
else:
print("Hello new world")
form = SMSForm()
return render(request, 'admin/sms_form.html', context={'form': form, 'travellers': queryset})