optimize feed

This commit is contained in:
Your Name 2024-06-18 12:18:31 -04:00 committed by Henri Dickson
parent 4154668a91
commit 889c429f52
3 changed files with 43 additions and 13 deletions

View file

@ -26,21 +26,27 @@ def liked_piece(context, piece):
@register.simple_tag(takes_context=True)
def liked_post(context, post):
user = context["request"].user
return (
user
and user.is_authenticated
and post.interactions.filter(identity_id=user.identity.pk, type="like").exists()
)
@register.simple_tag(takes_context=True)
def boosted_post(context, post):
if post.liked_by_current_user is not None:
return post.liked_by_current_user
user = context["request"].user
return (
user
and user.is_authenticated
and post.interactions.filter(
identity_id=user.identity.pk, type="boost"
identity_id=user.identity.pk, type="like", state__in=["new", "fanned_out"]
).exists()
)
@register.simple_tag(takes_context=True)
def boosted_post(context, post):
if post.boosted_by_current_user is not None:
return post.boosted_by_current_user
user = context["request"].user
return (
user
and user.is_authenticated
and post.interactions.filter(
identity_id=user.identity.pk, type="boost", state__in=["new", "fanned_out"]
).exists()
)

View file

@ -5,7 +5,7 @@ from django.views.decorators.http import require_http_methods
from catalog.models import *
from journal.models import *
from takahe.models import TimelineEvent
from takahe.models import PostInteraction, TimelineEvent
from takahe.utils import Takahe
from .models import *
@ -59,9 +59,10 @@ def feed(request):
@require_http_methods(["GET"])
def data(request):
since_id = int(request.GET.get("last", 0))
identity_id = request.user.identity.pk
events = (
TimelineEvent.objects.filter(
identity_id=request.user.identity.pk,
identity_id=identity_id,
type__in=[TimelineEvent.Types.post, TimelineEvent.Types.boost],
)
.order_by("-id")
@ -83,6 +84,23 @@ def data(request):
)
if since_id:
events = events.filter(id__lt=since_id)
events = list(events[:PAGE_SIZE])
interactions = PostInteraction.objects.filter(
identity_id=identity_id,
post_id__in=[event.subject_post_id for event in events],
type__in=["like", "boost"],
state__in=["new", "fanned_out"],
).values_list("post_id", "type")
for event in events:
if event.subject_post_id:
event.subject_post.liked_by_current_user = (
event.subject_post_id,
"like",
) in interactions
event.subject_post.boosted_by_current_user = (
event.subject_post_id,
"boost",
) in interactions
return render(request, "feed_events.html", {"events": events})

View file

@ -899,6 +899,9 @@ class Post(models.Model):
A post (status, toot) that is either local or remote.
"""
liked_by_current_user = None
boosted_by_current_user = None
if TYPE_CHECKING:
author_id: int
interactions: "models.QuerySet[PostInteraction]"
@ -1950,6 +1953,9 @@ class TimelineEvent(models.Model):
or more timelines, like posts, likes and follows.
"""
if TYPE_CHECKING:
subject_post_id: int
class Types(models.TextChoices):
post = "post"
boost = "boost" # A boost from someone (post substitute)