forked from beba/foerderbarometer
Add decision mailers for applicants and staff with approval/denial templates
This commit is contained in:
parent
5f2d99c037
commit
1ad4970cbc
|
|
@ -0,0 +1,87 @@
|
|||
from django.conf import settings
|
||||
from django.core.mail import EmailMultiAlternatives
|
||||
from django.template.loader import get_template
|
||||
from django.utils.html import strip_tags
|
||||
from .models import TYPE_CHOICES
|
||||
|
||||
|
||||
def _type_labels(choice: str):
|
||||
"""
|
||||
Resolve the human-readable type label.
|
||||
Returns (HTML label, plain text label).
|
||||
"""
|
||||
html = TYPE_CHOICES.get(choice, choice)
|
||||
plain = strip_tags(str(html))
|
||||
return html, plain
|
||||
|
||||
|
||||
def _decision_context(obj, choice_code: str) -> dict:
|
||||
"""
|
||||
Build a minimal, consistent context for decision mails (applicant & staff).
|
||||
Also exposes the full project object as 'project' for template access.
|
||||
"""
|
||||
type_html, type_plain = _type_labels(choice_code)
|
||||
realname = getattr(obj, 'realname', '') or getattr(obj, 'email', '')
|
||||
return {
|
||||
'data': {
|
||||
'realname': realname,
|
||||
'typestring': type_html,
|
||||
'typestring_plain': type_plain,
|
||||
'name': getattr(obj, 'name', None),
|
||||
},
|
||||
'project': obj,
|
||||
}
|
||||
|
||||
|
||||
def send_decision_mail(obj, choice_code: str, granted: bool) -> None:
|
||||
"""
|
||||
Send a decision email to the applicant after manual approval/denial.
|
||||
Uses: input/approval_granted.(txt|html) or input/approval_denied.(txt|html)
|
||||
"""
|
||||
recipient = getattr(obj, 'email', None)
|
||||
if not recipient:
|
||||
return # no recipient -> skip
|
||||
|
||||
ctx = _decision_context(obj, choice_code)
|
||||
base = 'input/approval_granted' if granted else 'input/approval_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()
|
||||
|
||||
|
||||
def send_staff_decision_mail(obj, choice_code: str, granted: bool) -> None:
|
||||
"""
|
||||
Send a decision email to the internal team (staff) after approval/denial.
|
||||
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'
|
||||
|
||||
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()
|
||||
Loading…
Reference in New Issue