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': [
{'name': 'message'},
{'name': 'emailaddress', 'permissions': ['mailer.emailaddress'] },
{'name': 'emailaddress'},
]},
{'app_label': 'members', 'items': [
{'name': 'member'},

@ -7,7 +7,7 @@ from django import forms
#from easy_select2 import apply_select2
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 members.models import Member
@ -24,6 +24,7 @@ class EmailAddressAdmin(admin.ModelAdmin):
# models.ForeignKey: {'widget': apply_select2(forms.Select)}
#}
filter_horizontal = ('to_members',)
form = EmailAddressForm
class MessageAdmin(admin.ModelAdmin):

@ -22,12 +22,22 @@ class EmailAddress(models.Model):
"""Represents an email address, that is forwarded to specific members"""
name = models.CharField(_('name'), max_length=50, validators=[alphanumeric])
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
def email(self):
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):
return self.email
@ -36,6 +46,21 @@ class EmailAddress(models.Model):
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.
class Message(models.Model):
"""Represents a message that can be sent to some members"""
@ -112,8 +137,11 @@ class Message(models.Model):
# generate message id
message_id = "<{}@jdav-ludwigsburg.de>".format(self.pk)
# reply to addresses
reply_to = [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 = [jl.association_email for jl in self.reply_to.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:
success = send(self.subject, get_content(self.content),
SENDING_ADDRESS,
@ -128,7 +156,7 @@ class Message(models.Model):
os.remove(a.f.path)
a.delete()
except Exception as e:
print("Exception catched", e)
print("Exception caught", e)
success = NOT_SENT
finally:
self.save()
@ -153,9 +181,14 @@ class MessageForm(forms.ModelForm):
freizeit = self.cleaned_data.get('to_freizeit')
notelist = self.cleaned_data.get('to_notelist')
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'
' 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):
"""Represents an attachment to an email"""

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

Loading…
Cancel
Save