Add support for subfolder scanning to watch folders. Closes GitLab issue #498 and #563. This commit adds a new field to watch folders called "include_subdirectories". The directory walk was also updated to use pathlib2. Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
from __future__ import unicode_literals
|
|
|
|
import logging
|
|
|
|
from pathlib2 import Path
|
|
|
|
from django.db import models
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from ..literals import SOURCE_CHOICE_WATCH, SOURCE_UNCOMPRESS_CHOICE_Y
|
|
|
|
from .base import IntervalBaseModel
|
|
|
|
__all__ = ('WatchFolderSource',)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class WatchFolderSource(IntervalBaseModel):
|
|
"""
|
|
The watch folder is another non-interactive source that like the email
|
|
source, works by periodically checking and processing documents. This
|
|
source instead of using an email account, monitors a filesystem folder.
|
|
Administrators can define watch folders, examples /home/mayan/watch_bills
|
|
or /home/mayan/watch_invoices and users just need to copy the documents
|
|
they want to upload as a bill or invoice to the respective filesystem
|
|
folder. Mayan will periodically scan these filesystem locations and
|
|
upload the files as documents, deleting them if configured.
|
|
"""
|
|
source_type = SOURCE_CHOICE_WATCH
|
|
|
|
folder_path = models.CharField(
|
|
help_text=_('Server side filesystem path to scan for files.'),
|
|
max_length=255, verbose_name=_('Folder path')
|
|
)
|
|
include_subdirectories = models.BooleanField(
|
|
help_text=_(
|
|
'If checked, not only will the folder path be scanned for files '
|
|
'but also its subdirectories.'
|
|
),
|
|
verbose_name=_('Include subdirectories?')
|
|
)
|
|
|
|
objects = models.Manager()
|
|
|
|
class Meta:
|
|
verbose_name = _('Watch folder')
|
|
verbose_name_plural = _('Watch folders')
|
|
|
|
def check_source(self):
|
|
path = Path(self.folder_path)
|
|
|
|
if self.include_subdirectories:
|
|
iterator = path.rglob('*')
|
|
else:
|
|
iterator = path.glob('*')
|
|
|
|
for entry in iterator:
|
|
if entry.is_file() or entry.is_symlink():
|
|
with entry.open(mode='rb') as file_object:
|
|
self.handle_upload(
|
|
file_object=file_object,
|
|
expand=(self.uncompress == SOURCE_UNCOMPRESS_CHOICE_Y),
|
|
label=entry.name
|
|
)
|
|
entry.unlink()
|