From a39d04e9c2ef68e97182846e3ede27cfec77e168 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 3 Jul 2014 01:36:57 -0400 Subject: [PATCH] Add proof of concept compressed document storage backend --- .../storage/backends/compressedstorage.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 mayan/apps/storage/backends/compressedstorage.py diff --git a/mayan/apps/storage/backends/compressedstorage.py b/mayan/apps/storage/backends/compressedstorage.py new file mode 100644 index 0000000000..3691ec551e --- /dev/null +++ b/mayan/apps/storage/backends/compressedstorage.py @@ -0,0 +1,51 @@ +from __future__ import absolute_import + +import os +import zipfile + +try: + import zlib + COMPRESSION = zipfile.ZIP_DEFLATED +except: + COMPRESSION = zipfile.ZIP_STORED + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +from django.core.files import File +from django.core.files.storage import FileSystemStorage + +from ..conf.settings import FILESTORAGE_LOCATION + + +class CompressedStorage(FileSystemStorage): + """Simple wrapper for the stock Django FileSystemStorage class""" + + separator = os.path.sep + + def __init__(self, *args, **kwargs): + super(CompressedStorage, self).__init__(*args, **kwargs) + self.location = FILESTORAGE_LOCATION + + def save(self, name, content): + descriptor = StringIO() + zf = zipfile.ZipFile(descriptor, mode='w', compression=COMPRESSION) + + zf.writestr('document', content.read()) + + for file in zf.filelist: + file.create_system = 0 + + zf.close() + descriptor.seek(0) + return super(CompressedStorage, self).save(name, File(descriptor)) + + def open(self, name, mode='rb'): + storage_file = super(CompressedStorage, self).open(name, mode) + zf = zipfile.ZipFile(storage_file) + descriptor = StringIO() + descriptor.write(zf.read('document')) + descriptor.seek(0) + return File(descriptor)