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

1from math import ceil 

2from typing import TYPE_CHECKING 

3 

4if TYPE_CHECKING: 

5 from rfpy.web.serial import Pagination 

6 

7 

8class Pager: 

9 """ 

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

11 """ 

12 

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 

19 

20 @property 

21 def startfrom(self) -> int: 

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

23 

24 @property 

25 def current_page(self) -> int: 

26 return self.page 

27 

28 @property 

29 def goto(self) -> int: 

30 return self.startfrom + self.page_size 

31 

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

33 return ceil(total_count / self.page_size) 

34 

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

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

37 

38 def __repr__(self) -> str: 

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

40 

41 def as_pagination( 

42 self, total_records: int, current_page_count: int 

43 ) -> "Pagination": 

44 from rfpy.web.serial import Pagination 

45 

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 )