Esempio n. 1
0
    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

        marker_value, pages = _get_marker(self.queryset_id, number)

        if marker_value:
            if len(self.original_orderings
                   ) == 1 and self.original_orderings[0].startswith("-"):
                qs = self.object_list.all().filter(
                    **{"{}__lt".format(self.field_required): marker_value})
            else:
                qs = self.object_list.all().filter(
                    **{"{}__gt".format(self.field_required): marker_value})
            bottom = pages * self.per_page  # We have to skip the pages here
            top = bottom + self.per_page
        else:
            qs = self.object_list

        results = list(qs[bottom:top + (self.per_page * self.readahead)])

        next_page = results[top:]
        next_page_counter = number + 1
        while next_page:
            if len(next_page) > self.per_page - 1:
                index = self.per_page - 1
            else:
                index = len(next_page) - 1
            _store_marker(self.queryset_id, next_page_counter,
                          getattr(next_page[index], self.field_required))
            next_page_counter += 1
            next_page = next_page[self.per_page:]

        if not results and not self.allow_empty_first_page:
            raise paginator.EmptyPage("That page contains no results")

        known_count = ((number - 1) * self.per_page) + len(results)
        _update_known_count(self.queryset_id, known_count)

        page = self._get_page(results[:self.per_page], number, self)

        if len(page.object_list) > self.per_page - 1:
            index = self.per_page - 1
        else:
            index = len(page.object_list) - 1

        if results:
            _store_marker(
                self.queryset_id, number,
                getattr(page.object_list[index], self.field_required))

        return page
Esempio n. 2
0
 def validate_number(self, number):
     """Override default handling to remove the extra search query
     """
     try:
         number = int(number)
     except (TypeError, ValueError):
         raise django_paginator.PageNotAnInteger(
             'That page number is not an integer')
     if number < 1:
         raise django_paginator.EmptyPage('That page number is less than 1')
     return number
Esempio n. 3
0
    def validate_number(self, number):
        """
        Validates the given 1-based page number.
        """
        try:
            number = int(number)
        except (TypeError, ValueError):
            raise paginator.PageNotAnInteger(
                'That page number is not an integer')
        if number < 1:
            raise paginator.EmptyPage('That page number is less than 1')

        return number