From 7aadab23cc85a19a1efca1a928a82985ca440db5 Mon Sep 17 00:00:00 2001
From: Daniel Quinn <code@danielquinn.org>
Date: Thu, 11 Feb 2016 22:05:38 +0000
Subject: [PATCH] Added the Renderable mixin because DRY

---
 src/documents/mail.py                          | 18 ++++++++++--------
 .../management/commands/document_consumer.py   |  7 ++-----
 .../management/commands/document_exporter.py   |  8 +++-----
 .../management/commands/document_retagger.py   |  8 +++-----
 src/documents/mixins.py                        |  9 +++++++++
 5 files changed, 27 insertions(+), 23 deletions(-)
 create mode 100644 src/documents/mixins.py

diff --git a/src/documents/mail.py b/src/documents/mail.py
index dd58673a5..3d961f4d5 100644
--- a/src/documents/mail.py
+++ b/src/documents/mail.py
@@ -11,6 +11,7 @@ from dateutil import parser
 from django.conf import settings
 
 from .consumer import Consumer
+from .mixins import Renderable
 from .models import Sender
 
 
@@ -22,7 +23,7 @@ class InvalidMessageError(Exception):
     pass
 
 
-class Message(object):
+class Message(Renderable):
     """
     A crude, but simple email message class.  We assume that there's a subject
     and n attachments, and that we don't care about the message body.
@@ -37,7 +38,7 @@ class Message(object):
             except (ValueError, AttributeError):
                 pass  # We assume that "now" is ok
 
-    def __init__(self, data):
+    def __init__(self, data, verbosity=1):
         """
         Cribbed heavily from
         https://www.ianlewis.org/en/parsing-email-attachments-python
@@ -57,7 +58,7 @@ class Message(object):
         if not Sender.SAFE_REGEX.match(self.subject):
             raise InvalidMessageError("Message subject is unsafe")
 
-        print('Fetching email: "{}"'.format(self.subject))
+        self._render('Fetching email: "{}"'.format(self.subject), 1)
 
         attachments = []
         for part in message.walk():
@@ -116,9 +117,9 @@ class Attachment(object):
         return self.data
 
 
-class MailFetcher(object):
+class MailFetcher(Renderable):
 
-    def __init__(self):
+    def __init__(self, verbosity=1):
 
         self._connection = None
         self._host = settings.MAIL_CONSUMPTION["HOST"]
@@ -130,6 +131,7 @@ class MailFetcher(object):
         self._enabled = bool(self._host)
 
         self.last_checked = datetime.datetime.now()
+        self.verbosity = verbosity
 
     def pull(self):
         """
@@ -142,7 +144,7 @@ class MailFetcher(object):
 
             for message in self._get_messages():
 
-                print("Storing email: \"{}\"".format(message.subject))
+                self._render("Storing email: \"{}\"".format(message.subject), 1)
 
                 t = int(time.mktime(message.time.timetuple()))
                 file_name = os.path.join(Consumer.CONSUME, message.file_name)
@@ -189,9 +191,9 @@ class MailFetcher(object):
 
             message = None
             try:
-                message = Message(data[0][1])
+                message = Message(data[0][1], self.verbosity)
             except InvalidMessageError as e:
-                print(e)
+                self._render(e, 0)
                 pass
 
             self._connection.store(num, "+FLAGS", "\\Deleted")
diff --git a/src/documents/management/commands/document_consumer.py b/src/documents/management/commands/document_consumer.py
index d384d1486..0d8677ed0 100644
--- a/src/documents/management/commands/document_consumer.py
+++ b/src/documents/management/commands/document_consumer.py
@@ -7,9 +7,10 @@ from django.core.management.base import BaseCommand, CommandError
 
 from ...consumer import Consumer, ConsumerError
 from ...mail import MailFetcher, MailFetcherError
+from ...mixins import Renderable
 
 
-class Command(BaseCommand):
+class Command(Renderable, BaseCommand):
     """
     On every iteration of an infinite loop, consume what we can from the
     consumption directory, and fetch any mail available.
@@ -62,7 +63,3 @@ class Command(BaseCommand):
         delta = self.mail_fetcher.last_checked + self.MAIL_DELTA
         if delta > datetime.datetime.now():
             self.mail_fetcher.pull()
-
-    def _render(self, text, verbosity):
-        if self.verbosity >= verbosity:
-            print(text)
diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py
index 5b70f7050..c8129ad7b 100644
--- a/src/documents/management/commands/document_exporter.py
+++ b/src/documents/management/commands/document_exporter.py
@@ -8,8 +8,10 @@ from django.core.management.base import BaseCommand, CommandError
 from documents.models import Document
 from paperless.db import GnuPG
 
+from ...mixins import Renderable
 
-class Command(BaseCommand):
+
+class Command(Renderable, BaseCommand):
 
     help = """
         Decrypt and rename all files in our collection into a given target
@@ -50,7 +52,3 @@ class Command(BaseCommand):
                 f.write(GnuPG.decrypted(document.source_file))
                 t = int(time.mktime(document.created.timetuple()))
                 os.utime(target, times=(t, t))
-
-    def _render(self, text, verbosity):
-        if self.verbosity >= verbosity:
-            print(text)
diff --git a/src/documents/management/commands/document_retagger.py b/src/documents/management/commands/document_retagger.py
index 79f6d2c66..84a887de0 100644
--- a/src/documents/management/commands/document_retagger.py
+++ b/src/documents/management/commands/document_retagger.py
@@ -2,8 +2,10 @@ from django.core.management.base import BaseCommand
 
 from documents.models import Document, Tag
 
+from ...mixins import Renderable
 
-class Command(BaseCommand):
+
+class Command(Renderable, BaseCommand):
 
     help = """
         Using the current set of tagging rules, apply said rules to all
@@ -28,7 +30,3 @@ class Command(BaseCommand):
                     self._render(
                         'Tagging {} with "{}"'.format(document, tag), 1)
                     document.tags.add(tag)
-
-    def _render(self, text, verbosity):
-        if self.verbosity >= verbosity:
-            print(text)
diff --git a/src/documents/mixins.py b/src/documents/mixins.py
new file mode 100644
index 000000000..881589fa3
--- /dev/null
+++ b/src/documents/mixins.py
@@ -0,0 +1,9 @@
+class Renderable(object):
+    """
+    A handy mixin to make it easier/cleaner to print output based on a verbosity
+    value.
+    """
+
+    def _render(self, text, verbosity):
+        if self.verbosity >= verbosity:
+            print(text)