From 9cdb2d9d1b8b13afd0c873a96bca44e9cb3da5e0 Mon Sep 17 00:00:00 2001 From: Adam Coddington Date: Sat, 22 Jun 2013 14:35:47 -0700 Subject: [PATCH] PEP-8 Cleanup. --- django_mailbox/admin.py | 45 ++++---- django_mailbox/models.py | 154 ++++++++++++++------------- django_mailbox/tests/__init__.py | 8 +- django_mailbox/transports/babyl.py | 1 + django_mailbox/transports/imap.py | 3 +- django_mailbox/transports/maildir.py | 1 + django_mailbox/transports/mbox.py | 1 + django_mailbox/transports/mh.py | 1 + django_mailbox/transports/mmdf.py | 1 + django_mailbox/transports/pop3.py | 1 + 10 files changed, 120 insertions(+), 96 deletions(-) diff --git a/django_mailbox/admin.py b/django_mailbox/admin.py index 52849ca..db39c26 100644 --- a/django_mailbox/admin.py +++ b/django_mailbox/admin.py @@ -8,25 +8,30 @@ from django_mailbox.signals import message_received logger = logging.getLogger(__name__) + def get_new_mail(mailbox_admin, request, queryset): for mailbox in queryset.all(): logger.debug('Receiving mail for %s' % mailbox) mailbox.get_new_mail() get_new_mail.short_description = 'Get new mail' + def resend_message_received_signal(message_admin, request, queryset): for message in queryset.all(): logger.debug('Resending \'message_received\' signal for %s' % 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): list_display = ( - 'name', - 'uri', - 'from_email', - 'active', - ) + 'name', + 'uri', + 'from_email', + 'active', + ) actions = [get_new_mail] @@ -48,23 +53,23 @@ class MessageAdmin(admin.ModelAdmin): MessageAttachmentInline, ] list_display = ( - 'subject', - 'processed', - 'read', - 'mailbox', - 'outgoing', - 'attachment_count', - ) + 'subject', + 'processed', + 'read', + 'mailbox', + 'outgoing', + 'attachment_count', + ) ordering = ['-processed'] list_filter = ( - 'mailbox', - 'outgoing', - 'processed', - 'read', - ) + 'mailbox', + 'outgoing', + 'processed', + 'read', + ) raw_id_fields = ( - 'in_reply_to', - ) + 'in_reply_to', + ) exclude = ( 'body', ) diff --git a/django_mailbox/models.py b/django_mailbox/models.py index af5f297..9e217b2 100755 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -12,13 +12,13 @@ from django.core.files import File from django.core.files.temp import NamedTemporaryFile from django.db import models from django_mailbox.transports import Pop3Transport, ImapTransport,\ - MaildirTransport, MboxTransport, BabylTransport, MHTransport, \ - MMDFTransport + MaildirTransport, MboxTransport, BabylTransport, MHTransport, \ + MMDFTransport from django_mailbox.signals import message_received SKIPPED_EXTENSIONS = getattr( - settings, - 'DJANGO_MAILBOX_SKIPPED_EXTENSIONS', + settings, + 'DJANGO_MAILBOX_SKIPPED_EXTENSIONS', ['.p7s'] ) STRIP_UNALLOWED_MIMETYPES = getattr( @@ -40,59 +40,58 @@ ALTERED_MESSAGE_HEADER = getattr( 'X-Django-Mailbox-Altered-Message' ) + class ActiveMailboxManager(models.Manager): def get_query_set(self): return super(ActiveMailboxManager, self).get_query_set().filter( active=True, ) + class Mailbox(models.Model): name = models.CharField(max_length=255) uri = models.CharField( - max_length=255, - help_text=""" - Example: imap+ssl://myusername:mypassword@someserver -
-
- Internet transports include 'imap' and 'pop3'; common local file transports include 'maildir', 'mbox', and less commonly 'babyl', 'mh', and 'mmdf'. -
-
- Be sure to urlencode your username and password should they - contain illegal characters (like @, :, etc). - """, - blank=True, - null=True, - default=None, - ) + max_length=255, + help_text=( + "Example: imap+ssl://myusername:mypassword@someserver
" + "
" + "Internet transports include 'imap' and 'pop3'; " + "common local file transports include 'maildir', 'mbox', " + "and less commonly 'babyl', 'mh', and 'mmdf'.
" + "
" + "Be sure to urlencode your username and password should they " + "contain illegal characters (like @, :, etc)." + ), + blank=True, + null=True, + default=None, + ) from_email = models.CharField( - max_length=255, - help_text=""" - Example: MailBot <mailbot@yourdomain.com> -
- 'From' header to set for outgoing email. -
-
- If you do not use this e-mail inbox for outgoing mail, this - setting is unnecessary. -
- If you send e-mail without setting this, your 'From' header will - be set to match the setting `DEFAULT_FROM_EMAIL`. - """, - blank=True, - null=True, - default=None, - ) + max_length=255, + help_text=( + "Example: MailBot <mailbot@yourdomain.com>
" + "'From' header to set for outgoing email.
" + "
" + "If you do not use this e-mail inbox for outgoing mail, this " + "setting is unnecessary.
" + "If you send e-mail without setting this, your 'From' header will'" + "be set to match the setting `DEFAULT_FROM_EMAIL`." + ), + blank=True, + null=True, + default=None, + ) active = models.BooleanField( - help_text=""" - Check this e-mail inbox for new e-mail messages during polling - cycles. This checkbox does not have an effect upon whether - mail is collected here when this mailbox receives mail from a - pipe, and does not affect whether e-mail messages can be - dispatched from this mailbox. - """, - blank=True, - default=True, - ) + help_text=( + "Check this e-mail inbox for new e-mail messages during polling " + "cycles. This checkbox does not have an effect upon whether " + "mail is collected here when this mailbox receives mail from a " + "pipe, and does not affect whether e-mail messages can be " + "dispatched from this mailbox. " + ), + blank=True, + default=True, + ) objects = models.Manager() active_mailboxes = ActiveMailboxManager() @@ -137,17 +136,17 @@ class Mailbox(models.Model): return None elif self.type == 'imap': conn = ImapTransport( - self.location, - port=self.port if self.port else None, - ssl=self.use_ssl - ) + self.location, + port=self.port if self.port else None, + ssl=self.use_ssl + ) conn.connect(self.username, self.password) elif self.type == 'pop3': conn = Pop3Transport( - self.location, - port=self.port if self.port else None, - ssl=self.use_ssl - ) + self.location, + port=self.port if self.port else None, + ssl=self.use_ssl + ) conn.connect(self.username, self.password) elif self.type == 'maildir': conn = MaildirTransport(self.location) @@ -207,7 +206,9 @@ class Mailbox(models.Model): msg.body = message.as_string() if message['in-reply-to']: 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: pass msg.save() @@ -219,13 +220,17 @@ class Mailbox(models.Model): continue filename = part.get_filename() # ignore SMIME extension - filename_basename, filename_extension = os.path.splitext(filename) + filename_basename, filename_extension = os.path.splitext( + filename + ) buffer_space = 40 if len(filename) > 100 - buffer_space: - # Ensure that there're at least a few chars available afterward - # for duplication things like _1, _2 ... _99 and the FileField's - # upload_to path. - filename_basename = filename_basename[0:100-len(filename_extension)-buffer_space] + # Ensure that there're at least a few chars available + # afterward for duplication things like _1, _2 ... _99 and + # the FileField's upload_to path. + filename_basename = filename_basename[ + 0:100-len(filename_extension)-buffer_space + ] filename = filename_basename + filename_extension if filename_extension in SKIPPED_EXTENSIONS: continue @@ -257,30 +262,34 @@ class Mailbox(models.Model): class Meta: verbose_name_plural = "Mailboxes" + class IncomingMessageManager(models.Manager): def get_query_set(self): return super(IncomingMessageManager, self).get_query_set().filter( outgoing=False, ) + class OutgoingMessageManager(models.Manager): def get_query_set(self): return super(OutgoingMessageManager, self).get_query_set().filter( outgoing=True, ) + class UnreadMessageManager(models.Manager): def get_query_set(self): return super(UnreadMessageManager, self).get_query_set().filter( read=None ) + class Message(models.Model): mailbox = models.ForeignKey(Mailbox, related_name='messages') subject = models.CharField(max_length=255) message_id = models.CharField(max_length=255) in_reply_to = models.ForeignKey( - 'django_mailbox.Message', + 'django_mailbox.Message', related_name='replies', blank=True, null=True, @@ -313,13 +322,13 @@ class Message(models.Model): @property def address(self): """Property allowing one to get the relevant address(es). - + In earlier versions of this library, the model had an `address` field storing the e-mail address from which a message was received. During later refactorings, it became clear that perhaps storing sent messages would also be useful, so the address field was replaced with two separate fields. - + """ if self.outgoing: return self.to_addresses() @@ -335,15 +344,15 @@ class Message(models.Model): addresses = [] for address in self.to_header.split(','): addresses.append( - rfc822.parseaddr( - address - )[1] - ) + rfc822.parseaddr( + address + )[1] + ) return addresses def reply(self, message): """Sends a message as a reply to this message instance. - + Although Django's e-mail processing will set both Message-ID and Date upon generating the e-mail message, we will not be able to retrieve that information through normal channels, so we must @@ -359,10 +368,10 @@ class Message(models.Model): message.extra_headers['In-Reply-To'] = self.message_id message.send() return self.mailbox.record_outgoing_message( - email.message_from_string( - message.message().as_string() - ) + email.message_from_string( + message.message().as_string() ) + ) @property def text(self): @@ -373,7 +382,8 @@ class Message(models.Model): body = '' if message.is_multipart(): 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) else: body = body + message.get_payload() diff --git a/django_mailbox/tests/__init__.py b/django_mailbox/tests/__init__.py index f00bdb2..83d18d1 100644 --- a/django_mailbox/tests/__init__.py +++ b/django_mailbox/tests/__init__.py @@ -1,14 +1,13 @@ import email import os.path -import shutil -from django.db import models from django.test import TestCase import mimic import django_mailbox from django_mailbox.models import Mailbox, Message + class EmailMessageTestCase(TestCase): def setUp(self): super(EmailMessageTestCase, self).setUp() @@ -26,6 +25,7 @@ class EmailMessageTestCase(TestCase): self.mimic.verify_all() + class TestProcessEmail(EmailMessageTestCase): def test_message_without_attachments(self): message = self._get_email_object('generic_message.eml') @@ -39,7 +39,7 @@ class TestProcessEmail(EmailMessageTestCase): ) self.assertEqual(msg.subject, 'Message Without Attachment') self.assertEqual( - msg.message_id, + msg.message_id, '' ) self.assertEqual( @@ -85,6 +85,7 @@ class TestProcessEmail(EmailMessageTestCase): actual_results, ) + class TestFilterMessageBody(EmailMessageTestCase): def setUp(self): django_mailbox.models.STRIP_UNALLOWED_MIMETYPES = True @@ -131,6 +132,7 @@ class TestFilterMessageBody(EmailMessageTestCase): mailbox._filter_message_body(message).as_string() ) + class TestGetMessage(EmailMessageTestCase): def test_get_text_body_properly_recomposes_line_continuations(self): message = Message() diff --git a/django_mailbox/transports/babyl.py b/django_mailbox/transports/babyl.py index 674aa2e..eb888a6 100644 --- a/django_mailbox/transports/babyl.py +++ b/django_mailbox/transports/babyl.py @@ -1,5 +1,6 @@ from mailbox import Babyl from django_mailbox.transports.generic import GenericFileMailbox + class BabylTransport(GenericFileMailbox): _variant = Babyl diff --git a/django_mailbox/transports/imap.py b/django_mailbox/transports/imap.py index 1c57b1c..6317857 100644 --- a/django_mailbox/transports/imap.py +++ b/django_mailbox/transports/imap.py @@ -1,6 +1,7 @@ import email from imaplib import IMAP4, IMAP4_SSL + class ImapTransport(object): def __init__(self, hostname, port=None, ssl=False): self.hostname = hostname @@ -28,6 +29,6 @@ class ImapTransport(object): yield message except email.Errors.MessageParseError: continue - self.server.store(key, "+FLAGS", "\\Deleted"); + self.server.store(key, "+FLAGS", "\\Deleted") self.server.expunge() return diff --git a/django_mailbox/transports/maildir.py b/django_mailbox/transports/maildir.py index 17f7511..2d4af53 100644 --- a/django_mailbox/transports/maildir.py +++ b/django_mailbox/transports/maildir.py @@ -1,6 +1,7 @@ from mailbox import Maildir from django_mailbox.transports.generic import GenericFileMailbox + class MaildirTransport(GenericFileMailbox): _variant = Maildir diff --git a/django_mailbox/transports/mbox.py b/django_mailbox/transports/mbox.py index 708bb33..d610deb 100644 --- a/django_mailbox/transports/mbox.py +++ b/django_mailbox/transports/mbox.py @@ -1,5 +1,6 @@ from mailbox import mbox from django_mailbox.transports.generic import GenericFileMailbox + class MboxTransport(GenericFileMailbox): _variant = mbox diff --git a/django_mailbox/transports/mh.py b/django_mailbox/transports/mh.py index 574ccf3..33fdc25 100644 --- a/django_mailbox/transports/mh.py +++ b/django_mailbox/transports/mh.py @@ -1,5 +1,6 @@ from mailbox import MH from django_mailbox.transports.generic import GenericFileMailbox + class MHTransport(GenericFileMailbox): _variant = MH diff --git a/django_mailbox/transports/mmdf.py b/django_mailbox/transports/mmdf.py index ad46284..270e4f3 100644 --- a/django_mailbox/transports/mmdf.py +++ b/django_mailbox/transports/mmdf.py @@ -1,5 +1,6 @@ from mailbox import MMDF from django_mailbox.transports.generic import GenericFileMailbox + class MMDFTransport(GenericFileMailbox): _variant = MMDF diff --git a/django_mailbox/transports/pop3.py b/django_mailbox/transports/pop3.py index b6943ae..652fbe7 100644 --- a/django_mailbox/transports/pop3.py +++ b/django_mailbox/transports/pop3.py @@ -1,6 +1,7 @@ import email from poplib import POP3, POP3_SSL + class Pop3Transport(object): def __init__(self, hostname, port=None, ssl=False): self.hostname = hostname