Merge "Add hierarchical dependency to current model"

This commit is contained in:
Jenkins 2017-04-06 09:45:31 +00:00 committed by Gerrit Code Review
commit 5135dc38ca
2 changed files with 29 additions and 4 deletions

View File

@ -194,7 +194,7 @@ class _CommonBase(models.Base):
@classmethod
def dependencies(cls):
deps = []
deps = set()
for key, field in cls.iterate_over_fields():
if isinstance(field, fields.ListField):
types = field.items_types
@ -203,11 +203,16 @@ class _CommonBase(models.Base):
for field_type in types:
try:
deps.append(field_type.get_proxied_model())
deps.add(field_type.get_proxied_model())
except AttributeError:
pass
if issubclass(field_type, ModelBase):
# If the field is not a reference, and it is a df
# model(derived from ModelBase), it is considered as
# non-first class model. And its dependency
# will be treated as current model's dependency.
deps |= field_type.dependencies()
return set(deps)
return deps
@classmethod
def is_first_class(cls):

View File

@ -135,6 +135,18 @@ class EmbeddingModel2(mf.ModelBase):
emb_required = fields.EmbeddedField(EmbeddedModel, required=True)
@mf.construct_nb_db_model
class ReffingNonFirstClassModel(mf.ModelBase):
ref1 = df_fields.ReferenceField(ReffedModel)
@mf.register_model
@mf.construct_nb_db_model
class ReffingModel3(mf.ModelBase):
table_name = 'ReffingModel3'
ref = fields.ListField(ReffingNonFirstClassModel)
class TestModelFramework(tests_base.BaseTestCase):
def test_lookup(self):
self.assertEqual(ModelTest, mf.get_model('ModelTest'))
@ -418,3 +430,11 @@ class TestModelFramework(tests_base.BaseTestCase):
(emb1, emb2, emb3),
embedding1.iterate_embedded_model_instances(),
)
def test_hierarchical_dependency(self):
sorted_models = mf.iter_models_by_dependency_order()
self.assertLess(
sorted_models.index(ReffedModel),
sorted_models.index(ReffingModel3)
)
self.assertIn(ReffedModel, ReffingModel3.dependencies())