diff --git a/input/management/commands/sendmails.py b/input/management/commands/sendmails.py index 15cac47..654d46a 100755 --- a/input/management/commands/sendmails.py +++ b/input/management/commands/sendmails.py @@ -2,13 +2,13 @@ from datetime import date, timedelta from django.core.management import CommandError from django.core.management.base import BaseCommand -from django.template.loader import get_template from django.core.mail import BadHeaderError -from django.core.mail import EmailMultiAlternatives from django.conf import settings from input.models import Project, Library, HonoraryCertificate, Travel, Email,\ BusinessCard, List, IFG, Literature +from input.utils.mail import send_email + class Command(BaseCommand): ''' mails will be sent here: @@ -34,15 +34,11 @@ class Command(BaseCommand): 'name': name, 'pid': pid, 'SURVEY_PREFIX': settings.SURVEY_PREFIX, } - txt_mail_template = get_template('input/survey_mail.txt') - html_mail_template = get_template('input/survey_mail.html') + + subject = 'Dein Feedback zur Förderung durch Wikimedia Deutschland' + try: - subject, from_email, to = 'Dein Feedback zur Förderung durch Wikimedia Deutschland', settings.IF_EMAIL, email - text_content = txt_mail_template.render(context) - html_content = html_mail_template.render(context) - msg = EmailMultiAlternatives(subject, text_content, from_email, [to], bcc=[settings.SURVEY_EMAIL]) - msg.attach_alternative(html_content, "text/html") - msg.send() + send_email('survey_mail', context, subject, email, bcc=[settings.SURVEY_EMAIL]) #print('survey mail would have been send') #survey_mail = EmailMessage('Dein Feedback zur Förderung durch Wikimedia Deutschland', @@ -70,21 +66,14 @@ class Command(BaseCommand): .exclude(end_mail_send = True)\ .filter(mail_state = 'NONE') - txt_mail_template = get_template('input/if_end_of_project.txt') - html_mail_template = get_template('input/if_end_of_project.html') - + subject = 'Projektende erreicht' + recipient = settings.IF_EMAIL for project in old: - context = {'project': project} - context['URL_PREFIX'] = settings.EMAIL_URL_PREFIX + context = {'project': project, 'URL_PREFIX': settings.EMAIL_URL_PREFIX} try: - subject, from_email, to = 'Projektende erreicht', settings.IF_EMAIL, settings.IF_EMAIL - text_content = txt_mail_template.render(context) - html_content = html_mail_template.render(context) - msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) - msg.attach_alternative(html_content, "text/html") - msg.send() + send_email('if_end_of_project', context, subject, recipient) #print('end of project mail would have been sent') #send_mail('Projektende erreicht', @@ -110,33 +99,19 @@ class Command(BaseCommand): approved_end = Project.objects.filter(status = 'END')\ .exclude(end_mail_send = True)\ .filter(mail_state = 'INF') - txt_mail_template = get_template('input/if_end_of_project_approved.txt') - html_mail_template = get_template('input/if_end_of_project_approved.html') - txt_informMail_template = get_template('input/if_end_of_project_orginformed.txt') - html_informMail_template = get_template('input/if_end_of_project_orginformed.html') # send the mail to project.email, which would be the mail of the volunteer filling out the form for project in approved_end: - context = {'project': project} - context['URL_PREFIX'] = settings.EMAIL_URL_PREFIX - + context = {'project': project, 'URL_PREFIX': settings.EMAIL_URL_PREFIX} try: - subject, from_email, to = 'Projektende erreicht', settings.IF_EMAIL, project.email - text_content = txt_mail_template.render(context) - html_content = html_mail_template.render(context) - msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) - msg.attach_alternative(html_content, "text/html") - msg.send() + send_email('if_end_of_project_approved', context, 'Projektende erreicht', project.email) + #print('if and of project approved mail would have been sent') - inform_subject, inform_from_email, inform_to = 'Projektorganisator*in wurde informiert', settings.IF_EMAIL, settings.IF_EMAIL - inform_text_content = txt_informMail_template.render(context) - inform_html_content = html_informMail_template.render(context) - inform_msg = EmailMultiAlternatives(inform_subject, inform_text_content, inform_from_email, [inform_to]) - inform_msg.attach_alternative(html_content, "text/html") - inform_msg.send() + send_email('if_end_of_project_orginformed', context, 'Projektorganisator*in wurde informiert', settings.IF_EMAIL) + #print('if end of project orginformed mail would have been sent') #send_mail('Projektende erreicht', @@ -168,25 +143,15 @@ class Command(BaseCommand): .exclude(end_mail_send = True)\ .filter(mail_state = 'INF') - html_mail_template = get_template('input/if_not_of_project_approved.html') - txt_mail_template = get_template('input/if_not_of_project_approved.txt') - - txt_informMail_template = get_template('input/if_end_of_project_orginformed.txt') - html_informMail_template = get_template('input/if_end_of_project_orginformed.html') # send the mail to project.email, which would be the mail of the volunteer that filled out the form for project in approved_notHappened: - context = {'project': project} - context['URL_PREFIX'] = settings.EMAIL_URL_PREFIX - try: - subject, from_email, to = 'Projektende erreicht', settings.IF_EMAIL, project.email - text_content = txt_mail_template.render(context) - html_content = html_mail_template.render(context) - msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) - msg.attach_alternative(html_content, "text/html") - msg.send() - #print('if not of project approved end mail would have been sent') + context = {'project': project, 'URL_PREFIX': settings.EMAIL_URL_PREFIX} + try: + send_email('if_not_of_project_approved', context, 'Projektende erreicht', project.email) + + #print('if not of project approved end mail would have been sent') #send_mail('Projektende erreicht', # mail_template.render(context), @@ -194,12 +159,8 @@ class Command(BaseCommand): # [project.email], # fail_silently=False) - inform_subject, inform_from_email, inform_to = 'Projektorganisator*in wurde informiert', settings.IF_EMAIL, settings.IF_EMAIL - inform_text_content = txt_informMail_template.render(context) - inform_html_content = html_informMail_template.render(context) - inform_msg = EmailMultiAlternatives(inform_subject, inform_text_content, inform_from_email, [inform_to]) - inform_msg.attach_alternative(html_content, "text/html") - inform_msg.send() + send_email('if_end_of_project_orginformed', context, 'Projektorganisator*in wurde informiert', settings.IF_EMAIL) + #print('if not of project approved end mail orginformed would have been sent') #send_mail('Projektorganisator*in wurde informiert', diff --git a/input/templates/input/approval_denied.html b/input/templates/mails/approval_denied.html similarity index 100% rename from input/templates/input/approval_denied.html rename to input/templates/mails/approval_denied.html diff --git a/input/templates/input/approval_denied.txt b/input/templates/mails/approval_denied.txt similarity index 100% rename from input/templates/input/approval_denied.txt rename to input/templates/mails/approval_denied.txt diff --git a/input/templates/input/approval_denied_staff.html b/input/templates/mails/approval_denied_staff.html similarity index 100% rename from input/templates/input/approval_denied_staff.html rename to input/templates/mails/approval_denied_staff.html diff --git a/input/templates/input/approval_denied_staff.txt b/input/templates/mails/approval_denied_staff.txt similarity index 100% rename from input/templates/input/approval_denied_staff.txt rename to input/templates/mails/approval_denied_staff.txt diff --git a/input/templates/input/approval_granted.html b/input/templates/mails/approval_granted.html similarity index 100% rename from input/templates/input/approval_granted.html rename to input/templates/mails/approval_granted.html diff --git a/input/templates/input/approval_granted.txt b/input/templates/mails/approval_granted.txt similarity index 100% rename from input/templates/input/approval_granted.txt rename to input/templates/mails/approval_granted.txt diff --git a/input/templates/input/approval_granted_staff.html b/input/templates/mails/approval_granted_staff.html similarity index 100% rename from input/templates/input/approval_granted_staff.html rename to input/templates/mails/approval_granted_staff.html diff --git a/input/templates/input/approval_granted_staff.txt b/input/templates/mails/approval_granted_staff.txt similarity index 100% rename from input/templates/input/approval_granted_staff.txt rename to input/templates/mails/approval_granted_staff.txt diff --git a/input/templates/input/if_end_of_project.html b/input/templates/mails/if_end_of_project.html similarity index 100% rename from input/templates/input/if_end_of_project.html rename to input/templates/mails/if_end_of_project.html diff --git a/input/templates/input/if_end_of_project.txt b/input/templates/mails/if_end_of_project.txt similarity index 100% rename from input/templates/input/if_end_of_project.txt rename to input/templates/mails/if_end_of_project.txt diff --git a/input/templates/input/if_end_of_project_approved.html b/input/templates/mails/if_end_of_project_approved.html similarity index 100% rename from input/templates/input/if_end_of_project_approved.html rename to input/templates/mails/if_end_of_project_approved.html diff --git a/input/templates/input/if_end_of_project_approved.txt b/input/templates/mails/if_end_of_project_approved.txt similarity index 100% rename from input/templates/input/if_end_of_project_approved.txt rename to input/templates/mails/if_end_of_project_approved.txt diff --git a/input/templates/input/if_end_of_project_orginformed.html b/input/templates/mails/if_end_of_project_orginformed.html similarity index 100% rename from input/templates/input/if_end_of_project_orginformed.html rename to input/templates/mails/if_end_of_project_orginformed.html diff --git a/input/templates/input/if_end_of_project_orginformed.txt b/input/templates/mails/if_end_of_project_orginformed.txt similarity index 100% rename from input/templates/input/if_end_of_project_orginformed.txt rename to input/templates/mails/if_end_of_project_orginformed.txt diff --git a/input/templates/input/if_mail.html b/input/templates/mails/if_mail.html similarity index 100% rename from input/templates/input/if_mail.html rename to input/templates/mails/if_mail.html diff --git a/input/templates/input/if_mail.txt b/input/templates/mails/if_mail.txt similarity index 100% rename from input/templates/input/if_mail.txt rename to input/templates/mails/if_mail.txt diff --git a/input/templates/input/if_not_of_project_approved.html b/input/templates/mails/if_not_of_project_approved.html similarity index 100% rename from input/templates/input/if_not_of_project_approved.html rename to input/templates/mails/if_not_of_project_approved.html diff --git a/input/templates/input/if_not_of_project_approved.txt b/input/templates/mails/if_not_of_project_approved.txt similarity index 100% rename from input/templates/input/if_not_of_project_approved.txt rename to input/templates/mails/if_not_of_project_approved.txt diff --git a/input/templates/input/ifg_volunteer_mail.html b/input/templates/mails/ifg_volunteer_mail.html similarity index 100% rename from input/templates/input/ifg_volunteer_mail.html rename to input/templates/mails/ifg_volunteer_mail.html diff --git a/input/templates/input/ifg_volunteer_mail.txt b/input/templates/mails/ifg_volunteer_mail.txt similarity index 100% rename from input/templates/input/ifg_volunteer_mail.txt rename to input/templates/mails/ifg_volunteer_mail.txt diff --git a/input/templates/input/survey_mail.html b/input/templates/mails/survey_mail.html similarity index 100% rename from input/templates/input/survey_mail.html rename to input/templates/mails/survey_mail.html diff --git a/input/templates/input/survey_mail.txt b/input/templates/mails/survey_mail.txt similarity index 100% rename from input/templates/input/survey_mail.txt rename to input/templates/mails/survey_mail.txt diff --git a/input/utils/mail/__init__.py b/input/utils/mail/__init__.py index 1a12737..25945ce 100644 --- a/input/utils/mail/__init__.py +++ b/input/utils/mail/__init__.py @@ -8,6 +8,8 @@ from input.models import TYPE_CHOICES from .attachments import collect_attachment_paths, attach_files __all__ = [ + 'build_email', + 'send_email', 'collect_attachment_paths', 'attach_files', 'send_decision_mail', @@ -15,6 +17,27 @@ __all__ = [ ] +def build_email(template_name: str, context: dict, subject: str, *recipients: str, **kwargs): + body = get_template(f'mails/{template_name}.txt').render(context) + html = get_template(f'mails/{template_name}.html').render(context) + + kwargs.setdefault('from_email', settings.IF_EMAIL) + + kwargs['subject'] = subject + kwargs['body'] = body + kwargs['to'] = recipients + + email = EmailMultiAlternatives(**kwargs) + + email.attach_alternative(html, 'text/html') + + return email + + +def send_email(template_name: str, context: dict, subject: str, *recipients: str, fail_silently=False, **kwargs): + return build_email(template_name, context, subject, *recipients, **kwargs).send(fail_silently) + + def _type_labels(choice: str): """ Resolve the human-readable type label. @@ -53,23 +76,13 @@ def send_decision_mail(obj, choice_code: str, granted: bool) -> None: return # no recipient -> skip ctx = _decision_context(obj, choice_code) - base = 'input/approval_granted' if granted else 'input/approval_denied' + template_suffix = 'granted' if granted else 'denied' project_name = getattr(obj, 'name', None) or '(ohne Projektnamen)' decision_word = 'bewilligt' if granted else 'abgelehnt' subject = f'Deine Förderanfrage „{project_name}“ – {decision_word}' - txt = get_template(f'{base}.txt').render(ctx) - html = get_template(f'{base}.html').render(ctx) - - msg = EmailMultiAlternatives( - subject, - txt, - settings.IF_EMAIL, - [recipient], - ) - msg.attach_alternative(html, 'text/html') - msg.send() + return send_email(f'approval_{template_suffix}', ctx, subject, recipient) def send_staff_decision_mail(obj, choice_code: str, granted: bool) -> None: @@ -78,20 +91,10 @@ def send_staff_decision_mail(obj, choice_code: str, granted: bool) -> None: Uses: input/approval_granted_staff.(txt|html) or input/approval_denied_staff.(txt|html) """ ctx = _decision_context(obj, choice_code) - base = 'input/approval_granted_staff' if granted else 'input/approval_denied_staff' + template_suffix = 'granted' if granted else 'denied' project_name = getattr(obj, 'name', None) or '(ohne Projektnamen)' decision_word = 'bewilligt' if granted else 'abgelehnt' subject = f'Entscheidung: {project_name} ({decision_word})' - txt = get_template(f'{base}.txt').render(ctx) - html = get_template(f'{base}.html').render(ctx) - - msg = EmailMultiAlternatives( - subject, - txt, - settings.IF_EMAIL, - [settings.IF_EMAIL], - ) - msg.attach_alternative(html, 'text/html') - msg.send() + return send_email(f'approval_{template_suffix}_staff', ctx, subject, settings.IF_EMAIL) diff --git a/input/views.py b/input/views.py index 2c6292d..e56264e 100755 --- a/input/views.py +++ b/input/views.py @@ -5,15 +5,14 @@ from django.shortcuts import render from django.http import HttpResponse, Http404 from django.utils.functional import cached_property from django.utils.safestring import mark_safe -from django.core.mail import BadHeaderError, EmailMultiAlternatives -from django.template.loader import get_template +from django.core.mail import BadHeaderError from django.conf import settings from django.contrib.auth.decorators import login_required from django.views.generic import TemplateView from django.views.generic.edit import FormView from django.utils.html import strip_tags -from input.utils.mail import collect_attachment_paths, attach_files +from input.utils.mail import collect_attachment_paths, attach_files, build_email from .forms import ( BaseApplicationForm, @@ -288,16 +287,13 @@ class ApplicationView(FormView): obj.delete() return HttpResponse('Error in sending mails (probably wrong address?). Data not saved!') - def send_email(self, kind, template_name, subject, recipient, context): - plain = get_template(f'input/{template_name}.txt').render(context) - html = get_template(f'input/{template_name}.html').render(context) - email = EmailMultiAlternatives(subject, plain, settings.IF_EMAIL, [recipient]) + def send_email(self, kind, template_name, subject, recipient, context, *, fail_silently=False): + email = build_email(template_name, context, subject, recipient) applicant_files = collect_attachment_paths(kind=kind, choice=self.type_code) - email.attach_alternative(html, 'text/html') attach_files(email, applicant_files) - return email.send() + return email.send(fail_silently) @staticmethod def get_recipient_name(obj, data):