Author: russellm
Date: 2008-07-20 07:44:41 -0500 (Sun, 20 Jul 2008)
New Revision: 8007

Modified:
   django/trunk/django/db/models/base.py
   django/trunk/tests/regressiontests/file_uploads/models.py
   django/trunk/tests/regressiontests/file_uploads/tests.py
Log:
Fixed #6450 -- Improved the checking of errors when creating the directories 
for saved files. Thanks to [EMAIL PROTECTED] for the report and patch, and vung 
for the excellent test case.

Modified: django/trunk/django/db/models/base.py
===================================================================
--- django/trunk/django/db/models/base.py       2008-07-20 11:37:20 UTC (rev 
8006)
+++ django/trunk/django/db/models/base.py       2008-07-20 12:44:41 UTC (rev 
8007)
@@ -472,11 +472,12 @@
         return os.path.getsize(self._get_FIELD_filename(field))
 
     def _save_FIELD_file(self, field, filename, raw_field, save=True):
-        directory = field.get_directory_name()
-        try: # Create the date-based directory if it doesn't exist.
-            os.makedirs(os.path.join(settings.MEDIA_ROOT, directory))
-        except OSError: # Directory probably already exists.
-            pass
+        # Create the upload directory if it doesn't already exist
+        directory = os.path.join(settings.MEDIA_ROOT, 
field.get_directory_name())
+        if not os.path.exists(directory):
+            os.makedirs(directory)
+        elif not os.path.isdir(directory):
+            raise IOError('%s exists and is not a directory' % directory)      
  
 
         # Check for old-style usage (files-as-dictionaries). Warn here first
         # since there are multiple locations where we need to support both new

Modified: django/trunk/tests/regressiontests/file_uploads/models.py
===================================================================
--- django/trunk/tests/regressiontests/file_uploads/models.py   2008-07-20 
11:37:20 UTC (rev 8006)
+++ django/trunk/tests/regressiontests/file_uploads/models.py   2008-07-20 
12:44:41 UTC (rev 8007)
@@ -1,2 +1,9 @@
-# This file unintentionally left blank.
-# Oops.
\ No newline at end of file
+import tempfile
+import os
+from django.db import models
+
+UPLOAD_ROOT = tempfile.mkdtemp()
+UPLOAD_TO = os.path.join(UPLOAD_ROOT, 'test_upload')
+
+class FileModel(models.Model):
+    testfile = models.FileField(upload_to=UPLOAD_TO)

Modified: django/trunk/tests/regressiontests/file_uploads/tests.py
===================================================================
--- django/trunk/tests/regressiontests/file_uploads/tests.py    2008-07-20 
11:37:20 UTC (rev 8006)
+++ django/trunk/tests/regressiontests/file_uploads/tests.py    2008-07-20 
12:44:41 UTC (rev 8007)
@@ -1,9 +1,16 @@
 import os
+import errno
 import sha
+import shutil
 import tempfile
+import unittest
+
+from django.core.files.uploadedfile import SimpleUploadedFile
 from django.test import TestCase, client
 from django.utils import simplejson
 
+from models import FileModel, UPLOAD_ROOT, UPLOAD_TO
+
 class FileUploadTests(TestCase):
     def test_simple_upload(self):
         post_data = {
@@ -179,3 +186,42 @@
 
         self.assertEqual(got.get('file1'), 1)
         self.assertEqual(got.get('file2'), 2)
+
+class DirectoryCreationTests(unittest.TestCase):
+    """
+    Tests for error handling during directory creation 
+    via _save_FIELD_file (ticket #6450)
+    """
+    def setUp(self):
+        self.obj = FileModel()
+        if not os.path.isdir(UPLOAD_ROOT):
+            os.makedirs(UPLOAD_ROOT)
+
+    def tearDown(self):
+        os.chmod(UPLOAD_ROOT, 0700)
+        shutil.rmtree(UPLOAD_ROOT)
+
+    def test_readonly_root(self):
+        """Permission errors are not swallowed"""
+        os.chmod(UPLOAD_ROOT, 0500)
+        try:
+            self.obj.save_testfile_file('foo.txt', 
SimpleUploadedFile('foo.txt', 'x'))
+        except OSError, err:
+            self.assertEquals(err.errno, errno.EACCES)
+        except:
+            self.fail("OSError [Errno %s] not raised" % errno.EACCES)
+
+    def test_not_a_directory(self):
+        """The correct IOError is raised when the upload directory name exists 
but isn't a directory"""
+        # Create a file with the upload directory name
+        fd = open(UPLOAD_TO, 'w')
+        fd.close()
+        try:
+            self.obj.save_testfile_file('foo.txt', 
SimpleUploadedFile('foo.txt', 'x'))
+        except IOError, err:
+            # The test needs to be done on a specific string as IOError
+            # is raised even without the patch (just not early enough)
+            self.assertEquals(err.args[0], 
+                              "%s exists and is not a directory" % UPLOAD_TO)
+        except:
+            self.fail("IOError not raised")


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to