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",
)
45 changes: 45 additions & 0 deletions stubs/django-polymorphic/@tests/stubtest_allowlist.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# 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.query.PolymorphicQuerySet.__repr__
polymorphic.query.PolymorphicQuerySet.bulk_create
polymorphic.query.PolymorphicQuerySet._p_list_class.__repr__
polymorphic.managers.PolymorphicQuerySet.__repr__
polymorphic.managers.PolymorphicQuerySet.bulk_create
polymorphic.managers.PolymorphicQuerySet._p_list_class.__repr__

# Model attributes - Django auto-generated
polymorphic.models.PolymorphicModel.polymorphic_ctype_id

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

# 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
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.10.*"
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"}}
9 changes: 9 additions & 0 deletions stubs/django-polymorphic/polymorphic/__init__.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from typing import Final

VERSION: Final[str]

__title__: Final = "Django Polymorphic"
__version__ = VERSION # version synonym for backwards compatibility
__author__: Final[str]
__license__: Final = "BSD-3-Clause"
__copyright__: Final[str]
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]] # type: ignore[misc]
delete_confirmation_template: ClassVar[list[str]] # type: ignore[misc]
object_history_template: ClassVar[list[str]] # type: ignore[misc]
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: ...
25 changes: 25 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/generic.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from typing import Any

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

from ..formsets import BaseGenericPolymorphicInlineFormSet, GenericPolymorphicFormSetChild
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 Child(PolymorphicInlineModelAdmin.Child):
formset_child: type[GenericPolymorphicFormSetChild] # type: ignore[assignment]
ct_field: str
ct_fk_field: str
@property
def content_type(self) -> ContentType: ...
def get_formset_child(
self, request: HttpRequest, obj: Any = None, **kwargs: Any
) -> GenericPolymorphicFormSetChild: ... # 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]: ...
36 changes: 36 additions & 0 deletions stubs/django-polymorphic/polymorphic/admin/inlines.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
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[PolymorphicInlineModelAdmin.Child], ...]
child_inline_instances: list[PolymorphicInlineModelAdmin.Child]
def __init__(self, parent_model: type[models.Model], admin_site: AdminSite) -> None: ...
def get_child_inlines(self) -> list[type[PolymorphicInlineModelAdmin.Child]]: ...
def get_child_inline_instances(self) -> list[PolymorphicInlineModelAdmin.Child]: ...
def get_child_inline_instance(self, model: type[models.Model]) -> PolymorphicInlineModelAdmin.Child: ...
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]
def get_fieldsets(self, request: HttpRequest, obj: Any = None) -> list[tuple[str | None, dict[str, Any]]]: ... # type: ignore[override]
def get_fields(self, request: HttpRequest, obj: Any = None) -> list[str]: ... # type: ignore[override]

class Child(InlineModelAdmin[Any, Any]):
formset_child: type[PolymorphicFormSetChild]
extra: int
parent_inline: PolymorphicInlineModelAdmin
def __init__(self, parent_inline: PolymorphicInlineModelAdmin) -> None: ...
def get_formset(self, request: HttpRequest, obj: Any = None, **kwargs: Any) -> None: ... # type: ignore[override]
def get_fields(self, request: HttpRequest, obj: Any = None) -> list[str]: ... # type: ignore[override]
def get_formset_child(self, request: HttpRequest, obj: Any = None, **kwargs: Any) -> PolymorphicFormSetChild: ...

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

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
change_list_template: ClassVar[list[str]] # type: ignore[misc]
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_urls(self) -> list[Any]: ...
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: ...
12 changes: 12 additions & 0 deletions stubs/django-polymorphic/polymorphic/apps.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from _typeshed import Unused
from collections.abc import Sequence
from typing import Final

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

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

class PolymorphicConfig(AppConfig):
name: Final = "polymorphic"
verbose_name: str = "Django Polymorphic"
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

POLYMORPHIC_SPECIAL_Q_KWORDS: set[str]

check_dump: bool

class ManagerInheritanceWarning(RuntimeWarning): ...

class PolymorphicModelBase(ModelBase):
def __new__(cls, model_name: str, bases: tuple[type, ...], attrs: dict[str, Any], **kwargs: Any) -> type: ...
@property
def base_objects(self) -> models.Manager[Any]: ...
@property
def _base_objects(self) -> models.Manager[Any]: ...
@property
def _default_manager(self) -> PolymorphicManager[Any]: ...
@property
def _base_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: ...
21 changes: 21 additions & 0 deletions stubs/django-polymorphic/polymorphic/deletion.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from collections.abc import Callable, Hashable
from typing import Any

from django.db.models import Field
from django.db.models.deletion import Collector
from django.db.models.query import QuerySet

def migration_fingerprint(value: Any) -> Hashable: ...

class PolymorphicGuard:
action: Callable[[Collector, Field[Any, Any], QuerySet[Any], str], None]
def __init__(self, action: Callable[[Collector, Field[Any, Any], QuerySet[Any], str], None]) -> None: ...
def __call__(self, collector: Collector, field: Field[Any, Any], sub_objs: QuerySet[Any], using: str) -> None: ...
@property
def migration_key(self) -> Hashable: ...
def __eq__(self, other: object) -> bool: ...
def __hash__(self) -> int: ...

class PolymorphicGuardSerializer:
value: PolymorphicGuard
def serialize(self) -> tuple[str, set[str]]: ...
Loading