From 14efa944fa268a57338219a0fccdecd7e1a25eee Mon Sep 17 00:00:00 2001 From: flavis Date: Thu, 24 Sep 2020 21:38:03 +0200 Subject: [PATCH] require reply-to --- jdav_web/jdav_web/settings.py | 2 +- jdav_web/mailer/admin.py | 3 +- jdav_web/mailer/models.py | 43 ++++++++++++++++--- .../management/commands/get_forward_addrs.py | 2 +- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index dfd0f6a..6ae3383 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -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'}, diff --git a/jdav_web/mailer/admin.py b/jdav_web/mailer/admin.py index d872c83..a3e8613 100644 --- a/jdav_web/mailer/admin.py +++ b/jdav_web/mailer/admin.py @@ -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): diff --git a/jdav_web/mailer/models.py b/jdav_web/mailer/models.py index d05ce98..f169498 100644 --- a/jdav_web/mailer/models.py +++ b/jdav_web/mailer/models.py @@ -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""" diff --git a/jdav_web/members/management/commands/get_forward_addrs.py b/jdav_web/members/management/commands/get_forward_addrs.py index 8dada6f..1b12266 100644 --- a/jdav_web/members/management/commands/get_forward_addrs.py +++ b/jdav_web/members/management/commands/get_forward_addrs.py @@ -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: