diff --git a/journal/templatetags/user_actions.py b/journal/templatetags/user_actions.py index d5590a52..9759d69d 100644 --- a/journal/templatetags/user_actions.py +++ b/journal/templatetags/user_actions.py @@ -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() ) diff --git a/social/views.py b/social/views.py index 92d2d584..a67a3ea7 100644 --- a/social/views.py +++ b/social/views.py @@ -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}) diff --git a/takahe/models.py b/takahe/models.py index 4c14a2ca..68318cbd 100644 --- a/takahe/models.py +++ b/takahe/models.py @@ -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)