|
@@ -17,6 +17,7 @@ from django.db.utils import IntegrityError, DatabaseError
|
|
|
from django.test import override_settings
|
|
|
from django.utils import six
|
|
|
|
|
|
+from .models import FoodManager, FoodQuerySet
|
|
|
from .test_base import MigrationTestBase
|
|
|
|
|
|
|
|
@@ -48,7 +49,7 @@ class OperationTestBase(MigrationTestBase):
|
|
|
return project_state, new_state
|
|
|
|
|
|
def set_up_test_model(self, app_label, second_model=False, third_model=False,
|
|
|
- related_model=False, mti_model=False, proxy_model=False,
|
|
|
+ related_model=False, mti_model=False, proxy_model=False, manager_model=False,
|
|
|
unique_together=False, options=False, db_table=None, index_together=False):
|
|
|
"""
|
|
|
Creates a test model state and database table.
|
|
@@ -142,6 +143,18 @@ class OperationTestBase(MigrationTestBase):
|
|
|
options={"proxy": True},
|
|
|
bases=['%s.Pony' % app_label],
|
|
|
))
|
|
|
+ if manager_model:
|
|
|
+ operations.append(migrations.CreateModel(
|
|
|
+ "Food",
|
|
|
+ fields=[
|
|
|
+ ("id", models.AutoField(primary_key=True)),
|
|
|
+ ],
|
|
|
+ managers=[
|
|
|
+ ("food_qs", FoodQuerySet.as_manager()),
|
|
|
+ ("food_mgr", FoodManager("a", "b")),
|
|
|
+ ("food_mgr_kwargs", FoodManager("x", "y", 3, 4)),
|
|
|
+ ]
|
|
|
+ ))
|
|
|
|
|
|
return self.apply_operations(app_label, ProjectState(), operations)
|
|
|
|
|
@@ -186,6 +199,10 @@ class OperationTests(OperationTestBase):
|
|
|
self.assertEqual(definition[0], "CreateModel")
|
|
|
self.assertEqual(definition[1], [])
|
|
|
self.assertEqual(sorted(definition[2].keys()), ["fields", "name"])
|
|
|
+ # And default manager not in set
|
|
|
+ operation = migrations.CreateModel("Foo", fields=[], managers=[("objects", models.Manager())])
|
|
|
+ definition = operation.deconstruct()
|
|
|
+ self.assertNotIn('managers', definition[2])
|
|
|
|
|
|
def test_create_model_with_unique_after(self):
|
|
|
"""
|
|
@@ -365,6 +382,37 @@ class OperationTests(OperationTestBase):
|
|
|
self.assertTableNotExists("test_crummo_unmanagedpony")
|
|
|
self.assertTableExists("test_crummo_pony")
|
|
|
|
|
|
+ def test_create_model_managers(self):
|
|
|
+ """
|
|
|
+ Tests that the managers on a model are set.
|
|
|
+ """
|
|
|
+ project_state = self.set_up_test_model("test_cmoma")
|
|
|
+ # Test the state alteration
|
|
|
+ operation = migrations.CreateModel(
|
|
|
+ "Food",
|
|
|
+ fields=[
|
|
|
+ ("id", models.AutoField(primary_key=True)),
|
|
|
+ ],
|
|
|
+ managers=[
|
|
|
+ ("food_qs", FoodQuerySet.as_manager()),
|
|
|
+ ("food_mgr", FoodManager("a", "b")),
|
|
|
+ ("food_mgr_kwargs", FoodManager("x", "y", 3, 4)),
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ self.assertEqual(operation.describe(), "Create model Food")
|
|
|
+ new_state = project_state.clone()
|
|
|
+ operation.state_forwards("test_cmoma", new_state)
|
|
|
+ self.assertIn(("test_cmoma", "food"), new_state.models)
|
|
|
+ managers = new_state.models["test_cmoma", "food"].managers
|
|
|
+ self.assertEqual(managers[0][0], "food_qs")
|
|
|
+ self.assertIsInstance(managers[0][1], models.Manager)
|
|
|
+ self.assertEqual(managers[1][0], "food_mgr")
|
|
|
+ self.assertIsInstance(managers[1][1], FoodManager)
|
|
|
+ self.assertEqual(managers[1][1].args, ("a", "b", 1, 2))
|
|
|
+ self.assertEqual(managers[2][0], "food_mgr_kwargs")
|
|
|
+ self.assertIsInstance(managers[2][1], FoodManager)
|
|
|
+ self.assertEqual(managers[2][1].args, ("x", "y", 3, 4))
|
|
|
+
|
|
|
def test_delete_model(self):
|
|
|
"""
|
|
|
Tests the DeleteModel operation.
|
|
@@ -1208,6 +1256,61 @@ class OperationTests(OperationTestBase):
|
|
|
self.assertEqual(definition[1], [])
|
|
|
self.assertEqual(definition[2], {'name': "Rider", 'order_with_respect_to': "pony"})
|
|
|
|
|
|
+ def test_alter_model_managers(self):
|
|
|
+ """
|
|
|
+ Tests that the managers on a model are set.
|
|
|
+ """
|
|
|
+ project_state = self.set_up_test_model("test_almoma")
|
|
|
+ # Test the state alteration
|
|
|
+ operation = migrations.AlterModelManagers(
|
|
|
+ "Pony",
|
|
|
+ managers=[
|
|
|
+ ("food_qs", FoodQuerySet.as_manager()),
|
|
|
+ ("food_mgr", FoodManager("a", "b")),
|
|
|
+ ("food_mgr_kwargs", FoodManager("x", "y", 3, 4)),
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ self.assertEqual(operation.describe(), "Change managers on Pony")
|
|
|
+ managers = project_state.models["test_almoma", "pony"].managers
|
|
|
+ self.assertEqual(managers, [])
|
|
|
+
|
|
|
+ new_state = project_state.clone()
|
|
|
+ operation.state_forwards("test_almoma", new_state)
|
|
|
+ self.assertIn(("test_almoma", "pony"), new_state.models)
|
|
|
+ managers = new_state.models["test_almoma", "pony"].managers
|
|
|
+ self.assertEqual(managers[0][0], "food_qs")
|
|
|
+ self.assertIsInstance(managers[0][1], models.Manager)
|
|
|
+ self.assertEqual(managers[1][0], "food_mgr")
|
|
|
+ self.assertIsInstance(managers[1][1], FoodManager)
|
|
|
+ self.assertEqual(managers[1][1].args, ("a", "b", 1, 2))
|
|
|
+ self.assertEqual(managers[2][0], "food_mgr_kwargs")
|
|
|
+ self.assertIsInstance(managers[2][1], FoodManager)
|
|
|
+ self.assertEqual(managers[2][1].args, ("x", "y", 3, 4))
|
|
|
+
|
|
|
+ def test_alter_model_managers_emptying(self):
|
|
|
+ """
|
|
|
+ Tests that the managers on a model are set.
|
|
|
+ """
|
|
|
+ project_state = self.set_up_test_model("test_almomae", manager_model=True)
|
|
|
+ # Test the state alteration
|
|
|
+ operation = migrations.AlterModelManagers("Food", managers=[])
|
|
|
+ self.assertEqual(operation.describe(), "Change managers on Food")
|
|
|
+ self.assertIn(("test_almomae", "food"), project_state.models)
|
|
|
+ managers = project_state.models["test_almomae", "food"].managers
|
|
|
+ self.assertEqual(managers[0][0], "food_qs")
|
|
|
+ self.assertIsInstance(managers[0][1], models.Manager)
|
|
|
+ self.assertEqual(managers[1][0], "food_mgr")
|
|
|
+ self.assertIsInstance(managers[1][1], FoodManager)
|
|
|
+ self.assertEqual(managers[1][1].args, ("a", "b", 1, 2))
|
|
|
+ self.assertEqual(managers[2][0], "food_mgr_kwargs")
|
|
|
+ self.assertIsInstance(managers[2][1], FoodManager)
|
|
|
+ self.assertEqual(managers[2][1].args, ("x", "y", 3, 4))
|
|
|
+
|
|
|
+ new_state = project_state.clone()
|
|
|
+ operation.state_forwards("test_almomae", new_state)
|
|
|
+ managers = new_state.models["test_almomae", "food"].managers
|
|
|
+ self.assertEqual(managers, [])
|
|
|
+
|
|
|
def test_alter_fk(self):
|
|
|
"""
|
|
|
Tests that creating and then altering an FK works correctly
|