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:
Stuart Rackham 2011-04-03 15:21:00 +12:00
parent 69989365c7
commit 2c7469c62a
2 changed files with 15 additions and 3 deletions

View File

@ -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()

View File

@ -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