Advertisement
Guest User

Untitled

a guest
Aug 4th, 2015
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. #coding: utf-8
  2. from rest_framework import serializers, pagination
  3. from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, Page
  4.  
  5.  
  6. class CustomPaginatorSerializer(pagination.BasePaginationSerializer):
  7. """ Сериалайзер для пагинатора drf.
  8. """
  9. has_next = serializers.BooleanField()
  10. next = pagination.NextPageField(source='*')
  11. previous = pagination.PreviousPageField(source='*')
  12. page = serializers.IntegerField(source='number')
  13. per_page = serializers.IntegerField(source='paginator.per_page')
  14.  
  15. results_field = 'objects'
  16.  
  17.  
  18. class FeedPage(Page):
  19. '''Страница, поддерживающия логику фида. Наличие следующей страницы
  20. определяется как len(object_list) > per_page.'''
  21.  
  22. @property
  23. def object_list(self):
  24. '''Возвращает список объектов на странице без лишних элементов.'''
  25. try:
  26. return self.__object_list[:self.paginator.per_page]
  27. except TypeError:
  28. return list()
  29.  
  30. @object_list.setter
  31. def object_list(self, value):
  32. self.__object_list = value
  33.  
  34. def __init__(self, object_list, number, paginator):
  35. self.__object_list = None
  36. super(FeedPage, self).__init__(object_list, number, paginator)
  37.  
  38. def __repr__(self):
  39. return '<Page %s of Unknown>' % (self.number,)
  40.  
  41. def has_next(self):
  42. try:
  43. return len(self.__object_list) > self.paginator.per_page
  44. except TypeError:
  45. return False
  46.  
  47. def end_index(self):
  48. raise NotImplementedError("feed doesn't support count")
  49.  
  50.  
  51. class FeedPaginator(Paginator):
  52. '''Пагинатор для фидов.'''
  53.  
  54. def _get_num_pages(self):
  55. '''Никогда не известно, сколько страниц всего.'''
  56. raise NotImplementedError()
  57.  
  58. def _get_page_range(self):
  59. '''Никогда не известно, сколько страниц всего.'''
  60. raise NotImplementedError()
  61.  
  62. def _get_count(self):
  63. '''Не будем считать количество объектов.'''
  64. raise NotImplementedError()
  65.  
  66. def validate_number(self, number):
  67. "Validates the given 1-based page number."
  68. try:
  69. number = int(number)
  70. except ValueError:
  71. raise PageNotAnInteger('That page number is not an integer')
  72. if number < 1:
  73. raise EmptyPage('That page number is less than 1')
  74. return number
  75.  
  76. def page(self, number):
  77. "Returns a Page object for the given 1-based page number."
  78. number = self.validate_number(number)
  79. bottom = (number - 1) * self.per_page
  80. top = bottom + self.per_page
  81. # top + 1 чтобы FeedPage мог определить, есть ли у него
  82. # данные для показа на следующей странице
  83. if self.object_list is not None:
  84. return FeedPage(self.object_list[bottom: top + 1], number, self)
  85. return FeedPage(None, number, self)
  86.  
  87.  
  88. class LazyAdminPaginator(FeedPaginator):
  89. """
  90. Ленивый paginator для админке. Не выполянет запросы к бд за count
  91. """
  92. def _get_count(self):
  93. return 0
  94. count = property(_get_count)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement