#25513: Paginator support for large page counts
------------------------------+-----------------------
     Reporter:  Tuttle        |      Owner:  nobody
         Type:  New feature   |     Status:  new
    Component:  Core (Other)  |    Version:  1.9a1
     Severity:  Normal        |   Keywords:  paginator
 Triage Stage:  Unreviewed    |  Has patch:  0
Easy pickings:  0             |      UI/UX:  0
------------------------------+-----------------------
 For large page counts I miss a standard way to display only interesting
 blocks of page links in the paginator. I guess Django should include one.

 What do you think about integrating my implementation to
 {{{django.core.paginator.Page}}} drafted below?
 **Template example at the bottom.**

 {{{#!python
 from django.core.paginator import Paginator, Page

 class EllipsisPaginator(Paginator):
     def __init__(self, *args, **kwargs):
         # number of page links to always display after the first page
         self.start_wing = kwargs.pop('start_wing', 1)
         # number of page links to always display around the current page
         self.island_wings = kwargs.pop('island_wings', 2)
         # number of page links to always display before the last page
         self.end_wing = kwargs.pop('end_wing', 1)

         super(EllipsisPaginator, self).__init__(*args, **kwargs)

     def _get_page(self, *args, **kwargs):
         return EllipsisPage(*args, **kwargs)


 class EllipsisPage(Page):
     def pages_with_ellipsis(self):
         """
         Generates the list of page numbers for large page counts.
         Yields '...' where the range of links should be omitted.

         >>> pp = EllipsisPaginator(object_list=range(38), per_page=3)
         >>> list(pp.page(1).pages_with_ellipsis())
         [1, 2, 3, '...', 12, 13]
         >>> list(pp.page(2).pages_with_ellipsis())
         [1, 2, 3, 4, '...', 12, 13]
         >>> list(pp.page(3).pages_with_ellipsis())
         [1, 2, 3, 4, 5, '...', 12, 13]
         >>> list(pp.page(4).pages_with_ellipsis())
         [1, 2, 3, 4, 5, 6, '...', 12, 13]
         >>> list(pp.page(5).pages_with_ellipsis())
         [1, 2, 3, 4, 5, 6, 7, '...', 12, 13]
         >>> list(pp.page(6).pages_with_ellipsis())
         [1, 2, 3, 4, 5, 6, 7, 8, '...', 12, 13]
         >>> list(pp.page(7).pages_with_ellipsis())
         [1, 2, '...', 5, 6, 7, 8, 9, '...', 12, 13]
         >>> list(pp.page(8).pages_with_ellipsis())
         [1, 2, '...', 6, 7, 8, 9, 10, 11, 12, 13]
         >>> list(pp.page(9).pages_with_ellipsis())
         [1, 2, '...', 7, 8, 9, 10, 11, 12, 13]
         >>> list(pp.page(10).pages_with_ellipsis())
         [1, 2, '...', 8, 9, 10, 11, 12, 13]
         >>> list(pp.page(11).pages_with_ellipsis())
         [1, 2, '...', 9, 10, 11, 12, 13]
         >>> list(pp.page(12).pages_with_ellipsis())
         [1, 2, '...', 10, 11, 12, 13]
         >>> list(pp.page(13).pages_with_ellipsis())
         [1, 2, '...', 11, 12, 13]
         """
         num = 1

         end_of_start_wing = min(self.paginator.num_pages,
 self.paginator.start_wing+1)

         for num in xrange(1, end_of_start_wing+1):
             yield num

         island_start = self.number - self.paginator.island_wings

         if num < island_start-2:
             yield '...'
             num = island_start
         else:
             num += 1

         island_end = min(self.paginator.num_pages, self.number +
 self.paginator.island_wings)

         for num in xrange(num, island_end+1):
             yield num

         start_of_end_wing = self.paginator.num_pages -
 self.paginator.end_wing

         if num < start_of_end_wing-2:
             yield '...'
             num = start_of_end_wing
         else:
             num += 1

         for num in xrange(num, self.paginator.num_pages+1):
             yield num
 }}}

 Usage in the template:
 {{{
 <ul class="pagination">
     <li rel="prev">
         <a {% if page.has_previous %}href="?page={{
 page.previous_page_number }}"{% endif %}>
             Previous
         </a>
     </li>

     {% for pg in page.pages_with_ellipsis %}

         {% if pg != '...' %}
             <li {% if pg == page.number %}class="active"{% endif %}>
                 <a {% if pg != page.number %}href="?page={{ pg }}"{% endif
 %}>
                     {{ pg }}
                 </a>
             </li>
         {% else %}
             <li><span>&hellip;</span></li>
         {% endif %}

     {% endfor %}

     <li rel="next" {% if page.has_next %}class="highlight"{% endif %}>
         <a {% if page.has_next %}href="?page={{ page.next_page_number
 }}"{% endif %}>
             Next
         </a>
     </li>
 </ul>
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/25513>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/049.5105bbdc5737d0667fe405f18ca55804%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to