Loading django/db/migrations/state.py +5 −6 Original line number Diff line number Diff line Loading @@ -14,6 +14,9 @@ class ProjectState(object): self.models = models or {} self.app_cache = None def add_model_state(self, model_state): self.models[(model_state.app_label, model_state.name.lower())] = model_state def clone(self): "Returns an exact copy of this ProjectState" return ProjectState( Loading @@ -24,7 +27,7 @@ class ProjectState(object): "Turns the project state into actual models in a new AppCache" if self.app_cache is None: self.app_cache = BaseAppCache() for model in self.model.values: for model in self.models.values(): model.render(self.app_cache) return self.app_cache Loading Loading @@ -90,10 +93,6 @@ class ModelState(object): meta = type("Meta", tuple(), meta_contents) # Then, work out our bases # TODO: Use the actual bases if self.bases: raise NotImplementedError("Custom bases not quite done yet!") else: bases = [models.Model] # Turn fields into a dict for the body, add other bits body = dict(self.fields) body['Meta'] = meta Loading @@ -101,6 +100,6 @@ class ModelState(object): # Then, make a Model object return type( self.name, tuple(bases), tuple(self.bases), body, ) tests/migrations/test_state.py +30 −1 Original line number Diff line number Diff line from django.test import TestCase from django.db import models from django.db.models.loading import BaseAppCache from django.db.migrations.state import ProjectState from django.db.migrations.state import ProjectState, ModelState class StateTests(TestCase): Loading @@ -13,6 +13,7 @@ class StateTests(TestCase): """ Tests making a ProjectState from an AppCache """ new_app_cache = BaseAppCache() class Author(models.Model): Loading Loading @@ -41,3 +42,31 @@ class StateTests(TestCase): self.assertEqual(author_state.fields[2][1].null, False) self.assertEqual(author_state.fields[3][1].null, True) self.assertEqual(author_state.bases, (models.Model, )) self.assertEqual(book_state.app_label, "migrations") self.assertEqual(book_state.name, "Book") self.assertEqual([x for x, y in book_state.fields], ["id", "title", "author"]) self.assertEqual(book_state.fields[1][1].max_length, 1000) self.assertEqual(book_state.fields[2][1].null, False) self.assertEqual(book_state.bases, (models.Model, )) def test_render(self): """ Tests rendering a ProjectState into an AppCache. """ project_state = ProjectState() project_state.add_model_state(ModelState( "migrations", "Tag", [ ("id", models.AutoField(primary_key=True)), ("name", models.CharField(max_length=100)), ("hidden", models.BooleanField()), ], {}, None, )) new_app_cache = project_state.render() 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) Loading
django/db/migrations/state.py +5 −6 Original line number Diff line number Diff line Loading @@ -14,6 +14,9 @@ class ProjectState(object): self.models = models or {} self.app_cache = None def add_model_state(self, model_state): self.models[(model_state.app_label, model_state.name.lower())] = model_state def clone(self): "Returns an exact copy of this ProjectState" return ProjectState( Loading @@ -24,7 +27,7 @@ class ProjectState(object): "Turns the project state into actual models in a new AppCache" if self.app_cache is None: self.app_cache = BaseAppCache() for model in self.model.values: for model in self.models.values(): model.render(self.app_cache) return self.app_cache Loading Loading @@ -90,10 +93,6 @@ class ModelState(object): meta = type("Meta", tuple(), meta_contents) # Then, work out our bases # TODO: Use the actual bases if self.bases: raise NotImplementedError("Custom bases not quite done yet!") else: bases = [models.Model] # Turn fields into a dict for the body, add other bits body = dict(self.fields) body['Meta'] = meta Loading @@ -101,6 +100,6 @@ class ModelState(object): # Then, make a Model object return type( self.name, tuple(bases), tuple(self.bases), body, )
tests/migrations/test_state.py +30 −1 Original line number Diff line number Diff line from django.test import TestCase from django.db import models from django.db.models.loading import BaseAppCache from django.db.migrations.state import ProjectState from django.db.migrations.state import ProjectState, ModelState class StateTests(TestCase): Loading @@ -13,6 +13,7 @@ class StateTests(TestCase): """ Tests making a ProjectState from an AppCache """ new_app_cache = BaseAppCache() class Author(models.Model): Loading Loading @@ -41,3 +42,31 @@ class StateTests(TestCase): self.assertEqual(author_state.fields[2][1].null, False) self.assertEqual(author_state.fields[3][1].null, True) self.assertEqual(author_state.bases, (models.Model, )) self.assertEqual(book_state.app_label, "migrations") self.assertEqual(book_state.name, "Book") self.assertEqual([x for x, y in book_state.fields], ["id", "title", "author"]) self.assertEqual(book_state.fields[1][1].max_length, 1000) self.assertEqual(book_state.fields[2][1].null, False) self.assertEqual(book_state.bases, (models.Model, )) def test_render(self): """ Tests rendering a ProjectState into an AppCache. """ project_state = ProjectState() project_state.add_model_state(ModelState( "migrations", "Tag", [ ("id", models.AutoField(primary_key=True)), ("name", models.CharField(max_length=100)), ("hidden", models.BooleanField()), ], {}, None, )) new_app_cache = project_state.render() 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)