Coverage for postrfp/shared/pager.py: 96%
24 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-22 21:34 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-22 21:34 +0000
1from postrfp.shared.serial.common import Pagination
4from math import ceil
7class Pager:
8 """
9 Translates GET args 'page' and 'page_size' to SQLAlchemy slice values
10 """
12 def __init__(self, page: int = 1, page_size: int = 20):
13 page_num = int(page)
14 if page_num < 1:
15 raise ValueError("query parameter -page- must be greater than zero")
16 self.page = page_num
17 self.page_size = page_size
19 @property
20 def startfrom(self) -> int:
21 return (self.page - 1) * self.page_size
23 @property
24 def current_page(self) -> int:
25 return self.page
27 @property
28 def goto(self) -> int:
29 return self.startfrom + self.page_size
31 def total_pages(self, total_count: int) -> int:
32 return ceil(total_count / self.page_size)
34 def has_next(self, total_count: int) -> bool:
35 return (self.page_size * self.page) <= total_count
37 def __repr__(self) -> str:
38 return f"<Pager: rows {self.startfrom} to {self.goto}>"
40 def as_pagination(self, total_records: int, current_page_count: int) -> Pagination:
41 return Pagination(
42 current_page=self.page,
43 page_size=self.page_size,
44 total_count=total_records,
45 total_pages=self.total_pages(total_records),
46 has_next=self.has_next(total_records),
47 current_page_count=current_page_count,
48 )