Ticket #10258: 10258.diff

File 10258.diff, 3.3 KB (added by ianschenck, 6 years ago)

patch

  • django/core/files/storage.py

    diff --git a/django/core/files/storage.py b/django/core/files/storage.py
    index bf30a78..3fb2a2f 100644
    a b  
    11import os
    22import errno
    33import urlparse
     4import itertools
    45
    56from django.conf import settings
    67from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation
    class Storage(object): 
    6364        Returns a filename that's free on the target storage system, and
    6465        available for new content to be written to.
    6566        """
    66         # If the filename already exists, keep adding an underscore to the name
    67         # of the file until the filename doesn't exist.
    68         while self.exists(name):
     67        # If the filename already exists, add a number to the filename
     68        # until an available name is found.
     69        if self.exists(name):
     70            # Build a filename template out of the (existing) name
    6971            try:
    7072                dot_index = name.rindex('.')
    7173            except ValueError: # filename has no dot
    72                 name += '_'
     74                template = "%s_%%d" % (name,)
    7375            else:
    74                 name = name[:dot_index] + '_' + name[dot_index:]
     76                template = "%s_%%d%s" % (name[:dot_index], name[dot_index:],)
     77            # Iterate indefinitely until a filename is found.
     78            count = itertools.count(1)
     79            while self.exists(name):
     80                name = template % count.next()
    7581        return name
    7682
    7783    def path(self, name):
  • tests/modeltests/files/models.py

    diff --git a/tests/modeltests/files/models.py b/tests/modeltests/files/models.py
    index ba3eb99..182eab7 100644
    a b ValueError: The 'normal' attribute has no file associated with it. 
    9393>>> obj2 = Storage()
    9494>>> obj2.normal.save('django_test.txt', ContentFile('more content'))
    9595>>> obj2.normal
    96 <FieldFile: tests/django_test_.txt>
     96<FieldFile: tests/django_test_1.txt>
    9797>>> obj2.normal.size
    989812
    9999
    ValueError: The 'normal' attribute has no file associated with it. 
    102102>>> cache.set('obj1', obj1)
    103103>>> cache.set('obj2', obj2)
    104104>>> cache.get('obj2').normal
    105 <FieldFile: tests/django_test_.txt>
     105<FieldFile: tests/django_test_1.txt>
    106106
    107107# Deleting an object deletes the file it uses, if there are no other objects
    108108# still using that file.
    ValueError: The 'normal' attribute has no file associated with it. 
    110110>>> obj2.delete()
    111111>>> obj2.normal.save('django_test.txt', ContentFile('more content'))
    112112>>> obj2.normal
    113 <FieldFile: tests/django_test_.txt>
     113<FieldFile: tests/django_test_1.txt>
    114114
    115115# Default values allow an object to access a single file.
    116116
  • tests/regressiontests/file_storage/tests.py

    diff --git a/tests/regressiontests/file_storage/tests.py b/tests/regressiontests/file_storage/tests.py
    index 6b219f0..bb1f3eb 100644
    a b class FileSaveRaceConditionTest(TestCase): 
    121121        name = self.save_file('conflict')
    122122        self.thread.join()
    123123        self.assert_(self.storage.exists('conflict'))
    124         self.assert_(self.storage.exists('conflict_'))
     124        self.assert_(self.storage.exists('conflict_1'))
    125125        self.storage.delete('conflict')
    126         self.storage.delete('conflict_')
     126        self.storage.delete('conflict_1')
    127127
    128128class FileStoragePermissions(TestCase):
    129129    def setUp(self):
Back to Top