redo email for shop and edd email for team app

This commit is contained in:
Stephan Telling 2017-04-18 20:46:57 +02:00
parent 9d70782b70
commit 49d4f74472
No known key found for this signature in database
GPG key ID: D4892289F36ADA9B
13 changed files with 232 additions and 65 deletions

View file

@ -1,52 +1,8 @@
from django.core.mail import EmailMultiAlternatives
from django.conf import settings
from django.template.loader import render_to_string
from utils.email import _send_email
import logging
logger = logging.getLogger("bornhack.%s" % __name__)
def send_email(emailtype, recipient, formatdict, subject, sender='BornHack <info@bornhack.dk>', attachment=None):
### determine email type, set template and attachment vars
html_template=None
if emailtype == 'invoice':
text_template = 'emails/invoice_email.txt'
html_template = 'emails/invoice_email.html'
attachment_filename = formatdict['filename']
elif emailtype == 'creditnote':
text_template = 'emails/creditnote_email.txt'
html_template = 'emails/creditnote_email.html'
attachment_filename = formatdict['creditnote'].filename
elif emailtype == 'testmail':
text_template = 'emails/testmail.txt'
else:
logger.error('Unknown email type: %s' % emailtype)
return False
try:
### put the basic email together
msg = EmailMultiAlternatives(subject, render_to_string(text_template, formatdict), sender, [recipient], [settings.ARCHIVE_EMAIL])
### is there a html version of this email?
if html_template:
msg.attach_alternative(render_to_string(html_template, formatdict), 'text/html')
### is there a pdf attachment to this mail?
if attachment:
msg.attach(attachment_filename, attachment, 'application/pdf')
except Exception as E:
logger.exception('exception while rendering email: %s' % E)
return False
### send the email
msg.send()
### all good
return True
def send_creditnote_email(creditnote):
# put formatdict together
formatdict = {
@ -56,15 +12,17 @@ def send_creditnote_email(creditnote):
subject = 'BornHack creditnote %s' % creditnote.pk
# send mail
return send_email(
emailtype='creditnote',
return _send_email(
text_template='emails/creditnote_email.txt',
html_template='emails/creditnote_email.html',
recipient=creditnote.user.email,
formatdict=formatdict,
subject=subject,
sender='info@bornhack.dk',
attachment=creditnote.pdf.read(),
attachment_filename=creditnote.filename
)
def send_invoice_email(invoice):
# put formatdict together
formatdict = {
@ -76,20 +34,20 @@ def send_invoice_email(invoice):
subject = 'BornHack invoice %s' % invoice.pk
# send mail
return send_email(
emailtype='invoice',
return _send_email(
text_template='emails/invoice_email.txt',
html_template='emails/invoice_email.html',
recipient=invoice.order.user.email,
formatdict=formatdict,
subject=subject,
sender='info@bornhack.dk',
attachment=invoice.pdf.read(),
attachment_filename=invoice.filename
)
def send_test_email(recipient):
return send_email(
emailtype='testmail',
return _send_email(
text_template='emails/testmail.txt',
recipient=recipient,
subject='testmail from bornhack website',
subject='testmail from bornhack website'
)

View file

@ -1,6 +1,6 @@
from django.contrib import admin
from .models import Team, TeamArea, TeamMember
from .email import send_add_membership_email, send_remove_membership_email
admin.site.register(TeamArea)
@ -35,11 +35,18 @@ class TeamMemberAdmin(admin.ModelAdmin):
def add_member(self, request, queryset):
teams_count = queryset.values('team').distinct().count()
rows_updated = queryset.update(approved=True)
updated = 0
for membership in queryset:
membership.approved = True
membership.save()
updated += 1
send_add_membership_email(membership)
self.message_user(
request,
'Added {} user(s) to {} team(s).'.format(
rows_updated,
updated,
teams_count
)
)
@ -47,11 +54,17 @@ class TeamMemberAdmin(admin.ModelAdmin):
def remove_member(self, request, queryset):
teams_count = queryset.values('team').distinct().count()
users_removed = queryset.delete()[0]
updated = 0
for membership in queryset:
send_remove_membership_email(membership)
membership.delete()
updated += 1
self.message_user(
request,
'Removed {} user(s) from {} team(s).'.format(
users_removed,
updated,
teams_count
)
)

58
src/teams/email.py Normal file
View file

@ -0,0 +1,58 @@
from utils.email import _send_email
import logging
logger = logging.getLogger("bornhack.%s" % __name__)
def send_add_membership_email(membership):
formatdict = {
'team': membership.team.name,
'camp': membership.team.camp.title
}
return _send_email(
text_template='emails/add_membership_email.txt',
html_template='emails/add_membership_email.html',
recipient=membership.user.email,
formatdict=formatdict,
subject='Team update from {}'.format(membership.team.camp.title)
)
def send_remove_membership_email(membership):
formatdict = {
'team': membership.team.name,
'camp': membership.team.camp.title
}
if membership.approved:
text_template = 'emails/remove_membership_email.txt',
html_template = 'emails/remove_membership_email.html'
else:
text_template = 'emails/unapproved_membership_email.txt',
html_template = 'emails/unapproved_membership_email.html'
return _send_email(
text_template=text_template,
html_template=html_template,
recipient=membership.user.email,
formatdict=formatdict,
subject='Team update from {}'.format(membership.team.camp.title)
)
def send_new_membership_email(membership):
formatdict = {
'team': membership.team.name,
'camp': membership.team.camp.title
}
return _send_email(
text_template='emails/new_membership_email.txt',
html_template='emails/new_membership_email.html',
recipient=membership.user.email,
formatdict=formatdict,
subject='New membership request for {} at {}'.format(
membership.team.name,
membership.team.camp.title
)
)

View file

@ -1,6 +1,9 @@
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils.text import slugify
from utils.models import CampRelatedModel
from .email import send_new_membership_email
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User
@ -13,7 +16,10 @@ class TeamArea(CampRelatedModel):
name = models.CharField(max_length=255)
description = models.TextField(default='')
camp = models.ForeignKey('camps.Camp')
responsible = models.ManyToManyField('auth.User', related_name='responsible_team_areas')
responsible = models.ManyToManyField(
'auth.User',
related_name='responsible_team_areas'
)
def __str__(self):
return '{} ({})'.format(self.name, self.camp)
@ -27,10 +33,18 @@ class Team(CampRelatedModel):
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, blank=True)
camp = models.ForeignKey('camps.Camp')
area = models.ForeignKey('teams.TeamArea', related_name='teams', on_delete=models.PROTECT)
area = models.ForeignKey(
'teams.TeamArea',
related_name='teams',
on_delete=models.PROTECT
)
description = models.TextField()
needs_members = models.BooleanField(default=True)
members = models.ManyToManyField('auth.User', related_name='teams', through='teams.TeamMember')
members = models.ManyToManyField(
'auth.User',
related_name='teams',
through='teams.TeamMember'
)
def __str__(self):
return '{} ({})'.format(self.name, self.camp)
@ -61,7 +75,10 @@ class Team(CampRelatedModel):
@property
def responsible(self):
if TeamMember.objects.filter(team=self, responsible=True).exists():
return User.objects.filter(teammember__team=self, teammember__responsible=True)
return User.objects.filter(
teammember__team=self,
teammember__responsible=True
)
else:
return self.area.responsible.all()
@ -73,5 +90,12 @@ class TeamMember(models.Model):
responsible = models.BooleanField(default=False)
def __str__(self):
return '{} is {} member of team {}'.format(self.user, '' if self.approved else 'an unapproved', self.team)
return '{} is {} member of team {}'.format(
self.user, '' if self.approved else 'an unapproved', self.team
)
@receiver(post_save, sender=TeamMember)
def send_responsible_email(sender, instance, created, **kwargs):
if created:
send_new_membership_email(instance)

View file

@ -0,0 +1,10 @@
Hello!<br>
<br>
You're now a member of the {{ team }} team at {{ camp }}.
<br>
Thank you for helping out!
<br>
<br>
Best regards,<br>
<br>
The BornHack Team<br>

View file

@ -0,0 +1,10 @@
Hello!
You're now a member of the {{ team }} team at {{ camp }}.
Thank you for helping out!
Best regards,
The BornHack Team

View file

@ -0,0 +1,8 @@
Hello!<br>
<br>
There's a new membership request for the {{ team }} team at {{ camp }}.
<br>
<br>
Best regards,<br>
<br>
The BornHack Team<br>

View file

@ -0,0 +1,8 @@
Hello!
There's a new membership request for the {{ team }} team at {{ camp }}.
Best regards,
The BornHack Team

View file

@ -0,0 +1,8 @@
Hello!<br>
<br>
You've been removed from the {{ team }} team at {{ camp }}.
<br>
<br>
Best regards,<br>
<br>
The BornHack Team<br>

View file

@ -0,0 +1,8 @@
Hello!
You've been removed from the {{ team }} team at {{ camp }}.
Best regards,
The BornHack Team

View file

@ -0,0 +1,8 @@
Hello!<br>
<br>
Your membership of {{ team }} team at {{ camp }} was not approved.
<br>
<br>
Best regards,<br>
<br>
The BornHack Team<br>

View file

@ -0,0 +1,8 @@
Hello!
Your membership of {{ team }} team at {{ camp }} was not approved.
Best regards,
The BornHack Team

46
src/utils/email.py Normal file
View file

@ -0,0 +1,46 @@
from django.core.mail import EmailMultiAlternatives
from django.conf import settings
from django.template.loader import render_to_string
import logging
logger = logging.getLogger("bornhack.%s" % __name__)
def _send_email(
text_template,
recipient,
formatdict,
subject,
html_template=None,
sender='BornHack <info@bornhack.dk>',
attachment=None,
attachment_filename=None
):
try:
# put the basic email together
msg = EmailMultiAlternatives(
subject,
render_to_string(text_template, formatdict),
sender,
[recipient],
[settings.ARCHIVE_EMAIL]
)
# is there a html version of this email?
if html_template:
msg.attach_alternative(
render_to_string(html_template, formatdict),
'text/html'
)
# is there a pdf attachment to this mail?
if attachment:
msg.attach(attachment_filename, attachment, 'application/pdf')
except Exception as e:
logger.exception('exception while rendering email: {}'.format(e))
return False
# send the email
msg.send()
return True