Fix profile page post listing

This commit is contained in:
Andrew Godwin 2022-11-22 18:39:15 -07:00
parent 05ed5989e3
commit 47de2c4424
2 changed files with 39 additions and 27 deletions

View File

@ -56,9 +56,13 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
{% for post in posts %} {% for post in page_obj %}
{% include "activities/_post.html" %} {% include "activities/_post.html" %}
{% empty %} {% empty %}
<span class="empty">No posts yet.</a> <span class="empty">No posts yet.</a>
{% endfor %} {% endfor %}
{% if page_obj.has_next %}
<div class="load-more"><a class="button" href=".?page={{ page_obj.next_page_number }}">Next Page</a></div>
{% endif %}
{% endblock %} {% endblock %}

View File

@ -6,8 +6,9 @@ from django.core import validators
from django.http import Http404, JsonResponse from django.http import Http404, JsonResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.generic import FormView, TemplateView, View from django.views.generic import FormView, ListView, TemplateView, View
from activities.models import Post
from core.ld import canonicalise from core.ld import canonicalise
from core.models import Config from core.models import Config
from users.decorators import identity_required from users.decorators import identity_required
@ -15,22 +16,28 @@ from users.models import Domain, Follow, FollowStates, Identity, IdentityStates
from users.shortcuts import by_handle_or_404 from users.shortcuts import by_handle_or_404
class ViewIdentity(TemplateView): class ViewIdentity(ListView):
""" """
Shows identity profile pages, and also acts as the Actor endpoint when Shows identity profile pages, and also acts as the Actor endpoint when
approached with the right Accept header. approached with the right Accept header.
""" """
template_name = "identity/view.html" template_name = "identity/view.html"
paginate_by = 5
def get(self, request, handle): def get(self, request, handle):
# Make sure we understand this handle # Make sure we understand this handle
identity = by_handle_or_404( self.identity = by_handle_or_404(
self.request, self.request,
handle, handle,
local=False, local=False,
fetch=True, fetch=True,
) )
if (
not self.identity.local
and self.identity.data_age > Config.system.identity_max_age
):
self.identity.transition_perform(IdentityStates.outdated)
# If they're coming in looking for JSON, they want the actor # If they're coming in looking for JSON, they want the actor
accept = request.META.get("HTTP_ACCEPT", "text/html").lower() accept = request.META.get("HTTP_ACCEPT", "text/html").lower()
if ( if (
@ -39,10 +46,10 @@ class ViewIdentity(TemplateView):
or "application/activity" in accept or "application/activity" in accept
): ):
# Return actor info # Return actor info
return self.serve_actor(identity) return self.serve_actor(self.identity)
else: else:
# Show normal page # Show normal page
return super().get(request, identity=identity) return super().get(request, identity=self.identity)
def serve_actor(self, identity): def serve_actor(self, identity):
# If this not a local actor, redirect to their canonical URI # If this not a local actor, redirect to their canonical URI
@ -50,28 +57,29 @@ class ViewIdentity(TemplateView):
return redirect(identity.actor_uri) return redirect(identity.actor_uri)
return JsonResponse(canonicalise(identity.to_ap(), include_security=True)) return JsonResponse(canonicalise(identity.to_ap(), include_security=True))
def get_context_data(self, identity): def get_queryset(self):
posts = identity.posts.all()[:100] return (
if identity.data_age > Config.system.identity_max_age: self.identity.posts.filter(
identity.transition_perform(IdentityStates.outdated) visibility__in=[Post.Visibilities.public, Post.Visibilities.unlisted],
follow = None )
reverse_follow = None .select_related("author")
.prefetch_related("attachments")
.order_by("-created")
)
def get_context_data(self):
context = super().get_context_data()
context["identity"] = self.identity
context["follow"] = None
context["reverse_follow"] = None
if self.request.identity: if self.request.identity:
follow = Follow.maybe_get(self.request.identity, identity) follow = Follow.maybe_get(self.request.identity, self.identity)
if follow and follow.state not in FollowStates.group_active(): if follow and follow.state in FollowStates.group_active():
follow = None context["follow"] = follow
reverse_follow = Follow.maybe_get(identity, self.request.identity) reverse_follow = Follow.maybe_get(self.identity, self.request.identity)
if ( if reverse_follow and reverse_follow.state in FollowStates.group_active():
reverse_follow context["reverse_follow"] = reverse_follow
and reverse_follow.state not in FollowStates.group_active() return context
):
reverse_follow = None
return {
"identity": identity,
"posts": posts,
"follow": follow,
"reverse_follow": reverse_follow,
}
@method_decorator(identity_required, name="dispatch") @method_decorator(identity_required, name="dispatch")