shortcuts.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from rest_framework.response import Response
  2. from django.http import Http404
  3. import six
  4. def paginate(object_list, page, per_page, orphans=0,
  5. allow_empty_first_page=True,
  6. allow_explicit_first_page=False,
  7. paginator=None):
  8. from django.core.paginator import Paginator, EmptyPage, InvalidPage
  9. from .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. paginator = paginator or Paginator
  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):
  22. pagination = {
  23. 'page': page.number,
  24. 'pages': page.paginator.num_pages,
  25. 'count': page.paginator.count,
  26. 'first': None,
  27. 'previous': None,
  28. 'next': None,
  29. 'last': None,
  30. 'before': 0,
  31. 'more': 0,
  32. }
  33. if page.has_previous():
  34. pagination['first'] = 1
  35. pagination['previous'] = page.previous_page_number()
  36. if page.has_next():
  37. pagination['last'] = page.paginator.num_pages
  38. pagination['next'] = page.next_page_number()
  39. if page.start_index():
  40. pagination['before'] = page.start_index() - 1
  41. pagination['more'] = page.paginator.count - page.end_index()
  42. return pagination
  43. def paginated_response(page, serializer=None, data=None, extra=None):
  44. response_data = pagination_dict(page)
  45. results = list(data or page.object_list)
  46. if serializer:
  47. results = serializer(results, many=True).data
  48. response_data.update({
  49. 'results': results
  50. })
  51. if extra:
  52. response_data.update(extra)
  53. return Response(response_data)
  54. def validate_slug(model, slug):
  55. from .exceptions import OutdatedSlug
  56. if model.slug != slug:
  57. raise OutdatedSlug(model)
  58. def get_int_or_404(value):
  59. if six.text_type(value).isdigit():
  60. return int(value)
  61. else:
  62. raise Http404()