add outgoingemail model, add mailhelper function and worker
This commit is contained in:
parent
698698a96b
commit
1f4df68304
|
@ -1,4 +1,4 @@
|
||||||
from utils.email import _send_email
|
from utils.email import add_outgoing_email
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger("bornhack.%s" % __name__)
|
logger = logging.getLogger("bornhack.%s" % __name__)
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ def send_add_membership_email(membership):
|
||||||
'camp': membership.team.camp.title
|
'camp': membership.team.camp.title
|
||||||
}
|
}
|
||||||
|
|
||||||
return _send_email(
|
return add_outgoing_email(
|
||||||
text_template='emails/add_membership_email.txt',
|
text_template='emails/add_membership_email.txt',
|
||||||
html_template='emails/add_membership_email.html',
|
html_template='emails/add_membership_email.html',
|
||||||
recipient=membership.user.email,
|
recipient=membership.user.email,
|
||||||
|
@ -31,7 +31,7 @@ def send_remove_membership_email(membership):
|
||||||
text_template = 'emails/unapproved_membership_email.txt',
|
text_template = 'emails/unapproved_membership_email.txt',
|
||||||
html_template = 'emails/unapproved_membership_email.html'
|
html_template = 'emails/unapproved_membership_email.html'
|
||||||
|
|
||||||
return _send_email(
|
return add_outgoing_email(
|
||||||
text_template=text_template,
|
text_template=text_template,
|
||||||
html_template=html_template,
|
html_template=html_template,
|
||||||
recipient=membership.user.email,
|
recipient=membership.user.email,
|
||||||
|
@ -46,10 +46,12 @@ def send_new_membership_email(membership):
|
||||||
'camp': membership.team.camp.title
|
'camp': membership.team.camp.title
|
||||||
}
|
}
|
||||||
|
|
||||||
return _send_email(
|
return add_outgoing_email(
|
||||||
text_template='emails/new_membership_email.txt',
|
text_template='emails/new_membership_email.txt',
|
||||||
html_template='emails/new_membership_email.html',
|
html_template='emails/new_membership_email.html',
|
||||||
recipient=[resp.email for resp in membership.team.responsible],
|
recipients=', '.join(
|
||||||
|
[resp.email for resp in membership.team.responsible]
|
||||||
|
),
|
||||||
formatdict=formatdict,
|
formatdict=formatdict,
|
||||||
subject='New membership request for {} at {}'.format(
|
subject='New membership request for {} at {}'.format(
|
||||||
membership.team.name,
|
membership.team.name,
|
||||||
|
|
8
src/utils/admin.py
Normal file
8
src/utils/admin.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from .models import OutgoingEmail
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(OutgoingEmail)
|
||||||
|
class OutgoingEmailAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
|
@ -1,6 +1,8 @@
|
||||||
from django.core.mail import EmailMultiAlternatives
|
from django.core.mail import EmailMultiAlternatives
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
|
from django.core.validators import validate_email
|
||||||
|
from .models import OutgoingEmail
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger("bornhack.%s" % __name__)
|
logger = logging.getLogger("bornhack.%s" % __name__)
|
||||||
|
|
||||||
|
@ -8,12 +10,11 @@ logger = logging.getLogger("bornhack.%s" % __name__)
|
||||||
def _send_email(
|
def _send_email(
|
||||||
text_template,
|
text_template,
|
||||||
recipient,
|
recipient,
|
||||||
formatdict,
|
|
||||||
subject,
|
subject,
|
||||||
html_template=None,
|
html_template='',
|
||||||
sender='BornHack <info@bornhack.dk>',
|
sender='BornHack <info@bornhack.dk>',
|
||||||
attachment=None,
|
attachment='',
|
||||||
attachment_filename=None
|
attachment_filename=''
|
||||||
):
|
):
|
||||||
if not isinstance(recipient, list):
|
if not isinstance(recipient, list):
|
||||||
recipient = [recipient]
|
recipient = [recipient]
|
||||||
|
@ -22,7 +23,7 @@ def _send_email(
|
||||||
# put the basic email together
|
# put the basic email together
|
||||||
msg = EmailMultiAlternatives(
|
msg = EmailMultiAlternatives(
|
||||||
subject,
|
subject,
|
||||||
render_to_string(text_template, formatdict),
|
text_template,
|
||||||
sender,
|
sender,
|
||||||
recipient,
|
recipient,
|
||||||
[settings.ARCHIVE_EMAIL]
|
[settings.ARCHIVE_EMAIL]
|
||||||
|
@ -31,7 +32,7 @@ def _send_email(
|
||||||
# is there a html version of this email?
|
# is there a html version of this email?
|
||||||
if html_template:
|
if html_template:
|
||||||
msg.attach_alternative(
|
msg.attach_alternative(
|
||||||
render_to_string(html_template, formatdict),
|
html_template,
|
||||||
'text/html'
|
'text/html'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -47,3 +48,39 @@ def _send_email(
|
||||||
msg.send()
|
msg.send()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def add_outgoing_email(
|
||||||
|
text_template,
|
||||||
|
recipients,
|
||||||
|
formatdict,
|
||||||
|
subject,
|
||||||
|
html_template='',
|
||||||
|
sender='BornHack <info@bornhack.dk>',
|
||||||
|
attachment='',
|
||||||
|
attachment_filename=''
|
||||||
|
):
|
||||||
|
""" adds an email to the outgoing queue
|
||||||
|
recipients is either just a str email or a str commaseperated emails
|
||||||
|
"""
|
||||||
|
text_template = render_to_string(text_template, formatdict)
|
||||||
|
|
||||||
|
if html_template:
|
||||||
|
html_template = render_to_string(html_template, formatdict)
|
||||||
|
|
||||||
|
if ',' in recipients:
|
||||||
|
for recipient in recipients.split(','):
|
||||||
|
validate_email(recipient.strip())
|
||||||
|
else:
|
||||||
|
validate_email(recipients)
|
||||||
|
|
||||||
|
OutgoingEmail.objects.create(
|
||||||
|
text_template=text_template,
|
||||||
|
html_template=html_template,
|
||||||
|
subject=subject,
|
||||||
|
sender=sender,
|
||||||
|
recipient=recipients,
|
||||||
|
attachment=attachment,
|
||||||
|
attachment_filename=attachment_filename
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
|
@ -68,3 +68,14 @@ class CampRelatedModel(CreatedUpdatedModel):
|
||||||
raise ValidationError('This camp is in read only mode.')
|
raise ValidationError('This camp is in read only mode.')
|
||||||
|
|
||||||
super().delete(**kwargs)
|
super().delete(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class OutgoingEmail(CreatedUpdatedModel):
|
||||||
|
subject = models.CharField(max_length=500)
|
||||||
|
text_template = models.TextField()
|
||||||
|
html_template = models.TextField(blank=True)
|
||||||
|
recipient = models.CharField(max_length=500)
|
||||||
|
sender = models.CharField(max_length=500)
|
||||||
|
attachment = models.CharField(max_length=500, blank=True)
|
||||||
|
attachment_filename = models.CharField(max_length=500, blank=True)
|
||||||
|
processed = models.BooleanField(default=False)
|
||||||
|
|
28
src/utils/outgoingemailworker.py
Normal file
28
src/utils/outgoingemailworker.py
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
from .models import OutgoingEmail
|
||||||
|
from .email import _send_email
|
||||||
|
import logging
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
logger = logging.getLogger('bornhack.%s' % __name__)
|
||||||
|
|
||||||
|
|
||||||
|
def do_work():
|
||||||
|
"""
|
||||||
|
The outgoing email worker sends emails added to the OutgoingEmail
|
||||||
|
queue.
|
||||||
|
"""
|
||||||
|
not_processed_email = OutgoingEmail.objects.filter(processed=False)
|
||||||
|
|
||||||
|
for email in not_processed_email:
|
||||||
|
if ',' in email.recipient:
|
||||||
|
recipient = email.recipient.split(',')
|
||||||
|
else:
|
||||||
|
recipient = [email.recipient]
|
||||||
|
|
||||||
|
_send_email(
|
||||||
|
text_template=email.text_template,
|
||||||
|
recipient=recipient,
|
||||||
|
subject=email.subject,
|
||||||
|
html_template=email.html_template,
|
||||||
|
attachment=email.attachment,
|
||||||
|
attachment_filename=email.attachment_filename
|
||||||
|
)
|
Loading…
Reference in a new issue