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
36 changes: 36 additions & 0 deletions mypy.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
[mypy]
# The mypy configurations: https://mypy.readthedocs.io/en/latest/config_file.html
python_version = 3.10

check_untyped_defs = True
disallow_any_generics = True
disallow_untyped_calls = True
disallow_untyped_decorators = True
ignore_errors = False
ignore_missing_imports = True
implicit_reexport = False
strict_optional = True
strict_equality = True
no_implicit_optional = True
warn_unused_ignores = True
warn_redundant_casts = True
warn_unused_configs = True
warn_unreachable = True
warn_no_return = True
show_error_codes = True

plugins =
mypy_django_plugin.main

[mypy.plugins.django-stubs]
django_settings_module = polymorphic.tests.settings

[mypy-polymorphic.*]
ignore_missing_imports = True

[mypy-*.migrations.*]
# Django migrations should not produce any errors:
ignore_errors = True

[mypy-tests.*]
ignore_errors = True
2 changes: 2 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ classifiers = [
]
dependencies = [
"Django >= 4.2",

]

[project.urls]
Expand Down Expand Up @@ -142,6 +143,7 @@ show_missing = true
dev = [
"coverage>=7.6.1",
"dj-database-url>=2.2.0",
"django-stubs>=5.2.8",
"django-test-migrations>=1.5.0",
"ipdb>=0.13.13",
"ipython>=8.18.1",
Expand Down
6 changes: 6 additions & 0 deletions src/polymorphic/__init__.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
VERSION: str
__version__ = VERSION
__title__ = str
__author__ = str
__license__ = str
__copyright__ = str
25 changes: 25 additions & 0 deletions src/polymorphic/admin/__init__.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from .childadmin import PolymorphicChildModelAdmin as PolymorphicChildModelAdmin
from .filters import PolymorphicChildModelFilter as PolymorphicChildModelFilter
from .forms import PolymorphicModelChoiceForm as PolymorphicModelChoiceForm
from .generic import GenericPolymorphicInlineModelAdmin as GenericPolymorphicInlineModelAdmin
from .generic import GenericStackedPolymorphicInline as GenericStackedPolymorphicInline
from .helpers import PolymorphicInlineAdminForm as PolymorphicInlineAdminForm
from .helpers import PolymorphicInlineAdminFormSet as PolymorphicInlineAdminFormSet
from .helpers import PolymorphicInlineSupportMixin as PolymorphicInlineSupportMixin
from .inlines import PolymorphicInlineModelAdmin as PolymorphicInlineModelAdmin
from .inlines import StackedPolymorphicInline as StackedPolymorphicInline
from .parentadmin import PolymorphicParentModelAdmin as PolymorphicParentModelAdmin

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

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

from polymorphic.utils import get_base_polymorphic_model as get_base_polymorphic_model

from ..admin import PolymorphicParentModelAdmin as PolymorphicParentModelAdmin

class ParentAdminNotRegistered(RuntimeError): ...

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

from django.contrib import admin
from django_stubs.db.models.query import QuerySet
from django_stubs.http import HttpRequest

class PolymorphicChildModelFilter(admin.SimpleListFilter):
title: str
parameter_name: str
def lookups(self, request: HttpRequest, model_admin): ...
def queryset(self, request: HttpRequest, queryset: QuerySet[Any]): ...
7 changes: 7 additions & 0 deletions src/polymorphic/admin/forms.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from _typeshed import Incomplete
from django_stubs import forms

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

from django.utils.functional import cached_property as cached_property
from django_stubs.contrib.contenttypes.admin import GenericInlineModelAdmin
from django_stubs.contrib.contenttypes.models import ContentType
from django_stubs.forms.models import BaseInlineFormSet
from django_stubs.http import HttpRequest

from polymorphic.formsets import (
BaseGenericPolymorphicInlineFormSet as BaseGenericPolymorphicInlineFormSet,
)
from polymorphic.formsets import GenericPolymorphicFormSetChild as GenericPolymorphicFormSetChild
from polymorphic.formsets import polymorphic_child_forms_factory as polymorphic_child_forms_factory

from .inlines import PolymorphicInlineModelAdmin as PolymorphicInlineModelAdmin

class GenericPolymorphicInlineModelAdmin(PolymorphicInlineModelAdmin, GenericInlineModelAdmin):
formset: Any = BaseGenericPolymorphicInlineFormSet
def get_formset(
self, request: HttpRequest, obj: Any = None, **kwargs: Any
) -> type[BaseInlineFormSet[Any, Any, Any]]: ...
class Child(PolymorphicInlineModelAdmin.Child):
formset_child = GenericPolymorphicFormSetChild
ct_field: str
ct_fk_field: str
@cached_property
def content_type(self) -> ContentType: ...
def get_formset_child(
self, request: HttpRequest, obj: Any = None, **kwargs: Any
) -> GenericPolymorphicFormSetChild: ...

class GenericStackedPolymorphicInline(GenericPolymorphicInlineModelAdmin):
template: str
24 changes: 24 additions & 0 deletions src/polymorphic/admin/helpers.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from _typeshed import Incomplete
from django_stubs.contrib.admin.helpers import InlineAdminForm, InlineAdminFormSet

from polymorphic.formsets import BasePolymorphicModelFormSet as BasePolymorphicModelFormSet

class PolymorphicInlineAdminForm(InlineAdminForm):
def polymorphic_ctype_field(self): ...
@property
def is_empty(self): ...

class PolymorphicInlineAdminFormSet(InlineAdminFormSet):
request: Incomplete
obj: Incomplete
def __init__(self, *args, **kwargs) -> None: ...
def __iter__(self): ...
def get_child_fieldsets(self, child_inline): ...
def get_child_readonly_fields(self, child_inline): ...
def get_child_prepopulated_fields(self, child_inline): ...
def inline_formset_data(self): ...

class PolymorphicInlineSupportMixin:
def get_inline_formsets(
self, request, formsets, inline_instances, obj=None, *args, **kwargs
): ...
51 changes: 51 additions & 0 deletions src/polymorphic/admin/inlines.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from typing import Any, Sequence

from django_stubs.contrib.admin.options import InlineModelAdmin
from django_stubs.db import models
from django_stubs.forms import Media
from django_stubs.forms.models import BaseInlineFormSet
from django_stubs.http import HttpRequest

from polymorphic.formsets import BasePolymorphicInlineFormSet as BasePolymorphicInlineFormSet
from polymorphic.formsets import PolymorphicFormSetChild as PolymorphicFormSetChild
from polymorphic.formsets import UnsupportedChildType as UnsupportedChildType
from polymorphic.formsets import polymorphic_child_forms_factory as polymorphic_child_forms_factory
from polymorphic.formsets.utils import add_media as add_media

from .helpers import PolymorphicInlineSupportMixin as PolymorphicInlineSupportMixin

class PolymorphicInlineModelAdmin(InlineModelAdmin[Any, Any]):
formset: type[BaseInlineFormSet[Any, Any, Any]]
polymorphic_media: Media
extra: int
child_inlines: Sequence[type[PolymorphicInlineModelAdmin.Child]]
child_inline_instances: list[PolymorphicInlineModelAdmin.Child]
def __init__(self, parent_model: type[models.Model], admin_site: Any) -> None: ...
def get_child_inlines(self) -> Sequence[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(
self, request: HttpRequest, obj: Any = None, **kwargs: Any
) -> type[BaseInlineFormSet[Any, Any, Any]]: ...
def get_formset_children(
self, request: HttpRequest, obj: Any = None
) -> list[PolymorphicFormSetChild]: ...
def get_fieldsets(self, request: HttpRequest, obj: Any = None) -> list[Any]: ...
def get_fields(self, request: HttpRequest, obj: Any = None) -> Any: ...
@property
def media(self) -> Media: ...
class Child(InlineModelAdmin[Any, Any]):
formset_child = PolymorphicFormSetChild
extra: int
parent_inline: PolymorphicInlineModelAdmin
def __init__(self, parent_inline: PolymorphicInlineModelAdmin) -> None: ...
def get_formset(self, request: HttpRequest, obj: Any = None, **kwargs: Any) -> Any: ...
def get_fields(self, request: HttpRequest, obj: Any = None) -> Any: ...
def get_formset_child(
self, request: HttpRequest, obj: Any = None, **kwargs: Any
) -> PolymorphicFormSetChild: ...

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

from django_stubs.contrib import admin
from django_stubs.db.models import Model
from django_stubs.db.models.query import QuerySet
from django_stubs.forms import ModelForm
from django_stubs.http import HttpRequest, HttpResponse

from polymorphic.utils import get_base_polymorphic_model as get_base_polymorphic_model

from .forms import PolymorphicModelChoiceForm as PolymorphicModelChoiceForm

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

class PolymorphicParentModelAdmin(admin.ModelAdmin[Any]):
base_model: type[Model] | None
child_models: Sequence[type[Model]] | None
polymorphic_list: bool
add_type_template: str | None
add_type_form: type[ModelForm[Any]]
pk_regex: str
def __init__(self, model: type[Model], admin_site: Any, *args: Any, **kwargs: Any) -> None: ...
def register_child(
self, model: type[Model], model_admin: type[admin.ModelAdmin[Any]]
) -> None: ...
def get_child_models(self) -> Sequence[type[Model]]: ...
def get_child_type_choices(
self, request: HttpRequest, action: str
) -> list[tuple[str, str]]: ...
def get_queryset(self, request: HttpRequest) -> QuerySet[Any]: ...
def add_view(
self, request: HttpRequest, form_url: str = "", extra_context: Any = None
) -> HttpResponse: ...
def change_view(
self, request: HttpRequest, object_id: str, *args: Any, **kwargs: Any
) -> HttpResponse: ...
def changeform_view(
self,
request: HttpRequest,
object_id: str | None = None,
*args: Any,
**kwargs: Any,
) -> HttpResponse: ...
def history_view(
self, request: HttpRequest, object_id: str, extra_context: Any = None
) -> HttpResponse: ...
def delete_view(
self, request: HttpRequest, object_id: str, extra_context: Any = None
) -> HttpResponse: ...
def get_preserved_filters(self, request: HttpRequest) -> str: ...
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: Any, form_url: str = ""
) -> HttpResponse: ...
change_list_template: ClassVar[str]
11 changes: 11 additions & 0 deletions src/polymorphic/apps.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from typing import Any

from django_stubs.apps import AppConfig

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

class PolymorphicConfig(AppConfig):
ignored_models: list[Any]
verbose_name: str
22 changes: 22 additions & 0 deletions src/polymorphic/base.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from typing import Any

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
): ...
@classmethod
def validate_model_manager(
cls, manager: PolymorphicManager[Any], model_name: str, manager_name: str
): ...
@property
def base_objects(self) -> PolymorphicManager[Any]: ...
Empty file.
23 changes: 23 additions & 0 deletions src/polymorphic/contrib/extra_views.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import extra_views
from _typeshed import Incomplete

from polymorphic.formsets import BasePolymorphicInlineFormSet, BasePolymorphicModelFormSet

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

class PolymorphicFormSetMixin:
formset_class = BasePolymorphicModelFormSet
factory_kwargs: Incomplete
formset_children: Incomplete
def get_formset_children(self): ...
def get_formset_child_kwargs(self): ...
def get_formset(self): ...

class PolymorphicFormSetView(PolymorphicFormSetMixin, extra_views.ModelFormSetView):
formset_class = BasePolymorphicModelFormSet

class PolymorphicInlineFormSetView(PolymorphicFormSetMixin, extra_views.InlineFormSetView):
formset_class = BasePolymorphicInlineFormSet

class PolymorphicInlineFormSet(PolymorphicFormSetMixin, extra_views.InlineFormSetFactory):
formset_class = BasePolymorphicInlineFormSet
1 change: 1 addition & 0 deletions src/polymorphic/contrib/guardian.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
def get_polymorphic_base_content_type(obj): ...
Loading
Loading