summaryrefslogtreecommitdiff
path: root/postgresqleu/confreg/mail.py
blob: 86526ed5a6ca4fd5e7b44cf627c804d8bddbe929 (plain)
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,
    })