Show posts and boosts on an identity's profile view (#574)

This commit is contained in:
Christof Dorner 2023-05-12 23:43:26 +00:00 committed by GitHub
parent b3b58df2b1
commit 744c2825d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 9 deletions

View File

@ -81,15 +81,31 @@ class TimelineService:
.order_by("-created")
)
def identity_public(self, identity: Identity):
def identity_public(self, identity: Identity, include_boosts: bool = True):
"""
Returns all publically visible posts for an identity
Returns timeline events with all of an identity's publicly visible posts
and their boosts
"""
filter = models.Q(
type=TimelineEvent.Types.post,
subject_post__author=identity,
subject_post__visibility__in=[
Post.Visibilities.public,
Post.Visibilities.local_only,
Post.Visibilities.unlisted,
],
)
if include_boosts:
filter = filter | models.Q(
type=TimelineEvent.Types.boost, subject_identity=identity
)
return (
PostService.queryset()
.filter(author=identity)
.unlisted(include_replies=True)
.order_by("-id")
self.event_queryset()
.filter(
filter,
identity=identity,
)
.order_by("-created")
)
def likes(self) -> models.QuerySet[Post]:

View File

@ -1,4 +1,5 @@
{% extends "base.html" %}
{% load activity_tags %}
{% block title %}{{ identity }}{% endblock %}
@ -90,8 +91,20 @@
{% block subcontent %}
<div class="page-content">
{% for post in page_obj %}
{% include "activities/_post.html" %}
{% for event in page_obj %}
{% if event.type == "post" %}
{% include "activities/_post.html" with post=event.subject_post %}
{% elif event.type == "boost" %}
<div class="boost-banner">
<a href="{{ event.subject_identity.urls.view }}">
{{ event.subject_identity.html_name_or_handle }}
</a> boosted
<time>
{{ event.subject_post_interaction.published | timedeltashort }} ago
</time>
</div>
{% include "activities/_post.html" with post=event.subject_post %}
{% endif %}
{% empty %}
<span class="empty">
{% if identity.local %}

View File

@ -164,7 +164,12 @@ class IdentityFeed(Feed):
return {"image": image}
def items(self, identity: Identity):
return TimelineService(None).identity_public(identity)[:20]
return [
e.subject_post
for e in TimelineService(None).identity_public(
identity, include_boosts=False
)[:20]
]
def item_description(self, item: Post):
return item.safe_content_remote()