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:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user