From c56bec04f99060a94c49b2b8fd57764e87aee889 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Sun, 12 Mar 2017 21:33:13 +0100 Subject: [PATCH] send mail to jugendleiter of member list --- jdav_web/mailer/admin.py | 24 ++++++++++++++---------- jdav_web/mailer/mailutils.py | 10 ++++++++-- jdav_web/mailer/models.py | 26 +++++++++++--------------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/jdav_web/mailer/admin.py b/jdav_web/mailer/admin.py index db8a265..003045d 100644 --- a/jdav_web/mailer/admin.py +++ b/jdav_web/mailer/admin.py @@ -6,6 +6,7 @@ from django.db import models from django import forms from .models import Message, Attachment, MessageForm +from .mailutils import NOT_SENT, PARTLY_SENT class AttachmentInline(admin.StackedInline): @@ -29,8 +30,7 @@ class MessageAdmin(admin.ModelAdmin): print("calling send_message") if request.POST.get('confirmed'): for msg in queryset: - msg.submit() - self.message_user(request, _("Message sent")) + submit_message(msg, request) else: context = { 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, @@ -42,19 +42,23 @@ class MessageAdmin(admin.ModelAdmin): def response_change(self, request, obj): if "_send" in request.POST: - if not obj.submit(): - messages.error(request, _("Failed to send message")) - else: - messages.info(request, _("Successfully sent message")) + submit_message(obj, request) return super(MessageAdmin, self).response_change(request, obj) def response_add(self, request, obj): if "_send" in request.POST: - if not obj.submit(): - messages.error(request, _("Failed to send message")) - else: - messages.info(request, _("Successfully sent message")) + submit_message(obj, request) return super(MessageAdmin, self).response_add(request, obj) +def submit_message(msg, request): + success = msg.submit() + if success == NOT_SENT: + messages.error(request, _("Failed to send message")) + elif success == PARTLY_SENT: + messages.warning(request, _("Failed to send some messages")) + else: + messages.info(request, _("Successfully sent message")) + + admin.site.register(Message, MessageAdmin) diff --git a/jdav_web/mailer/mailutils.py b/jdav_web/mailer/mailutils.py index 8878b81..cab4fa6 100644 --- a/jdav_web/mailer/mailutils.py +++ b/jdav_web/mailer/mailutils.py @@ -1,8 +1,12 @@ from django.core.mail import EmailMessage +NOT_SENT, SENT, PARTLY_SENT = 0, 1, 2 + + def send(subject, content, sender, recipients, reply_to=None, attachments=None): + failed, succeeded = False, False if type(recipients) != list: recipients = [recipients] if reply_to is not None: @@ -18,9 +22,11 @@ def send(subject, content, sender, recipients, reply_to=None, email.send() except Exception as e: print("Error when sending mail:", e) - return False + failed = True else: - return True + succeeded = True + return NOT_SENT if failed and not succeeded else SENT if not failed\ + and succeeded else PARTLY_SENT def get_content(content): diff --git a/jdav_web/mailer/models.py b/jdav_web/mailer/models.py index 0d48049..3c3e49b 100644 --- a/jdav_web/mailer/models.py +++ b/jdav_web/mailer/models.py @@ -2,7 +2,7 @@ from django.db import models from django.core.exceptions import ValidationError from django import forms from django.utils.translation import ugettext_lazy as _ -from .mailutils import send, get_content +from .mailutils import send, get_content, SENT, PARTLY_SENT import os @@ -57,32 +57,28 @@ class Message(models.Model): def submit(self): """Sends the mail to the specified group of members""" members = set() - for group in self.to_groups.all(): - group_members = group.member_set.all() - for member in group_members: - if not member.gets_newsletter: - continue - members.add(member) + groups = [gr.member_set.all() for gr in self.to_groups.all()] + members.update([m for gr in groups for m in gr]) if self.to_memberlist is not None: - for memberonlist in self.to_memberlist.memberonlist_set.all(): - if memberonlist.member.gets_newsletter: - members.add(memberonlist.member) + members.update([mol.member for mol in + self.to_memberlist.memberonlist_set.all()]) + members.update(self.to_memberlist.jugendleiter.all()) + filtered = [m for m in members if m.gets_newsletter] + print("sending mail to", filtered) attach = [a.f.path for a in Attachment.objects.filter(msg__id=self.pk) if a.f.name] success = send(self.subject, get_content(self.content), self.from_addr, - [member.email for member in members], + [member.email for member in filtered], attachments=attach) for a in Attachment.objects.filter(msg__id=self.pk): if a.f.name: os.remove(a.f.path) a.delete() - if success: + if success == SENT or success == PARTLY_SENT: self.sent = True self.save() - return True - else: - return False + return success class Meta: verbose_name = _('message')