Files
django-dav-events/dav_events/emails.py

154 lines
4.8 KiB
Python

# -*- coding: utf-8 -*-
import logging
from django.apps import apps
from django.core.exceptions import ImproperlyConfigured
from django.core.mail import EmailMessage
from django.template.loader import get_template
from .utils import get_users_by_role
app_config = apps.get_containing_app_config(__package__)
logger = logging.getLogger(__name__)
def get_recipients(task, sport=None):
users = []
if task == 'accept':
role = 'manage_all'
users += get_users_by_role(role)
if sport:
role = 'manage_{}'.format(sport.lower())
users += get_users_by_role(role)
elif task == 'publish':
role = 'incremental_publisher'
users += get_users_by_role(role)
else:
raise ValueError('utils.get_recipients(): invalid value for task')
return [u'{name} <{addr}>'.format(name=u.get_full_name(), addr=u.email) for u in users]
class AbstractMail(object):
_sender = app_config.settings.email_sender
_subject = 'Generic Mail'
_template_name = None
def _get_subject(self, **kwargs):
return self._subject.format(**kwargs)
def _get_template(self):
if not self._template_name:
raise ImproperlyConfigured('%s._template_name ist not set.', self.__class__.__name__)
return get_template(self._template_name)
def _get_context_data(self, extra_context=None):
context = {
'base_url': app_config.settings.email_base_url,
}
if extra_context:
context.update(extra_context)
return context
def _get_body(self, context=None):
template = self._get_template()
context = self._get_context_data(extra_context=context)
return template.render(context)
def _get_recipients(self):
raise NotImplementedError()
def send(self):
if not app_config.settings.enable_email_notifications:
return None
subject = self._get_subject()
body = self._get_body()
sender = self._sender
recipients = self._get_recipients()
emo = EmailMessage(subject=subject, body=body, from_email=sender, to=recipients)
logger.info(u'Send %s to %s', self.__class__.__name__, recipients)
emo.send()
class AbstractEventMail(AbstractMail):
_subject = u'[DAV Veranstaltungen]'
_template_name = 'dav_events/emails/default.txt'
def __init__(self, recipient, event):
self._recipient = recipient
self._event = event
def _get_recipients(self):
r = u'"{fullname}" <{email}>'.format(fullname=self._recipient.get_full_name(),
email=self._recipient.email)
return [r]
def _get_context_data(self, extra_context=None):
context = super(AbstractEventMail, self)._get_context_data(extra_context=extra_context)
context.update({
'recipient': self._recipient,
})
context.update(self._event.get_template_context())
return context
class NewEventMail(AbstractEventMail):
_template_name = 'dav_events/emails/new_event.txt'
def _get_subject(self, **kwargs):
s = super(NewEventMail, self)._get_subject(**kwargs)
s += u' Neue Veranstaltung angelegt'
return s
class EventToAcceptMail(AbstractEventMail):
_template_name = 'dav_events/emails/event_to_accept.txt'
def _get_subject(self, **kwargs):
s = super(EventToAcceptMail, self)._get_subject(**kwargs)
s += u' Neue Veranstaltung freigeben'
return s
class EventAcceptedMail(AbstractEventMail):
_template_name = 'dav_events/emails/event_accepted.txt'
def _get_subject(self, **kwargs):
s = super(EventAcceptedMail, self)._get_subject(**kwargs)
s += u' Veranstaltung wurde freigegeben'
return s
class EventToPublishMail(AbstractEventMail):
_template_name = 'dav_events/emails/event_to_publish.txt'
def _get_subject(self, **kwargs):
s = super(EventToPublishMail, self)._get_subject(**kwargs)
s += u' Veranstaltung veröffentlichen'
return s
class PasswordSetEmail(AbstractMail):
_subject = u'[DAV Veranstaltungen] Zugangsdaten'
_template_name = 'dav_events/emails/password_set.txt'
def __init__(self, user, password):
self._user = user
self._password = password
def _get_recipients(self):
r = u'{fullname} <{email}>'.format(fullname=self._user.get_full_name(),
email=self._user.email)
return [r]
def _get_context_data(self, extra_context=None):
context = super(PasswordSetEmail, self)._get_context_data(extra_context=extra_context)
context.update({
'fullname': self._user.get_full_name(),
'username': self._user.username,
'password': self._password
})
return context