paperless-ngx/src/documents/management/commands/document_consumer.py

76 lines
2.2 KiB
Python
Raw Normal View History

2015-12-26 13:21:33 +00:00
import datetime
import logging
2015-12-20 19:23:33 +00:00
import os
import time
2015-12-20 19:23:33 +00:00
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
2015-12-20 19:23:33 +00:00
from ...consumer import Consumer, ConsumerError
from ...mail import MailFetcher, MailFetcherError
2016-01-23 02:33:29 +00:00
class Command(BaseCommand):
2015-12-20 19:23:33 +00:00
"""
On every iteration of an infinite loop, consume what we can from the
consumption directory, and fetch any mail available.
2015-12-20 19:23:33 +00:00
"""
2017-01-01 18:41:06 +00:00
LOOP_TIME = settings.CONSUMER_LOOP_TIME
MAIL_DELTA = datetime.timedelta(minutes=10)
2015-12-26 13:21:33 +00:00
ORIGINAL_DOCS = os.path.join(settings.MEDIA_ROOT, "documents", "originals")
THUMB_DOCS = os.path.join(settings.MEDIA_ROOT, "documents", "thumbnails")
2015-12-20 19:23:33 +00:00
def __init__(self, *args, **kwargs):
2016-01-21 12:50:22 -05:00
2015-12-20 19:23:33 +00:00
self.verbosity = 0
self.file_consumer = None
self.mail_fetcher = None
self.first_iteration = True
2016-01-21 12:50:22 -05:00
2015-12-20 19:23:33 +00:00
BaseCommand.__init__(self, *args, **kwargs)
def handle(self, *args, **options):
self.verbosity = options["verbosity"]
try:
self.file_consumer = Consumer()
self.mail_fetcher = MailFetcher()
except (ConsumerError, MailFetcherError) as e:
raise CommandError(e)
for path in (self.ORIGINAL_DOCS, self.THUMB_DOCS):
try:
os.makedirs(path)
except FileExistsError:
pass
2015-12-20 19:23:33 +00:00
logging.getLogger(__name__).info(
"Starting document consumer at {}".format(settings.CONSUMPTION_DIR)
)
try:
while True:
self.loop()
2015-12-26 13:21:33 +00:00
time.sleep(self.LOOP_TIME)
if self.verbosity > 1:
print(".")
except KeyboardInterrupt:
print("Exiting")
def loop(self):
# Consume whatever files we can
self.file_consumer.consume()
2016-01-01 16:13:59 +00:00
# Occasionally fetch mail and store it to be consumed on the next loop
# We fetch email when we first start up so that it is not necessary to
# wait for 10 minutes after making changes to the config file.
delta = self.mail_fetcher.last_checked + self.MAIL_DELTA
if self.first_iteration or delta < datetime.datetime.now():
self.first_iteration = False
self.mail_fetcher.pull()