shortcuts.py 2.1 KB

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