diff options
| author | Jacob Kaplan-Moss <jacob@jacobian.org> | 2010-02-23 22:39:22 +0000 |
|---|---|---|
| committer | Jacob Kaplan-Moss <jacob@jacobian.org> | 2010-02-23 22:39:22 +0000 |
| commit | 5366aa96fef0ce55fc425cf273c7debe74d99305 (patch) | |
| tree | af4e584bfc0fcdc4b7bb8e86d1f398e41e01d169 /tests | |
| parent | 43b47a87d3ae075937b7dc181f8284576e5d73ac (diff) | |
Fixed #10258: handle duplicate file names better.
Instead of just continually appending "_" to duplicate file names, Django's
default storage now appends `_1`, `_2`, `_3`, etc.
Thanks to ianschenck and Thilo.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12552 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/modeltests/files/models.py | 23 | ||||
| -rw-r--r-- | tests/regressiontests/file_storage/tests.py | 8 |
2 files changed, 21 insertions, 10 deletions
diff --git a/tests/modeltests/files/models.py b/tests/modeltests/files/models.py index beea97e808..271fd8de9e 100644 --- a/tests/modeltests/files/models.py +++ b/tests/modeltests/files/models.py @@ -5,14 +5,11 @@ and where files should be stored. """ -import shutil import random import tempfile from django.db import models from django.core.files.base import ContentFile -from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.storage import FileSystemStorage -from django.core.cache import cache temp_storage_location = tempfile.mkdtemp() temp_storage = FileSystemStorage(location=temp_storage_location) @@ -64,6 +61,7 @@ ValueError: The 'normal' attribute has no file associated with it. # File objects can be assigned to FileField attributes, but shouldn't get # committed until the model it's attached to is saved. +>>> from django.core.files.uploadedfile import SimpleUploadedFile >>> obj1.normal = SimpleUploadedFile('assignment.txt', 'content') >>> dirs, files = temp_storage.listdir('tests') >>> dirs @@ -93,16 +91,17 @@ ValueError: The 'normal' attribute has no file associated with it. >>> obj2 = Storage() >>> obj2.normal.save('django_test.txt', ContentFile('more content')) >>> obj2.normal -<FieldFile: tests/django_test_.txt> +<FieldFile: tests/django_test_1.txt> >>> obj2.normal.size 12 # Push the objects into the cache to make sure they pickle properly +>>> from django.core.cache import cache >>> cache.set('obj1', obj1) >>> cache.set('obj2', obj2) >>> cache.get('obj2').normal -<FieldFile: tests/django_test_.txt> +<FieldFile: tests/django_test_1.txt> # Deleting an object deletes the file it uses, if there are no other objects # still using that file. @@ -110,7 +109,17 @@ ValueError: The 'normal' attribute has no file associated with it. >>> obj2.delete() >>> obj2.normal.save('django_test.txt', ContentFile('more content')) >>> obj2.normal -<FieldFile: tests/django_test_.txt> +<FieldFile: tests/django_test_1.txt> + +# Multiple files with the same name get _N appended to them. + +>>> objs = [Storage() for i in range(3)] +>>> for o in objs: +... o.normal.save('multiple_files.txt', ContentFile('Same Content')) +>>> [o.normal for o in objs] +[<FieldFile: tests/multiple_files.txt>, <FieldFile: tests/multiple_files_1.txt>, <FieldFile: tests/multiple_files_2.txt>] +>>> for o in objs: +... o.delete() # Default values allow an object to access a single file. @@ -139,5 +148,7 @@ ValueError: The 'normal' attribute has no file associated with it. >>> obj2.normal.delete() >>> obj3.default.delete() >>> obj4.random.delete() + +>>> import shutil >>> shutil.rmtree(temp_storage_location) """} diff --git a/tests/regressiontests/file_storage/tests.py b/tests/regressiontests/file_storage/tests.py index 81ea48950c..b1e31d1811 100644 --- a/tests/regressiontests/file_storage/tests.py +++ b/tests/regressiontests/file_storage/tests.py @@ -126,9 +126,9 @@ class FileSaveRaceConditionTest(TestCase): name = self.save_file('conflict') self.thread.join() self.assert_(self.storage.exists('conflict')) - self.assert_(self.storage.exists('conflict_')) + self.assert_(self.storage.exists('conflict_1')) self.storage.delete('conflict') - self.storage.delete('conflict_') + self.storage.delete('conflict_1') class FileStoragePermissions(TestCase): def setUp(self): @@ -167,7 +167,7 @@ class FileStoragePathParsing(TestCase): self.failIf(os.path.exists(os.path.join(self.storage_dir, 'dotted_.path'))) self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/test'))) - self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/test_'))) + self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/test_1'))) def test_first_character_dot(self): """ @@ -183,7 +183,7 @@ class FileStoragePathParsing(TestCase): if sys.version_info < (2, 6): self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/_.test'))) else: - self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/.test_'))) + self.assert_(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/.test_1'))) if Image is not None: class DimensionClosingBug(TestCase): |
