optimize feed
This commit is contained in:
parent
4154668a91
commit
889c429f52
3 changed files with 43 additions and 13 deletions
|
@ -26,21 +26,27 @@ def liked_piece(context, piece):
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True)
|
@register.simple_tag(takes_context=True)
|
||||||
def liked_post(context, post):
|
def liked_post(context, post):
|
||||||
user = context["request"].user
|
if post.liked_by_current_user is not None:
|
||||||
return (
|
return post.liked_by_current_user
|
||||||
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):
|
|
||||||
user = context["request"].user
|
user = context["request"].user
|
||||||
return (
|
return (
|
||||||
user
|
user
|
||||||
and user.is_authenticated
|
and user.is_authenticated
|
||||||
and post.interactions.filter(
|
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()
|
).exists()
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.views.decorators.http import require_http_methods
|
||||||
|
|
||||||
from catalog.models import *
|
from catalog.models import *
|
||||||
from journal.models import *
|
from journal.models import *
|
||||||
from takahe.models import TimelineEvent
|
from takahe.models import PostInteraction, TimelineEvent
|
||||||
from takahe.utils import Takahe
|
from takahe.utils import Takahe
|
||||||
|
|
||||||
from .models import *
|
from .models import *
|
||||||
|
@ -59,9 +59,10 @@ def feed(request):
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
def data(request):
|
def data(request):
|
||||||
since_id = int(request.GET.get("last", 0))
|
since_id = int(request.GET.get("last", 0))
|
||||||
|
identity_id = request.user.identity.pk
|
||||||
events = (
|
events = (
|
||||||
TimelineEvent.objects.filter(
|
TimelineEvent.objects.filter(
|
||||||
identity_id=request.user.identity.pk,
|
identity_id=identity_id,
|
||||||
type__in=[TimelineEvent.Types.post, TimelineEvent.Types.boost],
|
type__in=[TimelineEvent.Types.post, TimelineEvent.Types.boost],
|
||||||
)
|
)
|
||||||
.order_by("-id")
|
.order_by("-id")
|
||||||
|
@ -83,6 +84,23 @@ def data(request):
|
||||||
)
|
)
|
||||||
if since_id:
|
if since_id:
|
||||||
events = events.filter(id__lt=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})
|
return render(request, "feed_events.html", {"events": events})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -899,6 +899,9 @@ class Post(models.Model):
|
||||||
A post (status, toot) that is either local or remote.
|
A post (status, toot) that is either local or remote.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
liked_by_current_user = None
|
||||||
|
boosted_by_current_user = None
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
author_id: int
|
author_id: int
|
||||||
interactions: "models.QuerySet[PostInteraction]"
|
interactions: "models.QuerySet[PostInteraction]"
|
||||||
|
@ -1950,6 +1953,9 @@ class TimelineEvent(models.Model):
|
||||||
or more timelines, like posts, likes and follows.
|
or more timelines, like posts, likes and follows.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
subject_post_id: int
|
||||||
|
|
||||||
class Types(models.TextChoices):
|
class Types(models.TextChoices):
|
||||||
post = "post"
|
post = "post"
|
||||||
boost = "boost" # A boost from someone (post substitute)
|
boost = "boost" # A boost from someone (post substitute)
|
||||||
|
|
Loading…
Add table
Reference in a new issue