diff --git a/mayan/apps/mailer/admin.py b/mayan/apps/mailer/admin.py new file mode 100644 index 0000000000..f587f6664f --- /dev/null +++ b/mayan/apps/mailer/admin.py @@ -0,0 +1,14 @@ +from __future__ import unicode_literals + +from django.contrib import admin + +from .models import LogEntry + + +class LogEntryAdmin(admin.ModelAdmin): + date_hierarchy = 'datetime' + list_display = ('datetime', 'message') + readonly_fields = ('datetime', 'message') + + +admin.site.register(LogEntry, LogEntryAdmin) diff --git a/mayan/apps/mailer/apps.py b/mayan/apps/mailer/apps.py index 4f11d91f84..64575a074b 100644 --- a/mayan/apps/mailer/apps.py +++ b/mayan/apps/mailer/apps.py @@ -5,11 +5,16 @@ from kombu import Exchange, Queue from django.utils.translation import ugettext_lazy as _ from acls import ModelPermission -from common import MayanAppConfig, menu_object +from common import MayanAppConfig, menu_object, menu_tools from documents.models import Document from mayan.celery import app +from navigation import SourceColumn -from .links import link_send_document_link, link_send_document +from .links import ( + link_document_mailing_error_log, link_send_document_link, + link_send_document +) +from .models import LogEntry from .permissions import ( permission_mailing_link, permission_mailing_send_document ) @@ -22,6 +27,18 @@ class MailerApp(MayanAppConfig): def ready(self): super(MailerApp, self).ready() + SourceColumn( + source=LogEntry, + label='Date and time', + attribute='datetime' + ) + + SourceColumn( + source=LogEntry, + label='Message', + attribute='message' + ) + ModelPermission.register( model=Document, permissions=( permission_mailing_link, permission_mailing_send_document @@ -45,3 +62,5 @@ class MailerApp(MayanAppConfig): link_send_document_link, link_send_document ), sources=(Document,) ) + + menu_tools.bind_links(links=(link_document_mailing_error_log,)) diff --git a/mayan/apps/mailer/links.py b/mayan/apps/mailer/links.py index e104541da2..ebafcd33f0 100644 --- a/mayan/apps/mailer/links.py +++ b/mayan/apps/mailer/links.py @@ -5,7 +5,8 @@ from django.utils.translation import ugettext_lazy as _ from navigation import Link from .permissions import ( - permission_mailing_link, permission_mailing_send_document + permission_mailing_link, permission_mailing_send_document, + permission_view_error_log ) link_send_document = Link( @@ -16,3 +17,7 @@ link_send_document_link = Link( permissions=(permission_mailing_link,), text=_('Email link'), view='mailer:send_document_link', args='object.pk' ) +link_document_mailing_error_log = Link( + icon='fa fa-envelope', permissions=(permission_view_error_log,), + text=_('Document mailing error log'), view='mailer:error_log', +) diff --git a/mayan/apps/mailer/literals.py b/mayan/apps/mailer/literals.py index 20f47eaafb..9f703ec3f6 100644 --- a/mayan/apps/mailer/literals.py +++ b/mayan/apps/mailer/literals.py @@ -5,18 +5,18 @@ from django.utils.translation import ugettext_lazy as _ DEFAULT_DOCUMENT_BODY_TEMPLATE = _( - 'Attached to this email is the document: {{ document }}

\n\n\ - --------
\nThis email has been sent from \ - %(project_title)s (%(project_website)s)' + 'Attached to this email is the document: {{ document }}\n\n ' + '--------\n ' + 'This email has been sent from %(project_title)s (%(project_website)s)' ) % { 'project_title': settings.PROJECT_TITLE, 'project_website': settings.PROJECT_WEBSITE } DEFAULT_LINK_BODY_TEMPLATE = _( - 'To access this document click on the following link: \ - {{ link }}

\n\n--------
\ - \nThis email has been sent from %(project_title)s (%(project_website)s)' + '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)' ) % { 'project_title': settings.PROJECT_TITLE, 'project_website': settings.PROJECT_WEBSITE diff --git a/mayan/apps/mailer/migrations/0001_initial.py b/mayan/apps/mailer/migrations/0001_initial.py new file mode 100644 index 0000000000..8de31592a6 --- /dev/null +++ b/mayan/apps/mailer/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='LogEntry', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date time')), + ('message', models.TextField(verbose_name='Message', editable=False, blank=True)), + ], + options={ + 'ordering': ('-datetime',), + 'get_latest_by': 'datetime', + 'verbose_name': 'Log entry', + 'verbose_name_plural': 'Log entries', + }, + bases=(models.Model,), + ), + ] diff --git a/mayan/apps/mailer/migrations/__init__.py b/mayan/apps/mailer/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mayan/apps/mailer/models.py b/mayan/apps/mailer/models.py new file mode 100644 index 0000000000..668bb7d096 --- /dev/null +++ b/mayan/apps/mailer/models.py @@ -0,0 +1,27 @@ +from __future__ import unicode_literals + +import logging + +from django.db import models +from django.utils.encoding import python_2_unicode_compatible +from django.utils.translation import ugettext_lazy as _ + +from djcelery.models import PeriodicTask, IntervalSchedule +from documents.models import Document + +logger = logging.getLogger(__name__) + + +class LogEntry(models.Model): + datetime = models.DateTimeField( + auto_now_add=True, editable=False, verbose_name=_('Date time') + ) + message = models.TextField( + blank=True, editable=False, verbose_name=_('Message') + ) + + class Meta: + get_latest_by = 'datetime' + ordering = ('-datetime',) + verbose_name = _('Log entry') + verbose_name_plural = _('Log entries') diff --git a/mayan/apps/mailer/permissions.py b/mayan/apps/mailer/permissions.py index 4108257d40..b1f880dd8f 100644 --- a/mayan/apps/mailer/permissions.py +++ b/mayan/apps/mailer/permissions.py @@ -12,3 +12,6 @@ permission_mailing_link = namespace.add_permission( permission_mailing_send_document = namespace.add_permission( name='mail_document', label=_('Send document via email') ) +permission_view_error_log = namespace.add_permission( + name='view_error_log', label=_('View document mailing error log') +) diff --git a/mayan/apps/mailer/settings.py b/mayan/apps/mailer/settings.py index 24dabbb3d1..3d30d33293 100644 --- a/mayan/apps/mailer/settings.py +++ b/mayan/apps/mailer/settings.py @@ -8,8 +8,8 @@ from .literals import ( DEFAULT_DOCUMENT_BODY_TEMPLATE, DEFAULT_LINK_BODY_TEMPLATE ) - namespace = Namespace(name='mailer', label=_('Mailing')) + setting_link_subject_template = namespace.add_setting( default=_('Link for document: {{ document }}'), help_text=_('Template for the document link email form subject line.'), diff --git a/mayan/apps/mailer/tasks.py b/mayan/apps/mailer/tasks.py index 5d3fd51ae4..3d3a6be639 100644 --- a/mayan/apps/mailer/tasks.py +++ b/mayan/apps/mailer/tasks.py @@ -1,8 +1,12 @@ +from __future__ import unicode_literals + from django.core.mail import EmailMultiAlternatives from documents.models import Document from mayan.celery import app +from .models import LogEntry + @app.task(ignore_result=True) def task_send_document(subject_text, body_text_content, sender, recipient, document_id, as_attachment=False): @@ -17,4 +21,9 @@ def task_send_document(subject_text, body_text_content, sender, recipient, docum document.label, descriptor.read(), document.file_mimetype ) - email_msg.send() + try: + email_msg.send() + except Exception as exception: + LogEntry.objects.create(message=exception) + else: + LogEntry.objects.all().delete() diff --git a/mayan/apps/mailer/urls.py b/mayan/apps/mailer/urls.py index 2ecdd4817b..c32833bfac 100644 --- a/mayan/apps/mailer/urls.py +++ b/mayan/apps/mailer/urls.py @@ -2,6 +2,8 @@ from __future__ import unicode_literals from django.conf.urls import patterns, url +from .views import LogEntryListView + urlpatterns = patterns( 'mailer.views', url( @@ -10,6 +12,9 @@ urlpatterns = patterns( ), url( r'^(?P\d+)/send/document/$', 'send_document_link', - {'as_attachment': True}, 'send_document' + {'as_attachment': True}, name='send_document' + ), + url( + r'^log/$', LogEntryListView.as_view(), name='error_log' ), ) diff --git a/mayan/apps/mailer/views.py b/mayan/apps/mailer/views.py index db2b2a353c..594710ff35 100644 --- a/mayan/apps/mailer/views.py +++ b/mayan/apps/mailer/views.py @@ -12,16 +12,28 @@ from django.utils.html import strip_tags from django.utils.translation import ugettext_lazy as _ from acls.models import AccessControlList +from common.generics import SingleObjectListView from documents.models import Document from permissions import Permission from .forms import DocumentMailForm +from .models import LogEntry from .permissions import ( - permission_mailing_link, permission_mailing_send_document + permission_mailing_link, permission_mailing_send_document, + permission_view_error_log ) from .tasks import task_send_document +class LogEntryListView(SingleObjectListView): + extra_context = { + 'hide_object': True, + 'title': _('Document mailing error log'), + } + model = LogEntry + view_permission = permission_view_error_log + + def send_document_link(request, document_id=None, document_id_list=None, as_attachment=False): if document_id: documents = [get_object_or_404(Document, pk=document_id)]