Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #coding: utf-8
- from rest_framework import serializers, pagination
- from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, Page
- class CustomPaginatorSerializer(pagination.BasePaginationSerializer):
- """ Сериалайзер для пагинатора drf.
- """
- has_next = serializers.BooleanField()
- next = pagination.NextPageField(source='*')
- previous = pagination.PreviousPageField(source='*')
- page = serializers.IntegerField(source='number')
- per_page = serializers.IntegerField(source='paginator.per_page')
- results_field = 'objects'
- class FeedPage(Page):
- '''Страница, поддерживающия логику фида. Наличие следующей страницы
- определяется как len(object_list) > per_page.'''
- @property
- def object_list(self):
- '''Возвращает список объектов на странице без лишних элементов.'''
- try:
- return self.__object_list[:self.paginator.per_page]
- except TypeError:
- return list()
- @object_list.setter
- def object_list(self, value):
- self.__object_list = value
- def __init__(self, object_list, number, paginator):
- self.__object_list = None
- super(FeedPage, self).__init__(object_list, number, paginator)
- def __repr__(self):
- return '<Page %s of Unknown>' % (self.number,)
- def has_next(self):
- try:
- return len(self.__object_list) > self.paginator.per_page
- except TypeError:
- return False
- def end_index(self):
- raise NotImplementedError("feed doesn't support count")
- class FeedPaginator(Paginator):
- '''Пагинатор для фидов.'''
- def _get_num_pages(self):
- '''Никогда не известно, сколько страниц всего.'''
- raise NotImplementedError()
- def _get_page_range(self):
- '''Никогда не известно, сколько страниц всего.'''
- raise NotImplementedError()
- def _get_count(self):
- '''Не будем считать количество объектов.'''
- raise NotImplementedError()
- def validate_number(self, number):
- "Validates the given 1-based page number."
- try:
- number = int(number)
- except ValueError:
- raise PageNotAnInteger('That page number is not an integer')
- if number < 1:
- raise EmptyPage('That page number is less than 1')
- return number
- def page(self, number):
- "Returns a Page object for the given 1-based page number."
- number = self.validate_number(number)
- bottom = (number - 1) * self.per_page
- top = bottom + self.per_page
- # top + 1 чтобы FeedPage мог определить, есть ли у него
- # данные для показа на следующей странице
- if self.object_list is not None:
- return FeedPage(self.object_list[bottom: top + 1], number, self)
- return FeedPage(None, number, self)
- class LazyAdminPaginator(FeedPaginator):
- """
- Ленивый paginator для админке. Не выполянет запросы к бд за count
- """
- def _get_count(self):
- return 0
- count = property(_get_count)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement