Author: jezdez
Date: 2011-09-13 08:10:49 -0700 (Tue, 13 Sep 2011)
New Revision: 16824

Modified:
   django/trunk/django/core/files/storage.py
   django/trunk/docs/releases/1.4.txt
   django/trunk/tests/regressiontests/file_storage/tests.py
Log:
Fixed #16833 -- Removed undocumented `mixin` parameter from the 
`Storage.open()` method as this was an undocumented and obscure feature. Thanks 
to Marty and Russell for sanity-checking.

Modified: django/trunk/django/core/files/storage.py
===================================================================
--- django/trunk/django/core/files/storage.py   2011-09-13 08:22:53 UTC (rev 
16823)
+++ django/trunk/django/core/files/storage.py   2011-09-13 15:10:49 UTC (rev 
16824)
@@ -25,16 +25,11 @@
     # The following methods represent a public interface to private methods.
     # These shouldn't be overridden by subclasses unless absolutely necessary.
 
-    def open(self, name, mode='rb', mixin=None):
+    def open(self, name, mode='rb'):
         """
-        Retrieves the specified file from storage, using the optional mixin
-        class to customize what features are available on the File returned.
+        Retrieves the specified file from storage.
         """
-        file = self._open(name, mode)
-        if mixin:
-            # Add the mixin as a parent class of the File returned from 
storage.
-            file.__class__ = type(mixin.__name__, (mixin, file.__class__), {})
-        return file
+        return self._open(name, mode)
 
     def save(self, name, content):
         """

Modified: django/trunk/docs/releases/1.4.txt
===================================================================
--- django/trunk/docs/releases/1.4.txt  2011-09-13 08:22:53 UTC (rev 16823)
+++ django/trunk/docs/releases/1.4.txt  2011-09-13 15:10:49 UTC (rev 16824)
@@ -527,7 +527,31 @@
 security issues. Any existing usage of ``verify_exists`` should be
 removed.
 
+``django.core.files.storage.Storage.open``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+The ``open`` method of the base Storage class took an obscure parameter
+``mixin`` which allowed to dynamically change the base classes of the
+returned file object. In the rare case you relied on the `mixin` parameter,
+you can easily achieve the same by overriding the `open` method, e.g.::
+
+    from django.core.files import File
+    from django.core.files.storage import FileSystemStorage
+
+    class Spam(File):
+        """
+        Spam, spam, spam, spam and spam.
+        """
+        def ham(self):
+            return 'eggs'
+
+    class SpamStorage(FileSystemStorage):
+        """
+        A custom file storage backend.
+        """
+        def open(self, name, mode='rb'):
+            return Spam(open(self.path(name), mode))
+
 .. _deprecated-features-1.4:
 
 Features deprecated in 1.4

Modified: django/trunk/tests/regressiontests/file_storage/tests.py
===================================================================
--- django/trunk/tests/regressiontests/file_storage/tests.py    2011-09-13 
08:22:53 UTC (rev 16823)
+++ django/trunk/tests/regressiontests/file_storage/tests.py    2011-09-13 
15:10:49 UTC (rev 16824)
@@ -231,26 +231,6 @@
         self.storage.base_url = None
         self.assertRaises(ValueError, self.storage.url, 'test.file')
 
-    def test_file_with_mixin(self):
-        """
-        File storage can get a mixin to extend the functionality of the
-        returned file.
-        """
-        self.assertFalse(self.storage.exists('test.file'))
-
-        class TestFileMixin(object):
-            mixed_in = True
-
-        f = ContentFile('custom contents')
-        f_name = self.storage.save('test.file', f)
-
-        self.assertTrue(isinstance(
-            self.storage.open('test.file', mixin=TestFileMixin),
-            TestFileMixin
-        ))
-
-        self.storage.delete('test.file')
-
     def test_listdir(self):
         """
         File storage returns a tuple containing directories and files.

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

Reply via email to