require reply-to

v1-0-stable
Christian Merten 5 years ago
parent 70a9d50da5
commit 14efa944fa

@ -205,7 +205,7 @@ JET_SIDE_MENU_ITEMS = [
]}, ]},
{'app_label': 'mailer', 'items': [ {'app_label': 'mailer', 'items': [
{'name': 'message'}, {'name': 'message'},
{'name': 'emailaddress', 'permissions': ['mailer.emailaddress'] }, {'name': 'emailaddress'},
]}, ]},
{'app_label': 'members', 'items': [ {'app_label': 'members', 'items': [
{'name': 'member'}, {'name': 'member'},

@ -7,7 +7,7 @@ from django import forms
#from easy_select2 import apply_select2 #from easy_select2 import apply_select2
import json import json
from .models import Message, Attachment, MessageForm, EmailAddress from .models import Message, Attachment, MessageForm, EmailAddress, EmailAddressForm
from .mailutils import NOT_SENT, PARTLY_SENT from .mailutils import NOT_SENT, PARTLY_SENT
from members.models import Member from members.models import Member
@ -24,6 +24,7 @@ class EmailAddressAdmin(admin.ModelAdmin):
# models.ForeignKey: {'widget': apply_select2(forms.Select)} # models.ForeignKey: {'widget': apply_select2(forms.Select)}
#} #}
filter_horizontal = ('to_members',) filter_horizontal = ('to_members',)
form = EmailAddressForm
class MessageAdmin(admin.ModelAdmin): class MessageAdmin(admin.ModelAdmin):

@ -22,12 +22,22 @@ class EmailAddress(models.Model):
"""Represents an email address, that is forwarded to specific members""" """Represents an email address, that is forwarded to specific members"""
name = models.CharField(_('name'), max_length=50, validators=[alphanumeric]) name = models.CharField(_('name'), max_length=50, validators=[alphanumeric])
to_members = models.ManyToManyField('members.Member', to_members = models.ManyToManyField('members.Member',
verbose_name=_('Forward to')) verbose_name=_('Forward to participants'),
blank=True)
to_groups = models.ManyToManyField('members.Group',
verbose_name=_('Forward to group'),
blank=True)
@property @property
def email(self): def email(self):
return "{0}@{1}".format(self.name, HOST) return "{0}@{1}".format(self.name, HOST)
@property
def forwards(self):
mails = set(member.email for member in self.to_members.all())
mails.update([member.email for group in self.to_groups.all() for member in group.member_set.all()])
return mails
def __str__(self): def __str__(self):
return self.email return self.email
@ -36,6 +46,21 @@ class EmailAddress(models.Model):
verbose_name_plural = _('email addresses') verbose_name_plural = _('email addresses')
class EmailAddressForm(forms.ModelForm):
class Meta:
model = EmailAddress
exclude = []
def clean(self):
group = self.cleaned_data.get('to_groups')
members = self.cleaned_data.get('to_members')
if not group and not members:
raise ValidationError(_('Either a group or at least'
' one member is required as forward recipient.'))
# Create your models here. # Create your models here.
class Message(models.Model): class Message(models.Model):
"""Represents a message that can be sent to some members""" """Represents a message that can be sent to some members"""
@ -112,8 +137,11 @@ class Message(models.Model):
# generate message id # generate message id
message_id = "<{}@jdav-ludwigsburg.de>".format(self.pk) message_id = "<{}@jdav-ludwigsburg.de>".format(self.pk)
# reply to addresses # reply to addresses
reply_to = [jl.association_email for jl in self.reply_to.all()] reply_to_unfiltered = [jl.association_email for jl in self.reply_to.all()]
reply_to.extend([ml.email for ml in self.reply_to_email_address.all()]) reply_to_unfiltered.extend([ml.email for ml in self.reply_to_email_address.all()])
# remove sending address from reply-to field (probably unnecessary since it's removed by
# the mail provider anyways)
reply_to = [mail for mail in reply_to if mail != SENDING_ADDRESS ]
try: try:
success = send(self.subject, get_content(self.content), success = send(self.subject, get_content(self.content),
SENDING_ADDRESS, SENDING_ADDRESS,
@ -128,7 +156,7 @@ class Message(models.Model):
os.remove(a.f.path) os.remove(a.f.path)
a.delete() a.delete()
except Exception as e: except Exception as e:
print("Exception catched", e) print("Exception caught", e)
success = NOT_SENT success = NOT_SENT
finally: finally:
self.save() self.save()
@ -153,9 +181,14 @@ class MessageForm(forms.ModelForm):
freizeit = self.cleaned_data.get('to_freizeit') freizeit = self.cleaned_data.get('to_freizeit')
notelist = self.cleaned_data.get('to_notelist') notelist = self.cleaned_data.get('to_notelist')
members = self.cleaned_data.get('to_members') members = self.cleaned_data.get('to_members')
if not group and memberlist is None and not members and notelist is None: if not group and freizeit is None and not members and notelist is None:
raise ValidationError(_('Either a group, a memberlist or at least' raise ValidationError(_('Either a group, a memberlist or at least'
' one member is required as recipient')) ' one member is required as recipient'))
reply_to = self.cleaned_data.get('reply_to')
reply_to_email_address = self.cleaned_data.get('reply_to_email_address')
if not reply_to and not reply_to_email_address:
raise ValidationError(_('At least one reply-to recipient is required.'
'Use the info mail if you really want no reply-to recipient.'))
class Attachment(models.Model): class Attachment(models.Model):
"""Represents an attachment to an email""" """Represents an attachment to an email"""

@ -21,7 +21,7 @@ class Command(BaseCommand):
if addresses: if addresses:
forwards = [] forwards = []
for addr in addresses: for addr in addresses:
forwards.extend([member.email for member in addr.to_members.all()]) forwards.extend(addr.forwards)
self.stdout.write(" ".join(forwards)) self.stdout.write(" ".join(forwards))
return return
try: try:

Loading…
Cancel
Save