Commit aba75b0d authored by Baptiste Mispelon's avatar Baptiste Mispelon
Browse files

Fixed TypeError when rendering ModelState with multiple bases.

parent 38662d11
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -176,7 +176,7 @@ class ModelState(object):
            for base in self.bases
        )
        if None in bases:
            raise InvalidBasesError("Cannot resolve one or more bases from %r" % self.bases)
            raise InvalidBasesError("Cannot resolve one or more bases from %r" % (self.bases,))
        # Turn fields into a dict for the body, add other bits
        body = dict(self.fields)
        body['Meta'] = meta
+37 −11
Original line number Diff line number Diff line
@@ -94,32 +94,58 @@ class StateTests(TestCase):
        self.assertEqual(new_app_cache.get_model("migrations", "Tag")._meta.get_field_by_name("name")[0].max_length, 100)
        self.assertEqual(new_app_cache.get_model("migrations", "Tag")._meta.get_field_by_name("hidden")[0].null, False)

    def test_render_multiple_inheritance(self):
        # Use a custom app cache to avoid polluting the global one.
        new_app_cache = BaseAppCache()

    def test_render_model_inheritance(self):
        class Book(models.Model):
            title = models.CharField(max_length=1000)

            class Meta:
                app_label = "migrations"
                app_cache = new_app_cache
                app_cache = BaseAppCache()

        class Novel(Book):
            class Meta:
                app_label = "migrations"
                app_cache = new_app_cache
                app_cache = BaseAppCache()

        # First, test rendering individually
        yet_another_app_cache = BaseAppCache()
        app_cache = BaseAppCache()

        # We shouldn't be able to render yet
        with self.assertRaises(ValueError):
            ModelState.from_model(Novel).render(yet_another_app_cache)
        ms = ModelState.from_model(Novel)
        with self.assertRaises(InvalidBasesError):
            ms.render(app_cache)

        # Once the parent model is in the app cache, it should be fine
        ModelState.from_model(Book).render(yet_another_app_cache)
        ModelState.from_model(Novel).render(yet_another_app_cache)
        ModelState.from_model(Book).render(app_cache)
        ModelState.from_model(Novel).render(app_cache)

    def test_render_model_with_multiple_inheritance(self):
        class Foo(models.Model):
            class Meta:
                app_label = "migrations"
                app_cache = BaseAppCache()

        class Bar(models.Model):
            class Meta:
                app_label = "migrations"
                app_cache = BaseAppCache()

        class FooBar(Foo, Bar):
            class Meta:
                app_label = "migrations"
                app_cache = BaseAppCache()

        app_cache = BaseAppCache()

        # We shouldn't be able to render yet
        ms = ModelState.from_model(FooBar)
        with self.assertRaises(InvalidBasesError):
            ms.render(app_cache)

        # Once the parent models are in the app cache, it should be fine
        ModelState.from_model(Foo).render(app_cache)
        ModelState.from_model(Bar).render(app_cache)
        ModelState.from_model(FooBar).render(app_cache)

    def test_render_project_dependencies(self):
        """