shortcuts.py 2.1 KB

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