manager: preview booking reminders (#45293)
This commit is contained in:
parent
ab32481a6b
commit
7cfa0fc3f1
|
@ -307,3 +307,7 @@ div.ui-dialog form p span.datetime input {
|
|||
div.booking a.cancel {
|
||||
float: right;
|
||||
}
|
||||
|
||||
p.email-subject {
|
||||
text-align: center;
|
||||
}
|
||||
|
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue