allow attachments

v1-0-stable
Christian Merten 9 years ago
parent a2e7d2ef9a
commit c575db5f5f

@ -1,11 +1,16 @@
from django.contrib import admin from django.contrib import admin, messages
from django.contrib.admin import helpers from django.contrib.admin import helpers
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.shortcuts import render from django.shortcuts import render
from django.db import models from django.db import models
from django import forms 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): class MessageAdmin(admin.ModelAdmin):
@ -16,6 +21,7 @@ class MessageAdmin(admin.ModelAdmin):
models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple} models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}
} }
inlines = [AttachmentInline]
actions = ['send_message'] actions = ['send_message']
def send_message(self, request, queryset): def send_message(self, request, queryset):
@ -35,13 +41,17 @@ class MessageAdmin(admin.ModelAdmin):
def response_change(self, request, obj): def response_change(self, request, obj):
if "_send" in request.POST: 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) return super(MessageAdmin, self).response_change(request, obj)
def response_add(self, request, obj): def response_add(self, request, obj):
success = True
if "_send" in request.POST: if "_send" in request.POST:
obj.submit() success = obj.submit()
return super(MessageAdmin, self).response_change(request, obj) if success:
return super(MessageAdmin, self).response_add(request, obj)
admin.site.register(Message, MessageAdmin) admin.site.register(Message, MessageAdmin)

@ -1,16 +1,23 @@
from django.core.mail import send_mass_mail, send_mail from django.core.mail import EmailMessage
def send(subject, content, sender, recipicient): def send(subject, content, sender, recipients, reply_to=None,
send_mail(subject, content, sender, [recipicient]) attachments=None):
if reply_to is not None:
kwargs = {"reply_to": [reply_to]}
def send_mass(subject, content, sender, recipicients): else:
data = [ kwargs = {}
(subject, content, sender, [recipicient]) email = EmailMessage(subject, content, sender, recipients, **kwargs)
for recipicient in recipicients] if attachments is not None:
print("sending data", data) for attach in attachments:
send_mass_mail(data) 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): def get_content(content):

@ -1,6 +1,31 @@
from django.db import models from django.db import models
from django.forms import forms
from django.utils.translation import ugettext_lazy as _ 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. # Create your models here.
@ -29,10 +54,17 @@ class Message(models.Model):
if not member.gets_newsletter: if not member.gets_newsletter:
continue continue
members.add(member) members.add(member)
send_mass(self.subject, get_content(self.content), attach = [a.f.path for a in Attachment.objects.filter(msg__id=self.pk)
self.from_addr, [member.email for member in members]) if a.f.name]
self.sent = True success = send(self.subject, get_content(self.content),
self.save() 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: class Meta:
verbose_name = _('message') verbose_name = _('message')
@ -40,3 +72,21 @@ class Message(models.Model):
permissions = ( permissions = (
("submit_mails", _("Can submit mails")), ("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')

Loading…
Cancel
Save