269 lines
8.4 KiB
Python
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
|