Skip to content

Commit d0c651e

Browse files
committed
refactor pagination module
1 parent a619d2c commit d0c651e

File tree

6 files changed

+288
-253
lines changed

6 files changed

+288
-253
lines changed

ninja_extra/pagination.py

Lines changed: 0 additions & 253 deletions
This file was deleted.

ninja_extra/pagination/__init__.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from ninja.pagination import LimitOffsetPagination, PageNumberPagination, PaginationBase
2+
3+
from ninja_extra.schemas import PaginatedResponseSchema
4+
5+
from .decorator import paginate
6+
from .models import PageNumberPaginationExtra
7+
from .operations import AsyncPaginatorOperation, PaginatorOperation
8+
9+
__all__ = [
10+
"PageNumberPagination",
11+
"PageNumberPaginationExtra",
12+
"PaginationBase",
13+
"LimitOffsetPagination",
14+
"paginate",
15+
"PaginatedResponseSchema",
16+
"PaginatorOperation",
17+
"AsyncPaginatorOperation",
18+
]

ninja_extra/pagination/decorator.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import inspect
2+
import logging
3+
from typing import (
4+
Any,
5+
Callable,
6+
Type,
7+
overload,
8+
)
9+
10+
from ninja.constants import NOT_SET
11+
from ninja.pagination import PaginationBase
12+
from ninja.signature import is_async
13+
14+
from ninja_extra.conf import settings
15+
from ninja_extra.pagination.operations import (
16+
AsyncPaginatorOperation,
17+
PaginatorOperation,
18+
)
19+
20+
logger = logging.getLogger()
21+
22+
23+
@overload
24+
def paginate() -> Callable[..., Any]: # pragma: no cover
25+
...
26+
27+
28+
@overload
29+
def paginate(
30+
func_or_pgn_class: Any = NOT_SET, **paginator_params: Any
31+
) -> Callable[..., Any]: # pragma: no cover
32+
...
33+
34+
35+
def paginate(
36+
func_or_pgn_class: Any = NOT_SET, **paginator_params: Any
37+
) -> Callable[..., Any]:
38+
isfunction = inspect.isfunction(func_or_pgn_class)
39+
is_not_set = func_or_pgn_class == NOT_SET
40+
41+
pagination_class: Type[PaginationBase] = settings.PAGINATION_CLASS
42+
43+
if isfunction:
44+
return _inject_pagination(func_or_pgn_class, pagination_class)
45+
46+
if not is_not_set:
47+
pagination_class = func_or_pgn_class
48+
49+
def wrapper(func: Callable[..., Any]) -> Any:
50+
return _inject_pagination(func, pagination_class, **paginator_params)
51+
52+
return wrapper
53+
54+
55+
def _inject_pagination(
56+
func: Callable[..., Any],
57+
paginator_class: Type[PaginationBase],
58+
**paginator_params: Any,
59+
) -> Callable[..., Any]:
60+
paginator: PaginationBase = paginator_class(**paginator_params)
61+
paginator_kwargs_name = "pagination"
62+
paginator_operation_class = PaginatorOperation
63+
64+
if is_async(func):
65+
paginator_operation_class = AsyncPaginatorOperation
66+
paginator_operation = paginator_operation_class(
67+
paginator=paginator, view_func=func, paginator_kwargs_name=paginator_kwargs_name
68+
)
69+
70+
return paginator_operation.as_view
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .page_by_number import PageNumberPaginationExtra
2+
3+
__all__ = [
4+
"PageNumberPaginationExtra",
5+
]

0 commit comments

Comments
 (0)