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

1from postrfp.shared.serial.common import Pagination 

2 

3 

4from math import ceil 

5 

6 

7class Pager: 

8 """ 

9 Translates GET args 'page' and 'page_size' to SQLAlchemy slice values 

10 """ 

11 

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 

18 

19 @property 

20 def startfrom(self) -> int: 

21 return (self.page - 1) * self.page_size 

22 

23 @property 

24 def current_page(self) -> int: 

25 return self.page 

26 

27 @property 

28 def goto(self) -> int: 

29 return self.startfrom + self.page_size 

30 

31 def total_pages(self, total_count: int) -> int: 

32 return ceil(total_count / self.page_size) 

33 

34 def has_next(self, total_count: int) -> bool: 

35 return (self.page_size * self.page) <= total_count 

36 

37 def __repr__(self) -> str: 

38 return f"<Pager: rows {self.startfrom} to {self.goto}>" 

39 

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 )