mirror of
https://github.com/davidhalter/django-stubs.git
synced 2025-12-06 20:24:31 +08:00
Use runtime information to determine whether class is a models.Model subclass (#182)
This commit is contained in:
@@ -15,7 +15,7 @@ from mypy_django_plugin.lib import fullnames, helpers
|
||||
def _get_current_field_from_assignment(ctx: FunctionContext, django_context: DjangoContext) -> Optional[Field]:
|
||||
outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class()
|
||||
if (outer_model_info is None
|
||||
or not outer_model_info.has_base(fullnames.MODEL_CLASS_FULLNAME)):
|
||||
or not helpers.is_model_subclass_info(outer_model_info, django_context)):
|
||||
return None
|
||||
|
||||
field_name = None
|
||||
@@ -117,10 +117,9 @@ def transform_into_proper_return_type(ctx: FunctionContext, django_context: Djan
|
||||
|
||||
outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class()
|
||||
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
|
||||
or not helpers.is_model_subclass_info(outer_model_info, django_context)):
|
||||
return ctx.default_return_type
|
||||
|
||||
assert isinstance(outer_model_info, TypeInfo)
|
||||
|
||||
if helpers.has_any_of_bases(default_return_type.type, fullnames.RELATED_FIELDS_CLASSES):
|
||||
|
||||
@@ -218,18 +218,6 @@ 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 = [
|
||||
@@ -241,7 +229,6 @@ def process_model_class(ctx: ClassDefContext,
|
||||
AddRelatedManagers,
|
||||
AddExtraFieldMethods,
|
||||
AddMetaOptionsAttribute,
|
||||
RecordAllModelMixins,
|
||||
]
|
||||
for initializer_cls in initializers:
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user