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