Update mailer app to comply with MERCs 5 and 6

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2018-12-31 03:57:29 -04:00
parent 35ef8ba7b8
commit 7f3b28aec8
12 changed files with 173 additions and 112 deletions

View File

@@ -20,8 +20,8 @@ from mayan.celery import app
from .classes import MailerBackend
from .links import (
link_document_send, link_document_send_link, link_document_multiple_send,
link_document_multiple_send_link, link_system_mailer_error_log,
link_document_multiple_send, link_document_multiple_send_link,
link_document_send, link_document_send_link, link_system_mailer_error_log,
link_user_mailer_create, link_user_mailer_delete, link_user_mailer_edit,
link_user_mailer_list, link_user_mailer_log_list, link_user_mailer_setup,
link_user_mailer_test
@@ -48,8 +48,8 @@ class MailerApp(MayanAppConfig):
app_label='documents', model_name='Document'
)
LogEntry = self.get_model('LogEntry')
UserMailer = self.get_model('UserMailer')
LogEntry = self.get_model(model_name='LogEntry')
UserMailer = self.get_model(model_name='UserMailer')
MailerBackend.initialize()

View File

@@ -67,7 +67,7 @@ class MailerBackend(six.with_metaclass(MailerBackendMetaclass, MailerBackendBase
def initialize():
for app in apps.get_app_configs():
try:
import_module('{}.mailers'.format(app.name))
import_module(name='{}.mailers'.format(app.name))
except ImportError as exception:
if force_text(exception) not in ('No module named mailers', 'No module named \'{}.mailers\''.format(app.name)):
logger.error(

View File

@@ -47,8 +47,8 @@ class DocumentMailForm(forms.Form):
}
queryset = AccessControlList.objects.filter_by_access(
permission=permission_user_mailer_use, user=user,
queryset=UserMailer.objects.filter(enabled=True)
permission=permission_user_mailer_use,
queryset=UserMailer.objects.filter(enabled=True), user=user
)
self.fields['user_mailer'].queryset = queryset
@@ -96,8 +96,10 @@ class UserMailerDynamicForm(DynamicModelForm):
def __init__(self, *args, **kwargs):
result = super(UserMailerDynamicForm, self).__init__(*args, **kwargs)
if self.instance.backend_data:
for key, value in json.loads(self.instance.backend_data).items():
self.fields[key].initial = value
for key, value in json.loads(s=self.instance.backend_data).items():
field = self.fields.get(key)
if field:
field.initial = value
return result

View File

@@ -5,16 +5,10 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.navigation import Link
from .icons import (
icon_document_send,
icon_document_send_link,
icon_document_multiple_send,
icon_document_multiple_send_link,
icon_system_mailer_error_log, icon_user_mailer_create,
icon_user_mailer_delete,icon_user_mailer_edit,
icon_user_mailer_list, icon_user_mailer_setup,
icon_user_mailer_test
icon_document_multiple_send, icon_document_multiple_send_link,
icon_document_send, icon_document_send_link, icon_system_mailer_error_log,
icon_user_mailer_create, icon_user_mailer_delete, icon_user_mailer_edit,
icon_user_mailer_list, icon_user_mailer_setup, icon_user_mailer_test
)
from .permissions import (
permission_mailing_link, permission_mailing_send_document,

View File

@@ -7,11 +7,11 @@ DEFAULT_DOCUMENT_BODY_TEMPLATE = _(
'--------\n '
'This email has been sent from %(project_title)s (%(project_website)s)'
)
DEFAULT_DOCUMENT_SUBJECT_TEMPLATE = _('Document: {{ document }}')
DEFAULT_LINK_BODY_TEMPLATE = _(
'To access this document click on the following link: '
'{{ link }}\n\n--------\n '
'This email has been sent from %(project_title)s (%(project_website)s)'
)
DEFAULT_LINK_SUBJECT_TEMPLATE = _('Link for document: {{ document }}')
EMAIL_SEPARATORS = (',', ';')

View File

@@ -114,7 +114,7 @@ class UserMailer(models.Model):
"""
Deserialize the stored backend data.
"""
return json.loads(self.backend_data)
return json.loads(s=self.backend_data)
def natural_key(self):
return (self.label,)
@@ -150,7 +150,9 @@ class UserMailer(models.Model):
mimetype=attachment['mimetype']
)
email_message.attach_alternative(body, 'text/html')
email_message.attach_alternative(
content=body, mimetype='text/html'
)
try:
email_message.send()

View File

@@ -5,13 +5,14 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.smart_settings import Namespace
from .literals import (
DEFAULT_DOCUMENT_BODY_TEMPLATE, DEFAULT_LINK_BODY_TEMPLATE
DEFAULT_DOCUMENT_BODY_TEMPLATE, DEFAULT_DOCUMENT_SUBJECT_TEMPLATE,
DEFAULT_LINK_BODY_TEMPLATE, DEFAULT_LINK_SUBJECT_TEMPLATE
)
namespace = Namespace(name='mailer', label=_('Mailing'))
setting_link_subject_template = namespace.add_setting(
default=_('Link for document: {{ document }}'),
default=DEFAULT_LINK_SUBJECT_TEMPLATE,
help_text=_('Template for the document link email form subject line.'),
global_name='MAILER_LINK_SUBJECT_TEMPLATE'
)
@@ -24,7 +25,7 @@ setting_link_body_template = namespace.add_setting(
global_name='MAILER_LINK_BODY_TEMPLATE'
)
setting_document_subject_template = namespace.add_setting(
default=_('Document: {{ document }}'),
default=DEFAULT_DOCUMENT_SUBJECT_TEMPLATE,
help_text=_('Template for the document email form subject line.'),
global_name='MAILER_DOCUMENT_SUBJECT_TEMPLATE'
)

View File

@@ -17,3 +17,4 @@ TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT = [
]
TEST_USER_MAILER_BACKEND_PATH = 'mayan.apps.mailer.tests.mailers.TestBackend'
TEST_USER_MAILER_LABEL = 'test user mailer label'
TEST_USER_MAILER_LABEL_EDITED = 'test user mailer label edited'

View File

@@ -5,8 +5,8 @@ import json
from ..models import UserMailer
from .literals import (
TEST_EMAIL_FROM_ADDRESS, TEST_USER_MAILER_BACKEND_PATH,
TEST_USER_MAILER_LABEL
TEST_EMAIL_ADDRESS, TEST_EMAIL_FROM_ADDRESS, TEST_USER_MAILER_BACKEND_PATH,
TEST_USER_MAILER_LABEL, TEST_USER_MAILER_LABEL_EDITED
)
@@ -23,3 +23,42 @@ class MailerTestMixin(object):
}
)
)
def _request_user_mailer_create(self):
return self.post(
viewname='mailer:user_mailer_create', kwargs={
'class_path': TEST_USER_MAILER_BACKEND_PATH
}, data={
'default': True, 'enabled': True,
'label': TEST_USER_MAILER_LABEL,
}
)
def _request_user_mailer_delete(self):
return self.post(
viewname='mailer:user_mailer_delete',
kwargs={'mailer_pk': self.user_mailer.pk}
)
def _request_user_mailer_edit(self):
return self.post(
viewname='mailer:user_mailer_edit',
kwargs={'mailer_pk': self.user_mailer.pk},
data={
'label': TEST_USER_MAILER_LABEL_EDITED
}
)
def _request_user_mailer_list_view(self):
return self.get(viewname='mailer:user_mailer_list')
def _request_user_mailer_test(self):
return self.post(
viewname='mailer:user_mailer_test',
kwargs={'mailer_pk': self.user_mailer.pk},
data={
'email': getattr(
self, 'test_email_address', TEST_EMAIL_ADDRESS
)
}
)

View File

@@ -9,7 +9,8 @@ from ..models import UserMailer
from ..permissions import (
permission_mailing_link, permission_mailing_send_document,
permission_user_mailer_create, permission_user_mailer_delete,
permission_user_mailer_use, permission_user_mailer_view
permission_user_mailer_edit, permission_user_mailer_use,
permission_user_mailer_view
)
from .literals import (
@@ -17,8 +18,8 @@ from .literals import (
TEST_RECIPIENTS_MULTIPLE_COMMA, TEST_RECIPIENTS_MULTIPLE_COMMA_RESULT,
TEST_RECIPIENTS_MULTIPLE_MIXED, TEST_RECIPIENTS_MULTIPLE_MIXED_RESULT,
TEST_RECIPIENTS_MULTIPLE_SEMICOLON,
TEST_RECIPIENTS_MULTIPLE_SEMICOLON_RESULT, TEST_USER_MAILER_BACKEND_PATH,
TEST_USER_MAILER_LABEL
TEST_RECIPIENTS_MULTIPLE_SEMICOLON_RESULT, TEST_USER_MAILER_LABEL,
TEST_USER_MAILER_LABEL_EDITED
)
from .mailers import TestBackend
from .mixins import MailerTestMixin
@@ -29,31 +30,6 @@ class MailerViewsTestCase(MailerTestMixin, GenericViewTestCase):
super(MailerViewsTestCase, self).setUp()
self.login_user()
def _request_user_mailer_create(self):
return self.post(
viewname='mailer:user_mailer_create', args=(
TEST_USER_MAILER_BACKEND_PATH,
), data={
'default': True, 'enabled': True,
'label': TEST_USER_MAILER_LABEL,
}
)
def _request_user_mailer_delete(self):
return self.post(
viewname='mailer:user_mailer_delete', args=(self.user_mailer.pk,)
)
def _request_user_mailer_test(self):
return self.post(
viewname='mailer:user_mailer_test', args=(self.user_mailer.pk,),
data={
'email': getattr(
self, 'test_email_address', TEST_EMAIL_ADDRESS
)
}
)
def test_user_mailer_create_view_no_permissions(self):
response = self._request_user_mailer_create()
@@ -62,7 +38,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericViewTestCase):
)
self.assertEqual(UserMailer.objects.count(), 0)
def test_user_mailer_create_view_with_permissions(self):
def test_user_mailer_create_view_with_permission(self):
self.grant_permission(permission=permission_user_mailer_create)
response = self._request_user_mailer_create()
@@ -73,7 +49,8 @@ class MailerViewsTestCase(MailerTestMixin, GenericViewTestCase):
def test_user_mailer_delete_view_no_permissions(self):
self._create_user_mailer()
self._request_user_mailer_delete()
response = self._request_user_mailer_delete()
self.assertEqual(response.status_code, 404)
self.assertQuerysetEqual(
UserMailer.objects.all(), (repr(self.user_mailer),)
@@ -86,12 +63,32 @@ class MailerViewsTestCase(MailerTestMixin, GenericViewTestCase):
obj=self.user_mailer, permission=permission_user_mailer_delete
)
self._request_user_mailer_delete()
response = self._request_user_mailer_delete()
self.assertEqual(response.status_code, 302)
self.assertEqual(UserMailer.objects.count(), 0)
def _request_user_mailer_list_view(self):
return self.get(viewname='mailer:user_mailer_list')
def test_user_mailer_edit_view_no_permission(self):
self._create_user_mailer()
response = self._request_user_mailer_edit()
self.assertEqual(response.status_code, 404)
self.user_mailer.refresh_from_db()
self.assertEqual(self.user_mailer.label, TEST_USER_MAILER_LABEL)
def test_user_mailer_edit_view_with_access(self):
self._create_user_mailer()
self.grant_access(
obj=self.user_mailer, permission=permission_user_mailer_edit
)
response = self._request_user_mailer_edit()
self.assertEqual(response.status_code, 302)
self.user_mailer.refresh_from_db()
self.assertEqual(self.user_mailer.label, TEST_USER_MAILER_LABEL_EDITED)
def test_user_mailer_list_view_no_permissions(self):
self._create_user_mailer()
@@ -118,7 +115,7 @@ class MailerViewsTestCase(MailerTestMixin, GenericViewTestCase):
response = self._request_user_mailer_test()
self.assertEqual(response.status_code, 403)
self.assertEqual(response.status_code, 404)
self.assertEqual(len(mail.outbox), 0)
@@ -192,7 +189,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
def _request_document_link_send(self):
return self.post(
viewname='mailer:document_send_link', args=(self.document.pk,),
viewname='mailer:document_send_link',
kwargs={'document_pk': self.document.pk},
data={
'email': getattr(
self, 'test_email_address', TEST_EMAIL_ADDRESS
@@ -203,7 +201,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
def _request_document_send(self):
return self.post(
viewname='mailer:document_send', args=(self.document.pk,),
viewname='mailer:document_send',
kwargs={'document_pk': self.document.pk},
data={
'email': getattr(
self, 'test_email_address', TEST_EMAIL_ADDRESS
@@ -267,7 +266,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
permission=permission_user_mailer_use, obj=self.user_mailer
)
self._request_document_link_send()
response = self._request_document_link_send()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
@@ -285,7 +285,6 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
)
self.assertEqual(len(mail.outbox), 0)
def test_mail_document_view_with_document_access(self):
self._create_user_mailer()
@@ -328,12 +327,12 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
)
response = self._request_document_send()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
self.assertEqual(mail.outbox[0].to, [TEST_EMAIL_ADDRESS])
def test_mail_link_view_recipients_comma(self):
self._create_user_mailer()
@@ -341,7 +340,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self.grant_permission(permission=permission_user_mailer_use)
self.test_email_address = TEST_RECIPIENTS_MULTIPLE_COMMA
self._request_document_link_send()
response = self._request_document_link_send()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
@@ -356,7 +356,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self.grant_permission(permission=permission_user_mailer_use)
self.test_email_address = TEST_RECIPIENTS_MULTIPLE_MIXED
self._request_document_link_send()
response = self._request_document_link_send()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
@@ -371,7 +372,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self.grant_permission(permission=permission_user_mailer_use)
self.test_email_address = TEST_RECIPIENTS_MULTIPLE_SEMICOLON
self._request_document_link_send()
response = self._request_document_link_send()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
@@ -386,7 +388,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self.grant_permission(permission=permission_user_mailer_use)
self.test_email_address = TEST_RECIPIENTS_MULTIPLE_COMMA
self._request_document_send()
response = self._request_document_send()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
@@ -401,7 +404,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self.grant_permission(permission=permission_user_mailer_use)
self.test_email_address = TEST_RECIPIENTS_MULTIPLE_MIXED
self._request_document_send()
response = self._request_document_send()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)
@@ -416,7 +420,8 @@ class DocumentViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase):
self.grant_permission(permission=permission_user_mailer_use)
self.test_email_address = TEST_RECIPIENTS_MULTIPLE_SEMICOLON
self._request_document_send()
response = self._request_document_send()
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].from_email, TEST_EMAIL_FROM_ADDRESS)

View File

@@ -11,52 +11,53 @@ from .views import (
urlpatterns = [
url(
r'^documents/(?P<pk>\d+)/send/link/$', MailDocumentLinkView.as_view(),
name='document_send_link'
regex=r'^documents/(?P<document_pk>\d+)/send/link/$',
name='document_send_link', view=MailDocumentLinkView.as_view()
),
url(
r'^documents/multiple/send/link/$', MailDocumentLinkView.as_view(),
name='document_multiple_send_link'
regex=r'^documents/multiple/send/link/$',
name='document_multiple_send_link',
view=MailDocumentLinkView.as_view()
),
url(
r'^documents/(?P<pk>\d+)/send/$', MailDocumentView.as_view(),
name='document_send'
regex=r'^documents/(?P<document_pk>\d+)/send/$', name='document_send',
view=MailDocumentView.as_view()
),
url(
r'^documents/multiple/send/document/$', MailDocumentView.as_view(),
name='document_multiple_send'
regex=r'^documents/multiple/send/document/$',
name='document_multiple_send', view=MailDocumentView.as_view()
),
url(
r'^system_mailer/log/$', SystemMailerLogEntryListView.as_view(),
name='system_mailer_error_log'
regex=r'^system_mailer/log/$', name='system_mailer_error_log',
view=SystemMailerLogEntryListView.as_view()
),
url(
r'^user_mailers/backend/selection/$',
UserMailerBackendSelectionView.as_view(),
name='user_mailer_backend_selection'
regex=r'^user_mailers/backend/selection/$',
name='user_mailer_backend_selection',
view=UserMailerBackendSelectionView.as_view()
),
url(
r'^user_mailers/(?P<class_path>[a-zA-Z0-9_.]+)/create/$',
UserMailingCreateView.as_view(), name='user_mailer_create'
regex=r'^user_mailers/(?P<class_path>[a-zA-Z0-9_.]+)/create/$',
name='user_mailer_create', view=UserMailingCreateView.as_view()
),
url(
r'^user_mailers/(?P<pk>\d+)/delete/$', UserMailingDeleteView.as_view(),
name='user_mailer_delete'
regex=r'^user_mailers/(?P<mailer_pk>\d+)/delete/$',
name='user_mailer_delete', view=UserMailingDeleteView.as_view()
),
url(
r'^user_mailers/(?P<pk>\d+)/edit/$', UserMailingEditView.as_view(),
name='user_mailer_edit'
regex=r'^user_mailers/(?P<mailer_pk>\d+)/edit/$',
name='user_mailer_edit', view=UserMailingEditView.as_view()
),
url(
r'^user_mailers/(?P<pk>\d+)/log/$',
UserMailerLogEntryListView.as_view(), name='user_mailer_log'
regex=r'^user_mailers/(?P<mailer_pk>\d+)/log/$',
name='user_mailer_log', view=UserMailerLogEntryListView.as_view()
),
url(
r'^user_mailers/(?P<pk>\d+)/test/$',
UserMailerTestView.as_view(), name='user_mailer_test'
regex=r'^user_mailers/(?P<mailer_pk>\d+)/test/$',
name='user_mailer_test', view=UserMailerTestView.as_view()
),
url(
r'^user_mailers/$', UserMailerListView.as_view(),
name='user_mailer_list'
regex=r'^user_mailers/$', name='user_mailer_list',
view=UserMailerListView.as_view()
),
]

View File

@@ -47,7 +47,8 @@ class MailDocumentView(MultipleObjectFormActionView):
form_class = DocumentMailForm
model = Document
object_permission = permission_mailing_send_document
object_permission_raise_404 = True
pk_url_kwarg = 'document_pk'
success_message = _('%(count)d document queued for email delivery')
success_message_plural = _(
'%(count)d documents queued for email delivery'
@@ -126,13 +127,17 @@ class UserMailerBackendSelectionView(FormView):
def form_valid(self, form):
backend = form.cleaned_data['backend']
return HttpResponseRedirect(
reverse('mailer:user_mailer_create', args=(backend,),)
reverse(
viewname='mailer:user_mailer_create', kwargs={
'class_path': backend
}
)
)
class UserMailingCreateView(SingleObjectDynamicFormCreateView):
form_class = UserMailerDynamicForm
post_action_redirect = reverse_lazy('mailer:user_mailer_list')
post_action_redirect = reverse_lazy(viewname='mailer:user_mailer_list')
view_permission = permission_user_mailer_create
def get_backend(self):
@@ -168,7 +173,9 @@ class UserMailingCreateView(SingleObjectDynamicFormCreateView):
class UserMailingDeleteView(SingleObjectDeleteView):
model = UserMailer
object_permission = permission_user_mailer_delete
post_action_redirect = reverse_lazy('mailer:user_mailer_list')
object_permission_raise_404 = True
pk_url_kwarg = 'mailer_pk'
post_action_redirect = reverse_lazy(viewname='mailer:user_mailer_list')
def get_extra_context(self):
return {
@@ -180,6 +187,8 @@ class UserMailingEditView(SingleObjectDynamicFormEditView):
form_class = UserMailerDynamicForm
model = UserMailer
object_permission = permission_user_mailer_edit
object_permission_raise_404 = True
pk_url_kwarg = 'mailer_pk'
def get_extra_context(self):
return {
@@ -206,14 +215,16 @@ class UserMailerLogEntryListView(SingleObjectListView):
return {
'hide_object': True,
'object': self.get_user_mailer(),
'title': _('Error log for mailing profile: %s') % self.get_user_mailer(),
'title': _(
'Error log for mailing profile: %s'
) % self.get_user_mailer(),
}
def get_object_list(self):
return self.get_user_mailer().error_log.all()
def get_user_mailer(self):
return get_object_or_404(klass=UserMailer, pk=self.kwargs['pk'])
return get_object_or_404(klass=UserMailer, pk=self.kwargs['mailer_pk'])
class UserMailerListView(SingleObjectListView):
@@ -242,7 +253,6 @@ class UserMailerListView(SingleObjectListView):
class UserMailerTestView(FormView):
form_class = UserMailerTestForm
object_permission = permission_user_mailer_edit
def form_valid(self, form):
obj = self.get_object()
@@ -253,11 +263,15 @@ class UserMailerTestView(FormView):
obj.test(to=form.cleaned_data['email'])
except Exception as exception:
messages.error(
self.request, _('Error sending test message; %s.') % exception
request=self.request, message=_(
'Error sending test message; %s.'
) % exception
)
else:
messages.success(
self.request, _('Successfully sent test message.')
request=self.request, message=_(
'Successfully sent test message.'
)
)
return super(UserMailerTestView, self).form_valid(form=form)
@@ -271,10 +285,12 @@ class UserMailerTestView(FormView):
}
def get_object(self):
user_mailer = get_object_or_404(klass=UserMailer, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permissions=permission_user_mailer_use, user=self.request.user,
obj=user_mailer
return get_object_or_404(
klass=self.get_queryset(), pk=self.kwargs['mailer_pk']
)
return user_mailer
def get_queryset(self):
return AccessControlList.objects.filter_by_access(
permission=permission_user_mailer_use,
queryset=UserMailer.objects.all(), user=self.request.user
)