11import logging
22import re
33
4- from django .core .paginator import EmptyPage , PageNotAnInteger , Paginator
4+ from django .core .paginator import EmptyPage
5+ from django .core .paginator import PageNotAnInteger
6+ from django .core .paginator import Paginator
57from django .db .models .query import QuerySet
68from rest_framework .pagination import PageNumberPagination
79
@@ -25,11 +27,11 @@ class PaginatedListViewMixin:
2527 {"value" : 50 , "label" : "50 per page" },
2628 {"value" : 100 , "label" : "100 per page" },
2729 ]
28-
29- max_pages_without_truncation = 5 # it is a value for number of pages without truncation like is total number of pages are less than this number the pagination will show all pages.
30- pages_around_current = 2 # number of pages to be shown around current page
31- truncation_threshold_start = 4 # it is a threshold for start of truncation
32- truncation_threshold_end = 3 # it is a threshold for end of truncation
30+
31+ max_pages_without_truncation = 5 # it is a value for number of pages without truncation like is total number of pages are less than this number the pagination will show all pages.
32+ pages_around_current = 2 # number of pages to be shown around current page
33+ truncation_threshold_start = 4 # it is a threshold for start of truncation
34+ truncation_threshold_end = 3 # it is a threshold for end of truncation
3335
3436 def get_queryset (self ):
3537 """
@@ -40,7 +42,7 @@ def get_queryset(self):
4042 except Exception as e :
4143 logger .error (f"Error in get_queryset: { e } " )
4244 return self .model .objects .none ()
43-
45+
4446 if not queryset or not isinstance (queryset , QuerySet ):
4547 queryset = self .model .objects .none ()
4648 return queryset
@@ -51,22 +53,24 @@ def sanitize_page_size(self, raw_page_size):
5153 """
5254 if not raw_page_size :
5355 return self .paginate_default
54-
55- clean_page_size = re .sub (r"\D" , "" , str (raw_page_size )) # it remove all non-digit characters like if 50abcd is their then it takes out 50
56+
57+ clean_page_size = re .sub (
58+ r"\D" , "" , str (raw_page_size )
59+ ) # it remove all non-digit characters like if 50abcd is their then it takes out 50
5660 if not clean_page_size :
5761 return self .paginate_default
58-
62+
5963 try :
6064 page_size = int (clean_page_size )
6165 except (ValueError , TypeError ):
6266 logger .info ("Invalid page_size input attempted" )
6367 return self .paginate_default
64-
68+
6569 valid_sizes = {choice ["value" ] for choice in self .page_size_choices }
6670 if page_size not in valid_sizes :
6771 logger .warning (f"Attempted to use unauthorized page size: { page_size } " )
6872 return self .paginate_default
69-
73+
7074 return page_size
7175
7276 def get_paginate_by (self , queryset = None ):
@@ -85,7 +89,7 @@ def get_page_range(self, paginator, page_obj):
8589 if num_pages <= self .max_pages_without_truncation :
8690 return list (map (str , range (1 , num_pages + 1 )))
8791 pages = [1 ]
88-
92+
8993 if current_page > self .truncation_threshold_start :
9094 pages .append ("..." )
9195 start = max (2 , current_page - self .pages_around_current )
@@ -102,7 +106,7 @@ def paginate_queryset(self, queryset, page_size):
102106 queryset = self .model .objects .none ()
103107 paginator = Paginator (queryset , page_size )
104108 try :
105- page_number = int (self .request .GET .get ("page" , "1" ))
109+ page_number = int (self .request .GET .get ("page" , "1" ))
106110 except (ValueError , TypeError ):
107111 logger .error ("Invalid page number input" )
108112 page_number = 1
@@ -118,12 +122,11 @@ def get_context_data(self, **kwargs):
118122 """
119123 Return a mapping of pagination-related context data, preserving filters.
120124 """
121- queryset = kwargs .pop (' queryset' , None ) or self .get_queryset ()
125+ queryset = kwargs .pop (" queryset" , None ) or self .get_queryset ()
122126 page_size = self .get_paginate_by ()
123127 paginator , page , object_list , is_paginated = self .paginate_queryset (queryset , page_size )
124128 page_range = self .get_page_range (paginator , page )
125129
126-
127130 context = super ().get_context_data (
128131 object_list = object_list ,
129132 page_obj = page ,
@@ -134,14 +137,15 @@ def get_context_data(self, **kwargs):
134137
135138 previous_page_url = page .previous_page_number () if page .has_previous () else None
136139 next_page_url = page .next_page_number () if page .has_next () else None
137- context .update ({
138- "current_page_size" : page_size ,
139- "page_size_choices" : self .page_size_choices ,
140- "total_count" : paginator .count ,
141- "page_range" : page_range ,
142- "search" : self .request .GET .get ("search" , "" ),
143- "previous_page_url" : previous_page_url ,
144- "next_page_url" : next_page_url ,
145- }
140+ context .update (
141+ {
142+ "current_page_size" : page_size ,
143+ "page_size_choices" : self .page_size_choices ,
144+ "total_count" : paginator .count ,
145+ "page_range" : page_range ,
146+ "search" : self .request .GET .get ("search" , "" ),
147+ "previous_page_url" : previous_page_url ,
148+ "next_page_url" : next_page_url ,
149+ }
146150 )
147151 return context
0 commit comments