1
0
Fork 0

PEP-8 Cleanup.

This commit is contained in:
Adam Coddington 2013-06-22 14:35:47 -07:00
parent 9f77c9221a
commit 9cdb2d9d1b
10 changed files with 120 additions and 96 deletions

View file

@ -8,25 +8,30 @@ from django_mailbox.signals import message_received
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def get_new_mail(mailbox_admin, request, queryset): def get_new_mail(mailbox_admin, request, queryset):
for mailbox in queryset.all(): for mailbox in queryset.all():
logger.debug('Receiving mail for %s' % mailbox) logger.debug('Receiving mail for %s' % mailbox)
mailbox.get_new_mail() mailbox.get_new_mail()
get_new_mail.short_description = 'Get new mail' get_new_mail.short_description = 'Get new mail'
def resend_message_received_signal(message_admin, request, queryset): def resend_message_received_signal(message_admin, request, queryset):
for message in queryset.all(): for message in queryset.all():
logger.debug('Resending \'message_received\' signal for %s' % message) logger.debug('Resending \'message_received\' signal for %s' % message)
message_received.send(sender=message_admin, message=message) message_received.send(sender=message_admin, message=message)
resend_message_received_signal.short_description = 'Re-send message received signal' resend_message_received_signal.short_description = (
'Re-send message received signal'
)
class MailboxAdmin(admin.ModelAdmin): class MailboxAdmin(admin.ModelAdmin):
list_display = ( list_display = (
'name', 'name',
'uri', 'uri',
'from_email', 'from_email',
'active', 'active',
) )
actions = [get_new_mail] actions = [get_new_mail]
@ -48,23 +53,23 @@ class MessageAdmin(admin.ModelAdmin):
MessageAttachmentInline, MessageAttachmentInline,
] ]
list_display = ( list_display = (
'subject', 'subject',
'processed', 'processed',
'read', 'read',
'mailbox', 'mailbox',
'outgoing', 'outgoing',
'attachment_count', 'attachment_count',
) )
ordering = ['-processed'] ordering = ['-processed']
list_filter = ( list_filter = (
'mailbox', 'mailbox',
'outgoing', 'outgoing',
'processed', 'processed',
'read', 'read',
) )
raw_id_fields = ( raw_id_fields = (
'in_reply_to', 'in_reply_to',
) )
exclude = ( exclude = (
'body', 'body',
) )

View file

@ -12,8 +12,8 @@ from django.core.files import File
from django.core.files.temp import NamedTemporaryFile from django.core.files.temp import NamedTemporaryFile
from django.db import models from django.db import models
from django_mailbox.transports import Pop3Transport, ImapTransport,\ from django_mailbox.transports import Pop3Transport, ImapTransport,\
MaildirTransport, MboxTransport, BabylTransport, MHTransport, \ MaildirTransport, MboxTransport, BabylTransport, MHTransport, \
MMDFTransport MMDFTransport
from django_mailbox.signals import message_received from django_mailbox.signals import message_received
SKIPPED_EXTENSIONS = getattr( SKIPPED_EXTENSIONS = getattr(
@ -40,59 +40,58 @@ ALTERED_MESSAGE_HEADER = getattr(
'X-Django-Mailbox-Altered-Message' 'X-Django-Mailbox-Altered-Message'
) )
class ActiveMailboxManager(models.Manager): class ActiveMailboxManager(models.Manager):
def get_query_set(self): def get_query_set(self):
return super(ActiveMailboxManager, self).get_query_set().filter( return super(ActiveMailboxManager, self).get_query_set().filter(
active=True, active=True,
) )
class Mailbox(models.Model): class Mailbox(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
uri = models.CharField( uri = models.CharField(
max_length=255, max_length=255,
help_text=""" help_text=(
Example: imap+ssl://myusername:mypassword@someserver "Example: imap+ssl://myusername:mypassword@someserver <br />"
<br /> "<br />"
<br /> "Internet transports include 'imap' and 'pop3'; "
Internet transports include 'imap' and 'pop3'; common local file transports include 'maildir', 'mbox', and less commonly 'babyl', 'mh', and 'mmdf'. "common local file transports include 'maildir', 'mbox', "
<br /> "and less commonly 'babyl', 'mh', and 'mmdf'. <br />"
<br /> "<br />"
Be sure to urlencode your username and password should they "Be sure to urlencode your username and password should they "
contain illegal characters (like @, :, etc). "contain illegal characters (like @, :, etc)."
""", ),
blank=True, blank=True,
null=True, null=True,
default=None, default=None,
) )
from_email = models.CharField( from_email = models.CharField(
max_length=255, max_length=255,
help_text=""" help_text=(
Example: MailBot &lt;mailbot@yourdomain.com&gt; "Example: MailBot &lt;mailbot@yourdomain.com&gt;<br />"
<br /> "'From' header to set for outgoing email.<br />"
'From' header to set for outgoing email. "<br />"
<br /> "If you do not use this e-mail inbox for outgoing mail, this "
<br /> "setting is unnecessary.<br />"
If you do not use this e-mail inbox for outgoing mail, this "If you send e-mail without setting this, your 'From' header will'"
setting is unnecessary. "be set to match the setting `DEFAULT_FROM_EMAIL`."
<br /> ),
If you send e-mail without setting this, your 'From' header will blank=True,
be set to match the setting `DEFAULT_FROM_EMAIL`. null=True,
""", default=None,
blank=True, )
null=True,
default=None,
)
active = models.BooleanField( active = models.BooleanField(
help_text=""" help_text=(
Check this e-mail inbox for new e-mail messages during polling "Check this e-mail inbox for new e-mail messages during polling "
cycles. This checkbox does not have an effect upon whether "cycles. This checkbox does not have an effect upon whether "
mail is collected here when this mailbox receives mail from a "mail is collected here when this mailbox receives mail from a "
pipe, and does not affect whether e-mail messages can be "pipe, and does not affect whether e-mail messages can be "
dispatched from this mailbox. "dispatched from this mailbox. "
""", ),
blank=True, blank=True,
default=True, default=True,
) )
objects = models.Manager() objects = models.Manager()
active_mailboxes = ActiveMailboxManager() active_mailboxes = ActiveMailboxManager()
@ -137,17 +136,17 @@ class Mailbox(models.Model):
return None return None
elif self.type == 'imap': elif self.type == 'imap':
conn = ImapTransport( conn = ImapTransport(
self.location, self.location,
port=self.port if self.port else None, port=self.port if self.port else None,
ssl=self.use_ssl ssl=self.use_ssl
) )
conn.connect(self.username, self.password) conn.connect(self.username, self.password)
elif self.type == 'pop3': elif self.type == 'pop3':
conn = Pop3Transport( conn = Pop3Transport(
self.location, self.location,
port=self.port if self.port else None, port=self.port if self.port else None,
ssl=self.use_ssl ssl=self.use_ssl
) )
conn.connect(self.username, self.password) conn.connect(self.username, self.password)
elif self.type == 'maildir': elif self.type == 'maildir':
conn = MaildirTransport(self.location) conn = MaildirTransport(self.location)
@ -207,7 +206,9 @@ class Mailbox(models.Model):
msg.body = message.as_string() msg.body = message.as_string()
if message['in-reply-to']: if message['in-reply-to']:
try: try:
msg.in_reply_to = Message.objects.filter(message_id=message['in-reply-to'])[0] msg.in_reply_to = Message.objects.filter(
message_id=message['in-reply-to']
)[0]
except IndexError: except IndexError:
pass pass
msg.save() msg.save()
@ -219,13 +220,17 @@ class Mailbox(models.Model):
continue continue
filename = part.get_filename() filename = part.get_filename()
# ignore SMIME extension # ignore SMIME extension
filename_basename, filename_extension = os.path.splitext(filename) filename_basename, filename_extension = os.path.splitext(
filename
)
buffer_space = 40 buffer_space = 40
if len(filename) > 100 - buffer_space: if len(filename) > 100 - buffer_space:
# Ensure that there're at least a few chars available afterward # Ensure that there're at least a few chars available
# for duplication things like _1, _2 ... _99 and the FileField's # afterward for duplication things like _1, _2 ... _99 and
# upload_to path. # the FileField's upload_to path.
filename_basename = filename_basename[0:100-len(filename_extension)-buffer_space] filename_basename = filename_basename[
0:100-len(filename_extension)-buffer_space
]
filename = filename_basename + filename_extension filename = filename_basename + filename_extension
if filename_extension in SKIPPED_EXTENSIONS: if filename_extension in SKIPPED_EXTENSIONS:
continue continue
@ -257,24 +262,28 @@ class Mailbox(models.Model):
class Meta: class Meta:
verbose_name_plural = "Mailboxes" verbose_name_plural = "Mailboxes"
class IncomingMessageManager(models.Manager): class IncomingMessageManager(models.Manager):
def get_query_set(self): def get_query_set(self):
return super(IncomingMessageManager, self).get_query_set().filter( return super(IncomingMessageManager, self).get_query_set().filter(
outgoing=False, outgoing=False,
) )
class OutgoingMessageManager(models.Manager): class OutgoingMessageManager(models.Manager):
def get_query_set(self): def get_query_set(self):
return super(OutgoingMessageManager, self).get_query_set().filter( return super(OutgoingMessageManager, self).get_query_set().filter(
outgoing=True, outgoing=True,
) )
class UnreadMessageManager(models.Manager): class UnreadMessageManager(models.Manager):
def get_query_set(self): def get_query_set(self):
return super(UnreadMessageManager, self).get_query_set().filter( return super(UnreadMessageManager, self).get_query_set().filter(
read=None read=None
) )
class Message(models.Model): class Message(models.Model):
mailbox = models.ForeignKey(Mailbox, related_name='messages') mailbox = models.ForeignKey(Mailbox, related_name='messages')
subject = models.CharField(max_length=255) subject = models.CharField(max_length=255)
@ -335,10 +344,10 @@ class Message(models.Model):
addresses = [] addresses = []
for address in self.to_header.split(','): for address in self.to_header.split(','):
addresses.append( addresses.append(
rfc822.parseaddr( rfc822.parseaddr(
address address
)[1] )[1]
) )
return addresses return addresses
def reply(self, message): def reply(self, message):
@ -359,10 +368,10 @@ class Message(models.Model):
message.extra_headers['In-Reply-To'] = self.message_id message.extra_headers['In-Reply-To'] = self.message_id
message.send() message.send()
return self.mailbox.record_outgoing_message( return self.mailbox.record_outgoing_message(
email.message_from_string( email.message_from_string(
message.message().as_string() message.message().as_string()
)
) )
)
@property @property
def text(self): def text(self):
@ -373,7 +382,8 @@ class Message(models.Model):
body = '' body = ''
if message.is_multipart(): if message.is_multipart():
for part in message.get_payload(): for part in message.get_payload():
if part.get('content-type', '').split(';')[0] == 'text/plain': mime_type = part.get('content-type', '').split(';')[0]
if mime_type == 'text/plain':
body = body + get_body_from_message(part) body = body + get_body_from_message(part)
else: else:
body = body + message.get_payload() body = body + message.get_payload()

View file

@ -1,14 +1,13 @@
import email import email
import os.path import os.path
import shutil
from django.db import models
from django.test import TestCase from django.test import TestCase
import mimic import mimic
import django_mailbox import django_mailbox
from django_mailbox.models import Mailbox, Message from django_mailbox.models import Mailbox, Message
class EmailMessageTestCase(TestCase): class EmailMessageTestCase(TestCase):
def setUp(self): def setUp(self):
super(EmailMessageTestCase, self).setUp() super(EmailMessageTestCase, self).setUp()
@ -26,6 +25,7 @@ class EmailMessageTestCase(TestCase):
self.mimic.verify_all() self.mimic.verify_all()
class TestProcessEmail(EmailMessageTestCase): class TestProcessEmail(EmailMessageTestCase):
def test_message_without_attachments(self): def test_message_without_attachments(self):
message = self._get_email_object('generic_message.eml') message = self._get_email_object('generic_message.eml')
@ -85,6 +85,7 @@ class TestProcessEmail(EmailMessageTestCase):
actual_results, actual_results,
) )
class TestFilterMessageBody(EmailMessageTestCase): class TestFilterMessageBody(EmailMessageTestCase):
def setUp(self): def setUp(self):
django_mailbox.models.STRIP_UNALLOWED_MIMETYPES = True django_mailbox.models.STRIP_UNALLOWED_MIMETYPES = True
@ -131,6 +132,7 @@ class TestFilterMessageBody(EmailMessageTestCase):
mailbox._filter_message_body(message).as_string() mailbox._filter_message_body(message).as_string()
) )
class TestGetMessage(EmailMessageTestCase): class TestGetMessage(EmailMessageTestCase):
def test_get_text_body_properly_recomposes_line_continuations(self): def test_get_text_body_properly_recomposes_line_continuations(self):
message = Message() message = Message()

View file

@ -1,5 +1,6 @@
from mailbox import Babyl from mailbox import Babyl
from django_mailbox.transports.generic import GenericFileMailbox from django_mailbox.transports.generic import GenericFileMailbox
class BabylTransport(GenericFileMailbox): class BabylTransport(GenericFileMailbox):
_variant = Babyl _variant = Babyl

View file

@ -1,6 +1,7 @@
import email import email
from imaplib import IMAP4, IMAP4_SSL from imaplib import IMAP4, IMAP4_SSL
class ImapTransport(object): class ImapTransport(object):
def __init__(self, hostname, port=None, ssl=False): def __init__(self, hostname, port=None, ssl=False):
self.hostname = hostname self.hostname = hostname
@ -28,6 +29,6 @@ class ImapTransport(object):
yield message yield message
except email.Errors.MessageParseError: except email.Errors.MessageParseError:
continue continue
self.server.store(key, "+FLAGS", "\\Deleted"); self.server.store(key, "+FLAGS", "\\Deleted")
self.server.expunge() self.server.expunge()
return return

View file

@ -1,6 +1,7 @@
from mailbox import Maildir from mailbox import Maildir
from django_mailbox.transports.generic import GenericFileMailbox from django_mailbox.transports.generic import GenericFileMailbox
class MaildirTransport(GenericFileMailbox): class MaildirTransport(GenericFileMailbox):
_variant = Maildir _variant = Maildir

View file

@ -1,5 +1,6 @@
from mailbox import mbox from mailbox import mbox
from django_mailbox.transports.generic import GenericFileMailbox from django_mailbox.transports.generic import GenericFileMailbox
class MboxTransport(GenericFileMailbox): class MboxTransport(GenericFileMailbox):
_variant = mbox _variant = mbox

View file

@ -1,5 +1,6 @@
from mailbox import MH from mailbox import MH
from django_mailbox.transports.generic import GenericFileMailbox from django_mailbox.transports.generic import GenericFileMailbox
class MHTransport(GenericFileMailbox): class MHTransport(GenericFileMailbox):
_variant = MH _variant = MH

View file

@ -1,5 +1,6 @@
from mailbox import MMDF from mailbox import MMDF
from django_mailbox.transports.generic import GenericFileMailbox from django_mailbox.transports.generic import GenericFileMailbox
class MMDFTransport(GenericFileMailbox): class MMDFTransport(GenericFileMailbox):
_variant = MMDF _variant = MMDF

View file

@ -1,6 +1,7 @@
import email import email
from poplib import POP3, POP3_SSL from poplib import POP3, POP3_SSL
class Pop3Transport(object): class Pop3Transport(object):
def __init__(self, hostname, port=None, ssl=False): def __init__(self, hostname, port=None, ssl=False):
self.hostname = hostname self.hostname = hostname