1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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()
|