manager: preview booking reminders (#45293)

This commit is contained in:
Valentin Deniaud 2020-09-15 14:06:35 +02:00
parent ab32481a6b
commit 7cfa0fc3f1
6 changed files with 117 additions and 0 deletions

View File

@ -307,3 +307,7 @@ div.ui-dialog form p span.datetime input {
div.booking a.cancel {
float: right;
}
p.email-subject {
text-align: center;
}

View File

@ -0,0 +1,27 @@
{% extends "chrono/manager_agenda_view.html" %}
{% load i18n %}
{% block breadcrumb %}
{{ block.super }}
<a href="">{% trans "Reminder message preview" %}</a>
{% endblock %}
{% block appbar %}
<h2>{% trans "Reminder message preview" %}</h2>
{% endblock %}
{% block content %}
<div id="message-preview">
{% if subject %}
<p>{% trans "Users will receive the following email:" %}</p>
<p class="email-subject"><strong>{% trans "Subject:" %}</strong> {{ subject }}</p>
{% else %}
<p>{% trans "Users will receive the following SMS:" %}</p>
{% endif %}
<p>{{ message }}</p>
<div class="buttons">
<a class="button" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Return to settings' %}</a>
</div>
</div>
{% endblock %}

View File

@ -45,6 +45,14 @@
{{ agenda.reminder_settings.display_info }}
{% endif %}
</p>
<p>
{% if agenda.reminder_settings.send_email %}
<a rel="popup" data-selector="#message-preview" href="{% url 'chrono-manager-agenda-reminder-preview' pk=object.id type='email' %}">{% trans "Preview email" %}</a>
{% endif %}
{% if agenda.reminder_settings.send_sms %}
<a rel="popup" data-selector="#message-preview" href="{% url 'chrono-manager-agenda-reminder-preview' pk=object.id type='sms' %}">{% trans "Preview SMS" %}</a>
{% endif %}
</p>
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-reminder-settings' pk=object.id %}">{% trans "Configure" %}</a>
</div>
</div>

View File

@ -83,6 +83,11 @@ urlpatterns = [
views.agenda_reminder_settings,
name='chrono-manager-agenda-reminder-settings',
),
url(
r'^agendas/(?P<pk>\d+)/reminder/preview/(?P<type>(email|sms))/$',
views.agenda_reminder_preview,
name='chrono-manager-agenda-reminder-preview',
),
url(
r'^agendas/(?P<pk>\d+)/events/(?P<event_pk>\d+)/$',
views.event_view,

View File

@ -28,6 +28,7 @@ from django.db.models import Min, Max
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.shortcuts import redirect
from django.template.loader import render_to_string
from django.template.response import TemplateResponse
from django.urls import reverse, reverse_lazy
from django.utils.dates import MONTHS
@ -1388,6 +1389,44 @@ class AgendaReminderSettingsView(ManagedAgendaMixin, UpdateView):
agenda_reminder_settings = AgendaReminderSettingsView.as_view()
class AgendaReminderPreviewView(ManagedAgendaMixin, TemplateView):
template_name = 'chrono/manager_agenda_reminder_preview.html'
def dispatch(self, request, *args, **kwargs):
self.type_ = kwargs['type']
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
kind = self.agenda.kind
days = self.agenda.reminder_settings.days
event = Event(
label='{{ event_label }}',
start_datetime=datetime.datetime(year=2020, month=6, day=2, hour=14, minute=30),
)
booking = Booking(user_display_label='{{ user_display_label }}', form_url='#')
booking.event = event
reminder_ctx = {
'booking': booking,
'in_x_days': _('tomorrow') if days == 1 else _('in %s days') % days,
'date': booking.event.start_datetime,
'email_extra_info': self.agenda.reminder_settings.email_extra_info,
'sms_extra_info': self.agenda.reminder_settings.sms_extra_info,
}
if self.type_ == 'email':
ctx['subject'] = render_to_string('agendas/%s_reminder_subject.txt' % kind, reminder_ctx).strip()
ctx['message'] = render_to_string('agendas/%s_reminder_body.html' % kind, reminder_ctx)
elif self.type_ == 'sms':
ctx['message'] = render_to_string('agendas/%s_reminder_message.txt' % kind, reminder_ctx)
return ctx
agenda_reminder_preview = AgendaReminderPreviewView.as_view()
class EventDetailView(ViewableAgendaMixin, DetailView):
model = Event
pk_url_kwarg = 'event_pk'

View File

@ -35,6 +35,7 @@ from chrono.agendas.models import (
TimePeriodException,
TimePeriodExceptionSource,
VirtualMember,
AgendaReminderSettings,
)
from chrono.manager.forms import TimePeriodExceptionForm
from chrono.utils.signature import check_query
@ -4009,3 +4010,36 @@ def test_manager_reminders(app, admin_user):
agenda = Agenda.objects.create(label='Virtual', kind='virtual')
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
assert not 'Booking reminders' in resp.text
def test_manager_reminders_preview(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
AgendaReminderSettings.objects.create(
agenda=agenda,
days=1,
send_email=True,
email_extra_info='An ID will be required in order to process your form.',
send_sms=True,
sms_extra_info='Take ID card.',
)
login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
assert (
'Users will be reminded of their booking both by email and by SMS, one day in advance.' in resp.text
)
resp = resp.click('Preview email')
assert 'Users will receive the following email:' in resp.text
assert len(resp.pyquery.find('p.email-subject')) == 1
assert '<strong>Subject:</strong> Reminder for your booking tomorrow at 2:30 p.m.' in resp.text
assert 'You have a booking for event "{{ event_label }}", on Tuesday 2 June at 2:30 p.m..' in resp.text
assert 'An ID will be required' in resp.text
resp = resp.click('Return to settings')
resp = resp.click('Preview SMS')
assert 'Users will receive the following SMS:' in resp.text
assert (
'Reminder: you have a booking for event "{{ event_label }}", on 02/06 at 2:30 p.m.. Take ID card.'
in resp.text
)