From 2eb7cb2fffcc382979d0731370de26b051d04659 Mon Sep 17 00:00:00 2001 From: Loïc Bistuer Date: Mon, 20 Jun 2016 23:55:57 +0700 Subject: Fixed #26643 -- Prevented unnecessary AlterModelManagers operations caused by the manager inheritance refactor. This also makes migrations respect the base_manager_name and default_manager_name model options. Thanks Anthony King and Matthew Schinckel for the initial patches. --- tests/migrations/test_state.py | 72 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'tests') diff --git a/tests/migrations/test_state.py b/tests/migrations/test_state.py index d59a08b7b4..d165221aa6 100644 --- a/tests/migrations/test_state.py +++ b/tests/migrations/test_state.py @@ -191,6 +191,78 @@ class StateTests(SimpleTestCase): author_state = project_state.models['migrations', 'author'] self.assertEqual(author_state.managers, [('authors', custom_manager)]) + def test_custom_default_manager_named_objects_with_false_migration_flag(self): + """ + When a manager is added with a name of 'objects' but it does not + have `use_in_migrations = True`, no migration should be added to the + model state (#26643). + """ + new_apps = Apps(['migrations']) + + class Author(models.Model): + objects = models.Manager() + + class Meta: + app_label = 'migrations' + apps = new_apps + + project_state = ProjectState.from_apps(new_apps) + author_state = project_state.models['migrations', 'author'] + self.assertEqual(author_state.managers, []) + + def test_custom_default_manager(self): + new_apps = Apps(['migrations']) + + class Author(models.Model): + manager1 = models.Manager() + manager2 = models.Manager() + + class Meta: + app_label = 'migrations' + apps = new_apps + default_manager_name = 'manager2' + + project_state = ProjectState.from_apps(new_apps) + author_state = project_state.models['migrations', 'author'] + self.assertEqual(author_state.options['default_manager_name'], 'manager2') + self.assertEqual(author_state.managers, [('manager2', Author.manager1)]) + + def test_custom_base_manager(self): + new_apps = Apps(['migrations']) + + class Author(models.Model): + manager1 = models.Manager() + manager2 = models.Manager() + + class Meta: + app_label = 'migrations' + apps = new_apps + base_manager_name = 'manager2' + + class Author2(models.Model): + manager1 = models.Manager() + manager2 = models.Manager() + + class Meta: + app_label = 'migrations' + apps = new_apps + base_manager_name = 'manager1' + + project_state = ProjectState.from_apps(new_apps) + + author_state = project_state.models['migrations', 'author'] + self.assertEqual(author_state.options['base_manager_name'], 'manager2') + self.assertEqual(author_state.managers, [ + ('manager1', Author.manager1), + ('manager2', Author.manager2), + ]) + + author2_state = project_state.models['migrations', 'author2'] + self.assertEqual(author2_state.options['base_manager_name'], 'manager1') + self.assertEqual(author2_state.managers, [ + ('manager1', Author2.manager1), + ]) + def test_apps_bulk_update(self): """ StateApps.bulk_update() should update apps.ready to False and reset -- cgit v1.3