diff --git a/apps/documents/conf/settings.py b/apps/documents/conf/settings.py index f30ea5ba53..5e0190b46d 100644 --- a/apps/documents/conf/settings.py +++ b/apps/documents/conf/settings.py @@ -5,6 +5,7 @@ import uuid from django.conf import settings from django.contrib.auth.models import User +from documents.storage import DocumentStorage default_available_functions = { 'current_date':datetime.datetime.now().date, @@ -26,7 +27,9 @@ DELETE_LOCAL_ORIGINAL = getattr(settings, 'DOCUMENTS_DELETE_LOCAL_ORIGINAL', Fal CHECKSUM_FUNCTION = getattr(settings, 'DOCUMENTS_CHECKSUM_FUNCTION', lambda x: hashlib.sha256(x).hexdigest()) UUID_FUNCTION = getattr(settings, 'DOCUMENTS_UUID_FUNTION', lambda:unicode(uuid.uuid4())) # Storage +STORAGE_BACKEND = getattr(settings, 'DOCUMENTS_STORAGE_BACKEND', DocumentStorage) STORAGE_DIRECTORY_NAME = getattr(settings, 'DOCUMENTS_STORAGE_DIRECTORY_NAME', 'documents') # Serving -FILESERVING_PATH = getattr(settings, 'DOCUMENTS_FILESERVING_PATH', u'/tmp/mayan/documents') -SLUGIFY_PATH = getattr(settings, 'DOCUMENTS_SLUGIFY_PATH', False) +FILESYSTEM_FILESERVING_ENABLE = getattr(settings, 'DOCUMENTS_FILESYSTEM_FILESERVING_ENABLE', True) +FILESYSTEM_FILESERVING_PATH = getattr(settings, 'DOCUMENTS_FILESERVING_PATH', u'/tmp/mayan/documents') +FILESYSTEM_SLUGIFY_PATHS = getattr(settings, 'DOCUMENTS_SLUGIFY_PATHS', False) diff --git a/apps/documents/models.py b/apps/documents/models.py index f48c72825b..04cea2f1a4 100644 --- a/apps/documents/models.py +++ b/apps/documents/models.py @@ -12,14 +12,17 @@ from django.utils.translation import ugettext from dynamic_search.api import register from documents.conf.settings import AVAILABLE_FUNCTIONS -from documents.conf.settings import FILESERVING_PATH -from documents.conf.settings import SLUGIFY_PATH +from documents.conf.settings import AVAILABLE_MODELS from documents.conf.settings import CHECKSUM_FUNCTION from documents.conf.settings import UUID_FUNCTION +from documents.conf.settings import STORAGE_BACKEND from documents.conf.settings import STORAGE_DIRECTORY_NAME -from documents.conf.settings import AVAILABLE_MODELS +from documents.conf.settings import FILESYSTEM_FILESERVING_ENABLE +from documents.conf.settings import FILESYSTEM_FILESERVING_PATH +from documents.conf.settings import FILESYSTEM_SLUGIFY_PATHS -if SLUGIFY_PATH == False: + +if FILESYSTEM_SLUGIFY_PATHS == False: #Do not slugify path or filenames and extensions slugify = lambda x:x @@ -52,7 +55,7 @@ class Document(models.Model): Inherit this model to customise document metadata, see BasicDocument for an example. """ document_type = models.ForeignKey(DocumentType, verbose_name=_(u'document type')) - file = models.FileField(upload_to=get_filename_from_uuid) + file = models.FileField(upload_to=get_filename_from_uuid, storage=STORAGE_BACKEND()) uuid = models.CharField(max_length=48, default=UUID_FUNCTION(), blank=True, editable=False) file_mimetype = models.CharField(max_length=64, default='', editable=False) file_filename = models.CharField(max_length=64, default='', editable=False) @@ -90,36 +93,38 @@ class Document(models.Model): targets = [] for metadata in self.documentmetadata_set.all(): if metadata.metadata_type.documenttypemetadatatype_set.all()[0].create_directory_link: - target_directory = os.path.join(FILESERVING_PATH, slugify(metadata.metadata_type.name), slugify(metadata.value)) + target_directory = os.path.join(FILESYSTEM_FILESERVING_PATH, slugify(metadata.metadata_type.name), slugify(metadata.value)) targets.append(os.path.join(target_directory, os.extsep.join([slugify(self.file_filename), slugify(self.file_extension)]))) return targets def create_fs_links(self): - for target in self.calculate_fs_links(): - try: - os.makedirs(os.path.dirname(target)) - except OSError, exc: - if exc.errno == errno.EEXIST: - pass - else: - raise OSError(ugettext(u'Unable to create metadata indexing directory: %s') % exc) - try: - os.symlink(os.path.abspath(self.file.path), target) - except OSError, exc: - if exc.errno == errno.EEXIST: - pass - else: - raise OSError(ugettext(u'Unable to create metadata indexing symbolic link: %s') % exc) + if FILESYSTEM_FILESERVING_ENABLE: + for target in self.calculate_fs_links(): + try: + os.makedirs(os.path.dirname(target)) + except OSError, exc: + if exc.errno == errno.EEXIST: + pass + else: + raise OSError(ugettext(u'Unable to create metadata indexing directory: %s') % exc) + try: + os.symlink(os.path.abspath(self.file.path), target) + except OSError, exc: + if exc.errno == errno.EEXIST: + pass + else: + raise OSError(ugettext(u'Unable to create metadata indexing symbolic link: %s') % exc) def delete_fs_links(self): - for target in self.calculate_fs_links(): - try: - os.unlink(target) - except OSError, exc: - if exc.errno == errno.ENOENT: - pass - else: - raise OSError(ugettext(u'Unable to delete metadata indexing symbolic link: %s') % exc) + if FILESYSTEM_FILESERVING_ENABLE: + for target in self.calculate_fs_links(): + try: + os.unlink(target) + except OSError, exc: + if exc.errno == errno.ENOENT: + pass + else: + raise OSError(ugettext(u'Unable to delete metadata indexing symbolic link: %s') % exc) available_functions_string = (_(u' Available functions: %s') % ','.join(['%s()' % name for name, function in AVAILABLE_FUNCTIONS.items()])) if AVAILABLE_FUNCTIONS else '' diff --git a/apps/documents/storage.py b/apps/documents/storage.py new file mode 100644 index 0000000000..f471f63eaf --- /dev/null +++ b/apps/documents/storage.py @@ -0,0 +1,8 @@ +from django.core.files.storage import FileSystemStorage + +class DocumentStorage(FileSystemStorage): + def __init__(self, *args, **kwargs): + super(DocumentStorage, self).__init__(*args, **kwargs) + self.location='document_storage' + self.base_url='document_storage' + diff --git a/settings.py b/settings.py index 2b8d85c7e9..c7befe6700 100644 --- a/settings.py +++ b/settings.py @@ -178,8 +178,9 @@ LOGIN_EXEMPT_URLS = ( # Storage #DOCUMENTS_STORAGE_DIRECTORY_NAME = 'documents' # Serving -#DOCUMENTS_FILESERVING_PATH = u'/tmp/mayan/documents' -#DOCUMENTS_SLUGIFY_PATH = False +#DOCUMENTS_FILESYSTEM_FILESERVING_ENABLE = True +#DOCUMENTS_FILESYSTEM_FILESERVING_PATH = u'/tmp/mayan/documents' +#DOCUMENTS_FILESYSTEM_SLUGIFY_PATHS = False #======== End of configuration options ======= try: