From b3072c81ba73a16381366960841b6c294cc1fa6e Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Thu, 17 Nov 2022 20:04:01 -0700 Subject: Follows page --- users/models/follow.py | 4 ++++ users/views/follows.py | 33 +++++++++++++++++++++++++++++++++ users/views/identity.py | 14 +++++++++----- 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 users/views/follows.py (limited to 'users') diff --git a/users/models/follow.py b/users/models/follow.py index d2ee493..e741c56 100644 --- a/users/models/follow.py +++ b/users/models/follow.py @@ -23,6 +23,10 @@ class FollowStates(StateGraph): accepted.transitions_to(undone) undone.transitions_to(undone_remotely) + @classmethod + def group_active(cls): + return [cls.unrequested, cls.local_requested, cls.accepted] + @classmethod async def handle_unrequested(cls, instance: "Follow"): """ diff --git a/users/views/follows.py b/users/views/follows.py new file mode 100644 index 0000000..9030efe --- /dev/null +++ b/users/views/follows.py @@ -0,0 +1,33 @@ +from django.utils.decorators import method_decorator +from django.views.generic import TemplateView + +from users.decorators import identity_required +from users.models import FollowStates + + +@method_decorator(identity_required, name="dispatch") +class FollowsPage(TemplateView): + """ + Shows followers/follows. + """ + + template_name = "settings/follows.html" + + def get_context_data(self): + # Gather all identities with a following relationship with us + identities = {} + for outbound_follow in self.request.identity.outbound_follows.filter( + state__in=FollowStates.group_active() + ): + identities.setdefault(outbound_follow.target, {})[ + "outbound" + ] = outbound_follow + for inbound_follow in self.request.identity.inbound_follows.filter( + state__in=FollowStates.group_active() + ): + identities.setdefault(inbound_follow.source, {})["inbound"] = inbound_follow + + return { + "section": "follows", + "identities": sorted(identities.items(), key=lambda i: i[0].username), + } diff --git a/users/views/identity.py b/users/views/identity.py index b83ba9a..ae8e5b0 100644 --- a/users/views/identity.py +++ b/users/views/identity.py @@ -28,18 +28,22 @@ class ViewIdentity(TemplateView): if identity.data_age > Config.system.identity_max_age: identity.transition_perform(IdentityStates.outdated) follow = None + reverse_follow = None if self.request.identity: follow = Follow.maybe_get(self.request.identity, identity) - if follow and follow.state not in [ - FollowStates.unrequested, - FollowStates.local_requested, - FollowStates.accepted, - ]: + if follow and follow.state not in FollowStates.group_active(): follow = None + reverse_follow = Follow.maybe_get(identity, self.request.identity) + if ( + reverse_follow + and reverse_follow.state not in FollowStates.group_active() + ): + reverse_follow = None return { "identity": identity, "posts": posts, "follow": follow, + "reverse_follow": reverse_follow, } -- cgit v1.2.3