Commit 14116bc5 authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixed #12672 -- Added the ability to configure which applications are available on which database.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12290 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 6755a039
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -8,15 +8,10 @@ from django.conf import settings
from django.core import serializers
from django.core.management.base import BaseCommand
from django.core.management.color import no_style
from django.db import connections, transaction, DEFAULT_DB_ALIAS
from django.db import connections, router, transaction, DEFAULT_DB_ALIAS
from django.db.models import get_apps
from django.utils.itercompat import product

try:
    set
except NameError:
    from sets import Set as set   # Python 2.3 fallback

try:
    import bz2
    has_bz2 = True
@@ -31,13 +26,10 @@ class Command(BaseCommand):
        make_option('--database', action='store', dest='database',
            default=DEFAULT_DB_ALIAS, help='Nominates a specific database to load '
                'fixtures into. Defaults to the "default" database.'),
        make_option('-e', '--exclude', dest='exclude',action='append', default=[],
            help='App to exclude (use multiple --exclude to exclude multiple apps).'),
    )

    def handle(self, *fixture_labels, **options):
        using = options.get('database', DEFAULT_DB_ALIAS)
        excluded_apps = options.get('exclude', [])

        connection = connections[using]
        self.style = no_style()
@@ -171,7 +163,7 @@ class Command(BaseCommand):
                            try:
                                objects = serializers.deserialize(format, fixture, using=using)
                                for obj in objects:
                                    if obj.object._meta.app_label not in excluded_apps:
                                    if router.allow_syncdb(using, obj.object.__class__):
                                        objects_in_fixture += 1
                                        models.add(obj.object.__class__)
                                        obj.save(using=using)
+14 −16
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@ from django.conf import settings
from django.core.management.base import NoArgsCommand
from django.core.management.color import no_style
from django.core.management.sql import custom_sql_for_model, emit_post_sync_signal
from django.db import connections, transaction, models, DEFAULT_DB_ALIAS
from django.db import connections, router, transaction, models, DEFAULT_DB_ALIAS
from django.utils.importlib import import_module


@@ -16,8 +16,6 @@ class Command(NoArgsCommand):
        make_option('--database', action='store', dest='database',
            default=DEFAULT_DB_ALIAS, help='Nominates a database to synchronize. '
                'Defaults to the "default" database.'),
        make_option('-e', '--exclude', dest='exclude',action='append', default=[],
            help='App to exclude (use multiple --exclude to exclude multiple apps).'),
    )
    help = "Create the database tables for all apps in INSTALLED_APPS whose tables haven't already been created."

@@ -26,7 +24,6 @@ class Command(NoArgsCommand):
        verbosity = int(options.get('verbosity', 1))
        interactive = options.get('interactive')
        show_traceback = options.get('traceback', False)
        exclude = options.get('exclude', [])

        self.style = no_style()

@@ -59,13 +56,16 @@ class Command(NoArgsCommand):
        created_models = set()
        pending_references = {}

        excluded_apps = set(models.get_app(app_label) for app_label in exclude)
        included_apps = set(app for app in models.get_apps() if app not in excluded_apps)
        # Build the manifest of apps and models that are to be synchronized
        manifest = dict(
            (app.__name__.split('.')[-2],
                [m for m in models.get_models(app, include_auto_created=True)
                if router.allow_syncdb(db, m)])
            for app in models.get_apps()
        )

        # Create the tables for each model
        for app in included_apps:
            app_name = app.__name__.split('.')[-2]
            model_list = models.get_models(app, include_auto_created=True)
        for app_name, model_list in manifest.items():
            for model in model_list:
                # Create the model's database table, if it doesn't already exist.
                if verbosity >= 2:
@@ -101,9 +101,8 @@ class Command(NoArgsCommand):

        # Install custom SQL for the app (but only if this
        # is a model we've just created)
        for app in included_apps:
            app_name = app.__name__.split('.')[-2]
            for model in models.get_models(app):
        for app_name, model_list in manifest.items():
            for model in model_list:
                if model in created_models:
                    custom_sql = custom_sql_for_model(model, self.style, connection)
                    if custom_sql:
@@ -126,9 +125,8 @@ class Command(NoArgsCommand):
                            print "No custom SQL for %s.%s model" % (app_name, model._meta.object_name)

        # Install SQL indicies for all newly created models
        for app in included_apps:
            app_name = app.__name__.split('.')[-2]
            for model in models.get_models(app):
        for app_name, model_list in manifest.items():
            for model in model_list:
                if model in created_models:
                    index_sql = connection.creation.sql_indexes_for_model(model, self.style)
                    if index_sql:
@@ -145,4 +143,4 @@ class Command(NoArgsCommand):
                            transaction.commit_unless_managed(using=db)

        from django.core.management import call_command
        call_command('loaddata', 'initial_data', verbosity=verbosity, exclude=exclude, database=db)
        call_command('loaddata', 'initial_data', verbosity=verbosity, database=db)
+7 −0
Original line number Diff line number Diff line
@@ -121,3 +121,10 @@ class ConnectionRouter(object):
            if allow is not None:
                return allow
        return obj1._state.db == obj2._state.db

    def allow_syncdb(self, db, model):
        for router in self.routers:
            allow = router.allow_syncdb(db, model)
            if allow is not None:
                return allow
        return True
+0 −6
Original line number Diff line number Diff line
@@ -284,17 +284,11 @@ class DjangoTestSuiteRunner(object):
        Returns the number of tests that failed.
        """
        self.setup_test_environment()

        suite = self.build_suite(test_labels, extra_tests)

        old_config = self.setup_databases()

        result = self.run_suite(suite)

        self.teardown_databases(old_config)

        self.teardown_test_environment()

        return self.suite_result(result)

def run_tests(test_labels, verbosity=1, interactive=True, failfast=False, extra_tests=None):
+0 −19
Original line number Diff line number Diff line
@@ -423,25 +423,6 @@ define the fixture ``mydata.master.json`` or
have specified that you want to load data onto the ``master``
database.

Excluding applications from loading
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. versionadded:: 1.2

The :djadminopt:`--exclude` option may be provided to prevent specific
applications from being loaded.

For example, if you wanted to exclude models from ``django.contrib.auth``
from being loaded into your database, you would call::

    django-admin.py loaddata mydata.json --exclude auth

This will look for for a JSON fixture called ``mydata`` in all the
usual locations - including the ``fixtures`` directory of the
``django.contrib.auth`` application. However, any fixture object that
identifies itself as belonging to the ``auth`` application (e.g.,
instance of ``auth.User``) would be ignored by loaddata.

makemessages
------------

Loading