shortcuts.py 2.3 KB

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