shortcuts.py 2.4 KB

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