From 9a02fc34a9ea553b28f8dd1e6eac303033376def Mon Sep 17 00:00:00 2001
From: Valentin Deniaud
Date: Tue, 15 Sep 2020 14:06:35 +0200
Subject: [PATCH 3/3] manager: preview booking reminders (#45293)
---
chrono/manager/static/css/style.scss | 4 +++
.../manager_agenda_reminder_preview.html | 22 ++++++++++++
.../chrono/manager_agenda_settings.html | 8 +++++
chrono/manager/urls.py | 5 +++
chrono/manager/views.py | 36 +++++++++++++++++++
tests/test_manager.py | 34 ++++++++++++++++++
6 files changed, 109 insertions(+)
create mode 100644 chrono/manager/templates/chrono/manager_agenda_reminder_preview.html
diff --git a/chrono/manager/static/css/style.scss b/chrono/manager/static/css/style.scss
index 508716a..7f6a8ad 100644
--- a/chrono/manager/static/css/style.scss
+++ b/chrono/manager/static/css/style.scss
@@ -307,3 +307,7 @@ div.ui-dialog form p span.datetime input {
div.booking a.cancel {
float: right;
}
+
+p.email-subject {
+ text-align: center;
+}
diff --git a/chrono/manager/templates/chrono/manager_agenda_reminder_preview.html b/chrono/manager/templates/chrono/manager_agenda_reminder_preview.html
new file mode 100644
index 0000000..0d000e3
--- /dev/null
+++ b/chrono/manager/templates/chrono/manager_agenda_reminder_preview.html
@@ -0,0 +1,22 @@
+{% extends "chrono/manager_agenda_view.html" %}
+{% load i18n %}
+
+{% block breadcrumb %}
+{{ block.super }}
+{% trans "Reminder message preview" %}
+{% endblock %}
+
+{% block appbar %}
+{% trans "Reminder message preview" %}
+{% endblock %}
+
+{% block content %}
+{% if subject %}
+{% trans "Users will receive the following email:" %}
+{% trans "Subject:" %} {{ subject }}
+{% else %}
+{% trans "Users will receive the following SMS:" %}
+{% endif %}
+{{ message }}
+{% trans 'Return to settings' %}
+{% endblock %}
diff --git a/chrono/manager/templates/chrono/manager_agenda_settings.html b/chrono/manager/templates/chrono/manager_agenda_settings.html
index a348ec5..9f54c10 100644
--- a/chrono/manager/templates/chrono/manager_agenda_settings.html
+++ b/chrono/manager/templates/chrono/manager_agenda_settings.html
@@ -45,6 +45,14 @@
{{ agenda.reminder_settings.display_info }}
{% endif %}
+
+{% if agenda.reminder_settings.send_email %}
+{% trans "Preview email" %}
+{% endif %}
+{% if agenda.reminder_settings.send_sms %}
+{% trans "Preview SMS" %}
+{% endif %}
+
{% trans "Configure" %}
diff --git a/chrono/manager/urls.py b/chrono/manager/urls.py
index c6e886f..4cec0b2 100644
--- a/chrono/manager/urls.py
+++ b/chrono/manager/urls.py
@@ -83,6 +83,11 @@ urlpatterns = [
views.agenda_reminder_settings,
name='chrono-manager-agenda-reminder-settings',
),
+ url(
+ r'^agendas/(?P\d+)/reminder/preview/(?P(email|sms))/$',
+ views.agenda_reminder_preview,
+ name='chrono-manager-agenda-reminder-preview',
+ ),
url(
r'^agendas/(?P\d+)/events/(?P\d+)/$',
views.event_view,
diff --git a/chrono/manager/views.py b/chrono/manager/views.py
index 63a0b1d..bba627f 100644
--- a/chrono/manager/views.py
+++ b/chrono/manager/views.py
@@ -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,41 @@ 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
+ reminder_ctx = {
+ 'event': '{{ event_label }}',
+ 'meeting': '{{ user_display_label }}',
+ 'form_url': '#',
+ 'in_x_days': _('tomorrow') if days == 1 else _('in %s days') % days,
+ 'time': '14:30',
+ 'date': 'Monday 2 June',
+ 'date_short': '02/06',
+ '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'
diff --git a/tests/test_manager.py b/tests/test_manager.py
index 4886577..f2a32db 100644
--- a/tests/test_manager.py
+++ b/tests/test_manager.py
@@ -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
@@ -4005,3 +4006,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 'Subject: Reminder for your booking tomorrow at 14:30' in resp.text
+ assert 'You have a booking for event "{{ event_label }}", on Monday 2 June at 14:30.' 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 14:30. Take ID card.'
+ in resp.text
+ )
--
2.20.1