Merge pull request #32 from Schlabonski/attachments

allow attachments
v1-0-stable
Christian Merten 9 years ago committed by GitHub
commit 4ca531afdb

@ -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,15 @@ class MessageAdmin(admin.ModelAdmin):
def response_change(self, request, obj):
if "_send" in request.POST:
obj.submit()
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):
if "_send" in request.POST:
obj.submit()
return super(MessageAdmin, self).response_change(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)

@ -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):

@ -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])
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')

Loading…
Cancel
Save