Explorar el Código

Fixed #13308 -- Ensured that dumpdata correctly interacts with router allow_syncdb directions. Thanks to Francis (wizard_2) for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12940 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Russell Keith-Magee hace 15 años
padre
commit
7b47609629

+ 2 - 2
django/core/management/commands/dumpdata.py

@@ -1,7 +1,7 @@
 from django.core.exceptions import ImproperlyConfigured
 from django.core.management.base import BaseCommand, CommandError
 from django.core import serializers
-from django.db import connections, DEFAULT_DB_ALIAS
+from django.db import connections, router, DEFAULT_DB_ALIAS
 from django.utils.datastructures import SortedDict
 
 from optparse import make_option
@@ -79,7 +79,7 @@ class Command(BaseCommand):
         # Now collate the objects to be serialized.
         objects = []
         for model in sort_dependencies(app_list.items()):
-            if not model._meta.proxy:
+            if not model._meta.proxy and router.allow_syncdb(using, model):
                 objects.extend(model._default_manager.using(using).all())
 
         try:

+ 28 - 1
tests/regressiontests/multiple_database/tests.py

@@ -1,8 +1,11 @@
 import datetime
 import pickle
+import sys
+from StringIO import StringIO
 
 from django.conf import settings
 from django.contrib.auth.models import User
+from django.core import management
 from django.db import connections, router, DEFAULT_DB_ALIAS
 from django.db.utils import ConnectionRouter
 from django.test import TestCase
@@ -1211,10 +1214,19 @@ class AuthTestCase(TestCase):
         self.old_routers = router.routers
         router.routers = [AuthRouter()]
 
+        # Redirect stdout to a buffer so we can test
+        # the output of a management command
+        self.old_stdout = sys.stdout
+        self.stdout = StringIO()
+        sys.stdout = self.stdout
+
     def tearDown(self):
         # Restore the 'other' database as an independent database
         router.routers = self.old_routers
 
+        # Restore stdout
+        sys.stdout = self.old_stdout
+
     def test_auth_manager(self):
         "The methods on the auth manager obey database hints"
         # Create one user using default allocation policy
@@ -1243,6 +1255,22 @@ class AuthTestCase(TestCase):
         self.assertEquals(User.objects.using('default').count(), 1)
         self.assertEquals(User.objects.using('other').count(), 1)
 
+    def test_dumpdata(self):
+        "Check that dumpdata honors allow_syncdb restrictions on the router"
+        User.objects.create_user('alice', 'alice@example.com')
+        User.objects.db_manager('default').create_user('bob', 'bob@example.com')
+
+        # Check that dumping the default database doesn't try to include auth
+        # because allow_syncdb prohibits auth on default
+        self.stdout.flush()
+        management.call_command('dumpdata', 'auth', format='json', database='default')
+        self.assertEquals(self.stdout.getvalue(), '[]\n')
+
+        # Check that dumping the other database does include auth
+        self.stdout.flush()
+        management.call_command('dumpdata', 'auth', format='json', database='other')
+        self.assertTrue('alice@example.com' in self.stdout.getvalue())
+
 class UserProfileTestCase(TestCase):
     def setUp(self):
         self.old_auth_profile_module = getattr(settings, 'AUTH_PROFILE_MODULE', None)
@@ -1307,7 +1335,6 @@ class FixtureTestCase(TestCase):
         except Book.DoesNotExist:
             self.fail('"The Definitive Guide to Django" should exist on both databases')
 
-
 class PickleQuerySetTestCase(TestCase):
     multi_db = True