84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
import logging
|
|
import os
|
|
|
|
from django.conf import settings
|
|
from django.core.management.base import BaseCommand
|
|
|
|
from watchdog.observers import Observer
|
|
from watchdog.events import FileSystemEventHandler
|
|
|
|
from documents.consumer import Consumer
|
|
|
|
try:
|
|
from inotify_simple import INotify, flags
|
|
except ImportError:
|
|
INotify = flags = None
|
|
|
|
|
|
class Handler(FileSystemEventHandler):
|
|
|
|
def __init__(self, consumer):
|
|
self.consumer = consumer
|
|
|
|
def on_created(self, event):
|
|
self.consumer.try_consume_file(event.src_path)
|
|
|
|
|
|
class Command(BaseCommand):
|
|
"""
|
|
On every iteration of an infinite loop, consume what we can from the
|
|
consumption directory, and fetch any mail available.
|
|
"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
self.verbosity = 0
|
|
self.logger = logging.getLogger(__name__)
|
|
|
|
self.file_consumer = None
|
|
self.mail_fetcher = None
|
|
self.first_iteration = True
|
|
|
|
self.consumer = Consumer()
|
|
|
|
BaseCommand.__init__(self, *args, **kwargs)
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
"directory",
|
|
default=settings.CONSUMPTION_DIR,
|
|
nargs="?",
|
|
help="The consumption directory."
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
|
|
self.verbosity = options["verbosity"]
|
|
directory = options["directory"]
|
|
|
|
for d in (settings.ORIGINALS_DIR, settings.THUMBNAIL_DIR):
|
|
os.makedirs(d, exist_ok=True)
|
|
|
|
logging.getLogger(__name__).info(
|
|
"Starting document consumer at {}".format(
|
|
directory
|
|
)
|
|
)
|
|
|
|
# Consume all files as this is not done initially by the watchdog
|
|
for entry in os.scandir(directory):
|
|
if entry.is_file():
|
|
self.consumer.try_consume_file(entry.path)
|
|
|
|
# Start the watchdog. Woof!
|
|
observer = Observer()
|
|
event_handler = Handler(self.consumer)
|
|
observer.schedule(event_handler, directory, recursive=True)
|
|
observer.start()
|
|
try:
|
|
while observer.is_alive():
|
|
observer.join(1)
|
|
except KeyboardInterrupt:
|
|
observer.stop()
|
|
observer.join()
|