from typing import Any, Dict, Optional, Sequence, Tuple, Type

from django.core.paginator import Paginator
from django.db.models.query import QuerySet
from django.views.generic.base import ContextMixin, TemplateResponseMixin, View

from django.db.models import Model
from django.http import HttpRequest, HttpResponse

class MultipleObjectMixin(ContextMixin):
    allow_empty: bool = ...
    queryset: Optional[QuerySet] = ...
    model: Optional[Type[Model]] = ...
    paginate_by: int = ...
    paginate_orphans: int = ...
    context_object_name: Optional[str] = ...
    paginator_class: Type[Paginator] = ...
    page_kwarg: str = ...
    ordering: Sequence[str] = ...
    request: HttpRequest = ...
    kwargs: Dict[str, Any] = ...
    object_list: QuerySet = ...
    def get_queryset(self) -> QuerySet: ...
    def get_ordering(self) -> Sequence[str]: ...
    def paginate_queryset(self, queryset: QuerySet, page_size: int) -> Tuple[Paginator, int, QuerySet, bool]: ...
    def get_paginate_by(self, queryset: QuerySet) -> Optional[int]: ...
    def get_paginator(
        self, queryset: QuerySet, per_page: int, orphans: int = ..., allow_empty_first_page: bool = ..., **kwargs: Any
    ) -> Paginator: ...
    def get_paginate_orphans(self) -> int: ...
    def get_allow_empty(self) -> bool: ...
    def get_context_object_name(self, object_list: QuerySet) -> Optional[str]: ...

class BaseListView(MultipleObjectMixin, View):
    def render_to_response(self, context: Dict[str, Any], **response_kwargs: Any) -> HttpResponse: ...
    def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...

class MultipleObjectTemplateResponseMixin(TemplateResponseMixin):
    template_name_suffix: str = ...
    object_list: QuerySet = ...

class ListView(MultipleObjectTemplateResponseMixin, BaseListView): ...
