Skip to content

Commit

Permalink
Add type hinted get_type_classes() method
Browse files Browse the repository at this point in the history
  • Loading branch information
craigds committed Jan 23, 2025
1 parent 8cfdde8 commit ae6112f
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 7 deletions.
5 changes: 5 additions & 0 deletions testapp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,8 @@ def typed_queryset() -> None:
# This isn't actually called, but it's here for the mypy check to ensure that type hinting works correctly.
queryset = Animal.objects.filter(pk=1)
queryset.filter(name="lynx") # works, because Animal has this field


def do_get_type_classes() -> None:
for x in Animal.get_type_classes():
print(x)
2 changes: 1 addition & 1 deletion typedmodels/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.15.0b3"
__version__ = "0.15.0b4"
25 changes: 19 additions & 6 deletions typedmodels/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,7 @@ def do_related_class(self, other, cls):

# add a get_type_classes classmethod to allow fetching of all the subclasses (useful for admin)

def get_type_classes(
subcls: type["TypedModel"],
) -> list[type["TypedModel"]]:
def _get_type_classes(subcls) -> list[type["TypedModel"]]:
"""
Returns a list of the classes which are proxy subtypes of this concrete typed model.
"""
Expand All @@ -237,9 +235,9 @@ def get_type_classes(
for k in subcls._typedmodels_subtypes
]

cls.get_type_classes = classmethod(get_type_classes) # type: ignore
cls._get_type_classes = classmethod(_get_type_classes) # type: ignore

def get_types(subcls: type["TypedModel"]) -> list[str]:
def _get_types(subcls) -> list[str]:
"""
Returns a list of the possible string values (for the `type` attribute) for classes
which are proxy subtypes of this concrete typed model.
Expand All @@ -249,7 +247,7 @@ def get_types(subcls: type["TypedModel"]) -> list[str]:
else:
return subcls._typedmodels_subtypes[:]

cls.get_types = classmethod(get_types) # type: ignore
cls.get_types = classmethod(_get_types) # type: ignore

return cls

Expand Down Expand Up @@ -450,6 +448,21 @@ def from_db(cls, db, field_names, values):
new._state.db = db
return new

@classmethod
def get_type_classes(cls) -> list["__builtins__.type[Self]"]:
"""
Returns a list of the classes which are proxy subtypes of this concrete typed model.
"""
return cls._get_type_classes() # type: ignore

@classmethod
def get_types(cls) -> list[str]:
"""
Returns a list of the possible string values (for the `type` attribute) for classes
which are proxy subtypes of this concrete typed model.
"""
return cls._get_types() # type: ignore

def __init__(self, *args, _typedmodels_do_recast=None, **kwargs):
# Calling __init__ on base class because some functions (e.g. save()) need access to field values from base
# class.
Expand Down

0 comments on commit ae6112f

Please sign in to comment.