pkmntrade.club/cards/mixins.py

42 lines
No EOL
1.4 KiB
Python

from math import ceil
class ReusablePaginationMixin:
"""
A mixin that encapsulates reusable pagination logic.
Use in Django ListViews to generate custom pagination context.
"""
per_page = 10 # Default; can be overridden in your view.
def paginate_data(self, data_list, page_number):
"""
Paginate a list of items.
Arguments:
data_list (list): The list of items to paginate.
page_number (int): Current page number.
Returns:
tuple: (paginated_items, pagination_context)
"""
total_items = len(data_list)
num_pages = ceil(total_items / self.per_page) if self.per_page > 0 else 1
# Ensure page_number is within valid bounds.
if page_number < 1:
page_number = 1
elif page_number > num_pages:
page_number = num_pages
start = (page_number - 1) * self.per_page
end = page_number * self.per_page
items = data_list[start:end]
pagination_context = {
"number": page_number,
"has_previous": page_number > 1,
"has_next": page_number < num_pages,
"previous_page": page_number - 1 if page_number > 1 else 1,
"next_page": page_number + 1 if page_number < num_pages else num_pages,
"paginator": {"num_pages": num_pages},
}
return items, pagination_context