# -*- 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 logger = logging.getLogger(__name__) class AbstractMail(object): _subject = u'' _template_name = None def _get_sender(self): app_config = apps.get_containing_app_config(__package__) return app_config.settings.email_sender def _get_subject(self, **kwargs): s = self._subject app_config = apps.get_containing_app_config(__package__) if app_config.settings.email_subject_prefix: s = u'%s %s' % (app_config.settings.email_subject_prefix, s) s = s.format(**kwargs) return s 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): app_config = apps.get_containing_app_config(__package__) 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): subject = self._get_subject() body = self._get_body() sender = self._get_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): _template_name = 'dav_events/emails/default.txt' def __init__(self, recipient, event): self._recipient = recipient self._event = event def _get_subject(self, **kwargs): if 'number' not in kwargs: kwargs['number'] = self._event.get_number() s = super(AbstractEventMail, self)._get_subject(**kwargs) return s 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['recipient'] = self._recipient context.update(self._event.get_template_context()) return context class EventUpdatedMail(AbstractEventMail): _subject = u'{number}: Veranstaltung geändert' _template_name = 'dav_events/emails/event_updated.txt' def __init__(self, diff=None, editor=None, *args, **kwargs): self._diff = diff self._editor = editor super(EventUpdatedMail, self).__init__(*args, **kwargs) def _get_context_data(self, extra_context=None): context = super(EventUpdatedMail, self)._get_context_data(extra_context=extra_context) context['diff'] = self._diff context['editor'] = self._editor.get_full_name() return context class EventSubmittedMail(AbstractEventMail): _template_name = 'dav_events/emails/event_submitted.txt' def _get_subject(self, **kwargs): s = super(EventSubmittedMail, self)._get_subject(**kwargs) s += u'Neue Veranstaltung eingereicht' return s class EventToAcceptMail(AbstractEventMail): _template_name = 'dav_events/emails/event_to_accept.txt' def __init__(self, accept_action=None, *args, **kwargs): self._accept_action = accept_action super(EventToAcceptMail, self).__init__(*args, **kwargs) def _get_context_data(self, extra_context=None): context = super(EventToAcceptMail, self)._get_context_data(extra_context=extra_context) context['accept_url'] = self._accept_action.get_absolute_url() return context 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 __init__(self, confirm_publication_action=None, *args, **kwargs): self._confirm_publication_action = confirm_publication_action super(EventToPublishMail, self).__init__(*args, **kwargs) def _get_context_data(self, extra_context=None): context = super(EventToPublishMail, self)._get_context_data(extra_context=extra_context) context['confirm_publication_url'] = self._confirm_publication_action.get_absolute_url() return context def _get_subject(self, **kwargs): s = super(EventToPublishMail, self)._get_subject(**kwargs) s += u'Veranstaltung veröffentlichen' return s class PasswordSetEmail(AbstractMail): _subject = u'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