shortcuts.py 2.1 KB

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