Example #1
0
    def __init__(self, real_apps, models, ignore_swappable=False):
        # Any apps in self.real_apps should have all their models included
        # in the render. We don't use the original model instances as there
        # are some variables that refer to the Apps object.
        # FKs/M2Ms from real apps are also not included as they just
        # mess things up with partial states (due to lack of dependencies)
        self.real_models = []
        for app_label in real_apps:
            app = global_apps.get_app_config(app_label)
            for model in app.get_models():
                self.real_models.append(
                    ModelState.from_model(model, exclude_rels=True))
        # Populate the app registry with a stub for each application.
        app_labels = {model_state.app_label for model_state in models.values()}
        app_configs = [
            AppConfigStub(label)
            for label in sorted(real_apps + list(app_labels))
        ]
        super().__init__(app_configs)

        # The lock gets in the way of copying as implemented in clone(), which
        # is called whenever Django duplicates a StateApps before updating it.
        self._lock = None

        self.render_multiple(list(models.values()) + self.real_models)

        # There shouldn't be any operations pending at this point.
        from djmodels.core.checks.model_checks import _check_lazy_references
        ignore = {make_model_tuple(settings.AUTH_USER_MODEL)
                  } if ignore_swappable else set()
        errors = _check_lazy_references(self, ignore=ignore)
        if errors:
            raise ValueError("\n".join(error.msg for error in errors))
Example #2
0
 def test_custom_user(self):
     """
     Regression test for #22325 - references to a custom user model defined in the
     same app are not resolved correctly.
     """
     executor = MigrationExecutor(connection)
     self.assertTableNotExists("migrations_author")
     self.assertTableNotExists("migrations_tribble")
     # Migrate forwards
     executor.migrate([("migrations", "0001_initial")])
     self.assertTableExists("migrations_author")
     self.assertTableExists("migrations_tribble")
     # Make sure the soft-application detection works (#23093)
     # Change table_names to not return auth_user during this as
     # it wouldn't be there in a normal run, and ensure migrations.Author
     # exists in the global app registry temporarily.
     old_table_names = connection.introspection.table_names
     connection.introspection.table_names = lambda c: [
         x for x in old_table_names(c) if x != "auth_user"
     ]
     migrations_apps = executor.loader.project_state(
         ("migrations", "0001_initial")).apps
     global_apps.get_app_config(
         "migrations").models["author"] = migrations_apps.get_model(
             "migrations", "author")
     try:
         migration = executor.loader.get_migration("auth", "0001_initial")
         self.assertIs(
             executor.detect_soft_applied(None, migration)[0], True)
     finally:
         connection.introspection.table_names = old_table_names
         del global_apps.get_app_config("migrations").models["author"]
     # And migrate back to clean up the database
     executor.loader.build_graph()
     executor.migrate([("migrations", None)])
     self.assertTableNotExists("migrations_author")
     self.assertTableNotExists("migrations_tribble")
Example #3
0
 def setUp(self):
     self.before_count = ContentType.objects.count()
     self.content_type = ContentType.objects.create(app_label='contenttypes_tests', model='Fake')
     self.app_config = apps.get_app_config('contenttypes_tests')
Example #4
0
 def tearDown(self):
     app_config = apps.get_app_config('contenttypes_tests')
     models.signals.post_migrate.disconnect(self.assertOperationsInjected, sender=app_config)