Files
mayan-edms/mayan/apps/mailer/views.py
Roberto Rosario 410e6a4a55 Improve mailer no-result template message
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-05-20 23:29:54 -04:00

269 lines
8.4 KiB
Python

from __future__ import absolute_import, unicode_literals
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.template import RequestContext
from django.urls import reverse, reverse_lazy
from django.utils.translation import ungettext, ugettext_lazy as _
from mayan.apps.acls.models import AccessControlList
from mayan.apps.common.generics import (
FormView, MultipleObjectFormActionView, SingleObjectDeleteView,
SingleObjectDynamicFormCreateView, SingleObjectDynamicFormEditView,
SingleObjectListView
)
from mayan.apps.documents.models import Document
from .classes import MailerBackend
from .forms import (
DocumentMailForm, UserMailerBackendSelectionForm, UserMailerDynamicForm,
UserMailerTestForm
)
from .icons import icon_mail_document_submit, icon_user_mailer_setup
from .links import link_user_mailer_create
from .models import LogEntry, UserMailer
from .permissions import (
permission_mailing_link, permission_mailing_send_document,
permission_user_mailer_create, permission_user_mailer_delete,
permission_user_mailer_edit, permission_user_mailer_use,
permission_user_mailer_view, permission_view_error_log
)
from .tasks import task_send_document
class SystemMailerLogEntryListView(SingleObjectListView):
extra_context = {
'hide_object': True,
'title': _('Document mailing error log'),
}
model = LogEntry
view_permission = permission_view_error_log
class MailDocumentView(MultipleObjectFormActionView):
as_attachment = True
form_class = DocumentMailForm
model = Document
object_permission = permission_mailing_send_document
success_message = _('%(count)d document queued for email delivery')
success_message_plural = _(
'%(count)d documents queued for email delivery'
)
title = 'Email document'
title_plural = 'Email documents'
title_document = 'Email document: %s'
def get_extra_context(self):
queryset = self.object_list
result = {
'submit_icon_class': icon_mail_document_submit,
'submit_label': _('Send'),
'title': ungettext(
singular=self.title,
plural=self.title_plural,
number=queryset.count()
)
}
if queryset.count() == 1:
result.update(
{
'object': queryset.first(),
'title': _(self.title_document) % queryset.first()
}
)
return result
def get_form_extra_kwargs(self):
return {
'as_attachment': self.as_attachment,
'user': self.request.user
}
def object_action(self, form, instance):
AccessControlList.objects.check_access(
obj=form.cleaned_data['user_mailer'],
permissions=(permission_user_mailer_use,), user=self.request.user
)
task_send_document.apply_async(
kwargs={
'as_attachment': self.as_attachment,
'body': form.cleaned_data['body'],
'document_id': instance.pk,
'recipient': form.cleaned_data['email'],
'sender': self.request.user.email,
'subject': form.cleaned_data['subject'],
'user_mailer_id': form.cleaned_data['user_mailer'].pk,
}
)
class MailDocumentLinkView(MailDocumentView):
as_attachment = False
object_permission = permission_mailing_link
success_message = _('%(count)d document link queued for email delivery')
success_message_plural = _(
'%(count)d document links queued for email delivery'
)
title = 'Email document link'
title_plural = 'Email document links'
title_document = 'Email link for document: %s'
class UserMailerBackendSelectionView(FormView):
extra_context = {
'title': _('New mailing profile backend selection'),
}
form_class = UserMailerBackendSelectionForm
view_permission = permission_user_mailer_create
def form_valid(self, form):
backend = form.cleaned_data['backend']
return HttpResponseRedirect(
redirect_to=reverse(
viewname='mailer:user_mailer_create', kwargs={
'class_path': backend
}
)
)
class UserMailingCreateView(SingleObjectDynamicFormCreateView):
form_class = UserMailerDynamicForm
post_action_redirect = reverse_lazy(viewname='mailer:user_mailer_list')
view_permission = permission_user_mailer_create
def get_backend(self):
try:
return MailerBackend.get(name=self.kwargs['class_path'])
except KeyError:
raise Http404(
'{} class not found'.format(self.kwargs['class_path'])
)
def get_extra_context(self):
return {
'title': _(
'Create a "%s" mailing profile'
) % self.get_backend().label,
}
def get_form_schema(self):
backend = self.get_backend()
result = {
'fields': backend.fields,
'widgets': getattr(backend, 'widgets', {})
}
if hasattr(backend, 'field_order'):
result['field_order'] = backend.field_order
return result
def get_instance_extra_data(self):
return {'backend_path': self.kwargs['class_path']}
class UserMailingDeleteView(SingleObjectDeleteView):
model = UserMailer
object_permission = permission_user_mailer_delete
post_action_redirect = reverse_lazy(viewname='mailer:user_mailer_list')
def get_extra_context(self):
return {
'title': _('Delete mailing profile: %s') % self.get_object(),
}
class UserMailingEditView(SingleObjectDynamicFormEditView):
form_class = UserMailerDynamicForm
model = UserMailer
object_permission = permission_user_mailer_edit
def get_extra_context(self):
return {
'title': _('Edit mailing profile: %s') % self.get_object(),
}
def get_form_schema(self):
backend = self.get_object().get_backend()
result = {
'fields': backend.fields,
'widgets': getattr(backend, 'widgets', {})
}
if hasattr(backend, 'field_order'):
result['field_order'] = backend.field_order
return result
class UserMailerLogEntryListView(SingleObjectListView):
model = LogEntry
view_permission = permission_user_mailer_view
def get_extra_context(self):
return {
'hide_object': True,
'object': self.get_user_mailer(),
'title': _('%s error log') % self.get_user_mailer(),
}
def get_source_queryset(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'])
class UserMailerListView(SingleObjectListView):
model = UserMailer
object_permission = permission_user_mailer_view
def get_extra_context(self):
return {
'hide_object': True,
'no_results_icon': icon_user_mailer_setup,
'no_results_main_link': link_user_mailer_create.resolve(
context=RequestContext(request=self.request)
),
'no_results_text': _(
'Mailing profiles are email configurations. '
'Mailing profiles allow sending documents as attachments or as '
'links via email.'
),
'no_results_title': _('No mailing profiles available'),
'title': _('Mailing profile'),
}
def get_form_schema(self):
return {'fields': self.get_backend().fields}
class UserMailerTestView(FormView):
form_class = UserMailerTestForm
object_permission = permission_user_mailer_edit
def form_valid(self, form):
self.get_object().test(to=form.cleaned_data['email'])
return super(UserMailerTestView, self).form_valid(form=form)
def get_extra_context(self):
return {
'hide_object': True,
'object': self.get_object(),
'submit_label': _('Test'),
'title': _('Test mailing profile: %s') % self.get_object(),
}
def get_object(self):
user_mailer = get_object_or_404(klass=UserMailer, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
obj=user_mailer, permissions=(permission_user_mailer_use,),
user=self.request.user
)
return user_mailer