Skip to content

Commit

Permalink
pre commit
Browse files Browse the repository at this point in the history
  • Loading branch information
idocyabra committed Dec 27, 2023
1 parent 168722a commit 52624cc
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 29 deletions.
17 changes: 13 additions & 4 deletions flask_mongoengine/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,9 @@ def paginate(self, page, per_page, first_page_index=1):
Paginate the QuerySet with a certain number of docs per page
and return docs for a given page.
"""
return Pagination(self, page=page, per_page=per_page, first_page_index=first_page_index)
return Pagination(
self, page=page, per_page=per_page, first_page_index=first_page_index
)

def paginate_by_keyset(self, per_page, field_filter_by, last_field_value):
"""
Expand All @@ -71,7 +73,9 @@ def paginate_by_keyset(self, per_page, field_filter_by, last_field_value):
"""
return KeysetPagination(self, per_page, field_filter_by, last_field_value)

def paginate_field(self, field_name, doc_id, page, per_page, total=None, first_page_index=1):
def paginate_field(
self, field_name, doc_id, page, per_page, total=None, first_page_index=1
):
"""
Paginate items within a list field from one document in the
QuerySet.
Expand All @@ -81,8 +85,13 @@ def paginate_field(self, field_name, doc_id, page, per_page, total=None, first_p
count = getattr(item, f"{field_name}_count", "")
total = total or count or len(getattr(item, field_name))
return ListFieldPagination(
self, doc_id, field_name, page, per_page, total=total,
first_page_index=first_page_index
self,
doc_id,
field_name,
page,
per_page,
total=total,
first_page_index=first_page_index,
)


Expand Down
2 changes: 1 addition & 1 deletion flask_mongoengine/pagination/abc_pagination.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import math
from abc import abstractmethod, ABC
from abc import ABC, abstractmethod


class ABCPagination(ABC):
Expand Down
47 changes: 29 additions & 18 deletions flask_mongoengine/pagination/basic_pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,14 @@


class Pagination(ABCPagination):
def __init__(self, iterable, page: int, per_page: int, max_depth: int = None,
first_page_index: int = 1
):
def __init__(
self,
iterable,
page: int,
per_page: int,
max_depth: int = None,
first_page_index: int = 1,
):
"""
:param iterable: iterable object .
:param page: Required page number start from 1.
Expand All @@ -19,7 +24,7 @@ def __init__(self, iterable, page: int, per_page: int, max_depth: int = None,
"""

if page < first_page_index:
abort(404, 'Invalid page number.')
abort(404, "Invalid page number.")

self.iterable = iterable
self.page = page
Expand All @@ -28,19 +33,19 @@ def __init__(self, iterable, page: int, per_page: int, max_depth: int = None,

if isinstance(self.iterable, QuerySet):
self.total = iterable.count()
self.items = self.iterable.skip(self.per_page * (self.page - self.first_page_index)).limit(
self.per_page
)
self.items = self.iterable.skip(
self.per_page * (self.page - self.first_page_index)
).limit(self.per_page)
if max_depth is not None:
self.items = self.items.select_related(max_depth)
else:
start_index = (page - self.first_page_index) * per_page
end_index = start_index + per_page

self.total = len(iterable)
self.items = iterable[start_index:min(end_index, self.total)]
self.items = iterable[start_index : min(end_index, self.total)]
if not self.items and page != self.first_page_index:
abort(404, 'Invalid page number.')
abort(404, "Invalid page number.")

@property
def pages(self) -> int:
Expand All @@ -56,10 +61,12 @@ def prev(self, error_out=False):
if isinstance(iterable, QuerySet):
iterable._skip = None
iterable._limit = None
return self.__class__(iterable,
page=self.page - 1,
per_page=self.per_page,
first_page_index=self.first_page_index)
return self.__class__(
iterable,
page=self.page - 1,
per_page=self.per_page,
first_page_index=self.first_page_index,
)

@property
def prev_num(self) -> int:
Expand All @@ -80,10 +87,12 @@ def next(self, error_out=False):
if isinstance(iterable, QuerySet):
iterable._skip = None
iterable._limit = None
return self.__class__(iterable,
page=self.page + 1,
per_page=self.per_page,
first_page_index=self.first_page_index)
return self.__class__(
iterable,
page=self.page + 1,
per_page=self.per_page,
first_page_index=self.first_page_index,
)

@property
def has_next(self) -> bool:
Expand All @@ -100,7 +109,9 @@ def next_num(self) -> int:
"""Number of the next page"""
return self.page + 1

def iter_pages(self, left_edge=2, left_current=2, right_current=5, right_edge=2): # TODO: documentation!!!
def iter_pages(
self, left_edge=2, left_current=2, right_current=5, right_edge=2
): # TODO: documentation!!!
"""Iterates over the page numbers in the pagination. The four
parameters control the thresholds how many numbers should be produced
from the sides. Skipped page numbers are represented as `None`.
Expand Down
18 changes: 13 additions & 5 deletions flask_mongoengine/pagination/list_field_pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,16 @@


class ListFieldPagination(Pagination):
def __init__(self, queryset, doc_id, field_name, page: int, per_page: int, total: [int | None] = None,
first_page_index: int = 1):
def __init__(
self,
queryset,
doc_id,
field_name,
page: int,
per_page: int,
total: [int | None] = None,
first_page_index: int = 1,
):
"""Allows an array within a document to be paginated.
Queryset must contain the document which has the array we're
Expand All @@ -21,7 +29,7 @@ def __init__(self, queryset, doc_id, field_name, page: int, per_page: int, total
"""
if page < first_page_index:
abort(404, 'Invalid page number.')
abort(404, "Invalid page number.")

self.page = page
self.per_page = per_page
Expand All @@ -42,7 +50,7 @@ def __init__(self, queryset, doc_id, field_name, page: int, per_page: int, total
)

if not self.items and page != self.first_page_index:
abort(404, 'Invalid page number.')
abort(404, "Invalid page number.")

def prev(self, error_out=False):
"""Returns a :class:`Pagination` object for the previous page."""
Expand All @@ -56,7 +64,7 @@ def prev(self, error_out=False):
self.page - 1,
self.per_page,
self.total,
self.first_page_index
self.first_page_index,
)

def next(self, error_out=False):
Expand Down
4 changes: 3 additions & 1 deletion tests/test_pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,9 @@ def test_list_field_pagination(app, todo):
_test_paginator(paginator, 1)

# Check first_page_index
paginator = ListFieldPagination(Todo.objects, todo.id, "comments", 0, 10, first_page_index=0)
paginator = ListFieldPagination(
Todo.objects, todo.id, "comments", 0, 10, first_page_index=0
)
_test_paginator(paginator, 0)

# Check with providing a total (saves a query)
Expand Down

0 comments on commit 52624cc

Please sign in to comment.