pagination.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import math
  2. from django.http import Http404
  3. def make_pagination(page, total, per):
  4. pagination = {'start': 0, 'stop': 0, 'prev':-1, 'next':-1}
  5. page = int(page)
  6. if page > 0:
  7. pagination['start'] = (page - 1) * per
  8. # Set page and total stat
  9. pagination['page'] = int(pagination['start'] / per) + 1
  10. pagination['total'] = int(math.ceil(total / float(per)))
  11. # Fix too large offset
  12. if pagination['start'] > total:
  13. pagination['start'] = 0
  14. # Allow prev/next?
  15. if total > per:
  16. if pagination['page'] > 1:
  17. pagination['prev'] = pagination['page'] - 1
  18. if pagination['page'] < pagination['total']:
  19. pagination['next'] = pagination['page'] + 1
  20. # Fix empty pagers
  21. if not pagination['total']:
  22. pagination['total'] = 1
  23. # Set stop offset
  24. pagination['stop'] = pagination['start'] + per
  25. # Put 1/5 of last page on current page...
  26. if pagination['page'] + 1 == pagination['total']:
  27. last_page = per + total - (pagination['total'] * per)
  28. cutoff = int(per / 5)
  29. if cutoff > 1 and last_page < cutoff:
  30. pagination['stop'] += last_page
  31. pagination['total'] -= 1
  32. pagination['next'] = -1
  33. # Raise 404 if page is out of range
  34. if pagination['page'] > pagination['total']:
  35. raise Http404()
  36. # Return complete pager
  37. return pagination