shortcuts.py 2.1 KB

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