add custom Field processing for mixins used in the Model subclasses (#167)

This commit is contained in:
Maxim Kurnikov
2019-09-18 01:40:41 +03:00
committed by GitHub
parent 64720f492c
commit 23ad65033b
4 changed files with 42 additions and 2 deletions

View File

@@ -116,7 +116,9 @@ def transform_into_proper_return_type(ctx: FunctionContext, django_context: Djan
assert isinstance(default_return_type, Instance)
outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class()
if not outer_model_info or not outer_model_info.has_base(fullnames.MODEL_CLASS_FULLNAME):
if (outer_model_info is None
or not outer_model_info.has_base(fullnames.MODEL_CLASS_FULLNAME)
and outer_model_info.fullname() not in helpers.get_all_model_mixins(helpers.get_typechecker_api(ctx))):
# not inside models.Model class
return ctx.default_return_type
assert isinstance(outer_model_info, TypeInfo)

View File

@@ -212,6 +212,18 @@ class AddMetaOptionsAttribute(ModelClassInitializer):
]))
class RecordAllModelMixins(ModelClassInitializer):
def run(self) -> None:
basemodel_info = self.lookup_typeinfo_or_incomplete_defn_error(fullnames.MODEL_CLASS_FULLNAME)
basemodel_metadata = helpers.get_django_metadata(basemodel_info)
if 'model_mixins' not in basemodel_metadata:
basemodel_metadata['model_mixins'] = {}
for base_info in self.model_classdef.info.mro[1:]:
if base_info.fullname() != 'builtins.object':
basemodel_metadata['model_mixins'][base_info.fullname()] = 1
def process_model_class(ctx: ClassDefContext,
django_context: DjangoContext) -> None:
initializers = [
@@ -220,7 +232,8 @@ def process_model_class(ctx: ClassDefContext,
AddRelatedModelsId,
AddManagers,
AddExtraFieldMethods,
AddMetaOptionsAttribute
AddMetaOptionsAttribute,
RecordAllModelMixins,
]
for initializer_cls in initializers:
try: