Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions stubs/django-polymorphic/@tests/django_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SECRET_KEY = "1"

INSTALLED_APPS = (
"django.contrib.contenttypes",
"django.contrib.sites",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.admin.apps.SimpleAdminConfig",
"django.contrib.staticfiles",
"django.contrib.auth",
"polymorphic",
)
99 changes: 99 additions & 0 deletions stubs/django-polymorphic/@tests/stubtest_allowlist.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# Module-level metadata
polymorphic.__license__
polymorphic.__title__

# Child classes for inline admin (runtime-only helper classes)
polymorphic.admin.GenericPolymorphicInlineModelAdmin.Child
polymorphic.admin.PolymorphicInlineModelAdmin.Child
polymorphic.admin.generic.GenericPolymorphicInlineModelAdmin.Child
polymorphic.admin.inlines.PolymorphicInlineModelAdmin.Child

# Admin __init__ methods with *args
polymorphic.admin.PolymorphicChildModelAdmin.__init__
polymorphic.admin.PolymorphicParentModelAdmin.__init__
polymorphic.admin.childadmin.PolymorphicChildModelAdmin.__init__
polymorphic.admin.parentadmin.PolymorphicParentModelAdmin.__init__

# Admin get_form - stub includes change parameter for compatibility with Django base class
polymorphic.admin.PolymorphicChildModelAdmin.get_form
polymorphic.admin.childadmin.PolymorphicChildModelAdmin.get_form

# QuerySet methods - version-specific Django parameters
polymorphic.base.PolymorphicQuerySet.__repr__
polymorphic.base.PolymorphicQuerySet.bulk_create
polymorphic.query.PolymorphicQuerySet.__repr__
polymorphic.query.PolymorphicQuerySet.bulk_create
polymorphic.managers.PolymorphicQuerySet.__repr__
polymorphic.managers.PolymorphicQuerySet.bulk_create

# Formset factory functions - too complex to type precisely
polymorphic.formsets.generic_polymorphic_inlineformset_factory
polymorphic.formsets.polymorphic_inlineformset_factory
polymorphic.formsets.polymorphic_modelformset_factory
polymorphic.formsets.polymorphic_child_forms_factory
polymorphic.formsets.generic.generic_polymorphic_inlineformset_factory
polymorphic.formsets.models.polymorphic_child_forms_factory
polymorphic.formsets.models.polymorphic_inlineformset_factory
polymorphic.formsets.models.polymorphic_modelformset_factory

# PolymorphicFormSetChild - runtime implementation details
polymorphic.formsets.PolymorphicFormSetChild.__init__
polymorphic.formsets.PolymorphicFormSetChild.content_type
polymorphic.formsets.PolymorphicFormSetChild.get_form
polymorphic.formsets.GenericPolymorphicFormSetChild.__init__
polymorphic.formsets.GenericPolymorphicFormSetChild.get_form
polymorphic.formsets.generic.GenericPolymorphicFormSetChild.__init__
polymorphic.formsets.generic.GenericPolymorphicFormSetChild.get_form
polymorphic.formsets.models.PolymorphicFormSetChild.__init__
polymorphic.formsets.models.PolymorphicFormSetChild.content_type
polymorphic.formsets.models.PolymorphicFormSetChild.get_form

# BasePolymorphicModelFormSet - runtime helpers
polymorphic.formsets.BasePolymorphicModelFormSet.child_forms
polymorphic.formsets.BasePolymorphicModelFormSet.empty_forms
polymorphic.formsets.BasePolymorphicModelFormSet.get_form_class
polymorphic.formsets.models.BasePolymorphicModelFormSet.child_forms
polymorphic.formsets.models.BasePolymorphicModelFormSet.empty_forms
polymorphic.formsets.models.BasePolymorphicModelFormSet.get_form_class

# Model attributes - Django auto-generated
polymorphic.models.PolymorphicModel.DoesNotExist
polymorphic.models.PolymorphicModel.MultipleObjectsReturned
polymorphic.models.PolymorphicModel.polymorphic_ctype_id
polymorphic.models.PolymorphicModel.translate_polymorphic_Q_object
polymorphic.utils.PolymorphicModel.DoesNotExist
polymorphic.utils.PolymorphicModel.MultipleObjectsReturned
polymorphic.utils.PolymorphicModel.polymorphic_ctype_id
polymorphic.utils.PolymorphicModel.translate_polymorphic_Q_object

# Type annotation helpers (not runtime classes)
polymorphic.models.PolymorphicModel@AnnotatedWith

# ShowFieldBase private methods (internal helpers)
polymorphic.showfields.ShowFieldBase._showfields_add_annotated_fields
polymorphic.showfields.ShowFieldBase._showfields_add_deferred_fields
polymorphic.showfields.ShowFieldBase._showfields_add_extra_select_fields

# Optional dependencies - contrib modules may require additional packages
polymorphic.contrib.extra_views

# Template properties - read-only at runtime
polymorphic.admin.PolymorphicChildModelAdmin.change_form_template
polymorphic.admin.PolymorphicChildModelAdmin.delete_confirmation_template
polymorphic.admin.PolymorphicChildModelAdmin.object_history_template
polymorphic.admin.PolymorphicParentModelAdmin.change_list_template
polymorphic.admin.childadmin.PolymorphicChildModelAdmin.change_form_template
polymorphic.admin.childadmin.PolymorphicChildModelAdmin.delete_confirmation_template
polymorphic.admin.childadmin.PolymorphicChildModelAdmin.object_history_template
polymorphic.admin.parentadmin.PolymorphicParentModelAdmin.change_list_template

# __all__ differences - stub uses list for easier editing
polymorphic.admin.__all__
polymorphic.formsets.__all__
polymorphic.managers.__all__

# Descriptor vs typed value - normal for stubs
polymorphic.models.PolymorphicModel.objects
polymorphic.models.PolymorphicModel.polymorphic_ctype
polymorphic.utils.PolymorphicModel.objects
polymorphic.utils.PolymorphicModel.polymorphic_ctype
7 changes: 7 additions & 0 deletions stubs/django-polymorphic/METADATA.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
version = "4.4.*"
upstream_repository = "https://github.com/jazzband/django-polymorphic"
requires = ["django-stubs"]

[tool.stubtest]
mypy_plugins = ["mypy_django_plugin.main"]
mypy_plugins_config = {"django-stubs" = {"django_settings_module" = "@tests.django_settings"}}
2 changes: 2 additions & 0 deletions stubs/django-polymorphic/polymorphic/__init__.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
VERSION: str
__version__ = VERSION
31 changes: 31 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/__init__.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from .childadmin import PolymorphicChildModelAdmin as PolymorphicChildModelAdmin
from .filters import PolymorphicChildModelFilter as PolymorphicChildModelFilter
from .forms import PolymorphicModelChoiceForm as PolymorphicModelChoiceForm
from .generic import (
GenericPolymorphicInlineModelAdmin as GenericPolymorphicInlineModelAdmin,
GenericStackedPolymorphicInline as GenericStackedPolymorphicInline,
)
from .helpers import (
PolymorphicInlineAdminForm as PolymorphicInlineAdminForm,
PolymorphicInlineAdminFormSet as PolymorphicInlineAdminFormSet,
PolymorphicInlineSupportMixin as PolymorphicInlineSupportMixin,
)
from .inlines import (
PolymorphicInlineModelAdmin as PolymorphicInlineModelAdmin,
StackedPolymorphicInline as StackedPolymorphicInline,
)
from .parentadmin import PolymorphicParentModelAdmin as PolymorphicParentModelAdmin

__all__ = [
"PolymorphicParentModelAdmin",
"PolymorphicChildModelAdmin",
"PolymorphicModelChoiceForm",
"PolymorphicChildModelFilter",
"PolymorphicInlineAdminForm",
"PolymorphicInlineAdminFormSet",
"PolymorphicInlineSupportMixin",
"PolymorphicInlineModelAdmin",
"StackedPolymorphicInline",
"GenericPolymorphicInlineModelAdmin",
"GenericStackedPolymorphicInline",
]
39 changes: 39 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/childadmin.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from collections.abc import Sequence
from typing import Any, ClassVar

from django.contrib import admin
from django.db import models
from django.forms import Form, ModelForm
from django.http import HttpRequest, HttpResponse, HttpResponseRedirect

class ParentAdminNotRegistered(RuntimeError): ...

class PolymorphicChildModelAdmin(admin.ModelAdmin[Any]):
base_model: type[models.Model] | None
base_form: type[Form] | None
base_fieldsets: Sequence[tuple[str | None, dict[str, Any]]] | None
extra_fieldset_title: str
show_in_index: bool
change_form_template: ClassVar[list[str]]
delete_confirmation_template: ClassVar[list[str]]
object_history_template: ClassVar[list[str]]
def get_form(
self, request: HttpRequest, obj: Any | None = None, change: bool = False, **kwargs: Any
) -> type[ModelForm[Any]]: ...
def get_model_perms(self, request: HttpRequest) -> dict[str, bool]: ...
def get_base_fieldsets(self, request: HttpRequest, obj: Any = None) -> list[tuple[str | None, dict[str, Any]]] | None: ...
def get_fieldsets(self, request: HttpRequest, obj: Any = None) -> list[tuple[str | None, dict[str, Any]]]: ... # type: ignore[override]
def get_subclass_fields(self, request: HttpRequest, obj: Any = None) -> list[str]: ...
def response_post_save_add(self, request: HttpRequest, obj: Any) -> HttpResponseRedirect: ...
def response_post_save_change(self, request: HttpRequest, obj: Any) -> HttpResponseRedirect: ...
def render_change_form(
self,
request: HttpRequest,
context: dict[str, Any],
add: bool = False,
change: bool = False,
form_url: str = "",
obj: Any = None,
) -> HttpResponse: ...
def delete_view(self, request: HttpRequest, object_id: str, context: dict[str, Any] | None = None) -> HttpResponse: ...
def history_view(self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = None) -> HttpResponse: ...
12 changes: 12 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/filters.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from collections.abc import Iterable
from typing import Any

from django.contrib.admin import ModelAdmin, SimpleListFilter
from django.db.models import QuerySet
from django.http import HttpRequest

class PolymorphicChildModelFilter(SimpleListFilter):
title: str
parameter_name: str
def lookups(self, request: HttpRequest, model_admin: ModelAdmin[Any]) -> Iterable[tuple[str, str]]: ...
def queryset(self, request: HttpRequest, queryset: QuerySet[Any]) -> QuerySet[Any]: ...
8 changes: 8 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/forms.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from typing import Any

from django import forms

class PolymorphicModelChoiceForm(forms.Form):
type_label: str
ct_id: forms.ChoiceField
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
14 changes: 14 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/generic.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from typing import Any

from django.contrib.contenttypes.admin import GenericInlineModelAdmin
from django.http import HttpRequest

from ..formsets import BaseGenericPolymorphicInlineFormSet
from .inlines import PolymorphicInlineModelAdmin

class GenericPolymorphicInlineModelAdmin(PolymorphicInlineModelAdmin, GenericInlineModelAdmin):
formset: type[BaseGenericPolymorphicInlineFormSet] # type: ignore[assignment]
def get_formset(self, request: HttpRequest, obj: Any = None, **kwargs: Any) -> type[BaseGenericPolymorphicInlineFormSet]: ... # type: ignore[override]

class GenericStackedPolymorphicInline(GenericPolymorphicInlineModelAdmin):
template: str
25 changes: 25 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/helpers.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from collections.abc import Iterator
from typing import Any

from django.contrib.admin.helpers import AdminField, InlineAdminForm, InlineAdminFormSet
from django.http import HttpRequest

class PolymorphicInlineAdminForm(InlineAdminForm):
def polymorphic_ctype_field(self) -> AdminField: ...
@property
def is_empty(self) -> bool: ...

class PolymorphicInlineAdminFormSet(InlineAdminFormSet):
request: HttpRequest | None
obj: Any | None
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
def __iter__(self) -> Iterator[PolymorphicInlineAdminForm]: ...
def get_child_fieldsets(self, child_inline: Any) -> list[tuple[str | None, dict[str, Any]]]: ...
def get_child_readonly_fields(self, child_inline: Any) -> list[str]: ...
def get_child_prepopulated_fields(self, child_inline: Any) -> dict[str, Any]: ...
def inline_formset_data(self) -> str: ...

class PolymorphicInlineSupportMixin:
def get_inline_formsets(
self, request: HttpRequest, formsets: list[Any], inline_instances: list[Any], obj: Any = None, *args: Any, **kwargs: Any
) -> list[InlineAdminFormSet]: ...
25 changes: 25 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/inlines.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from typing import Any

from django.contrib.admin.options import InlineModelAdmin
from django.contrib.admin.sites import AdminSite
from django.db import models
from django.forms import Media
from django.http import HttpRequest

from ..formsets import BasePolymorphicInlineFormSet, PolymorphicFormSetChild

class PolymorphicInlineModelAdmin(InlineModelAdmin[Any, Any]):
formset: type[BasePolymorphicInlineFormSet] # type: ignore[assignment]
polymorphic_media: Media
extra: int
child_inlines: tuple[type[Any], ...]
child_inline_instances: list[Any]
def __init__(self, parent_model: type[models.Model], admin_site: AdminSite) -> None: ...
def get_child_inlines(self) -> list[type[Any]]: ...
def get_child_inline_instances(self) -> list[Any]: ...
def get_child_inline_instance(self, model: type[models.Model]) -> Any: ...
def get_formset_children(self, request: HttpRequest, obj: Any = None) -> list[PolymorphicFormSetChild]: ...
def get_formset(self, request: HttpRequest, obj: Any = None, **kwargs: Any) -> type[BasePolymorphicInlineFormSet]: ... # type: ignore[override]

class StackedPolymorphicInline(PolymorphicInlineModelAdmin):
template: str
36 changes: 36 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/parentadmin.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from collections.abc import Sequence
from typing import Any

from django.contrib import admin
from django.db import models
from django.db.models import QuerySet
from django.forms import Form
from django.http import HttpRequest, HttpResponse

class RegistrationClosed(RuntimeError): ...
class ChildAdminNotRegistered(RuntimeError): ...

class PolymorphicParentModelAdmin(admin.ModelAdmin[Any]):
base_model: type[models.Model] | None
child_models: Sequence[type[models.Model]] | None
polymorphic_list: bool
add_type_template: str | Sequence[str] | None
add_type_form: type[Form]
pk_regex: str
def register_child(self, model: type[models.Model], model_admin: type[admin.ModelAdmin[Any]]) -> None: ...
def get_child_models(self) -> Sequence[type[models.Model]]: ...
def get_child_type_choices(self, request: HttpRequest, action: str) -> list[tuple[int, str]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet[Any]: ...
def add_view(self, request: HttpRequest, form_url: str = "", extra_context: dict[str, Any] | None = None) -> HttpResponse: ...
def change_view(
self, request: HttpRequest, object_id: str, form_url: str = "", extra_context: dict[str, Any] | None = None
) -> HttpResponse: ...
def changeform_view(
self, request: HttpRequest, object_id: str | None = None, form_url: str = "", extra_context: dict[str, Any] | None = None
) -> HttpResponse: ...
def history_view(self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = None) -> HttpResponse: ...
def delete_view(self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = None) -> HttpResponse: ...
def get_preserved_filters(self, request: HttpRequest) -> str: ...
def subclass_view(self, request: HttpRequest, path: str) -> HttpResponse: ...
def add_type_view(self, request: HttpRequest, form_url: str = "") -> HttpResponse: ...
def render_add_type_form(self, request: HttpRequest, context: dict[str, Any], form_url: str = "") -> HttpResponse: ...
11 changes: 11 additions & 0 deletions stubs/django-polymorphic/polymorphic/apps.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from collections.abc import Sequence
from typing import Any

from django.apps import AppConfig
from django.core.checks import CheckMessage

def check_reserved_field_names(app_configs: Sequence[AppConfig] | None, **kwargs: Any) -> list[CheckMessage]: ...

class PolymorphicConfig(AppConfig):
name: str
verbose_name: str
23 changes: 23 additions & 0 deletions stubs/django-polymorphic/polymorphic/base.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from typing import Any

from django.db import models
from django.db.models.base import ModelBase

from .managers import PolymorphicManager as PolymorphicManager
from .query import PolymorphicQuerySet as PolymorphicQuerySet

POLYMORPHIC_SPECIAL_Q_KWORDS: set[str]
DUMPDATA_COMMAND: str

class ManagerInheritanceWarning(RuntimeWarning): ...

class PolymorphicModelBase(ModelBase):
def __new__(cls, model_name: str, bases: tuple[type, ...], attrs: dict[str, Any], **kwargs: Any) -> type: ...
@classmethod
def validate_model_manager(cls, manager: models.Manager[Any], model_name: str, manager_name: str) -> models.Manager[Any]: ...
@property
def base_objects(self) -> models.Manager[Any]: ...
@property
def _base_objects(self) -> models.Manager[Any]: ...
@property
def _default_manager(self) -> PolymorphicManager[Any]: ...
Empty file.
28 changes: 28 additions & 0 deletions stubs/django-polymorphic/polymorphic/contrib/extra_views.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from typing import Any

from django.forms import BaseFormSet

from ..formsets import (
BasePolymorphicInlineFormSet as BasePolymorphicInlineFormSet,
BasePolymorphicModelFormSet as BasePolymorphicModelFormSet,
PolymorphicFormSetChild,
)

__all__ = ["PolymorphicFormSetView", "PolymorphicInlineFormSetView", "PolymorphicInlineFormSet"]

class PolymorphicFormSetMixin:
formset_class: type[BaseFormSet[Any]]
factory_kwargs: dict[str, Any]
formset_children: list[PolymorphicFormSetChild] | None
def get_formset_children(self) -> list[PolymorphicFormSetChild]: ...
def get_formset_child_kwargs(self) -> dict[str, Any]: ...
def get_formset(self) -> type[BaseFormSet[Any]]: ...

class PolymorphicFormSetView(PolymorphicFormSetMixin):
formset_class: type[BasePolymorphicModelFormSet]

class PolymorphicInlineFormSetView(PolymorphicFormSetMixin):
formset_class: type[BasePolymorphicInlineFormSet]

class PolymorphicInlineFormSet(PolymorphicFormSetMixin):
formset_class: type[BasePolymorphicInlineFormSet]
5 changes: 5 additions & 0 deletions stubs/django-polymorphic/polymorphic/contrib/guardian.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from typing import Any

from django.contrib.contenttypes.models import ContentType

def get_polymorphic_base_content_type(obj: Any) -> ContentType: ...
Loading
Loading