11import inspect
22import logging
3- import sys
43from collections import OrderedDict
54from functools import wraps
6- from typing import TYPE_CHECKING , Any , Callable , Optional , Type , Union , cast
5+ from typing import TYPE_CHECKING , Any , Callable , Optional , Type , Union , cast , overload
76
87from django .core .paginator import InvalidPage , Page , Paginator
98from django .db .models import QuerySet
1716
1817from ninja_extra .conf import settings
1918from ninja_extra .exceptions import NotFound
20- from ninja_extra .schemas import PaginatedResponseSchema , get_paginated_response_schema
19+ from ninja_extra .schemas import PaginatedResponseSchema
2120from ninja_extra .urls import remove_query_param , replace_query_param
2221
2322logger = logging .getLogger ()
3130 "PaginationBase" ,
3231 "LimitOffsetPagination" ,
3332 "paginate" ,
33+ "PaginatedResponseSchema" ,
3434]
3535
3636
@@ -106,11 +106,9 @@ def get_paginated_response(self, *, base_url: str, page: Page) -> DictStrAny:
106106
107107 @classmethod
108108 def get_response_schema (
109- cls , response_schema : Union [Schema , Type [Schema ]]
110- ) -> Type [Schema ]:
111- if sys .version_info >= (3 , 8 ):
112- return PaginatedResponseSchema [response_schema ]
113- return get_paginated_response_schema (response_schema )
109+ cls , response_schema : Union [Schema , Type [Schema ], Any ]
110+ ) -> Any :
111+ return PaginatedResponseSchema [response_schema ]
114112
115113 def get_next_link (self , url : str , page : Page ) -> Optional [str ]:
116114 if not page .has_next ():
@@ -136,7 +134,21 @@ def get_page_size(self, page_size: int) -> int:
136134 return self .page_size
137135
138136
139- def paginate (func_or_pgn_class : Any = NOT_SET , ** paginator_params : Any ) -> Callable :
137+ @overload
138+ def paginate () -> Callable [..., Any ]:
139+ ...
140+
141+
142+ @overload
143+ def paginate (
144+ func_or_pgn_class : Any = NOT_SET , ** paginator_params : Any
145+ ) -> Callable [..., Any ]:
146+ ...
147+
148+
149+ def paginate (
150+ func_or_pgn_class : Any = NOT_SET , ** paginator_params : Any
151+ ) -> Callable [..., Any ]:
140152 isfunction = inspect .isfunction (func_or_pgn_class )
141153 isnotset = func_or_pgn_class == NOT_SET
142154
@@ -148,32 +160,31 @@ def paginate(func_or_pgn_class: Any = NOT_SET, **paginator_params: Any) -> Calla
148160 if not isnotset :
149161 pagination_class = func_or_pgn_class
150162
151- def wrapper (func : Callable ) -> Any :
163+ def wrapper (func : Callable [..., Any ] ) -> Any :
152164 return _inject_pagination (func , pagination_class , ** paginator_params )
153165
154166 return wrapper
155167
156168
157169def _inject_pagination (
158- func : Callable ,
170+ func : Callable [..., Any ] ,
159171 paginator_class : Type [PaginationBase ],
160172 ** paginator_params : Any ,
161- ) -> Callable :
162- func_modified = cast (Any , func )
163- func_modified .has_kwargs = True
164- if not has_kwargs (func_modified ):
165- func_modified .has_kwargs = False
173+ ) -> Callable [..., Any ]:
174+ func .has_kwargs = True # type: ignore
175+ if not has_kwargs (func ):
176+ func .has_kwargs = False # type: ignore
166177 logger .debug (
167- f"function { func_modified .__name__ } should have **kwargs if you want to use pagination parameters"
178+ f"function { func .__name__ } should have **kwargs if you want to use pagination parameters"
168179 )
169180
170181 paginator : PaginationBase = paginator_class (** paginator_params )
171182 paginator_kwargs_name = "pagination"
172183
173- @wraps (func_modified )
184+ @wraps (func )
174185 def view_with_pagination (controller : "APIController" , * args : Any , ** kw : Any ) -> Any :
175186 func_kwargs = dict (kw )
176- if not func_modified .has_kwargs :
187+ if not func .has_kwargs : # type: ignore
177188 func_kwargs .pop (paginator_kwargs_name )
178189
179190 items = func (controller , * args , ** func_kwargs )
0 commit comments