Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
*.pyc
*.pyo
*.py[cod]
__pycache__
.settings/
*.pid
*.log
Expand Down
2 changes: 2 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
include README.rst
recursive-include django_email_test/migrations *
2 changes: 2 additions & 0 deletions django_email_test/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.pyc
*.pyo
2 changes: 1 addition & 1 deletion django_email_test/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
VERSION = (0, 0, 3)
VERSION = (0, 0, 5)

__version__ = "".join([".".join(map(str, VERSION[0:3])), "".join(VERSION[3:])])
8 changes: 4 additions & 4 deletions django_email_test/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,22 @@
from django.contrib import admin

#App imports
from models import TestEmail
from .models import TestEmail

class TestEmailAdmin(admin.ModelAdmin):
list_display = ['subject', 'added', 'date', 'sent', 'error']
list_filter = ['sent']
readonly_fields = ['added', 'sent', 'error']
save_as = True
search_fields = ['subject', 'from_email', 'to', 'bcc', 'body', 'error']

def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name == 'to':
request = kwargs.get('request', None)

if request is not None:
db_field.default = request.user.email

return super(TestEmailAdmin, self).formfield_for_dbfield(db_field, **kwargs)

admin.site.register(TestEmail, TestEmailAdmin)
32 changes: 32 additions & 0 deletions django_email_test/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
import datetime


class Migration(migrations.Migration):

dependencies = [
]

operations = [
migrations.CreateModel(
name='TestEmail',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('added', models.DateTimeField(auto_now_add=True)),
('date', models.DateTimeField(default=datetime.datetime.now, help_text=b'The date you want to set as the date header.')),
('from_email', models.CharField(default=b'', max_length=254, verbose_name=b'from')),
('to', models.TextField(default=b'', blank=True)),
('bcc', models.TextField(default=b'', blank=True)),
('subject', models.CharField(default=b'This is a test email.', max_length=150)),
('body', models.TextField(default=b"Here's some default text.")),
('sent', models.BooleanField(default=False, editable=False)),
('error', models.TextField(default=b'', editable=False, blank=True)),
],
options={
'ordering': ['-added'],
},
),
]
52 changes: 52 additions & 0 deletions django_email_test/migrations/0002_auto_20190510_1742.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-10 17:42
from __future__ import unicode_literals

import datetime
from django.db import migrations, models
import django_email_test.models


class Migration(migrations.Migration):

dependencies = [
('django_email_test', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='testemail',
name='bcc',
field=models.TextField(blank=True, default=''),
),
migrations.AlterField(
model_name='testemail',
name='body',
field=models.TextField(default="Here's some default text."),
),
migrations.AlterField(
model_name='testemail',
name='date',
field=models.DateTimeField(default=datetime.datetime.now, help_text='The date you want to set as the date header.'),
),
migrations.AlterField(
model_name='testemail',
name='error',
field=models.TextField(blank=True, default='', editable=False),
),
migrations.AlterField(
model_name='testemail',
name='from_email',
field=models.CharField(default=django_email_test.models.test_email_default_from_email, max_length=150, verbose_name='from'),
),
migrations.AlterField(
model_name='testemail',
name='subject',
field=models.CharField(default='This is a test email.', max_length=150),
),
migrations.AlterField(
model_name='testemail',
name='to',
field=models.TextField(blank=True, default=''),
),
]
Empty file.
32 changes: 19 additions & 13 deletions django_email_test/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@

logger = logging.getLogger(__name__)

# Create your models here.
def test_email_default_from_email():
return settings.DEFAULT_FROM_EMAIL


class TestEmail(models.Model):
"""
Expand All @@ -25,15 +27,16 @@ class TestEmail(models.Model):
on the model.
"""
added = models.DateTimeField(auto_now_add=True)

#email fields
date = models.DateTimeField(
default=lambda: datetime.now(),
default=datetime.now,
help_text="The date you want to set as the date header."
)
from_email = models.EmailField(
from_email = models.CharField(
'from',
default=lambda: settings.DEFAULT_FROM_EMAIL
max_length=150,
default=test_email_default_from_email
)
to = models.TextField(
default='',
Expand All @@ -50,34 +53,37 @@ class TestEmail(models.Model):
default="This is a test email."
)
body = models.TextField(default="Here's some default text.")

sent = models.BooleanField(default=False, editable=False)
error = models.TextField(
default='',
blank=True,
editable=False
)

def send(self):
to = self.to.split(',')
bcc = self.bcc.split(',')

try:
email = EmailMessage(self.subject, self.body, self.from_email, to, bcc)
email.send()
self.sent = True
except Exception, e:
except Exception as e:
tb = traceback.format_exc()
logger.error(tb)
self.error = unicode(tb)

try:
self.error = unicode(tb)
except:
self.error = str(tb)

#only save here if already in the database, otherwise the save_handler will call this function again
if self.id:
self.save()

def __unicode__(self):
return self.subject

class Meta:
ordering = ['-added']

Expand Down
70 changes: 39 additions & 31 deletions django_email_test/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,21 @@ def setUp(self):
from_email = 'foo@example.com',
to = 'bar@example.com'
)


def test_send_success(self):
self.assertEquals(len(mail.outbox), 0)
self.assertEquals(self.te.sent, False)
self.assertEquals(self.te.error, '')
self.assertEquals(self.te.id, None)

self.te.send()

self.assertEquals(len(mail.outbox), 1)
self.assertEquals(self.te.sent, True)
self.assertEquals(self.te.error, '')
self.assertEquals(self.te.id, None)

def test_send_error(self):
#TODO: move this to setUp() so that failures here don't affect other tests
#need EmailMessage.send() (which is called in TestEmail.send() to throw an error)
Expand All @@ -44,91 +44,99 @@ def test_send_error(self):
def send_gives_error(*args, **kwargs):
raise error
EmailMessage.send = send_gives_error

self.assertEquals(len(mail.outbox), 0)
self.assertEquals(self.te.sent, False)
self.assertEquals(self.te.error, '')
self.assertEquals(self.te.id, None)

self.te.send()

self.assertEquals(len(mail.outbox), 0)
self.assertEquals(self.te.sent, False)
self.assertTrue(unicode(error) in self.te.error)
try:
error = unicode(error)
except:
error = str(error)
self.assertTrue(error in self.te.error)
self.assertEquals(self.te.id, None)

#restore the original method so other tests can pass
EmailMessage.send = old_send

def test_test_email_post_save_handler_success(self):
self.assertEquals(len(mail.outbox), 0)
self.assertEquals(self.te.sent, False)
self.assertEquals(self.te.error, '')
self.assertEquals(self.te.id, None)

self.te.save()

#get object from DB to ensure 'sent' and 'error' were saved
te = TestEmail.objects.all()[0]

self.assertEquals(len(mail.outbox), 1)
self.assertEquals(te.sent, True)
self.assertEquals(te.error, '')
self.assertNotEquals(te.id, None)

def test_test_email_post_save_handler_error(self):
#need EmailMessage.send() (which is called in TestEmail.send() to throw an error)
old_send = EmailMessage.send
error = Exception('an error occurred!')
def send_gives_error(*args, **kwargs):
raise error
EmailMessage.send = send_gives_error

self.assertEquals(len(mail.outbox), 0)
self.assertEquals(self.te.sent, False)
self.assertEquals(self.te.error, '')
self.assertEquals(self.te.id, None)

self.te.save()

#get object from DB to ensure 'sent' and 'error' were saved
te = TestEmail.objects.all()[0]

self.assertEquals(len(mail.outbox), 0)
self.assertEquals(te.sent, False)
self.assertTrue(unicode(error) in self.te.error)
try:
error = unicode(error)
except:
error = str(error)
self.assertTrue(error in self.te.error)
self.assertNotEquals(te.id, None)

#restore the original method so other tests can pass
EmailMessage.send = old_send

def test_test_email_pre_save_handler_resets_error_and_sent_to_default_for_new_objects(self):
self.te.sent = True
self.te.error = 'Couldn\'t send email.'

self.assertEquals(self.te.sent, True)
self.assertEquals(self.te.error, 'Couldn\'t send email.')
self.assertEquals(self.te.id, None)


test_email_pre_save_handler(TestEmail, self.te)

self.assertEquals(self.te.sent, False)
self.assertEquals(self.te.error, '')
self.assertEquals(self.te.id, None)

def test_test_email_pre_save_handler_leaves_saved_objects_alone(self):
self.te.id = 1
self.te.sent = True
self.te.error = 'Couldn\'t send email.'

self.assertEquals(self.te.sent, True)
self.assertEquals(self.te.error, 'Couldn\'t send email.')
self.assertEquals(self.te.id, 1)

test_email_pre_save_handler(TestEmail, self.te)

self.assertEquals(self.te.sent, True)
self.assertEquals(self.te.error, 'Couldn\'t send email.')
self.assertEquals(self.te.id, 1)