From c575db5f5ffa5745bcde084081bf93f5f1f3b5d7 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 14 Jan 2017 13:44:06 +0100 Subject: [PATCH 1/2] allow attachments --- jdav_web/mailer/admin.py | 20 +++++++++--- jdav_web/mailer/mailutils.py | 33 ++++++++++++-------- jdav_web/mailer/models.py | 60 +++++++++++++++++++++++++++++++++--- 3 files changed, 90 insertions(+), 23 deletions(-) diff --git a/jdav_web/mailer/admin.py b/jdav_web/mailer/admin.py index 9e9675d..5394aa8 100644 --- a/jdav_web/mailer/admin.py +++ b/jdav_web/mailer/admin.py @@ -1,11 +1,16 @@ -from django.contrib import admin +from django.contrib import admin, messages from django.contrib.admin import helpers from django.utils.translation import ugettext_lazy as _ from django.shortcuts import render from django.db import models from django import forms -from .models import Message +from .models import Message, Attachment + + +class AttachmentInline(admin.StackedInline): + model = Attachment + extra = 0 class MessageAdmin(admin.ModelAdmin): @@ -16,6 +21,7 @@ class MessageAdmin(admin.ModelAdmin): models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple} } + inlines = [AttachmentInline] actions = ['send_message'] def send_message(self, request, queryset): @@ -35,13 +41,17 @@ class MessageAdmin(admin.ModelAdmin): def response_change(self, request, obj): if "_send" in request.POST: - obj.submit() + success = obj.submit() + if not success: + messages.error(request, _("Failed to send message")) return super(MessageAdmin, self).response_change(request, obj) def response_add(self, request, obj): + success = True if "_send" in request.POST: - obj.submit() - return super(MessageAdmin, self).response_change(request, obj) + success = obj.submit() + if success: + return super(MessageAdmin, self).response_add(request, obj) admin.site.register(Message, MessageAdmin) diff --git a/jdav_web/mailer/mailutils.py b/jdav_web/mailer/mailutils.py index bd47c74..9fa195b 100644 --- a/jdav_web/mailer/mailutils.py +++ b/jdav_web/mailer/mailutils.py @@ -1,16 +1,23 @@ -from django.core.mail import send_mass_mail, send_mail - - -def send(subject, content, sender, recipicient): - send_mail(subject, content, sender, [recipicient]) - - -def send_mass(subject, content, sender, recipicients): - data = [ - (subject, content, sender, [recipicient]) - for recipicient in recipicients] - print("sending data", data) - send_mass_mail(data) +from django.core.mail import EmailMessage + + +def send(subject, content, sender, recipients, reply_to=None, + attachments=None): + if reply_to is not None: + kwargs = {"reply_to": [reply_to]} + else: + kwargs = {} + email = EmailMessage(subject, content, sender, recipients, **kwargs) + if attachments is not None: + for attach in attachments: + email.attach_file(attach) + try: + email.send() + except Exception as e: + print("Error when sending mail:", e) + return False + else: + return True def get_content(content): diff --git a/jdav_web/mailer/models.py b/jdav_web/mailer/models.py index 10770fc..6e03115 100644 --- a/jdav_web/mailer/models.py +++ b/jdav_web/mailer/models.py @@ -1,6 +1,31 @@ from django.db import models +from django.forms import forms from django.utils.translation import ugettext_lazy as _ -from .mailutils import send_mass, get_content +from .mailutils import send, get_content + +import os + + +class RestrictedFileField(models.FileField): + + def __init__(self, *args, **kwargs): + if "max_upload_size" in kwargs: + self.max_upload_size = kwargs.pop("max_upload_size") + + super(RestrictedFileField, self).__init__(*args, **kwargs) + + def clean(self, *args, **kwargs): + data = super(RestrictedFileField, self).clean(*args, **kwargs) + f = data.file + try: + if f._size > self.max_upload_size: + raise forms.ValidationError('Please keep filesize under {}. ' + 'Current filesize: ' + '{}'.format(self.max_upload_size, + f._size)) + except AttributeError as e: + print(e) + return data # Create your models here. @@ -29,10 +54,17 @@ class Message(models.Model): if not member.gets_newsletter: continue members.add(member) - send_mass(self.subject, get_content(self.content), - self.from_addr, [member.email for member in members]) - self.sent = True - self.save() + 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], + attachments=attach) + if success: + self.sent = True + self.save() + return True + else: + return False class Meta: verbose_name = _('message') @@ -40,3 +72,21 @@ class Message(models.Model): permissions = ( ("submit_mails", _("Can submit mails")), ) + + +class Attachment(models.Model): + """Represents an attachment to an email""" + msg = models.ForeignKey(Message, on_delete=models.CASCADE) + print("attachment class") + # file (not naming it file because of builtin) + f = RestrictedFileField(_('file'), + upload_to='attachments', + blank=True, + max_upload_size=10485760) + + def __str__(self): + return os.path.basename(self.f.name) if self.f.name else _("Empty") + + class Meta: + verbose_name = _('attachment') + verbose_name_plural = _('attachments') From 5214612e0fc94b97cc3e894043adb1855a9fb166 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 14 Jan 2017 13:47:38 +0100 Subject: [PATCH 2/2] fix response add --- jdav_web/mailer/admin.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/jdav_web/mailer/admin.py b/jdav_web/mailer/admin.py index 5394aa8..936a8cd 100644 --- a/jdav_web/mailer/admin.py +++ b/jdav_web/mailer/admin.py @@ -41,17 +41,15 @@ class MessageAdmin(admin.ModelAdmin): def response_change(self, request, obj): if "_send" in request.POST: - success = obj.submit() - if not success: + if not obj.submit(): messages.error(request, _("Failed to send message")) return super(MessageAdmin, self).response_change(request, obj) def response_add(self, request, obj): - success = True if "_send" in request.POST: - success = obj.submit() - if success: - return super(MessageAdmin, self).response_add(request, obj) + if not obj.submit(): + messages.error(request, _("Failed to send message")) + return super(MessageAdmin, self).response_add(request, obj) admin.site.register(Message, MessageAdmin)