Browse Source

Rename pre_ and post_syncdb to *_migrate, with aliases from old names

Andrew Godwin 11 years ago
parent
commit
68e0a169c4

+ 2 - 2
django/contrib/auth/management/__init__.py

@@ -187,7 +187,7 @@ def get_default_username(check_db=True):
             return ''
             return ''
     return default_username
     return default_username
 
 
-signals.post_syncdb.connect(create_permissions,
+signals.post_migrate.connect(create_permissions,
     dispatch_uid="django.contrib.auth.management.create_permissions")
     dispatch_uid="django.contrib.auth.management.create_permissions")
-signals.post_syncdb.connect(create_superuser,
+signals.post_migrate.connect(create_superuser,
     sender=auth_app, dispatch_uid="django.contrib.auth.management.create_superuser")
     sender=auth_app, dispatch_uid="django.contrib.auth.management.create_superuser")

+ 1 - 1
django/contrib/contenttypes/management.py

@@ -88,7 +88,7 @@ def update_all_contenttypes(verbosity=2, **kwargs):
     for app in get_apps():
     for app in get_apps():
         update_contenttypes(app, None, verbosity, **kwargs)
         update_contenttypes(app, None, verbosity, **kwargs)
 
 
-signals.post_syncdb.connect(update_contenttypes)
+signals.post_migrate.connect(update_contenttypes)
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
     update_all_contenttypes()
     update_all_contenttypes()

+ 1 - 1
django/contrib/gis/db/backends/spatialite/creation.py

@@ -45,7 +45,7 @@ class SpatiaLiteCreation(DatabaseCreation):
 
 
         # We need to then do a flush to ensure that any data installed by
         # We need to then do a flush to ensure that any data installed by
         # custom SQL has been removed. The only test data should come from
         # custom SQL has been removed. The only test data should come from
-        # test fixtures, or autogenerated from post_syncdb triggers.
+        # test fixtures, or autogenerated from post_migrate triggers.
         # This has the side effect of loading initial data (which was
         # This has the side effect of loading initial data (which was
         # intentionally skipped in the syncdb).
         # intentionally skipped in the syncdb).
         call_command('flush',
         call_command('flush',

+ 1 - 1
django/contrib/sites/management.py

@@ -33,4 +33,4 @@ def create_default_site(app, created_models, verbosity, db, **kwargs):
 
 
     Site.objects.clear_cache()
     Site.objects.clear_cache()
 
 
-signals.post_syncdb.connect(create_default_site, sender=site_app)
+signals.post_migrate.connect(create_default_site, sender=site_app)

+ 11 - 11
django/core/management/commands/flush.py

@@ -6,7 +6,7 @@ from django.db import connections, router, transaction, models, DEFAULT_DB_ALIAS
 from django.core.management import call_command
 from django.core.management import call_command
 from django.core.management.base import NoArgsCommand, CommandError
 from django.core.management.base import NoArgsCommand, CommandError
 from django.core.management.color import no_style
 from django.core.management.color import no_style
-from django.core.management.sql import sql_flush, emit_post_sync_signal
+from django.core.management.sql import sql_flush, emit_post_migrate_signal
 from django.utils.importlib import import_module
 from django.utils.importlib import import_module
 from django.utils.six.moves import input
 from django.utils.six.moves import input
 from django.utils import six
 from django.utils import six
@@ -23,8 +23,8 @@ class Command(NoArgsCommand):
             help='Tells Django not to load any initial data after database synchronization.'),
             help='Tells Django not to load any initial data after database synchronization.'),
     )
     )
     help = ('Returns the database to the state it was in immediately after '
     help = ('Returns the database to the state it was in immediately after '
-           'syncdb was executed. This means that all data will be removed '
-           'from the database, any post-synchronization handlers will be '
+           'migrate was first executed. This means that all data will be removed '
+           'from the database, any post-migration handlers will be '
            're-executed, and the initial_data fixture will be re-installed.')
            're-executed, and the initial_data fixture will be re-installed.')
 
 
     def handle_noargs(self, **options):
     def handle_noargs(self, **options):
@@ -35,7 +35,7 @@ class Command(NoArgsCommand):
         # The following are stealth options used by Django's internals.
         # The following are stealth options used by Django's internals.
         reset_sequences = options.get('reset_sequences', True)
         reset_sequences = options.get('reset_sequences', True)
         allow_cascade = options.get('allow_cascade', False)
         allow_cascade = options.get('allow_cascade', False)
-        inhibit_post_syncdb = options.get('inhibit_post_syncdb', False)
+        inhibit_post_migrate = options.get('inhibit_post_migrate', False)
 
 
         self.style = no_style()
         self.style = no_style()
 
 
@@ -54,7 +54,7 @@ class Command(NoArgsCommand):
         if interactive:
         if interactive:
             confirm = input("""You have requested a flush of the database.
             confirm = input("""You have requested a flush of the database.
 This will IRREVERSIBLY DESTROY all data currently in the %r database,
 This will IRREVERSIBLY DESTROY all data currently in the %r database,
-and return each table to the state it was in after syncdb.
+and return each table to a fresh state.
 Are you sure you want to do this?
 Are you sure you want to do this?
 
 
     Type 'yes' to continue, or 'no' to cancel: """ % connection.settings_dict['NAME'])
     Type 'yes' to continue, or 'no' to cancel: """ % connection.settings_dict['NAME'])
@@ -77,8 +77,8 @@ Are you sure you want to do this?
                     "The full error: %s") % (connection.settings_dict['NAME'], e)
                     "The full error: %s") % (connection.settings_dict['NAME'], e)
                 six.reraise(CommandError, CommandError(new_msg), sys.exc_info()[2])
                 six.reraise(CommandError, CommandError(new_msg), sys.exc_info()[2])
 
 
-            if not inhibit_post_syncdb:
-                self.emit_post_syncdb(verbosity, interactive, db)
+            if not inhibit_post_migrate:
+                self.emit_post_migrate(verbosity, interactive, db)
 
 
             # Reinstall the initial_data fixture.
             # Reinstall the initial_data fixture.
             if options.get('load_initial_data'):
             if options.get('load_initial_data'):
@@ -89,13 +89,13 @@ Are you sure you want to do this?
             self.stdout.write("Flush cancelled.\n")
             self.stdout.write("Flush cancelled.\n")
 
 
     @staticmethod
     @staticmethod
-    def emit_post_syncdb(verbosity, interactive, database):
-        # Emit the post sync signal. This allows individual applications to
-        # respond as if the database had been sync'd from scratch.
+    def emit_post_migrate(verbosity, interactive, database):
+        # Emit the post migrate signal. This allows individual applications to
+        # respond as if the database had been migrated from scratch.
         all_models = []
         all_models = []
         for app in models.get_apps():
         for app in models.get_apps():
             all_models.extend([
             all_models.extend([
                 m for m in models.get_models(app, include_auto_created=True)
                 m for m in models.get_models(app, include_auto_created=True)
                 if router.allow_syncdb(database, m)
                 if router.allow_syncdb(database, m)
             ])
             ])
-        emit_post_sync_signal(set(all_models), verbosity, interactive, database)
+        emit_post_migrate_signal(set(all_models), verbosity, interactive, database)

+ 14 - 7
django/core/management/commands/migrate.py

@@ -6,7 +6,7 @@ from django.conf import settings
 from django.core.management import call_command
 from django.core.management import call_command
 from django.core.management.base import BaseCommand, CommandError
 from django.core.management.base import BaseCommand, CommandError
 from django.core.management.color import color_style, no_style
 from django.core.management.color import color_style, no_style
-from django.core.management.sql import custom_sql_for_model, emit_post_sync_signal, emit_pre_sync_signal
+from django.core.management.sql import custom_sql_for_model, emit_post_migrate_signal, emit_pre_migrate_signal
 from django.db import connections, router, transaction, models, DEFAULT_DB_ALIAS
 from django.db import connections, router, transaction, models, DEFAULT_DB_ALIAS
 from django.db.migrations.executor import MigrationExecutor
 from django.db.migrations.executor import MigrationExecutor
 from django.db.migrations.loader import AmbiguityError
 from django.db.migrations.loader import AmbiguityError
@@ -99,10 +99,14 @@ class Command(BaseCommand):
 
 
         # Run the syncdb phase.
         # Run the syncdb phase.
         # If you ever manage to get rid of this, I owe you many, many drinks.
         # If you ever manage to get rid of this, I owe you many, many drinks.
+        # Note that pre_migrate is called from inside here, as it needs
+        # the list of models about to be installed.
         if run_syncdb:
         if run_syncdb:
             if self.verbosity >= 1:
             if self.verbosity >= 1:
                 self.stdout.write(self.style.MIGRATE_HEADING("Synchronizing apps without migrations:"))
                 self.stdout.write(self.style.MIGRATE_HEADING("Synchronizing apps without migrations:"))
-            self.sync_apps(connection, executor.loader.unmigrated_apps)
+            created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
+        else:
+            created_models = []
 
 
         # Migrate!
         # Migrate!
         if self.verbosity >= 1:
         if self.verbosity >= 1:
@@ -113,6 +117,10 @@ class Command(BaseCommand):
         else:
         else:
             executor.migrate(targets, plan, fake=options.get("fake", False))
             executor.migrate(targets, plan, fake=options.get("fake", False))
 
 
+        # Send the post_migrate signal, so individual apps can do whatever they need
+        # to do at this point.
+        emit_post_migrate_signal(created_models, self.verbosity, self.interactive, connection.alias)
+
     def migration_progress_callback(self, action, migration):
     def migration_progress_callback(self, action, migration):
         if self.verbosity >= 1:
         if self.verbosity >= 1:
             if action == "apply_start":
             if action == "apply_start":
@@ -159,7 +167,7 @@ class Command(BaseCommand):
         )
         )
 
 
         create_models = set([x for x in itertools.chain(*manifest.values())])
         create_models = set([x for x in itertools.chain(*manifest.values())])
-        emit_pre_sync_signal(create_models, self.verbosity, self.interactive, connection.alias)
+        emit_pre_migrate_signal(create_models, self.verbosity, self.interactive, connection.alias)
 
 
         # Create the tables for each model
         # Create the tables for each model
         if self.verbosity >= 1:
         if self.verbosity >= 1:
@@ -188,10 +196,6 @@ class Command(BaseCommand):
         # If you can prove we don't need this, remove it.
         # If you can prove we don't need this, remove it.
         transaction.set_dirty(using=connection.alias)
         transaction.set_dirty(using=connection.alias)
 
 
-        # Send the post_syncdb signal, so individual apps can do whatever they need
-        # to do at this point.
-        emit_post_sync_signal(created_models, self.verbosity, self.interactive, connection.alias)
-
         # The connection may have been closed by a syncdb handler.
         # The connection may have been closed by a syncdb handler.
         cursor = connection.cursor()
         cursor = connection.cursor()
 
 
@@ -220,6 +224,7 @@ class Command(BaseCommand):
 
 
         if self.verbosity >= 1:
         if self.verbosity >= 1:
             self.stdout.write("  Installing indexes...\n")
             self.stdout.write("  Installing indexes...\n")
+
         # Install SQL indices for all newly created models
         # Install SQL indices for all newly created models
         for app_name, model_list in manifest.items():
         for app_name, model_list in manifest.items():
             for model in model_list:
             for model in model_list:
@@ -238,3 +243,5 @@ class Command(BaseCommand):
         # Load initial_data fixtures (unless that has been disabled)
         # Load initial_data fixtures (unless that has been disabled)
         if self.load_initial_data:
         if self.load_initial_data:
             call_command('loaddata', 'initial_data', verbosity=self.verbosity, database=connection.alias, skip_validation=True)
             call_command('loaddata', 'initial_data', verbosity=self.verbosity, database=connection.alias, skip_validation=True)
+
+        return created_models

+ 8 - 8
django/core/management/sql.py

@@ -192,25 +192,25 @@ def custom_sql_for_model(model, style, connection):
     return output
     return output
 
 
 
 
-def emit_pre_sync_signal(create_models, verbosity, interactive, db):
-    # Emit the pre_sync signal for every application.
+def emit_pre_migrate_signal(create_models, verbosity, interactive, db):
+    # Emit the pre_migrate signal for every application.
     for app in models.get_apps():
     for app in models.get_apps():
         app_name = app.__name__.split('.')[-2]
         app_name = app.__name__.split('.')[-2]
         if verbosity >= 2:
         if verbosity >= 2:
-            print("Running pre-sync handlers for application %s" % app_name)
-        models.signals.pre_syncdb.send(sender=app, app=app,
+            print("Running pre-migrate handlers for application %s" % app_name)
+        models.signals.pre_migrate.send(sender=app, app=app,
                                        create_models=create_models,
                                        create_models=create_models,
                                        verbosity=verbosity,
                                        verbosity=verbosity,
                                        interactive=interactive,
                                        interactive=interactive,
                                        db=db)
                                        db=db)
 
 
 
 
-def emit_post_sync_signal(created_models, verbosity, interactive, db):
-    # Emit the post_sync signal for every application.
+def emit_post_migrate_signal(created_models, verbosity, interactive, db):
+    # Emit the post_migrate signal for every application.
     for app in models.get_apps():
     for app in models.get_apps():
         app_name = app.__name__.split('.')[-2]
         app_name = app.__name__.split('.')[-2]
         if verbosity >= 2:
         if verbosity >= 2:
-            print("Running post-sync handlers for application %s" % app_name)
-        models.signals.post_syncdb.send(sender=app, app=app,
+            print("Running post-migrate handlers for application %s" % app_name)
+        models.signals.post_migrate.send(sender=app, app=app,
             created_models=created_models, verbosity=verbosity,
             created_models=created_models, verbosity=verbosity,
             interactive=interactive, db=db)
             interactive=interactive, db=db)

+ 1 - 1
django/db/backends/creation.py

@@ -344,7 +344,7 @@ class BaseDatabaseCreation(object):
 
 
         # We need to then do a flush to ensure that any data installed by
         # We need to then do a flush to ensure that any data installed by
         # custom SQL has been removed. The only test data should come from
         # custom SQL has been removed. The only test data should come from
-        # test fixtures, or autogenerated from post_syncdb triggers.
+        # test fixtures, or autogenerated from post_migrate triggers.
         # This has the side effect of loading initial data (which was
         # This has the side effect of loading initial data (which was
         # intentionally skipped in the syncdb).
         # intentionally skipped in the syncdb).
         call_command('flush',
         call_command('flush',

+ 4 - 2
django/db/models/signals.py

@@ -12,7 +12,9 @@ post_save = Signal(providing_args=["instance", "raw", "created", "using", "updat
 pre_delete = Signal(providing_args=["instance", "using"], use_caching=True)
 pre_delete = Signal(providing_args=["instance", "using"], use_caching=True)
 post_delete = Signal(providing_args=["instance", "using"], use_caching=True)
 post_delete = Signal(providing_args=["instance", "using"], use_caching=True)
 
 
-pre_syncdb = Signal(providing_args=["app", "create_models", "verbosity", "interactive", "db"])
-post_syncdb = Signal(providing_args=["class", "app", "created_models", "verbosity", "interactive", "db"], use_caching=True)
+pre_migrate = Signal(providing_args=["app", "create_models", "verbosity", "interactive", "db"])
+pre_syncdb = pre_migrate
+post_migrate = Signal(providing_args=["class", "app", "created_models", "verbosity", "interactive", "db"], use_caching=True)
+post_syncdb = post_migrate
 
 
 m2m_changed = Signal(providing_args=["action", "instance", "reverse", "model", "pk_set", "using"], use_caching=True)
 m2m_changed = Signal(providing_args=["action", "instance", "reverse", "model", "pk_set", "using"], use_caching=True)

+ 5 - 6
django/test/testcases.py

@@ -718,7 +718,7 @@ class TransactionTestCase(SimpleTestCase):
         """Performs any pre-test setup. This includes:
         """Performs any pre-test setup. This includes:
 
 
         * If the class has an 'available_apps' attribute, restricting the app
         * If the class has an 'available_apps' attribute, restricting the app
-          cache to these applications, then firing post_syncdb -- it must run
+          cache to these applications, then firing post_migrate -- it must run
           with the correct set of applications for the test case.
           with the correct set of applications for the test case.
         * If the class has a 'fixtures' attribute, installing these fixtures.
         * If the class has a 'fixtures' attribute, installing these fixtures.
         """
         """
@@ -726,8 +726,7 @@ class TransactionTestCase(SimpleTestCase):
         if self.available_apps is not None:
         if self.available_apps is not None:
             cache.set_available_apps(self.available_apps)
             cache.set_available_apps(self.available_apps)
             for db_name in self._databases_names(include_mirrors=False):
             for db_name in self._databases_names(include_mirrors=False):
-                flush.Command.emit_post_syncdb(
-                        verbosity=0, interactive=False, database=db_name)
+                flush.Command.emit_post_migrate(verbosity=0, interactive=False, database=db_name)
         try:
         try:
             self._fixture_setup()
             self._fixture_setup()
         except Exception:
         except Exception:
@@ -772,7 +771,7 @@ class TransactionTestCase(SimpleTestCase):
         """Performs any post-test things. This includes:
         """Performs any post-test things. This includes:
 
 
         * Flushing the contents of the database, to leave a clean slate. If
         * Flushing the contents of the database, to leave a clean slate. If
-          the class has an 'available_apps' attribute, post_syncdb isn't fired.
+          the class has an 'available_apps' attribute, post_migrate isn't fired.
         * Force-closing the connection, so the next test gets a clean cursor.
         * Force-closing the connection, so the next test gets a clean cursor.
         """
         """
         try:
         try:
@@ -790,14 +789,14 @@ class TransactionTestCase(SimpleTestCase):
             cache.unset_available_apps()
             cache.unset_available_apps()
 
 
     def _fixture_teardown(self):
     def _fixture_teardown(self):
-        # Allow TRUNCATE ... CASCADE and don't emit the post_syncdb signal
+        # Allow TRUNCATE ... CASCADE and don't emit the post_migrate signal
         # when flushing only a subset of the apps
         # when flushing only a subset of the apps
         for db_name in self._databases_names(include_mirrors=False):
         for db_name in self._databases_names(include_mirrors=False):
             call_command('flush', verbosity=0, interactive=False,
             call_command('flush', verbosity=0, interactive=False,
                          database=db_name, skip_validation=True,
                          database=db_name, skip_validation=True,
                          reset_sequences=False,
                          reset_sequences=False,
                          allow_cascade=self.available_apps is not None,
                          allow_cascade=self.available_apps is not None,
-                         inhibit_post_syncdb=self.available_apps is not None)
+                         inhibit_post_migrate=self.available_apps is not None)
 
 
     def assertQuerysetEqual(self, qs, values, transform=repr, ordered=True):
     def assertQuerysetEqual(self, qs, values, transform=repr, ordered=True):
         items = six.moves.map(transform, qs)
         items = six.moves.map(transform, qs)

+ 1 - 1
docs/ref/contrib/sites.txt

@@ -267,7 +267,7 @@ To enable the sites framework, follow these steps:
 3. Run :djadmin:`migrate`.
 3. Run :djadmin:`migrate`.
 
 
 ``django.contrib.sites`` registers a
 ``django.contrib.sites`` registers a
-:data:`~django.db.models.signals.post_syncdb` signal handler which creates a
+:data:`~django.db.models.signals.post_migrate` signal handler which creates a
 default site named ``example.com`` with the domain ``example.com``. This site
 default site named ``example.com`` with the domain ``example.com``. This site
 will also be created after Django creates the test database. To set the
 will also be created after Django creates the test database. To set the
 correct name and domain for your project, you can use an :doc:`initial data
 correct name and domain for your project, you can use an :doc:`initial data

+ 59 - 28
docs/ref/signals.txt

@@ -360,40 +360,36 @@ Management signals
 
 
 Signals sent by :doc:`django-admin </ref/django-admin>`.
 Signals sent by :doc:`django-admin </ref/django-admin>`.
 
 
-pre_syncdb
-----------
+pre_migrate
+-----------
 
 
-.. data:: django.db.models.signals.pre_syncdb
+.. data:: django.db.models.signals.pre_migrate
    :module:
    :module:
 
 
-Sent by the :djadmin:`syncdb` command before it starts to install an
+Sent by the :djadmin:`migrate` command before it starts to install an
 application.
 application.
 
 
 Any handlers that listen to this signal need to be written in a particular
 Any handlers that listen to this signal need to be written in a particular
 place: a ``management`` module in one of your :setting:`INSTALLED_APPS`. If
 place: a ``management`` module in one of your :setting:`INSTALLED_APPS`. If
 handlers are registered anywhere else they may not be loaded by
 handlers are registered anywhere else they may not be loaded by
-:djadmin:`syncdb`.
+:djadmin:`migrate`.
 
 
 Arguments sent with this signal:
 Arguments sent with this signal:
 
 
 ``sender``
 ``sender``
-    The ``models`` module that was just installed. That is, if
-    :djadmin:`syncdb` just installed an app called ``"foo.bar.myapp"``,
-    ``sender`` will be the ``foo.bar.myapp.models`` module.
+    The ``models`` module of the app about to be migrated/synced.
+    For example, if :djadmin:`migrate` is about to install
+    an app called ``"foo.bar.myapp"``, ``sender`` will be the
+    ``foo.bar.myapp.models`` module.
 
 
 ``app``
 ``app``
     Same as ``sender``.
     Same as ``sender``.
 
 
-``create_models``
-    A list of the model classes from any app which :djadmin:`syncdb` plans to
-    create.
-
-
 ``verbosity``
 ``verbosity``
     Indicates how much information manage.py is printing on screen. See
     Indicates how much information manage.py is printing on screen. See
     the :djadminopt:`--verbosity` flag for details.
     the :djadminopt:`--verbosity` flag for details.
 
 
-    Functions which listen for :data:`pre_syncdb` should adjust what they
+    Functions which listen for :data:`pre_migrate` should adjust what they
     output to the screen based on the value of this argument.
     output to the screen based on the value of this argument.
 
 
 ``interactive``
 ``interactive``
@@ -407,42 +403,57 @@ Arguments sent with this signal:
 ``db``
 ``db``
     The alias of database on which a command will operate.
     The alias of database on which a command will operate.
 
 
-post_syncdb
------------
 
 
-.. data:: django.db.models.signals.post_syncdb
+pre_syncdb
+----------
+
+.. data:: django.db.models.signals.pre_syncdb
    :module:
    :module:
 
 
-Sent by the :djadmin:`syncdb` command after it installs an application, and the
+.. deprecated:: 1.7
+
+    This signal has been renamed to :data:`~django.db.models.signals.pre_migrate`.
+
+Alias of :data:`django.db.models.signals.pre_migrate`. As long as this alias
+is present, for backwards-compatability this signal has an extra argument it sends:
+
+``create_models``
+    A list of the model classes from any app which :djadmin:`migrate` is
+    going to create, **only if the app has no migrations**.
+
+
+post_migrate
+------------
+
+.. data:: django.db.models.signals.post_migrate
+   :module:
+
+Sent by the :djadmin:`migrate` command after it installs an application, and the
 :djadmin:`flush` command.
 :djadmin:`flush` command.
 
 
 Any handlers that listen to this signal need to be written in a particular
 Any handlers that listen to this signal need to be written in a particular
 place: a ``management`` module in one of your :setting:`INSTALLED_APPS`. If
 place: a ``management`` module in one of your :setting:`INSTALLED_APPS`. If
 handlers are registered anywhere else they may not be loaded by
 handlers are registered anywhere else they may not be loaded by
-:djadmin:`syncdb`. It is important that handlers of this signal perform
+:djadmin:`migrate`. It is important that handlers of this signal perform
 idempotent changes (e.g. no database alterations) as this may cause the
 idempotent changes (e.g. no database alterations) as this may cause the
 :djadmin:`flush` management command to fail if it also ran during the
 :djadmin:`flush` management command to fail if it also ran during the
-:djadmin:`syncdb` command.
+:djadmin:`migrate` command.
 
 
 Arguments sent with this signal:
 Arguments sent with this signal:
 
 
 ``sender``
 ``sender``
     The ``models`` module that was just installed. That is, if
     The ``models`` module that was just installed. That is, if
-    :djadmin:`syncdb` just installed an app called ``"foo.bar.myapp"``,
+    :djadmin:`migrate` just installed an app called ``"foo.bar.myapp"``,
     ``sender`` will be the ``foo.bar.myapp.models`` module.
     ``sender`` will be the ``foo.bar.myapp.models`` module.
 
 
 ``app``
 ``app``
     Same as ``sender``.
     Same as ``sender``.
 
 
-``created_models``
-    A list of the model classes from any app which :djadmin:`syncdb` has
-    created so far.
-
 ``verbosity``
 ``verbosity``
     Indicates how much information manage.py is printing on screen. See
     Indicates how much information manage.py is printing on screen. See
     the :djadminopt:`--verbosity` flag for details.
     the :djadminopt:`--verbosity` flag for details.
 
 
-    Functions which listen for :data:`post_syncdb` should adjust what they
+    Functions which listen for :data:`post_migrate` should adjust what they
     output to the screen based on the value of this argument.
     output to the screen based on the value of this argument.
 
 
 ``interactive``
 ``interactive``
@@ -459,14 +470,34 @@ Arguments sent with this signal:
 
 
 For example, ``yourapp/management/__init__.py`` could be written like::
 For example, ``yourapp/management/__init__.py`` could be written like::
 
 
-    from django.db.models.signals import post_syncdb
+    from django.db.models.signals import post_migrate
     import yourapp.models
     import yourapp.models
 
 
     def my_callback(sender, **kwargs):
     def my_callback(sender, **kwargs):
         # Your specific logic here
         # Your specific logic here
         pass
         pass
 
 
-    post_syncdb.connect(my_callback, sender=yourapp.models)
+    post_migrate.connect(my_callback, sender=yourapp.models)
+
+
+post_syncdb
+-----------
+
+.. data:: django.db.models.signals.post_syncdb
+   :module:
+
+.. deprecated:: 1.7
+
+    This signal has been renamed to :data:`~django.db.models.signals.post_migrate`.
+
+Alias of :data:`django.db.models.signals.post_migrate`. As long as this alias
+is present, for backwards-compatability this signal has an extra argument it sends:
+
+``created_models``
+    A list of the model classes from any app which :djadmin:`migrate` has
+    created, **only if the app has no migrations**.
+
+
 
 
 Request/response signals
 Request/response signals
 ========================
 ========================

+ 5 - 5
docs/topics/testing/advanced.txt

@@ -182,7 +182,7 @@ Advanced features of ``TransactionTestCase``
 
 
     By default, ``available_apps`` is set to ``None``. After each test, Django
     By default, ``available_apps`` is set to ``None``. After each test, Django
     calls :djadmin:`flush` to reset the database state. This empties all tables
     calls :djadmin:`flush` to reset the database state. This empties all tables
-    and emits the :data:`~django.db.models.signals.post_syncdb` signal, which
+    and emits the :data:`~django.db.models.signals.post_migrate` signal, which
     re-creates one content type and three permissions for each model. This
     re-creates one content type and three permissions for each model. This
     operation gets expensive proportionally to the number of models.
     operation gets expensive proportionally to the number of models.
 
 
@@ -190,13 +190,13 @@ Advanced features of ``TransactionTestCase``
     behave as if only the models from these applications were available. The
     behave as if only the models from these applications were available. The
     behavior of ``TransactionTestCase`` changes as follows:
     behavior of ``TransactionTestCase`` changes as follows:
 
 
-    - :data:`~django.db.models.signals.post_syncdb` is fired before each
+    - :data:`~django.db.models.signals.post_migrate` is fired before each
       test to create the content types and permissions for each model in
       test to create the content types and permissions for each model in
       available apps, in case they're missing.
       available apps, in case they're missing.
     - After each test, Django empties only tables corresponding to models in
     - After each test, Django empties only tables corresponding to models in
       available apps. However, at the database level, truncation may cascade to
       available apps. However, at the database level, truncation may cascade to
       related models in unavailable apps. Furthermore
       related models in unavailable apps. Furthermore
-      :data:`~django.db.models.signals.post_syncdb` isn't fired; it will be
+      :data:`~django.db.models.signals.post_migrate` isn't fired; it will be
       fired by the next ``TransactionTestCase``, after the correct set of
       fired by the next ``TransactionTestCase``, after the correct set of
       applications is selected.
       applications is selected.
 
 
@@ -205,10 +205,10 @@ Advanced features of ``TransactionTestCase``
     cause unrelated tests to fail. Be careful with tests that use sessions;
     cause unrelated tests to fail. Be careful with tests that use sessions;
     the default session engine stores them in the database.
     the default session engine stores them in the database.
 
 
-    Since :data:`~django.db.models.signals.post_syncdb` isn't emitted after
+    Since :data:`~django.db.models.signals.post_migrate` isn't emitted after
     flushing the database, its state after a ``TransactionTestCase`` isn't the
     flushing the database, its state after a ``TransactionTestCase`` isn't the
     same as after a ``TestCase``: it's missing the rows created by listeners
     same as after a ``TestCase``: it's missing the rows created by listeners
-    to :data:`~django.db.models.signals.post_syncdb`. Considering the
+    to :data:`~django.db.models.signals.post_migrate`. Considering the
     :ref:`order in which tests are executed <order-of-tests>`, this isn't an
     :ref:`order in which tests are executed <order-of-tests>`, this isn't an
     issue, provided either all ``TransactionTestCase`` in a given test suite
     issue, provided either all ``TransactionTestCase`` in a given test suite
     declare ``available_apps``, or none of them.
     declare ``available_apps``, or none of them.