Additional file-like behavior for FileField (optional size arg for read
method; fixed seek and tell methods for reading files).
This commit is contained in:
parent
69989365c7
commit
2c7469c62a
@ -561,6 +561,7 @@ class GridFSProxy(object):
|
|||||||
self.fs = gridfs.GridFS(_get_db()) # Filesystem instance
|
self.fs = gridfs.GridFS(_get_db()) # Filesystem instance
|
||||||
self.newfile = None # Used for partial writes
|
self.newfile = None # Used for partial writes
|
||||||
self.grid_id = grid_id # Store GridFS id for file
|
self.grid_id = grid_id # Store GridFS id for file
|
||||||
|
self.gridout = None
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
obj = self.get()
|
obj = self.get()
|
||||||
@ -574,8 +575,12 @@ class GridFSProxy(object):
|
|||||||
def get(self, id=None):
|
def get(self, id=None):
|
||||||
if id:
|
if id:
|
||||||
self.grid_id = id
|
self.grid_id = id
|
||||||
|
if self.grid_id is None:
|
||||||
|
return None
|
||||||
try:
|
try:
|
||||||
return self.fs.get(id or self.grid_id)
|
if self.gridout is None:
|
||||||
|
self.gridout = self.fs.get(self.grid_id)
|
||||||
|
return self.gridout
|
||||||
except:
|
except:
|
||||||
# File has been deleted
|
# File has been deleted
|
||||||
return None
|
return None
|
||||||
@ -605,9 +610,9 @@ class GridFSProxy(object):
|
|||||||
self.grid_id = self.newfile._id
|
self.grid_id = self.newfile._id
|
||||||
self.newfile.writelines(lines)
|
self.newfile.writelines(lines)
|
||||||
|
|
||||||
def read(self):
|
def read(self, size=-1):
|
||||||
try:
|
try:
|
||||||
return self.get().read()
|
return self.get().read(size)
|
||||||
except:
|
except:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -615,6 +620,7 @@ class GridFSProxy(object):
|
|||||||
# Delete file from GridFS, FileField still remains
|
# Delete file from GridFS, FileField still remains
|
||||||
self.fs.delete(self.grid_id)
|
self.fs.delete(self.grid_id)
|
||||||
self.grid_id = None
|
self.grid_id = None
|
||||||
|
self.grid_out = None
|
||||||
|
|
||||||
def replace(self, file, **kwargs):
|
def replace(self, file, **kwargs):
|
||||||
self.delete()
|
self.delete()
|
||||||
|
@ -700,6 +700,12 @@ class FieldTest(unittest.TestCase):
|
|||||||
self.assertTrue(streamfile == result)
|
self.assertTrue(streamfile == result)
|
||||||
self.assertEquals(result.file.read(), text + more_text)
|
self.assertEquals(result.file.read(), text + more_text)
|
||||||
self.assertEquals(result.file.content_type, content_type)
|
self.assertEquals(result.file.content_type, content_type)
|
||||||
|
result.file.seek(0)
|
||||||
|
self.assertEquals(result.file.tell(), 0)
|
||||||
|
self.assertEquals(result.file.read(len(text)), text)
|
||||||
|
self.assertEquals(result.file.tell(), len(text))
|
||||||
|
self.assertEquals(result.file.read(len(more_text)), more_text)
|
||||||
|
self.assertEquals(result.file.tell(), len(text + more_text))
|
||||||
result.file.delete()
|
result.file.delete()
|
||||||
|
|
||||||
# Ensure deleted file returns None
|
# Ensure deleted file returns None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user