Files
mayan-edms/mayan/apps/mailer/views.py
Roberto Rosario 8e69178e07 Project: Switch to full app paths
Instead of inserting the path of the apps into the Python app,
the apps are now referenced by their full import path.

This app name claves with external or native Python libraries.
Example: Mayan statistics app vs. Python new statistics library.

Every app reference is now prepended with 'mayan.apps'.

Existing config.yml files need to be updated manually.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2018-12-05 02:04:20 -04:00

280 lines
8.8 KiB
Python

from __future__ import absolute_import, unicode_literals
from django.contrib import messages
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.get_queryset()
result = {
'submit_icon_class': icon_mail_document_submit,
'submit_label': _('Send'),
'title': ungettext(
self.title,
self.title_plural,
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(
permissions=permission_user_mailer_use, user=self.request.user,
obj=form.cleaned_data['user_mailer']
)
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(
reverse('mailer:user_mailer_create', args=(backend,),)
)
class UserMailingCreateView(SingleObjectDynamicFormCreateView):
form_class = UserMailerDynamicForm
post_action_redirect = reverse_lazy('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('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': _('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(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 are used to send documents '
'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):
obj = self.get_object()
# Separate getting the object from executing the test method to avoid
# catching PermissionDenied exception.
try:
obj.test(to=form.cleaned_data['email'])
except Exception as exception:
messages.error(
self.request, _('Error sending test message; %s.') % exception
)
else:
messages.success(
self.request, _('Successfully sent test message.')
)
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(UserMailer, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permissions=permission_user_mailer_use, user=self.request.user,
obj=user_mailer
)
return user_mailer