From aba75b0d71808ed9ebc625e31a47da158f25b29d Mon Sep 17 00:00:00 2001 From: Baptiste Mispelon Date: Fri, 6 Dec 2013 00:55:31 +0100 Subject: [PATCH] Fixed TypeError when rendering ModelState with multiple bases. --- django/db/migrations/state.py | 2 +- tests/migrations/test_state.py | 48 ++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/django/db/migrations/state.py b/django/db/migrations/state.py index 0dd8d85e10c..53c24cb8daa 100644 --- a/django/db/migrations/state.py +++ b/django/db/migrations/state.py @@ -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 diff --git a/tests/migrations/test_state.py b/tests/migrations/test_state.py index fe2092dad1a..889367b41de 100644 --- a/tests/migrations/test_state.py +++ b/tests/migrations/test_state.py @@ -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): """