Guest User

Untitled

a guest
Jan 21st, 2018
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. #
  2. # This piece of code is in the public domain.
  3. # <zh.jesse@gmail.com>
  4. #
  5.  
  6. #### the filter ####
  7.  
  8. def insert_ellipse(lst, ellipse=0):
  9. '''Insert ellipse where it's not sequential
  10.  
  11. An ellipse is represented by @ellipse.
  12.  
  13. E.g.:
  14. [1, 2, 5] -> [1, 2, 0, 5]
  15. [1, 2, 4] -> [1, 2, 3, 4]
  16.  
  17. The last example is that if only one step is missing, just add it instead
  18. of an ellipse.
  19. '''
  20.  
  21. if len(lst) <= 1:
  22. return list(lst[:])
  23. gap = lst[1] - lst[0]
  24. if gap <= 1:
  25. return [lst[0]] + insert_ellipse(lst[1:], ellipse)
  26. elif gap == 2:
  27. return [lst[0], lst[0] + 1] + insert_ellipse(lst[1:], ellipse)
  28. else:
  29. return [lst[0], ellipse] + insert_ellipse(lst[1:], ellipse)
  30.  
  31. @register.filter
  32. def pick_pages(num_pages, current):
  33. '''pick pages to display in the pager
  34.  
  35. It's like: 1 ... (x-2) (x-1) (x) (x+1) (x+2) ... N.
  36. '''
  37.  
  38. ret = []
  39.  
  40. for p in range(current - 2, current):
  41. if p >= 1:
  42. ret.append(p)
  43. ret.append(current)
  44. for p in range(current + 1, current + 3):
  45. if p <= num_pages:
  46. ret.append(p)
  47.  
  48. if ret[0] != 1:
  49. ret.insert(0, 1)
  50. if ret[-1] != num_pages:
  51. ret.append(num_pages)
  52. ret = insert_ellipse(ret)
  53.  
  54. return ret
  55.  
  56. #### template ####
  57.  
  58. {% if page.paginator.num_pages > 1 %}
  59. <div class="pager">
  60. {% if page.number > 1 %}
  61. <a href="{% add_get_param request 'page' page.previous_page_number %}">
  62. <span class="page-number prev">←prev</span>
  63. </a>
  64. {% endif %}
  65.  
  66. {% for p in page.paginator.num_pages|pick_pages:page.number %}
  67. {% if p == page.number %}
  68. <span class="page-number current">{{p}}</span>
  69. {% else %}{% if p == 0 %}
  70. <span class="page-number ellipse">&hellip;</span>
  71. {% else %}
  72. <a href="{% add_get_param request 'page' p %}">
  73. <span class="page-number">{{p}}</span>
  74. </a>
  75. {% endif %}
  76. {% endif %}
  77. {% endfor %}
  78.  
  79. {% if page.number < page.paginator.num_pages %}
  80. <a href="{% add_get_param request 'page' page.next_page_number %}">
  81. <span class="page-number next">next→</span>
  82. </a>
  83. {% endif %}
  84. </div>
  85. {% endif %}
  86.  
  87. #### unittest / examples ####
  88.  
  89. def test_insert_ellipse(self):
  90. for lst, result in (
  91. ((0, 1, 3), [0, 1, 2, 3]),
  92. ((0, 1, 4), [0, 1, None, 4]),
  93. ):
  94. self.assertEqual(insert_ellipse(lst, ellipse=None), result)
  95.  
  96. for lst, result in (
  97. ((1,), [1]),
  98. ((1, 3, 5), [1, 2, 3, 4, 5]),
  99. ((3, 7), [3, 0, 7]),
  100. ):
  101. self.assertEqual(points_utils.insert_ellipse(lst), result)
  102.  
  103. def test_filter_pick_pages(self):
  104. for num_pages, current, output in (
  105. (3, 1, [1, 2, 3]),
  106. (5, 1, [1, 2, 3, 4, 5]),
  107. (5, 3, [1, 2, 3, 4, 5]),
  108. (6, 1, [1, 2, 3, 0, 6]),
  109. (6, 5, [1, 2, 3, 4, 5, 6]),
  110. (6, 6, [1, 0, 4, 5, 6]),
  111. (1, 1, [1]),
  112. ):
  113. self.assertEqual(pick_pages(num_pages, current), output)
Add Comment
Please, Sign In to add comment