Files
mayan-edms/mayan/apps/mailer/models.py
2018-04-10 17:54:43 -04:00

170 lines
5.2 KiB
Python

from __future__ import unicode_literals
import json
import logging
from django.contrib.sites.models import Site
from django.core import mail
from django.db import models
from django.template import Context, Template
from django.utils.html import strip_tags
from django.utils.module_loading import import_string
from django.utils.translation import ugettext_lazy as _
from .utils import split_recipient_list
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')
class UserMailer(models.Model):
label = models.CharField(
max_length=128, unique=True, verbose_name=_('Label')
)
default = models.BooleanField(
default=True, help_text=_(
'If default, this mailing profile will be pre-selected on the '
'document mailing form.'
), verbose_name=_('Default')
)
enabled = models.BooleanField(default=True, verbose_name=_('Enabled'))
backend_path = models.CharField(
max_length=128,
help_text=_('The dotted Python path to the backend class.'),
verbose_name=_('Backend path')
)
backend_data = models.TextField(
blank=True, verbose_name=_('Backend data')
)
class Meta:
ordering = ('label',)
verbose_name = _('User mailer')
verbose_name_plural = _('User mailers')
def __str__(self):
return self.label
def backend_label(self):
return self.get_backend().label
def dumps(self, data):
self.backend_data = json.dumps(data)
self.save()
def get_backend(self):
return import_string(self.backend_path)
def get_connection(self):
return mail.get_connection(
backend=self.get_backend().class_path, **self.loads()
)
def loads(self):
return json.loads(self.backend_data)
def save(self, *args, **kwargs):
if self.default:
UserMailer.objects.select_for_update().exclude(pk=self.pk).update(
default=False
)
return super(UserMailer, self).save(*args, **kwargs)
def send(self, to, subject='', body='', attachments=None):
"""
Send a simple email. There is no document or template knowledge.
attachments is a list of dictionaries with the keys:
filename, content, and mimetype.
"""
recipient_list = split_recipient_list(recipients=[to])
with self.get_connection() as connection:
email_message = mail.EmailMultiAlternatives(
body=strip_tags(body), connection=connection, subject=subject,
to=recipient_list,
)
for attachment in attachments or []:
email_message.attach(
filename=attachment['filename'],
content=attachment['content'],
mimetype=attachment['mimetype']
)
email_message.attach_alternative(body, 'text/html')
try:
email_message.send()
except Exception as exception:
self.error_log.create(message=exception)
else:
self.error_log.all().delete()
def send_document(self, document, to, subject='', body='', as_attachment=False):
context_dictionary = {
'link': 'http://%s%s' % (
Site.objects.get_current().domain,
document.get_absolute_url()
),
'document': document
}
context = Context(context_dictionary)
body_template = Template(body)
body_html_content = body_template.render(context)
subject_template = Template(subject)
subject_text = strip_tags(subject_template.render(context))
attachments = []
if as_attachment:
with document.open() as file_object:
attachments.append(
{
'filename': document.label, 'content': file_object.read(),
'mimetype': document.file_mimetype
}
)
return self.send(
subject=subject_text, body=body_html_content, to=to, attachments=attachments
)
def test(self, to):
self.send(subject=_('Test email from Mayan EDMS'), to=to)
class UserMailerLogEntry(models.Model):
user_mailer = models.ForeignKey(
on_delete=models.CASCADE, related_name='error_log', to=UserMailer,
verbose_name=_('User mailer')
)
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 = _('User mailer log entry')
verbose_name_plural = _('User mailer log entries')