0003-manager-preview-booking-reminders-45293.patch
chrono/manager/static/css/style.scss | ||
---|---|---|
307 | 307 |
div.booking a.cancel { |
308 | 308 |
float: right; |
309 | 309 |
} |
310 | ||
311 |
p.email-subject { |
|
312 |
text-align: center; |
|
313 |
} |
chrono/manager/templates/chrono/manager_agenda_reminder_preview.html | ||
---|---|---|
1 |
{% extends "chrono/manager_agenda_view.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block breadcrumb %} |
|
5 |
{{ block.super }} |
|
6 |
<a href="">{% trans "Reminder message preview" %}</a> |
|
7 |
{% endblock %} |
|
8 | ||
9 |
{% block appbar %} |
|
10 |
<h2>{% trans "Reminder message preview" %}</h2> |
|
11 |
{% endblock %} |
|
12 | ||
13 |
{% block content %} |
|
14 |
{% if subject %} |
|
15 |
<p>{% trans "Users will receive the following email:" %}</p> |
|
16 |
<p class="email-subject"><strong>{% trans "Subject:" %}</strong> {{ subject }}</p> |
|
17 |
{% else %} |
|
18 |
<p>{% trans "Users will receive the following SMS:" %}</p> |
|
19 |
{% endif %} |
|
20 |
<p>{{ message }}</p> |
|
21 |
<a class="button" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Return to settings' %}</a> |
|
22 |
{% endblock %} |
chrono/manager/templates/chrono/manager_agenda_settings.html | ||
---|---|---|
45 | 45 |
{{ agenda.reminder_settings.display_info }} |
46 | 46 |
{% endif %} |
47 | 47 |
</p> |
48 |
<p> |
|
49 |
{% if agenda.reminder_settings.send_email %} |
|
50 |
<a href="{% url 'chrono-manager-agenda-reminder-preview' pk=object.id type='email' %}">{% trans "Preview email" %}</a> |
|
51 |
{% endif %} |
|
52 |
{% if agenda.reminder_settings.send_sms %} |
|
53 |
<a href="{% url 'chrono-manager-agenda-reminder-preview' pk=object.id type='sms' %}">{% trans "Preview SMS" %}</a> |
|
54 |
{% endif %} |
|
55 |
</p> |
|
48 | 56 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-reminder-settings' pk=object.id %}">{% trans "Configure" %}</a> |
49 | 57 |
</div> |
50 | 58 |
</div> |
chrono/manager/urls.py | ||
---|---|---|
83 | 83 |
views.agenda_reminder_settings, |
84 | 84 |
name='chrono-manager-agenda-reminder-settings', |
85 | 85 |
), |
86 |
url( |
|
87 |
r'^agendas/(?P<pk>\d+)/reminder/preview/(?P<type>(email|sms))/$', |
|
88 |
views.agenda_reminder_preview, |
|
89 |
name='chrono-manager-agenda-reminder-preview', |
|
90 |
), |
|
86 | 91 |
url( |
87 | 92 |
r'^agendas/(?P<pk>\d+)/events/(?P<event_pk>\d+)/$', |
88 | 93 |
views.event_view, |
chrono/manager/views.py | ||
---|---|---|
28 | 28 |
from django.http import Http404, HttpResponse, HttpResponseRedirect |
29 | 29 |
from django.shortcuts import get_object_or_404 |
30 | 30 |
from django.shortcuts import redirect |
31 |
from django.template.loader import render_to_string |
|
31 | 32 |
from django.template.response import TemplateResponse |
32 | 33 |
from django.urls import reverse, reverse_lazy |
33 | 34 |
from django.utils.dates import MONTHS |
... | ... | |
1388 | 1389 |
agenda_reminder_settings = AgendaReminderSettingsView.as_view() |
1389 | 1390 | |
1390 | 1391 | |
1392 |
class AgendaReminderPreviewView(ManagedAgendaMixin, TemplateView): |
|
1393 |
template_name = 'chrono/manager_agenda_reminder_preview.html' |
|
1394 | ||
1395 |
def dispatch(self, request, *args, **kwargs): |
|
1396 |
self.type_ = kwargs['type'] |
|
1397 |
return super().dispatch(request, *args, **kwargs) |
|
1398 | ||
1399 |
def get_context_data(self, **kwargs): |
|
1400 |
ctx = super().get_context_data(**kwargs) |
|
1401 |
kind = self.agenda.kind |
|
1402 |
days = self.agenda.reminder_settings.days |
|
1403 |
reminder_ctx = { |
|
1404 |
'event': '{{ event_label }}', |
|
1405 |
'meeting': '{{ user_display_label }}', |
|
1406 |
'form_url': '#', |
|
1407 |
'in_x_days': _('tomorrow') if days == 1 else _('in %s days') % days, |
|
1408 |
'time': '14:30', |
|
1409 |
'date': 'Monday 2 June', |
|
1410 |
'date_short': '02/06', |
|
1411 |
'email_extra_info': self.agenda.reminder_settings.email_extra_info, |
|
1412 |
'sms_extra_info': self.agenda.reminder_settings.sms_extra_info, |
|
1413 |
} |
|
1414 | ||
1415 |
if self.type_ == 'email': |
|
1416 |
ctx['subject'] = render_to_string('agendas/%s_reminder_subject.txt' % kind, reminder_ctx).strip() |
|
1417 |
ctx['message'] = render_to_string('agendas/%s_reminder_body.html' % kind, reminder_ctx) |
|
1418 |
elif self.type_ == 'sms': |
|
1419 |
ctx['message'] = render_to_string('agendas/%s_reminder_message.txt' % kind, reminder_ctx) |
|
1420 | ||
1421 |
return ctx |
|
1422 | ||
1423 | ||
1424 |
agenda_reminder_preview = AgendaReminderPreviewView.as_view() |
|
1425 | ||
1426 | ||
1391 | 1427 |
class EventDetailView(ViewableAgendaMixin, DetailView): |
1392 | 1428 |
model = Event |
1393 | 1429 |
pk_url_kwarg = 'event_pk' |
tests/test_manager.py | ||
---|---|---|
35 | 35 |
TimePeriodException, |
36 | 36 |
TimePeriodExceptionSource, |
37 | 37 |
VirtualMember, |
38 |
AgendaReminderSettings, |
|
38 | 39 |
) |
39 | 40 |
from chrono.manager.forms import TimePeriodExceptionForm |
40 | 41 |
from chrono.utils.signature import check_query |
... | ... | |
4005 | 4006 |
agenda = Agenda.objects.create(label='Virtual', kind='virtual') |
4006 | 4007 |
resp = app.get('/manage/agendas/%s/settings' % agenda.id) |
4007 | 4008 |
assert not 'Booking reminders' in resp.text |
4009 | ||
4010 | ||
4011 |
def test_manager_reminders_preview(app, admin_user): |
|
4012 |
agenda = Agenda.objects.create(label='Events', kind='events') |
|
4013 |
AgendaReminderSettings.objects.create( |
|
4014 |
agenda=agenda, |
|
4015 |
days=1, |
|
4016 |
send_email=True, |
|
4017 |
email_extra_info='An ID will be required in order to process your form.', |
|
4018 |
send_sms=True, |
|
4019 |
sms_extra_info='Take ID card.', |
|
4020 |
) |
|
4021 | ||
4022 |
login(app) |
|
4023 |
resp = app.get('/manage/agendas/%s/settings' % agenda.id) |
|
4024 |
assert ( |
|
4025 |
'Users will be reminded of their booking both by email and by SMS, one day in advance.' in resp.text |
|
4026 |
) |
|
4027 | ||
4028 |
resp = resp.click('Preview email') |
|
4029 |
assert 'Users will receive the following email:' in resp.text |
|
4030 |
assert len(resp.pyquery.find('p.email-subject')) == 1 |
|
4031 |
assert '<strong>Subject:</strong> Reminder for your booking tomorrow at 14:30' in resp.text |
|
4032 |
assert 'You have a booking for event "{{ event_label }}", on Monday 2 June at 14:30.' in resp.text |
|
4033 |
assert 'An ID will be required' in resp.text |
|
4034 | ||
4035 |
resp = resp.click('Return to settings') |
|
4036 |
resp = resp.click('Preview SMS') |
|
4037 |
assert 'Users will receive the following SMS:' in resp.text |
|
4038 |
assert ( |
|
4039 |
'Reminder: you have a booking for event "{{ event_label }}", on 02/06 at 14:30. Take ID card.' |
|
4040 |
in resp.text |
|
4041 |
) |
|
4008 |
- |