diff options
Diffstat (limited to 'users')
-rw-r--r-- | users/models/follow.py | 4 | ||||
-rw-r--r-- | users/views/follows.py | 33 | ||||
-rw-r--r-- | users/views/identity.py | 14 |
3 files changed, 46 insertions, 5 deletions
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 @@ -24,6 +24,10 @@ class FollowStates(StateGraph): 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"): """ Follows that are unrequested need us to deliver the Follow object 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, } |