mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-23 16:32:15 +00:00
Add sending of emails to clients.
Add email sending methods. Add TEC side sending of emails.
This commit is contained in:
@@ -175,3 +175,7 @@ class ExternalClientEventAuthorisationForm(BaseClientEventAuthorisationForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = models.EventAuthorisation
|
model = models.EventAuthorisation
|
||||||
fields = ('tos', 'name', 'amount', 'po')
|
fields = ('tos', 'name', 'amount', 'po')
|
||||||
|
|
||||||
|
|
||||||
|
class EventAuthorisationRequestForm(forms.Form):
|
||||||
|
email = forms.EmailField(required=True, label='Authoriser Email')
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
import os
|
|
||||||
import cStringIO as StringIO
|
import cStringIO as StringIO
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
import urllib2
|
import urllib2
|
||||||
|
|
||||||
import reversion
|
|
||||||
from django.core.mail import EmailMessage
|
from django.core.mail import EmailMessage
|
||||||
from django.db import transaction
|
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from django.core.urlresolvers import reverse_lazy
|
from django.core.urlresolvers import reverse_lazy
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
@@ -293,3 +290,46 @@ class EventAuthorise(generic.UpdateView):
|
|||||||
raise SuspiciousOperation(
|
raise SuspiciousOperation(
|
||||||
"The security integrity of that URL is invalid. Please contact your event MIC to obtain a new URL")
|
"The security integrity of that URL is invalid. Please contact your event MIC to obtain a new URL")
|
||||||
return super(EventAuthorise, self).dispatch(request, *args, **kwargs)
|
return super(EventAuthorise, self).dispatch(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class EventAuthorisationRequest(generic.FormView, generic.detail.SingleObjectMixin):
|
||||||
|
model = models.Event
|
||||||
|
form_class = forms.EventAuthorisationRequestForm
|
||||||
|
template_name = 'RIGS/eventauthorisation_request.html'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def object(self):
|
||||||
|
return self.get_object()
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
if self.request.is_ajax():
|
||||||
|
url = reverse_lazy('closemodal')
|
||||||
|
messages.info(self.request, "$('.event-authorise-request').addClass('btn-success')")
|
||||||
|
else:
|
||||||
|
url = reverse_lazy('event_detail', kwargs={
|
||||||
|
'pk': self.object.pk,
|
||||||
|
})
|
||||||
|
messages.add_message(self.request, messages.SUCCESS, "Authorisation request successfully sent.")
|
||||||
|
return url
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
email = form.cleaned_data['email']
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'object': self.object,
|
||||||
|
'request': self.request,
|
||||||
|
'hmac': signing.dumps({
|
||||||
|
'pk': self.object.pk,
|
||||||
|
'email': email
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = EmailMessage(
|
||||||
|
"N%05d | %s - Event Authorisation Request".format(self.object.pk, self.object.name),
|
||||||
|
get_template("RIGS/eventauthorisation_client_request.txt").render(context),
|
||||||
|
to=[email],
|
||||||
|
)
|
||||||
|
|
||||||
|
msg.send()
|
||||||
|
|
||||||
|
return super(EventAuthorisationRequest, self).form_valid(form)
|
||||||
|
|||||||
@@ -11,34 +11,7 @@
|
|||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 text-right">
|
<div class="col-sm-12 text-right">
|
||||||
<div class="btn-group btn-page">
|
{% include 'RIGS/event_detail_buttons.html' %}
|
||||||
<a href="{% url 'event_update' event.pk %}" class="btn btn-default"><span
|
|
||||||
class="glyphicon glyphicon-edit"></span> <span
|
|
||||||
class="hidden-xs">Edit</span></a>
|
|
||||||
{% if event.is_rig %}
|
|
||||||
<a href="{% url 'event_print' event.pk %}" target="_blank" class="btn btn-default"><span
|
|
||||||
class="glyphicon glyphicon-print"></span> <span
|
|
||||||
class="hidden-xs">Print</span></a>
|
|
||||||
{% endif %}
|
|
||||||
<a href="{% url 'event_duplicate' event.pk %}" class="btn btn-default" title="Duplicate Rig"><span
|
|
||||||
class="glyphicon glyphicon-duplicate"></span> <span
|
|
||||||
class="hidden-xs">Duplicate</span></a>
|
|
||||||
{% if event.is_rig %}
|
|
||||||
{% if perms.RIGS.add_invoice %}
|
|
||||||
<a id="invoiceDropdownLabel" href="{% url 'invoice_event' event.pk %}" class="btn
|
|
||||||
{% if event.invoice and event.invoice.is_closed %}
|
|
||||||
btn-success
|
|
||||||
{% elif event.invoice %}
|
|
||||||
btn-warning
|
|
||||||
{% else %}
|
|
||||||
btn-danger
|
|
||||||
{% endif %}
|
|
||||||
" title="Invoice Rig"><span
|
|
||||||
class="glyphicon glyphicon-gbp"></span>
|
|
||||||
<span class="hidden-xs">Invoice</span></a>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -184,34 +157,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if not request.is_ajax %}
|
{% if not request.is_ajax %}
|
||||||
<div class="col-sm-12 text-right">
|
<div class="col-sm-12 text-right">
|
||||||
<div class="btn-group btn-page">
|
{% include 'RIGS/event_detail_buttons.html' %}
|
||||||
<a href="{% url 'event_update' event.pk %}" class="btn btn-default"><span
|
|
||||||
class="glyphicon glyphicon-edit"></span> <span
|
|
||||||
class="hidden-xs">Edit</span></a>
|
|
||||||
{% if event.is_rig %}
|
|
||||||
<a href="{% url 'event_print' event.pk %}" target="_blank" class="btn btn-default"><span
|
|
||||||
class="glyphicon glyphicon-print"></span> <span
|
|
||||||
class="hidden-xs">Print</span></a>
|
|
||||||
{% endif %}
|
|
||||||
<a href="{% url 'event_duplicate' event.pk %}" class="btn btn-default" title="Duplicate Rig"><span
|
|
||||||
class="glyphicon glyphicon-duplicate"></span> <span
|
|
||||||
class="hidden-xs">Duplicate</span></a>
|
|
||||||
{% if event.is_rig %}
|
|
||||||
{% if perms.RIGS.add_invoice %}
|
|
||||||
<a id="invoiceDropdownLabel" href="{% url 'invoice_event' event.pk %}" class="btn
|
|
||||||
{% if event.invoice and event.invoice.is_closed %}
|
|
||||||
btn-success
|
|
||||||
{% elif event.invoice %}
|
|
||||||
btn-warning
|
|
||||||
{% else %}
|
|
||||||
btn-danger
|
|
||||||
{% endif %}
|
|
||||||
" title="Invoice Rig"><span
|
|
||||||
class="glyphicon glyphicon-gbp"></span>
|
|
||||||
<span class="hidden-xs">Invoice</span></a>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if event.is_rig %}
|
{% if event.is_rig %}
|
||||||
@@ -229,34 +175,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if not request.is_ajax %}
|
{% if not request.is_ajax %}
|
||||||
<div class="col-sm-12 text-right">
|
<div class="col-sm-12 text-right">
|
||||||
<div class="btn-group btn-page">
|
{% include 'RIGS/event_detail_buttons.html' %}
|
||||||
<a href="{% url 'event_update' event.pk %}" class="btn btn-default"><span
|
|
||||||
class="glyphicon glyphicon-edit"></span> <span
|
|
||||||
class="hidden-xs">Edit</span></a>
|
|
||||||
{% if event.is_rig %}
|
|
||||||
<a href="{% url 'event_print' event.pk %}" target="_blank" class="btn btn-default"><span
|
|
||||||
class="glyphicon glyphicon-print"></span> <span
|
|
||||||
class="hidden-xs">Print</span></a>
|
|
||||||
{% endif %}
|
|
||||||
<a href="{% url 'event_duplicate' event.pk %}" class="btn btn-default" title="Duplicate Rig"><span
|
|
||||||
class="glyphicon glyphicon-duplicate"></span> <span
|
|
||||||
class="hidden-xs">Duplicate</span></a>
|
|
||||||
{% if event.is_rig %}
|
|
||||||
{% if perms.RIGS.add_invoice %}
|
|
||||||
<a id="invoiceDropdownLabel" href="{% url 'invoice_event' event.pk %}" class="btn
|
|
||||||
{% if event.invoice and event.invoice.is_closed %}
|
|
||||||
btn-success
|
|
||||||
{% elif event.invoice %}
|
|
||||||
btn-warning
|
|
||||||
{% else %}
|
|
||||||
btn-danger
|
|
||||||
{% endif %}
|
|
||||||
" title="Invoice Rig"><span
|
|
||||||
class="glyphicon glyphicon-gbp"></span>
|
|
||||||
<span class="hidden-xs">Invoice</span></a>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
33
RIGS/templates/RIGS/event_detail_buttons.html
Normal file
33
RIGS/templates/RIGS/event_detail_buttons.html
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<div class="btn-group btn-page">
|
||||||
|
<a href="{% url 'event_update' event.pk %}" class="btn btn-default"><span
|
||||||
|
class="glyphicon glyphicon-edit"></span> <span
|
||||||
|
class="hidden-xs">Edit</span></a>
|
||||||
|
{% if event.is_rig %}
|
||||||
|
<a href="{% url 'event_print' event.pk %}" target="_blank" class="btn btn-default"><span
|
||||||
|
class="glyphicon glyphicon-print"></span> <span
|
||||||
|
class="hidden-xs">Print</span></a>
|
||||||
|
{% endif %}
|
||||||
|
<a href="{% url 'event_duplicate' event.pk %}" class="btn btn-default" title="Duplicate Rig"><span
|
||||||
|
class="glyphicon glyphicon-duplicate"></span> <span
|
||||||
|
class="hidden-xs">Duplicate</span></a>
|
||||||
|
{% if event.is_rig %}
|
||||||
|
<a class="btn btn-default item-add modal-href event-authorise-request"
|
||||||
|
href="{% url 'event_authorise_request' object.pk %}">
|
||||||
|
<span class="glyphicon glyphicon-send"></span>
|
||||||
|
Authorisation Request
|
||||||
|
</a>
|
||||||
|
{% if perms.RIGS.add_invoice %}
|
||||||
|
<a id="invoiceDropdownLabel" href="{% url 'invoice_event' event.pk %}" class="btn
|
||||||
|
{% if event.invoice and event.invoice.is_closed %}
|
||||||
|
btn-success
|
||||||
|
{% elif event.invoice %}
|
||||||
|
btn-warning
|
||||||
|
{% else %}
|
||||||
|
btn-danger
|
||||||
|
{% endif %}
|
||||||
|
" title="Invoice Rig"><span
|
||||||
|
class="glyphicon glyphicon-gbp"></span>
|
||||||
|
<span class="hidden-xs">Invoice</span></a>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
12
RIGS/templates/RIGS/eventauthorisation_client_request.txt
Normal file
12
RIGS/templates/RIGS/eventauthorisation_client_request.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
Hi there,
|
||||||
|
|
||||||
|
{{request.user.get_full_name}} has requested that you authorise N{{object.pk|stringformat:"05d"}} | {{object.name}}.
|
||||||
|
|
||||||
|
Please find the link below to complete the event booking process.
|
||||||
|
{% if object.event.organisation and object.event.organisation.union_account %}{# internal #}
|
||||||
|
Remember that only Presidents or Treasurers are allowed to sign off payments. You may need to forward this email on.
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{{request.scheme}}://{{request.get_host}}{% url 'event_authorise' object.pk hmac %}
|
||||||
|
|
||||||
|
The TEC Rig Information Gathering System
|
||||||
32
RIGS/templates/RIGS/eventauthorisation_request.html
Normal file
32
RIGS/templates/RIGS/eventauthorisation_request.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{% extends request.is_ajax|yesno:'base_ajax.html,base.html' %}
|
||||||
|
{% load widget_tweaks %}
|
||||||
|
|
||||||
|
{% block title %}Request Authorisation{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-offset-1 col-sm-10">
|
||||||
|
<form action="{{ form.action|default:request.path }}" method="post" class="form-horizontal">{% csrf_token %}
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
{% include 'form_errors.html' %}
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-2 control-label"
|
||||||
|
for="{{ form.email.id_for_label }}">{{ form.email.label }}</label>
|
||||||
|
|
||||||
|
<div class="col-sm-10">
|
||||||
|
{% render_field form.email type="email" class+="form-control" %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text-right col-sm-3 col-sm-offset-9">
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="submit" class="form-control btn btn-primary"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -1042,3 +1042,33 @@ class ClientEventAuthorisationTest(TestCase):
|
|||||||
self.assertEqual(mail.outbox[0].to, ['authemail@function.test'])
|
self.assertEqual(mail.outbox[0].to, ['authemail@function.test'])
|
||||||
self.assertEqual(mail.outbox[1].to, [settings.AUTHORISATION_NOTIFICATION_ADDRESS])
|
self.assertEqual(mail.outbox[1].to, [settings.AUTHORISATION_NOTIFICATION_ADDRESS])
|
||||||
|
|
||||||
|
|
||||||
|
class TECEventAuthorisationTest(TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
cls.profile = models.Profile.objects.create(
|
||||||
|
name='Test TEC User',
|
||||||
|
email='teccie@functional.test',
|
||||||
|
is_superuser=True # lazily grant all permissions
|
||||||
|
)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
venue = models.Venue.objects.create(name='Authorisation Test Venue')
|
||||||
|
client = models.Person.objects.create(name='Authorisation Test Person', email='authorisation@functional.test')
|
||||||
|
organisation = models.Organisation.objects.create(name='Authorisation Test Organisation', union_account=False)
|
||||||
|
self.event = models.Event.objects.create(
|
||||||
|
name='Authorisation Test',
|
||||||
|
start_date=date.today(),
|
||||||
|
venue=venue,
|
||||||
|
person=client,
|
||||||
|
organisation=organisation,
|
||||||
|
)
|
||||||
|
self.url = reverse('event_authorise_request', kwargs={'pk': self.event.pk})
|
||||||
|
|
||||||
|
def test_request_send(self):
|
||||||
|
self.client.force_login(self.profile)
|
||||||
|
response = self.client.post(self.url)
|
||||||
|
self.assertContains(response, 'This field is required.')
|
||||||
|
|
||||||
|
response = self.client.post(self.url, {'email': 'client@functional.test'})
|
||||||
|
self.assertEqual(response.status_code, 301)
|
||||||
|
|||||||
@@ -115,6 +115,11 @@ urlpatterns = patterns('',
|
|||||||
permission_required_with_403('RIGS.view_event')(versioning.VersionHistory.as_view()),
|
permission_required_with_403('RIGS.view_event')(versioning.VersionHistory.as_view()),
|
||||||
name='event_history', kwargs={'model': models.Event}),
|
name='event_history', kwargs={'model': models.Event}),
|
||||||
|
|
||||||
|
url(r'^event/(?P<pk>\d+)/auth/$',
|
||||||
|
permission_required_with_403('RIGS.change_event')(
|
||||||
|
rigboard.EventAuthorisationRequest.as_view()
|
||||||
|
),
|
||||||
|
name='event_authorise_request'),
|
||||||
url(r'^event/(?P<pk>\d+)/(?P<hmac>[-:\w]+)/$', rigboard.EventAuthorise.as_view(),
|
url(r'^event/(?P<pk>\d+)/(?P<hmac>[-:\w]+)/$', rigboard.EventAuthorise.as_view(),
|
||||||
name='event_authorise'),
|
name='event_authorise'),
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user