shortcuts.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from collections import OrderedDict
  2. import six
  3. from django.http import Http404
  4. from django.shortcuts import * # noqa
  5. def paginate(object_list, page, per_page, orphans=0,
  6. allow_empty_first_page=True,
  7. allow_explicit_first_page=False):
  8. from django.http import Http404
  9. from django.core.paginator import Paginator, EmptyPage, InvalidPage
  10. from .exceptions import ExplicitFirstPage
  11. if page in (1, "1") and not allow_explicit_first_page:
  12. raise ExplicitFirstPage()
  13. elif not page:
  14. page = 1
  15. try:
  16. return Paginator(
  17. object_list, per_page, orphans=orphans,
  18. allow_empty_first_page=allow_empty_first_page).page(page)
  19. except (EmptyPage, InvalidPage):
  20. raise Http404()
  21. def pagination_dict(page, include_page_range=True):
  22. pagination = {
  23. 'page': page.number,
  24. 'pages': page.paginator.num_pages,
  25. 'page_range': None,
  26. 'first': None,
  27. 'previous': None,
  28. 'next': None,
  29. 'last': None,
  30. 'before': 0,
  31. 'more': 0,
  32. }
  33. if include_page_range:
  34. pagination['page_range'] = list(page.paginator.page_range)
  35. if page.has_previous():
  36. pagination['first'] = 1
  37. if page.previous_page_number() > 1:
  38. pagination['previous'] = page.previous_page_number()
  39. if page.has_next():
  40. pagination['last'] = page.paginator.num_pages
  41. if page.next_page_number() <= page.paginator.num_pages:
  42. pagination['next'] = page.next_page_number()
  43. if page.start_index():
  44. pagination['before'] = page.start_index() - 1
  45. pagination['more'] = page.paginator.count - page.end_index()
  46. return OrderedDict([
  47. ('count', page.paginator.count),
  48. ('page', pagination['page']),
  49. ('pages', pagination['pages']),
  50. ('page_range', pagination['page_range']),
  51. ('first', pagination['first']),
  52. ('previous', pagination['previous']),
  53. ('next', pagination['next']),
  54. ('last', pagination['last']),
  55. ('before', pagination['before']),
  56. ('more', pagination['more'])
  57. ])
  58. def validate_slug(model, slug):
  59. from .exceptions import OutdatedSlug
  60. if model.slug != slug:
  61. raise OutdatedSlug(model)
  62. def get_int_or_404(value):
  63. if six.text_type(value).isdigit():
  64. return int(value)
  65. else:
  66. raise Http404()