Fix home timeline pagination
This commit is contained in:
parent
3bd01b2b3d
commit
6e8149675c
|
@ -4,10 +4,11 @@ from collections.abc import Callable
|
||||||
from typing import Any, Generic, Protocol, TypeVar
|
from typing import Any, Generic, Protocol, TypeVar
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models.expressions import Case, F, When
|
||||||
from django.http import HttpRequest
|
from django.http import HttpRequest
|
||||||
from hatchway.http import ApiResponse
|
from hatchway.http import ApiResponse
|
||||||
|
|
||||||
from activities.models import PostInteraction
|
from activities.models import PostInteraction, TimelineEvent
|
||||||
|
|
||||||
T = TypeVar("T")
|
T = TypeVar("T")
|
||||||
|
|
||||||
|
@ -247,27 +248,22 @@ class MastodonPaginator:
|
||||||
The home timeline requires special handling where we mix Posts and
|
The home timeline requires special handling where we mix Posts and
|
||||||
PostInteractions together.
|
PostInteractions together.
|
||||||
"""
|
"""
|
||||||
|
queryset = queryset.annotate(
|
||||||
|
event_id=Case(
|
||||||
|
When(type=TimelineEvent.Types.post, then=F("subject_post_id")),
|
||||||
|
default=F("subject_post_interaction"),
|
||||||
|
)
|
||||||
|
)
|
||||||
if max_id and not max_id.startswith("interaction"):
|
if max_id and not max_id.startswith("interaction"):
|
||||||
queryset = queryset.filter(
|
queryset = queryset.filter(event_id__lt=max_id)
|
||||||
models.Q(subject_post_id__lt=max_id)
|
|
||||||
| models.Q(subject_post_interaction_id__lt=max_id)
|
|
||||||
)
|
|
||||||
|
|
||||||
if since_id and not since_id.startswith("interaction"):
|
if since_id and not since_id.startswith("interaction"):
|
||||||
queryset = queryset.filter(
|
queryset = queryset.filter(event_id__gt=since_id)
|
||||||
models.Q(subject_post_id__gt=since_id)
|
|
||||||
| models.Q(subject_post_interaction_id__gt=since_id)
|
|
||||||
)
|
|
||||||
|
|
||||||
if min_id and not min_id.startswith("interaction"):
|
if min_id and not min_id.startswith("interaction"):
|
||||||
# Min ID requires items _immediately_ newer than specified, so we
|
# Min ID requires items _immediately_ newer than specified, so we
|
||||||
# invert the ordering to accommodate
|
# invert the ordering to accommodate
|
||||||
queryset = queryset.filter(
|
queryset = queryset.filter(event_id__gt=min_id).order_by("event_id")
|
||||||
models.Q(subject_post_id__gt=min_id)
|
|
||||||
| models.Q(subject_post_interaction_id__gt=min_id)
|
|
||||||
).order_by("id")
|
|
||||||
else:
|
else:
|
||||||
queryset = queryset.order_by("-id")
|
queryset = queryset.order_by("-event_id")
|
||||||
|
|
||||||
limit = min(limit or self.default_limit, self.max_limit)
|
limit = min(limit or self.default_limit, self.max_limit)
|
||||||
return PaginationResult(
|
return PaginationResult(
|
||||||
|
|
Loading…
Reference in New Issue