Fix for case where Document is deleted and it's files (FieldFields) in GridFS remain.
This commit is contained in:
parent
94eac1e79d
commit
2753e02cda
@ -463,6 +463,12 @@ class Document(BaseDocument):
|
|||||||
"""
|
"""
|
||||||
signals.pre_delete.send(self.__class__, document=self)
|
signals.pre_delete.send(self.__class__, document=self)
|
||||||
|
|
||||||
|
#Delete FileFields seperately
|
||||||
|
FileField = _import_class('FileField')
|
||||||
|
for name, field in self._fields.iteritems():
|
||||||
|
if isinstance(field, FileField):
|
||||||
|
getattr(self, name).delete()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._qs.filter(
|
self._qs.filter(
|
||||||
**self._object_key).delete(write_concern=write_concern, _from_doc_delete=True)
|
**self._object_key).delete(write_concern=write_concern, _from_doc_delete=True)
|
||||||
|
@ -297,6 +297,71 @@ class FileTest(unittest.TestCase):
|
|||||||
test_file = TestFile()
|
test_file = TestFile()
|
||||||
self.assertFalse(test_file.the_file in [{"test": 1}])
|
self.assertFalse(test_file.the_file in [{"test": 1}])
|
||||||
|
|
||||||
|
def test_file_disk_space(self):
|
||||||
|
""" Test disk space usage when we delete/replace a file """
|
||||||
|
class TestFile(Document):
|
||||||
|
the_file = FileField()
|
||||||
|
|
||||||
|
text = b('Hello, World!')
|
||||||
|
content_type = 'text/plain'
|
||||||
|
|
||||||
|
testfile = TestFile()
|
||||||
|
testfile.the_file.put(text, content_type=content_type, filename="hello")
|
||||||
|
testfile.save()
|
||||||
|
|
||||||
|
#Now check fs.files and fs.chunks
|
||||||
|
db = TestFile._get_db()
|
||||||
|
|
||||||
|
files = db.fs.files.find()
|
||||||
|
chunks = db.fs.chunks.find()
|
||||||
|
self.assertEquals(len(list(files)), 1)
|
||||||
|
self.assertEquals(len(list(chunks)), 1)
|
||||||
|
|
||||||
|
#Deleting the docoument should delete the files
|
||||||
|
testfile.delete()
|
||||||
|
|
||||||
|
files = db.fs.files.find()
|
||||||
|
chunks = db.fs.chunks.find()
|
||||||
|
self.assertEquals(len(list(files)), 0)
|
||||||
|
self.assertEquals(len(list(chunks)), 0)
|
||||||
|
|
||||||
|
#Test case where we don't store a file in the first place
|
||||||
|
testfile = TestFile()
|
||||||
|
testfile.save()
|
||||||
|
|
||||||
|
files = db.fs.files.find()
|
||||||
|
chunks = db.fs.chunks.find()
|
||||||
|
self.assertEquals(len(list(files)), 0)
|
||||||
|
self.assertEquals(len(list(chunks)), 0)
|
||||||
|
|
||||||
|
testfile.delete()
|
||||||
|
|
||||||
|
files = db.fs.files.find()
|
||||||
|
chunks = db.fs.chunks.find()
|
||||||
|
self.assertEquals(len(list(files)), 0)
|
||||||
|
self.assertEquals(len(list(chunks)), 0)
|
||||||
|
|
||||||
|
#Test case where we overwrite the file
|
||||||
|
testfile = TestFile()
|
||||||
|
testfile.the_file.put(text, content_type=content_type, filename="hello")
|
||||||
|
testfile.save()
|
||||||
|
|
||||||
|
text = b('Bonjour, World!')
|
||||||
|
testfile.the_file.replace(text, content_type=content_type, filename="hello")
|
||||||
|
testfile.save()
|
||||||
|
|
||||||
|
files = db.fs.files.find()
|
||||||
|
chunks = db.fs.chunks.find()
|
||||||
|
self.assertEquals(len(list(files)), 1)
|
||||||
|
self.assertEquals(len(list(chunks)), 1)
|
||||||
|
|
||||||
|
testfile.delete()
|
||||||
|
|
||||||
|
files = db.fs.files.find()
|
||||||
|
chunks = db.fs.chunks.find()
|
||||||
|
self.assertEquals(len(list(files)), 0)
|
||||||
|
self.assertEquals(len(list(chunks)), 0)
|
||||||
|
|
||||||
def test_image_field(self):
|
def test_image_field(self):
|
||||||
if not HAS_PIL:
|
if not HAS_PIL:
|
||||||
raise SkipTest('PIL not installed')
|
raise SkipTest('PIL not installed')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user