From 00795f119eeb4b8eb1330b7959ca5ef93accc64b Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Fri, 16 Dec 2022 17:24:56 -0700 Subject: [PATCH] Split Follows page into two types This overcomes the query problem of pulling a combined list --- activities/views/follows.py | 47 +++++++++++++++++-------- templates/activities/follows.html | 20 ++++++++--- templates/activities/home.html | 4 +-- templates/activities/local.html | 4 +-- templates/activities/notifications.html | 4 +-- 5 files changed, 53 insertions(+), 26 deletions(-) diff --git a/activities/views/follows.py b/activities/views/follows.py index 6b0881a..f5f5909 100644 --- a/activities/views/follows.py +++ b/activities/views/follows.py @@ -1,4 +1,3 @@ -from django.db.models import Q from django.utils.decorators import method_decorator from django.views.generic import ListView @@ -18,22 +17,40 @@ class Follows(ListView): } paginate_by = 50 + def get(self, request, *args, **kwargs): + self.inbound = self.request.GET.get("inbound") + return super().get(request, *args, **kwargs) + def get_queryset(self): - return Follow.objects.filter( - Q(source=self.request.identity) | Q(target=self.request.identity), - state__in=FollowStates.group_active(), - ).order_by("-created") + if self.inbound: + return Follow.objects.filter( + target=self.request.identity, + state__in=FollowStates.group_active(), + ).order_by("-created") + else: + return Follow.objects.filter( + source=self.request.identity, + state__in=FollowStates.group_active(), + ).order_by("-created") def get_context_data(self): context = super().get_context_data() - identities = [] - for follow in context["page_obj"].object_list: - if follow.source == self.request.identity: - identity = follow.target - follow_type = "outbound" - else: - identity = follow.source - follow_type = "inbound" - identities.append((identity, follow_type)) - context["page_obj"].object_list = identities + # Go work out if any of these people also follow us/are followed + if self.inbound: + context["page_obj"].object_list = [ + follow.source for follow in context["page_obj"] + ] + identity_ids = [identity.id for identity in context["page_obj"]] + context["outbound_ids"] = Follow.objects.filter( + source=self.request.identity, target_id__in=identity_ids + ).values_list("target_id", flat=True) + else: + context["page_obj"].object_list = [ + follow.target for follow in context["page_obj"] + ] + identity_ids = [identity.id for identity in context["page_obj"]] + context["inbound_ids"] = Follow.objects.filter( + target=self.request.identity, source_id__in=identity_ids + ).values_list("source_id", flat=True) + context["inbound"] = self.inbound return context diff --git a/templates/activities/follows.html b/templates/activities/follows.html index e2c0ece..bc2db7d 100644 --- a/templates/activities/follows.html +++ b/templates/activities/follows.html @@ -3,18 +3,28 @@ {% block subtitle %}Follows{% endblock %} {% block content %} +
+ {% if inbound %} + Your Follows + Follows You + {% else %} + Your Follows + Follows You + {% endif %} +
+
- {% for identity, follow_type in page_obj %} + {% for identity in page_obj %} {{ identity.html_name_or_handle }} @{{ identity.handle }} - {% if follow_type == "outbound" %} + {% if identity.id in outbound_ids %} Following {% endif %} - {% if follow_type == "inbound" %} + {% if identity.id in inbound_ids %} Follows You {% endif %} @@ -25,11 +35,11 @@ {% endblock %} diff --git a/templates/activities/home.html b/templates/activities/home.html index 06fa88c..8d9d39c 100644 --- a/templates/activities/home.html +++ b/templates/activities/home.html @@ -24,11 +24,11 @@ {% endblock %} diff --git a/templates/activities/local.html b/templates/activities/local.html index c3d180b..55f9090 100644 --- a/templates/activities/local.html +++ b/templates/activities/local.html @@ -11,11 +11,11 @@ {% endblock %} diff --git a/templates/activities/notifications.html b/templates/activities/notifications.html index 89ca4d8..8b7bc13 100644 --- a/templates/activities/notifications.html +++ b/templates/activities/notifications.html @@ -34,11 +34,11 @@ {% endblock %}