Coverage for rfpy/web/__init__.py: 96%
25 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-24 10:52 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-24 10:52 +0000
1from math import ceil
2from typing import TYPE_CHECKING
4if TYPE_CHECKING:
5 from rfpy.web.serial import Pagination
8class Pager:
9 """
10 Translates GET args 'page' and 'page_size' to SQLAlchemy slice values
11 """
13 def __init__(self, page: int = 1, page_size: int = 20):
14 page_num = int(page)
15 if page_num < 1:
16 raise ValueError("query parameter -page- must be greater than zero")
17 self.page = page_num
18 self.page_size = page_size
20 @property
21 def startfrom(self) -> int:
22 return (self.page - 1) * self.page_size
24 @property
25 def current_page(self) -> int:
26 return self.page
28 @property
29 def goto(self) -> int:
30 return self.startfrom + self.page_size
32 def total_pages(self, total_count: int) -> int:
33 return ceil(total_count / self.page_size)
35 def has_next(self, total_count: int) -> bool:
36 return (self.page_size * self.page) <= total_count
38 def __repr__(self) -> str:
39 return f"<Pager: rows {self.startfrom} to {self.goto}>"
41 def as_pagination(
42 self, total_records: int, current_page_count: int
43 ) -> "Pagination":
44 from rfpy.web.serial import Pagination
46 return Pagination(
47 current_page=self.page,
48 page_size=self.page_size,
49 total_count=total_records,
50 total_pages=self.total_pages(total_records),
51 has_next=self.has_next(total_records),
52 current_page_count=current_page_count,
53 )