Added Send SMS function to traveller contacts. The send command is commented out.
This commit is contained in:
@@ -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': [
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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> </td>
|
||||||
|
<td><input type="submit" name="send" value="Send"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
@@ -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})
|
||||||
|
|||||||
Reference in New Issue
Block a user