|
|
|
@ -3,9 +3,9 @@ |
|
|
|
from typing import Any, Iterator, List, Optional, TypeVar |
|
|
|
|
|
|
|
from pyramid.request import Request |
|
|
|
from sqlalchemy import Column, func |
|
|
|
from sqlalchemy import Column, func, inspect |
|
|
|
|
|
|
|
from tildes.lib.id import id36_to_id |
|
|
|
from tildes.lib.id import id_to_id36, id36_to_id |
|
|
|
from .model_query import ModelQuery |
|
|
|
|
|
|
|
|
|
|
|
@ -22,7 +22,8 @@ class PaginatedQuery(ModelQuery): |
|
|
|
|
|
|
|
super().__init__(model_cls, request) |
|
|
|
|
|
|
|
self._sort_column: Optional[Column] = None |
|
|
|
# default to sorting by created_time descending (newest first) |
|
|
|
self._sort_column = model_cls.created_time |
|
|
|
self.sort_desc = True |
|
|
|
|
|
|
|
self.after_id: Optional[int] = None |
|
|
|
@ -135,17 +136,16 @@ class PaginatedQuery(ModelQuery): |
|
|
|
"""Finalize the query before execution.""" |
|
|
|
query = super()._finalize() |
|
|
|
|
|
|
|
if self._sort_column: |
|
|
|
# if the query is reversed, we need to sort in the opposite dir |
|
|
|
# (basically self.sort_desc XOR self.is_reversed) |
|
|
|
desc = self.sort_desc |
|
|
|
if self.is_reversed: |
|
|
|
desc = not desc |
|
|
|
# if the query is reversed, we need to sort in the opposite dir |
|
|
|
# (basically self.sort_desc XOR self.is_reversed) |
|
|
|
desc = self.sort_desc |
|
|
|
if self.is_reversed: |
|
|
|
desc = not desc |
|
|
|
|
|
|
|
if desc: |
|
|
|
query = query.order_by(*self.sorting_columns_desc) |
|
|
|
else: |
|
|
|
query = query.order_by(*self.sorting_columns) |
|
|
|
if desc: |
|
|
|
query = query.order_by(*self.sorting_columns_desc) |
|
|
|
else: |
|
|
|
query = query.order_by(*self.sorting_columns) |
|
|
|
|
|
|
|
# pylint: disable=protected-access |
|
|
|
query = query._apply_before_or_after() |
|
|
|
@ -204,3 +204,21 @@ class PaginatedResults: |
|
|
|
def __len__(self) -> int: |
|
|
|
"""Return the number of results.""" |
|
|
|
return len(self.results) |
|
|
|
|
|
|
|
@property |
|
|
|
def next_page_after_id36(self) -> str: |
|
|
|
"""Return "after" ID36 that should be used to fetch the next page.""" |
|
|
|
if not self.has_next_page: |
|
|
|
raise AttributeError |
|
|
|
|
|
|
|
next_id = inspect(self.results[-1]).identity[0] |
|
|
|
return id_to_id36(next_id) |
|
|
|
|
|
|
|
@property |
|
|
|
def prev_page_before_id36(self) -> str: |
|
|
|
"""Return "before" ID36 that should be used to fetch the prev page.""" |
|
|
|
if not self.has_prev_page: |
|
|
|
raise AttributeError |
|
|
|
|
|
|
|
prev_id = inspect(self.results[0]).identity[0] |
|
|
|
return id_to_id36(prev_id) |