From 52672f2b942767e861c65dfbaa3058dc1f1a8303 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Wed, 27 Aug 2008 21:30:47 +0000 Subject: [PATCH] Fixed #8534: getting the size of a file no longer opens it (at least for the built-in file-system storage). Thanks, snaury. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8638 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/fields/files.py | 5 +++++ tests/regressiontests/file_storage/models.py | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/django/db/models/fields/files.py b/django/db/models/fields/files.py index 59bd35e27f8..949f991c5ca 100644 --- a/django/db/models/fields/files.py +++ b/django/db/models/fields/files.py @@ -54,6 +54,11 @@ class FieldFile(File): return self.storage.url(self.name) url = property(_get_url) + def _get_size(self): + self._require_file() + return self.storage.size(self.name) + size = property(_get_size) + def open(self, mode='rb'): self._require_file() return super(FieldFile, self).open(mode) diff --git a/tests/regressiontests/file_storage/models.py b/tests/regressiontests/file_storage/models.py index c0557bcab4a..6a62c5252a1 100644 --- a/tests/regressiontests/file_storage/models.py +++ b/tests/regressiontests/file_storage/models.py @@ -46,5 +46,23 @@ if Image: >>> p2.mugshot.save("shot", ContentFile(image_data)) >>> os.remove(p2.mugshot.path) >>> p2.delete() + +# Bug #8534: FileField.size should not leave the file open. +>>> p3 = Person(name="Joan") +>>> p3.mugshot.save("shot", ContentFile(image_data)) + +# Get a "clean" model instance +>>> p3 = Person.objects.get(name="Joan") + +# It won't have an opened file. This is a bit brittle since it depends on the +# the internals of FieldFile, but there's no other way of telling if the +# file's been opened or not. +>>> hasattr(p3.mugshot, '_file') +False + +# After asking for the size, the file should still be closed. +>>> _ = p3.mugshot.size +>>> hasattr(p3.mugshot, '_file') +False """} \ No newline at end of file