384 lines
14 KiB
Python
384 lines
14 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
import datetime
|
|
from django.apps import apps
|
|
from django.contrib.auth import get_user_model
|
|
from django.core import mail as django_mail
|
|
from django.test import TestCase
|
|
|
|
from dav_base.tests.generic import EmailTestMixin
|
|
|
|
from ..models.oneclickaction import OneClickAction
|
|
|
|
from .generic import RoleMixin, EventMixin
|
|
|
|
TEST_EVENT_DATA = {
|
|
'title': 'Täst',
|
|
'description': 'Teßt',
|
|
'mode': 'joint',
|
|
'sport': 'W',
|
|
'level': 'beginner',
|
|
'first_day': datetime.date(2019, 3, 1),
|
|
'country': 'DE',
|
|
'trainer_firstname': 'Übungsleiter',
|
|
'trainer_familyname': 'Weißalles',
|
|
'trainer_email': 'trainer@localhost',
|
|
}
|
|
|
|
EVENT_UPDATED_EMAIL_TEMPLATE = """Hallo {recipient_first_name},
|
|
|
|
{editor_full_name} hat die folgende Veranstaltung geändert:
|
|
{event}
|
|
|
|
Link zur Veranstaltung:
|
|
{base_url}{event_url}
|
|
|
|
Ausschreibung:
|
|
==============
|
|
W**/19 - Täst
|
|
|
|
Freitag, 01. März 2019
|
|
|
|
-Teßt
|
|
+Teßt Gößweinstein
|
|
|
|
Leitung: Übungsleiter Weißalles (trainer@localhost)
|
|
|
|
Nichtöffentliche Daten:
|
|
=======================
|
|
Veranstaltungsart: gemeinschaftliche Tour
|
|
Schwierigkeitsnivau: Anfänger
|
|
Gelände: Kletterhalle
|
|
Anmeldung: Nicht erforderlich
|
|
Anreise des Kurs-/Tourenleiters am Vortag: Nein
|
|
Veröffentlichung: sofort
|
|
"""
|
|
|
|
EVENT_SUBMITTED_EMAIL_TEMPLATE = """Hallo {recipient_first_name},
|
|
|
|
eine Veranstaltung wurde in deinem Namen eingereicht.
|
|
Die entsprechenden Referenten wurden informiert, um deine Veranstaltung frei zu geben.
|
|
|
|
Link zur Veranstaltung:
|
|
{base_url}{event_url}
|
|
|
|
Voraussichtliche Veröffentlichung: In wenigen Tagen
|
|
|
|
Ausschreibung:
|
|
==============
|
|
{event_text}"""
|
|
|
|
EVENT_TO_ACCEPT_EMAIL_TEMPLATE = """Hallo {recipient_first_name},
|
|
|
|
{trainer_firstname} {trainer_familyname} hat eine Veranstaltung eingereicht.
|
|
|
|
Der folgende Link führt zur Veranstaltung:
|
|
{base_url}{event_url}
|
|
Über den folgenden Link kannst du die Veranstaltung unmittelbar freigeben:
|
|
{base_url}{accept_url}
|
|
|
|
Veröffentlichung: sofort
|
|
|
|
Ausschreibung:
|
|
==============
|
|
{event_text}"""
|
|
|
|
EVENT_ACCEPTED_EMAIL_TEMPLATE=u"""Hallo {recipient_first_name},
|
|
|
|
deine Veranstaltung wurde von {editor_full_name} freigegeben.
|
|
Die Redaktion wurde informiert, um deine Veranstaltung zu veröffentlichen.
|
|
|
|
Link zur Veranstaltung:
|
|
{base_url}{event_url}
|
|
|
|
Voraussichtliche Veröffentlichung: {planned_publication_date}
|
|
|
|
Ausschreibung:
|
|
==============
|
|
{event_text}
|
|
Bearbeitungshinweis:
|
|
====================
|
|
{internal_note}"""
|
|
|
|
EVENT_TO_PUBLISH_WEB_EMAIL_TEMPLATE = """Hallo {recipient_first_name},
|
|
|
|
{trainer_firstname} {trainer_familyname} hat eine neue Veranstaltung eingereicht.
|
|
Die Veranstaltung wurde von {editor_full_name} zur Veröffentlichung
|
|
auf der Webseite frei gegeben.
|
|
|
|
Der folgende Link führt zur Veranstaltung:
|
|
{base_url}{event_url}
|
|
Über den folgenden Link kannst du die Veröffentlichung auf der Webseite unmittelbar bestätigen:
|
|
{base_url}{confirm_publication_url}
|
|
|
|
Veröffentlichung: ({planned_publication_date})
|
|
=================
|
|
Veröffentlichung starten: {planned_publication_date_short} 00:00:00
|
|
Veröffentlichung beenden: {day_after_short} 00:00:00
|
|
Erstellungsdatum: {first_day_short} 00:00:00
|
|
Titel: {number} - {title}
|
|
|
|
Bearbeitungshinweis:
|
|
====================
|
|
{internal_note}
|
|
|
|
Joomla HTML
|
|
===========
|
|
<h6>{normalized_long_date}</h6>
|
|
<p>{description}</p>
|
|
<hr id="system-readmore" />
|
|
|
|
<p>
|
|
<strong>Leitung:</strong> {trainer_firstname} {trainer_familyname} (<a href="mailto:trainer@localhost">trainer@localhost</a>)
|
|
</p>
|
|
"""
|
|
|
|
EVENT_TO_PUBLISH_FACEBOOK_EMAIL_TEMPLATE = """Hallo {recipient_first_name},
|
|
|
|
{trainer_firstname} {trainer_familyname} hat eine neue Veranstaltung eingereicht.
|
|
Die Veranstaltung wurde von {editor_full_name} zur Veröffentlichung
|
|
auf Facebook frei gegeben.
|
|
|
|
Der folgende Link führt zur Veranstaltung:
|
|
{base_url}{event_url}
|
|
Über den folgenden Link kannst du die Veröffentlichung auf Facebook unmittelbar bestätigen:
|
|
{base_url}{confirm_publication_url}
|
|
|
|
Veröffentlichung: (sofort)
|
|
=================
|
|
Veröffentlichung starten: --
|
|
Veröffentlichung beenden: {day_after_short} 00:00:00
|
|
Erstellungsdatum: {first_day_short} 00:00:00
|
|
Titel: {number} {title}
|
|
|
|
Ausschreibung:
|
|
==============
|
|
{number} {title}
|
|
|
|
{normalized_long_date}
|
|
|
|
{description}
|
|
|
|
Leitung: {trainer_firstname} {trainer_familyname} (trainer@localhost)
|
|
"""
|
|
|
|
|
|
class EmailTestCase(EmailTestMixin, RoleMixin, EventMixin, TestCase):
|
|
def setUp(self):
|
|
super(EmailTestCase, self).setUp()
|
|
|
|
app_config = apps.get_containing_app_config(__package__)
|
|
app_config.settings.enable_email_on_update = False
|
|
app_config.settings.enable_email_on_status_update = False
|
|
self.app_settings = app_config.settings
|
|
|
|
event_data = TEST_EVENT_DATA
|
|
self.event = self.create_event_by_model(event_data)
|
|
self.trainer = self.event.owner
|
|
|
|
self.manager_super = self.create_user_for_role('manager_super', 'password', 'Touren', 'Referent')
|
|
self.manager_w = self.create_user_for_role('manager_w', 'password', 'Bereichsleiter', 'Wandern')
|
|
self.manager_s = self.create_user_for_role('manager_s', 'password', 'Bereichsleiter', 'Ski')
|
|
self.publisher_web = self.create_user_for_role('publisher_web', 'password', 'Joomla', 'Redakteur')
|
|
self.publisher_facebook = self.create_user_for_role('publisher_facebook', 'password', 'Facebook', 'Redakteur')
|
|
|
|
model = get_user_model()
|
|
self.recipient = model.objects.create_user(username='recipient@example.com',
|
|
email='recipient@example.com',
|
|
password='mellon12',
|
|
first_name='Re Ö.',
|
|
last_name='Cipient',
|
|
)
|
|
self.editor = model.objects.create_user(username='editor@example.com',
|
|
email='editor@example.com',
|
|
password='mellon12',
|
|
first_name='Ed Ü.',
|
|
last_name='Itor',
|
|
)
|
|
|
|
def test_disabled_mail(self):
|
|
self.event.workflow.update_status('submitted', self.trainer)
|
|
self.event.description += ' Gößweinstein'
|
|
self.event.save()
|
|
self.event.workflow.update_status('accepted', self.editor)
|
|
self.event.first_day += datetime.timedelta(1)
|
|
self.event.save()
|
|
self.assertEqual(len(django_mail.outbox), 0)
|
|
|
|
def test_event_updated_mail(self):
|
|
expected_recipient = self.manager_super
|
|
editor = self.trainer
|
|
|
|
self.app_settings.enable_email_on_update = True
|
|
self.event.workflow.update_status('submitted', self.trainer)
|
|
self.event.description += ' Gößweinstein'
|
|
self.event.save()
|
|
self.assertEqual(len(django_mail.outbox), 2)
|
|
|
|
mail = django_mail.outbox[0]
|
|
self.assertSender(mail)
|
|
self.assertRecipients(mail, [expected_recipient])
|
|
self.assertSubject(mail, 'Veranstaltung geändert')
|
|
|
|
expected_body = EVENT_UPDATED_EMAIL_TEMPLATE.format(
|
|
recipient_first_name=expected_recipient.first_name,
|
|
editor_full_name=editor.get_full_name(),
|
|
event=self.event,
|
|
base_url=self.email_base_url,
|
|
event_url=self.event.get_absolute_url(),
|
|
)
|
|
self.assertBody(mail, expected_body)
|
|
|
|
def test_event_submitted_mail(self):
|
|
expected_recipient = self.trainer
|
|
|
|
self.app_settings.enable_email_on_status_update = True
|
|
self.event.workflow.update_status('submitted', self.trainer)
|
|
self.assertEqual(len(django_mail.outbox), 3)
|
|
|
|
mail = django_mail.outbox[0]
|
|
self.assertSender(mail)
|
|
self.assertRecipients(mail, [expected_recipient])
|
|
self.assertSubject(mail, 'Veranstaltung eingereicht')
|
|
|
|
expected_body = EVENT_SUBMITTED_EMAIL_TEMPLATE.format(
|
|
recipient_first_name=expected_recipient.first_name,
|
|
base_url=self.email_base_url,
|
|
event_url=self.event.get_absolute_url(),
|
|
event_text=self.event.render_as_text(),
|
|
)
|
|
self.assertBody(mail, expected_body)
|
|
|
|
def test_event_to_accept_mail(self):
|
|
expected_recipient = self.manager_super
|
|
|
|
self.app_settings.enable_email_on_status_update = True
|
|
self.event.workflow.update_status('submitted', self.trainer)
|
|
self.assertEqual(len(django_mail.outbox), 3)
|
|
|
|
mail = django_mail.outbox[1]
|
|
self.assertSender(mail)
|
|
self.assertRecipients(mail, [expected_recipient])
|
|
self.assertSubject(mail, 'Veranstaltung freigeben')
|
|
|
|
action_parameters = '{},{},{}'.format(self.event.id, 'accepted', expected_recipient.id)
|
|
action = OneClickAction.objects.get(parameters=action_parameters)
|
|
|
|
expected_body = EVENT_TO_ACCEPT_EMAIL_TEMPLATE.format(
|
|
recipient_first_name=expected_recipient.first_name,
|
|
trainer_firstname=self.event.trainer_firstname,
|
|
trainer_familyname=self.event.trainer_familyname,
|
|
base_url=self.email_base_url,
|
|
event_url=self.event.get_absolute_url(),
|
|
accept_url=action.get_absolute_url(),
|
|
event_text=self.event.render_as_text(),
|
|
)
|
|
self.assertBody(mail, expected_body)
|
|
|
|
def test_accepted_mail(self):
|
|
expected_recipient = self.trainer
|
|
editor = self.manager_w
|
|
|
|
self.event.workflow.update_status('submitted', self.trainer)
|
|
self.event.internal_note = 'Automatischer Software Test.'
|
|
self.event.planned_publication_date = datetime.date(2019, 3, 24)
|
|
ppd_string = 'Sonntag, 24. März 2019'
|
|
self.event.save()
|
|
|
|
self.app_settings.enable_email_on_status_update = True
|
|
self.event.workflow.update_status('accepted', editor)
|
|
self.assertEqual(len(django_mail.outbox), 3)
|
|
|
|
mail = django_mail.outbox[0]
|
|
self.assertSender(mail)
|
|
self.assertRecipients(mail, [expected_recipient])
|
|
self.assertSubject(mail, '{}: Veranstaltung freigegeben'.format(self.event.number))
|
|
|
|
expected_body = EVENT_ACCEPTED_EMAIL_TEMPLATE.format(
|
|
recipient_first_name=expected_recipient.first_name,
|
|
editor_full_name=editor.get_full_name(),
|
|
base_url=self.email_base_url,
|
|
event_url=self.event.get_absolute_url(),
|
|
planned_publication_date=ppd_string,
|
|
event_text=self.event.render_as_text(),
|
|
internal_note=self.event.internal_note,
|
|
)
|
|
self.assertBody(mail, expected_body)
|
|
|
|
def test_event_to_publish_web_mail(self):
|
|
expected_recipient = self.publisher_web
|
|
editor = self.manager_w
|
|
|
|
self.event.workflow.update_status('submitted', self.trainer)
|
|
self.event.internal_note = 'Automatischer Software Test.'
|
|
self.event.planned_publication_date = datetime.date(2019, 3, 24)
|
|
ppd_string = 'Sonntag, 24. März 2019'
|
|
self.event.save()
|
|
|
|
self.app_settings.enable_email_on_status_update = True
|
|
self.event.workflow.update_status('accepted', editor)
|
|
self.assertEqual(len(django_mail.outbox), 3)
|
|
|
|
mail = django_mail.outbox[1]
|
|
self.assertSender(mail)
|
|
self.assertRecipients(mail, [expected_recipient])
|
|
self.assertSubject(mail, '{}: Veranstaltung veröffentlichen'.format(self.event.number))
|
|
|
|
action_parameters = '{},{},{}'.format(self.event.id, 'publishing_web', expected_recipient.id)
|
|
action = OneClickAction.objects.get(parameters=action_parameters)
|
|
|
|
expected_body = EVENT_TO_PUBLISH_WEB_EMAIL_TEMPLATE.format(
|
|
recipient_first_name=expected_recipient.first_name,
|
|
trainer_firstname=self.event.trainer_firstname,
|
|
trainer_familyname=self.event.trainer_familyname,
|
|
editor_full_name=editor.get_full_name(),
|
|
base_url=self.email_base_url,
|
|
event_url=self.event.get_absolute_url(),
|
|
confirm_publication_url=action.get_absolute_url(),
|
|
planned_publication_date=ppd_string,
|
|
internal_note=self.event.internal_note,
|
|
number=self.event.number,
|
|
title=self.event.title,
|
|
description=self.event.description,
|
|
planned_publication_date_short=self.event.planned_publication_date.strftime('%d.%m.%Y'),
|
|
first_day_short=self.event.first_day.strftime('%d.%m.%Y'),
|
|
day_after_short=(self.event.first_day + datetime.timedelta(1)).strftime('%d.%m.%Y'),
|
|
normalized_long_date=self.event.get_formated_date(format='normalized_long'),
|
|
)
|
|
self.assertBody(mail, expected_body)
|
|
|
|
def test_event_to_publish_facebook_mail(self):
|
|
expected_recipient = self.publisher_facebook
|
|
editor = self.manager_super
|
|
|
|
self.event.workflow.update_status('submitted', self.trainer)
|
|
|
|
self.app_settings.enable_email_on_status_update = True
|
|
self.event.workflow.update_status('accepted', editor)
|
|
self.assertEqual(len(django_mail.outbox), 3)
|
|
|
|
mail = django_mail.outbox[2]
|
|
self.assertSender(mail)
|
|
self.assertRecipients(mail, [expected_recipient])
|
|
self.assertSubject(mail, '{}: Veranstaltung veröffentlichen'.format(self.event.number))
|
|
|
|
action_parameters = '{},{},{}'.format(self.event.id, 'publishing_facebook', expected_recipient.id)
|
|
action = OneClickAction.objects.get(parameters=action_parameters)
|
|
|
|
expected_body = EVENT_TO_PUBLISH_FACEBOOK_EMAIL_TEMPLATE.format(
|
|
recipient_first_name=expected_recipient.first_name,
|
|
trainer_firstname=self.event.trainer_firstname,
|
|
trainer_familyname=self.event.trainer_familyname,
|
|
editor_full_name=editor.get_full_name(),
|
|
base_url=self.email_base_url,
|
|
event_url=self.event.get_absolute_url(),
|
|
confirm_publication_url=action.get_absolute_url(),
|
|
number=self.event.number,
|
|
title=self.event.title,
|
|
description=self.event.description,
|
|
first_day_short=self.event.first_day.strftime('%d.%m.%Y'),
|
|
day_after_short=(self.event.first_day + datetime.timedelta(1)).strftime('%d.%m.%Y'),
|
|
normalized_long_date=self.event.get_formated_date(format='normalized_long'),
|
|
)
|
|
self.assertBody(mail, expected_body)
|