From 2d3f8fafe93586f69ea1c388449c691b925609c5 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sun, 4 Mar 2012 19:19:51 -0400 Subject: [PATCH 1/4] Add document link mailing app --- apps/mailer/__init__.py | 17 ++++++++ apps/mailer/forms.py | 8 ++++ apps/mailer/models.py | 3 ++ apps/mailer/permissions.py | 9 ++++ apps/mailer/urls.py | 5 +++ apps/mailer/views.py | 85 ++++++++++++++++++++++++++++++++++++++ settings.py | 1 + urls.py | 1 + 8 files changed, 129 insertions(+) create mode 100644 apps/mailer/__init__.py create mode 100644 apps/mailer/forms.py create mode 100644 apps/mailer/models.py create mode 100644 apps/mailer/permissions.py create mode 100644 apps/mailer/urls.py create mode 100644 apps/mailer/views.py diff --git a/apps/mailer/__init__.py b/apps/mailer/__init__.py new file mode 100644 index 0000000000..dad1e45fd5 --- /dev/null +++ b/apps/mailer/__init__.py @@ -0,0 +1,17 @@ +from __future__ import absolute_import + +from django.utils.translation import ugettext_lazy as _ + +from navigation.api import register_links +from documents.models import Document +from acls.api import class_permissions + +from .permissions import PERMISSION_MAILING_LINK + +send_document_link = {'text': _(u'email link'), 'view': 'send_document_link', 'args': 'object.pk', 'famfam': 'email_link', 'permissions': [PERMISSION_MAILING_LINK]} + +register_links(Document, [send_document_link]) + +class_permissions(Document, [ + PERMISSION_MAILING_LINK, +]) diff --git a/apps/mailer/forms.py b/apps/mailer/forms.py new file mode 100644 index 0000000000..38235e241f --- /dev/null +++ b/apps/mailer/forms.py @@ -0,0 +1,8 @@ +from django import forms +from django.utils.translation import ugettext as _ + + +class DocumentMailForm(forms.Form): + email = forms.EmailField(label=_(u'Email address')) + subject = forms.CharField(label=_(u'Subject'), required=False, initial=_(u'Link for document: {{ document }}')) + body = forms.CharField(label=_(u'Body'), widget=forms.widgets.Textarea(), required=False, initial=_(u'To access this document click on the following link: {{ link }}')) diff --git a/apps/mailer/models.py b/apps/mailer/models.py new file mode 100644 index 0000000000..71a8362390 --- /dev/null +++ b/apps/mailer/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/apps/mailer/permissions.py b/apps/mailer/permissions.py new file mode 100644 index 0000000000..4879902311 --- /dev/null +++ b/apps/mailer/permissions.py @@ -0,0 +1,9 @@ +from __future__ import absolute_import + +from django.utils.translation import ugettext_lazy as _ + +from permissions.models import PermissionNamespace, Permission + +mailer_namespace = PermissionNamespace('mailing', _(u'Mailing')) + +PERMISSION_MAILING_LINK = Permission.objects.register(mailer_namespace, 'mail_link', _(u'Send document link via email')) diff --git a/apps/mailer/urls.py b/apps/mailer/urls.py new file mode 100644 index 0000000000..469a2f5da3 --- /dev/null +++ b/apps/mailer/urls.py @@ -0,0 +1,5 @@ +from django.conf.urls.defaults import patterns, url + +urlpatterns = patterns('mailer.views', + url(r'^(?P\d+)/send/link/$', 'send_document_link', (), 'send_document_link'), +) diff --git a/apps/mailer/views.py b/apps/mailer/views.py new file mode 100644 index 0000000000..1ea408cf94 --- /dev/null +++ b/apps/mailer/views.py @@ -0,0 +1,85 @@ +from __future__ import absolute_import + +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.utils.translation import ugettext_lazy as _ +from django.shortcuts import get_object_or_404 +from django.contrib import messages +from django.http import HttpResponseRedirect +from django.core.urlresolvers import reverse +from django.core.exceptions import PermissionDenied +from django.core.mail import EmailMultiAlternatives +from django.utils.html import strip_tags +from django.template import Context, Template +from django.contrib.sites.models import Site + +from documents.models import Document, RecentDocument +from permissions.models import Permission +from acls.models import AccessEntry + +from .permissions import PERMISSION_MAILING_LINK +from .forms import DocumentMailForm + + +def send_document_link(request, document_id=None, document_id_list=None): + if document_id: + documents = [get_object_or_404(Document, pk=document_id)] + elif document_id_list: + documents = [get_object_or_404(Document, pk=document_id) for document_id in document_id_list.split(',')] + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_MAILING_LINK]) + except PermissionDenied: + documents = AccessEntry.objects.filter_objects_by_access(PERMISSION_MAILING_LINK, request.user, documents) + + if not documents: + messages.error(request, _(u'Must provide at least one document.')) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + + post_action_redirect = reverse('document_list_recent') + + next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', post_action_redirect))) + + for document in documents: + RecentDocument.objects.add_document_for_user(request.user, document) + + if request.method == 'POST': + form = DocumentMailForm(request.POST) + if form.is_valid(): + context = Context({ + 'link': 'http://%s%s' % (Site.objects.get_current().domain, reverse('document_view_simple', args=[document.pk])), + 'document': document + }) + body_template = Template(form.cleaned_data['body']) + body_html_content = body_template.render(context) + body_text_content = strip_tags(body_html_content) + + subject_template = Template(form.cleaned_data['subject']) + subject_text = strip_tags(subject_template.render(context)) + + email_msg = EmailMultiAlternatives(subject_text, body_text_content, request.user.email, [form.cleaned_data['email']]) + email_msg.attach_alternative(body_html_content, 'text/html') + try: + email_msg.send() + except Exception, exc: + messages.error(request, _(u'Error sending document link for document %(document)s; %(error)s.') % { + 'document': document, 'error': exc}) + else: + messages.success(request, _(u'Successfully sent document link via email.')) + return HttpResponseRedirect(next) + else: + form = DocumentMailForm() + + context = { + 'form': form, + 'next': next, + 'submit_label': _(u'send'), + } + if len(documents) == 1: + context['object'] = documents[0] + context['title'] = _(u'Email link for document: %s') % ', '.join([unicode(d) for d in documents]) + elif len(documents) > 1: + context['title'] = _(u'Email links for documents: %s') % ', '.join([unicode(d) for d in documents]) + + return render_to_response('generic_form.html', context, + context_instance=RequestContext(request)) diff --git a/settings.py b/settings.py index a0da8da709..c6894408c2 100644 --- a/settings.py +++ b/settings.py @@ -165,6 +165,7 @@ INSTALLED_APPS = ( 'document_comments', 'metadata', 'documents', + 'mailer', 'linking', 'document_indexing', 'document_acls', diff --git a/urls.py b/urls.py index a6ae677f51..ee1f199449 100644 --- a/urls.py +++ b/urls.py @@ -32,6 +32,7 @@ urlpatterns = patterns('', (r'^gpg/', include('django_gpg.urls')), (r'^documents/signatures/', include('document_signatures.urls')), (r'^feedback/', include('feedback.urls')), + (r'^mailer/', include('mailer.urls')), ) From ab9dee0a56a08d5b7bfd56da0e18db84684fb7c0 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 5 Mar 2012 01:23:19 -0400 Subject: [PATCH 2/4] Add configurable default email templates --- apps/mailer/conf/__init__.py | 0 apps/mailer/conf/settings.py | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 apps/mailer/conf/__init__.py create mode 100644 apps/mailer/conf/settings.py diff --git a/apps/mailer/conf/__init__.py b/apps/mailer/conf/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/mailer/conf/settings.py b/apps/mailer/conf/settings.py new file mode 100644 index 0000000000..257f2d057d --- /dev/null +++ b/apps/mailer/conf/settings.py @@ -0,0 +1,18 @@ +"""Configuration options for the mailer app""" + +from django.utils.translation import ugettext_lazy as _ + +from smart_settings.api import register_settings + +register_settings( + namespace=u'mailer', + module=u'mailer.conf.settings', + settings=[ + # Links + {'name': u'LINK_SUBJECT_TEMPLATE', 'global_name': u'MAILER_LINK_SUBJECT_TEMPLATE', 'default': 'Link for document: {{ document }}', 'description': _(u'Template for the document link email form subject line.')}, + {'name': u'LINK_BODY_TEMPLATE', 'global_name': u'MAILER_LINK_BODY_TEMPLATE', 'default': 'To access this document click on the following link: {{ link }}

\n\n--------
\nThis email has been sent from Mayan EDMS (http://www.mayan-edms.com)', 'description': _(u'Template for the document link email form body line.')}, + # Attachment + {'name': u'DOCUMENT_SUBJECT_TEMPLATE', 'global_name': u'MAILER_DOCUMENT_SUBJECT_TEMPLATE', 'default': 'Document: {{ document }}', 'description': _(u'Template for the document email form subject line.')}, + {'name': u'DOCUMENT_BODY_TEMPLATE', 'global_name': u'MAILER_DOCUMENT_BODY_TEMPLATE', 'default': 'Attached to this email is the document: {{ document }}

\n\n--------
\nThis email has been sent from Mayan EDMS (http://www.mayan-edms.com)', 'description': _(u'Template for the document email form body line.')}, + ] +) From 7cd651638acf8837d3a4acc00d67adece7f92701 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 5 Mar 2012 01:23:43 -0400 Subject: [PATCH 3/4] Add document attachment sending support --- apps/mailer/__init__.py | 6 +++-- apps/mailer/forms.py | 19 +++++++++++++-- apps/mailer/permissions.py | 1 + apps/mailer/urls.py | 1 + apps/mailer/views.py | 49 ++++++++++++++++++++++++++++---------- 5 files changed, 60 insertions(+), 16 deletions(-) diff --git a/apps/mailer/__init__.py b/apps/mailer/__init__.py index dad1e45fd5..5d6e967d51 100644 --- a/apps/mailer/__init__.py +++ b/apps/mailer/__init__.py @@ -6,12 +6,14 @@ from navigation.api import register_links from documents.models import Document from acls.api import class_permissions -from .permissions import PERMISSION_MAILING_LINK +from .permissions import PERMISSION_MAILING_LINK, PERMISSION_MAILING_SEND_DOCUMENT send_document_link = {'text': _(u'email link'), 'view': 'send_document_link', 'args': 'object.pk', 'famfam': 'email_link', 'permissions': [PERMISSION_MAILING_LINK]} +send_document = {'text': _(u'email document'), 'view': 'send_document', 'args': 'object.pk', 'famfam': 'email_open', 'permissions': [PERMISSION_MAILING_SEND_DOCUMENT]} -register_links(Document, [send_document_link]) +register_links(Document, [send_document_link, send_document]) class_permissions(Document, [ PERMISSION_MAILING_LINK, + PERMISSION_MAILING_SEND_DOCUMENT ]) diff --git a/apps/mailer/forms.py b/apps/mailer/forms.py index 38235e241f..35253f5f91 100644 --- a/apps/mailer/forms.py +++ b/apps/mailer/forms.py @@ -1,8 +1,23 @@ +from __future__ import absolute_import + from django import forms from django.utils.translation import ugettext as _ +from .conf import settings + class DocumentMailForm(forms.Form): + def __init__(self, *args, **kwargs): + as_attachment = kwargs.pop('as_attachment', False) + super(DocumentMailForm, self).__init__(*args, **kwargs) + if as_attachment: + self.fields['subject'].initial = settings.DOCUMENT_SUBJECT_TEMPLATE + self.fields['body'].initial = settings.DOCUMENT_BODY_TEMPLATE + else: + self.fields['subject'].initial = settings.LINK_SUBJECT_TEMPLATE + self.fields['body'].initial = settings.LINK_BODY_TEMPLATE + + email = forms.EmailField(label=_(u'Email address')) - subject = forms.CharField(label=_(u'Subject'), required=False, initial=_(u'Link for document: {{ document }}')) - body = forms.CharField(label=_(u'Body'), widget=forms.widgets.Textarea(), required=False, initial=_(u'To access this document click on the following link: {{ link }}')) + subject = forms.CharField(label=_(u'Subject'), required=False)#, initial=_(u'Link for document: {{ document }}')) + body = forms.CharField(label=_(u'Body'), widget=forms.widgets.Textarea(), required=False)#, initial=_(u'To access this document click on the following link: {{ link }}')) diff --git a/apps/mailer/permissions.py b/apps/mailer/permissions.py index 4879902311..1da56812dc 100644 --- a/apps/mailer/permissions.py +++ b/apps/mailer/permissions.py @@ -7,3 +7,4 @@ from permissions.models import PermissionNamespace, Permission mailer_namespace = PermissionNamespace('mailing', _(u'Mailing')) PERMISSION_MAILING_LINK = Permission.objects.register(mailer_namespace, 'mail_link', _(u'Send document link via email')) +PERMISSION_MAILING_SEND_DOCUMENT = Permission.objects.register(mailer_namespace, 'mail_document', _(u'Send document via email')) diff --git a/apps/mailer/urls.py b/apps/mailer/urls.py index 469a2f5da3..9ffadfe687 100644 --- a/apps/mailer/urls.py +++ b/apps/mailer/urls.py @@ -2,4 +2,5 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('mailer.views', url(r'^(?P\d+)/send/link/$', 'send_document_link', (), 'send_document_link'), + url(r'^(?P\d+)/send/document/$', 'send_document_link', {'as_attachment': True}, 'send_document'), ) diff --git a/apps/mailer/views.py b/apps/mailer/views.py index 1ea408cf94..cb37720ee4 100644 --- a/apps/mailer/views.py +++ b/apps/mailer/views.py @@ -17,20 +17,25 @@ from documents.models import Document, RecentDocument from permissions.models import Permission from acls.models import AccessEntry -from .permissions import PERMISSION_MAILING_LINK +from .permissions import PERMISSION_MAILING_LINK, PERMISSION_MAILING_SEND_DOCUMENT from .forms import DocumentMailForm -def send_document_link(request, document_id=None, document_id_list=None): +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)] elif document_id_list: documents = [get_object_or_404(Document, pk=document_id) for document_id in document_id_list.split(',')] + if as_attachment: + permission = PERMISSION_MAILING_SEND_DOCUMENT + else: + permission = PERMISSION_MAILING_LINK + try: - Permission.objects.check_permissions(request.user, [PERMISSION_MAILING_LINK]) + Permission.objects.check_permissions(request.user, [permission]) except PermissionDenied: - documents = AccessEntry.objects.filter_objects_by_access(PERMISSION_MAILING_LINK, request.user, documents) + documents = AccessEntry.objects.filter_objects_by_access(permission, request.user, documents) if not documents: messages.error(request, _(u'Must provide at least one document.')) @@ -44,7 +49,7 @@ def send_document_link(request, document_id=None, document_id_list=None): RecentDocument.objects.add_document_for_user(request.user, document) if request.method == 'POST': - form = DocumentMailForm(request.POST) + form = DocumentMailForm(request.POST, as_attachment=as_attachment) if form.is_valid(): context = Context({ 'link': 'http://%s%s' % (Site.objects.get_current().domain, reverse('document_view_simple', args=[document.pk])), @@ -59,27 +64,47 @@ def send_document_link(request, document_id=None, document_id_list=None): email_msg = EmailMultiAlternatives(subject_text, body_text_content, request.user.email, [form.cleaned_data['email']]) email_msg.attach_alternative(body_html_content, 'text/html') + if as_attachment: + for document in documents: + descriptor = document.open() + email_msg.attach(document.filename, descriptor.read(), document.file_mimetype) + descriptor.close() + try: email_msg.send() except Exception, exc: - messages.error(request, _(u'Error sending document link for document %(document)s; %(error)s.') % { - 'document': document, 'error': exc}) + if as_attachment: + messages.error(request, _(u'Error sending document: %(document)s, via email; %(error)s.') % { + 'document': document, 'error': exc}) + else: + messages.error(request, _(u'Error sending document link for document %(document)s; %(error)s.') % { + 'document': document, 'error': exc}) + else: - messages.success(request, _(u'Successfully sent document link via email.')) + if as_attachment: + messages.success(request, _(u'Successfully sent document via email.')) + else: + messages.success(request, _(u'Successfully sent document link via email.')) return HttpResponseRedirect(next) else: - form = DocumentMailForm() + form = DocumentMailForm(as_attachment=as_attachment) context = { 'form': form, 'next': next, - 'submit_label': _(u'send'), + 'submit_label': _(u'Send'), } if len(documents) == 1: context['object'] = documents[0] - context['title'] = _(u'Email link for document: %s') % ', '.join([unicode(d) for d in documents]) + if as_attachment: + context['title'] = _(u'Email document: %s') % ', '.join([unicode(d) for d in documents]) + else: + context['title'] = _(u'Email link for document: %s') % ', '.join([unicode(d) for d in documents]) elif len(documents) > 1: - context['title'] = _(u'Email links for documents: %s') % ', '.join([unicode(d) for d in documents]) + if as_attachment: + context['title'] = _(u'Email documents: %s') % ', '.join([unicode(d) for d in documents]) + else: + context['title'] = _(u'Email links for documents: %s') % ', '.join([unicode(d) for d in documents]) return render_to_response('generic_form.html', context, context_instance=RequestContext(request)) From 406d0fd18391fa5275e3411403159473b17e443b Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 5 Mar 2012 01:31:17 -0400 Subject: [PATCH 4/4] Change the document and email submit link icon --- apps/mailer/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/mailer/views.py b/apps/mailer/views.py index cb37720ee4..69df01079b 100644 --- a/apps/mailer/views.py +++ b/apps/mailer/views.py @@ -93,6 +93,7 @@ def send_document_link(request, document_id=None, document_id_list=None, as_atta 'form': form, 'next': next, 'submit_label': _(u'Send'), + 'submit_icon_famfam': 'email_go' } if len(documents) == 1: context['object'] = documents[0]