Various small bug fixes, break out pagination for cards into its own mixin and templatetag

This commit is contained in:
badblocks 2025-03-29 00:27:40 -07:00
parent 05a279fa3a
commit 138a929da6
17 changed files with 225 additions and 136 deletions

42
cards/mixins.py Normal file
View file

@ -0,0 +1,42 @@
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