1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
from django.shortcuts import render
from django.utils.html import escape
from django.db import transaction
from django.http import Http404, HttpResponseRedirect
from django.contrib import messages
from django.utils import timezone
from postgresqleu.util.db import exec_to_dict, exec_to_scalar, exec_no_result
from postgresqleu.scheduler.util import trigger_immediate_job_run
from .util import send_conference_mail
from .backendforms import BackendSendEmailForm
def attendee_email_form(request, conference, query=None, breadcrumbs=[], extracontext={}, strings=False):
if request.method == 'POST':
if strings:
idlist = request.POST['idlist'].split(',')
else:
idlist = list(map(int, request.POST['idlist'].split(',')))
else:
if 'idlist' not in request.GET:
raise Http404("Mandatory parameter idlist is missing")
if strings:
idlist = request.GET['idlist'].split(',')
else:
idlist = list(map(int, request.GET['idlist'].split(',')))
queryparams = {'conference': conference.id, 'idlist': idlist}
if query is None:
query = "SELECT id AS regid, attendee_id AS user_id, firstname || ' ' || lastname AS fullname, email FROM confreg_conferenceregistration WHERE conference_id=%(conference)s AND id=ANY(%(idlist)s)"
elif callable(query):
query, queryparams = query(idlist)
recipients = exec_to_dict(query, queryparams)
initial = {
'_from': '{0} <{1}>'.format(conference.conferencename, conference.contactaddr),
'recipients': escape(", ".join(['{0} <{1}>'.format(x['fullname'], x['email']) for x in recipients])),
'idlist': ",".join(map(str, idlist)),
}
if request.method == 'POST':
p = request.POST.copy()
p['recipients'] = initial['recipients']
form = BackendSendEmailForm(conference, data=p, initial=initial)
if form.is_valid():
with transaction.atomic():
mailid = exec_to_scalar("INSERT INTO confreg_attendeemail (conference_id, sent, sentat, subject, message, tocheckin, tovolunteers) VALUES (%(confid)s, false, %(sentat)s, %(subject)s, %(message)s, false, false) RETURNING id", {
'confid': conference.id,
'sentat': form.cleaned_data['sendat'],
'subject': form.cleaned_data['subject'],
'message': form.cleaned_data['message'],
})
for r in recipients:
if r['regid']:
# Existing registration, so attach directly to attendee
exec_no_result("INSERT INTO confreg_attendeemail_registrations (attendeemail_id, conferenceregistration_id) VALUES (%(mailid)s, %(reg)s)", {
'mailid': mailid,
'reg': r['regid'],
})
else:
# No existing registration, so queue it up in case the attendee
# might register later. We have the userid...
exec_no_result("INSERT INTO confreg_attendeemail_pending_regs (attendeemail_id, user_id) VALUES (%(mailid)s, %(userid)s)", {
'mailid': mailid,
'userid': r['user_id'],
})
if form.cleaned_data['sendat'] > timezone.now():
messages.info(request, "Email scheduled for later sending to attendees")
else:
trigger_immediate_job_run('confreg_send_emails')
messages.info(request, "Email sent to attendees, and added to their registration pages")
return HttpResponseRedirect('../')
else:
form = BackendSendEmailForm(conference, initial=initial)
return render(request, 'confreg/admin_backend_form.html', {
'conference': conference,
'basetemplate': 'confreg/confadmin_base.html',
'form': form,
'what': 'new email',
'savebutton': 'Send email',
'cancelurl': '../',
'breadcrumbs': breadcrumbs,
})
|