summaryrefslogtreecommitdiff
path: root/storages/backends/mongodb.py
diff options
context:
space:
mode:
authorYuval Adam <yuval@segmanta.com>2014-03-20 17:49:16 +0200
committerYuval Adam <yuval@segmanta.com>2014-03-20 17:49:16 +0200
commit75f93a3f7854a7383febd047391e2bfd4caceee0 (patch)
treed5e634ef292c6b84acacc3982dbcaa0d300a346e /storages/backends/mongodb.py
Initial git fork of django-storagesHEADmaster
Diffstat (limited to 'storages/backends/mongodb.py')
-rw-r--r--storages/backends/mongodb.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/storages/backends/mongodb.py b/storages/backends/mongodb.py
new file mode 100644
index 0000000..b963729
--- /dev/null
+++ b/storages/backends/mongodb.py
@@ -0,0 +1,104 @@
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+from django.core.files.base import File
+from django.core.files.storage import Storage
+from django.db import connections
+from django.utils.encoding import force_unicode
+
+try:
+ from gridfs import GridFS, NoFile
+except ImportError:
+ raise ImproperlyConfigured("Could not load gridfs dependency.\
+ \nSee http://www.mongodb.org/display/DOCS/GridFS")
+
+try:
+ from pymongo import Connection
+except ImportError:
+ raise ImproperlyConfigured("Could not load pymongo dependency.\
+ \nSee http://github.com/mongodb/mongo-python-driver")
+
+class GridFSStorage(Storage):
+ @property
+ def fs(self):
+ db = settings.GRIDFS_DATABASE
+ # This should support both the django_mongodb_engine and the GSoC 2010
+ # MongoDB backend
+ from django_mongodb_engine import __version__
+ if __version__[0] == 0 and __version__[1] <= 3:
+ try:
+ connection = connections[db].db_connection
+ except:
+ connection = connections[db].connection
+ return GridFS(connection)
+ else:
+ return GridFS(connections[db].database)
+
+ def _open(self, name, mode='rb'):
+ return GridFSFile(name, self, mode=mode)
+
+ def _save(self, name, content):
+ name = force_unicode(name).replace('\\', '/')
+ content.open()
+ kwargs = {'filename': name}
+ if hasattr(content.file, 'content_type'):
+ kwargs['content_type'] = content.file.content_type
+ file = self.fs.new_file(**kwargs)
+ if hasattr(content, 'chunks'):
+ for chunk in content.chunks():
+ file.write(chunk)
+ else:
+ file.write(content)
+ file.close()
+ content.close()
+ return name
+
+ def get_valid_name(self, name):
+ return force_unicode(name).strip().replace('\\', '/')
+
+ def delete(self, name):
+ f = self._open(name, 'r')
+ return self.fs.delete(f.file._id)
+
+ def exists(self, name):
+ try:
+ self.fs.get_last_version(name)
+ return True
+ except NoFile:
+ return False
+
+ def listdir(self, path):
+ return ((), self.fs.list())
+
+ def size(self, name):
+ try:
+ return self.fs.get_last_version(name).length
+ except NoFile:
+ raise ValueError('File with name "%s" does not exist' % name)
+
+ def url(self, name):
+ raise NotImplementedError()
+
+class GridFSFile(File):
+ def __init__(self, name, storage, mode):
+ self.name = name
+ self._storage = storage
+ self._mode = mode
+
+ try:
+ self.file = storage.fs.get_last_version(name)
+ except NoFile:
+ raise ValueError("The file doesn't exist.")
+
+ @property
+ def size(self):
+ return self.file.length
+
+ def read(self, num_bytes=None):
+ return self.file.read(num_bytes)
+
+ def write(self, content):
+ raise NotImplementedError()
+
+ def close(self):
+ self.file.close()
+