Merge pull request #2247 from bookwyrm-social/followers-following-views
Merges follower/following views
This commit is contained in:
commit
3270d0a7d4
9 changed files with 101 additions and 98 deletions
|
@ -127,14 +127,8 @@ from .setup import InstanceConfig, CreateAdmin
|
|||
from .status import CreateStatus, EditStatus, DeleteStatus, update_progress
|
||||
from .status import edit_readthrough
|
||||
from .updates import get_notification_count, get_unread_status_string
|
||||
from .user import (
|
||||
User,
|
||||
Followers,
|
||||
Following,
|
||||
hide_suggestions,
|
||||
user_redirect,
|
||||
toggle_guided_tour,
|
||||
)
|
||||
from .user import User, hide_suggestions, user_redirect, toggle_guided_tour
|
||||
from .relationships import Relationships
|
||||
from .wellknown import *
|
||||
from .annual_summary import (
|
||||
AnnualSummary,
|
||||
|
|
50
bookwyrm/views/relationships.py
Normal file
50
bookwyrm/views/relationships.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
""" Following and followers lists """
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.core.paginator import Paginator
|
||||
from django.db.models import Q, Count
|
||||
from django.template.response import TemplateResponse
|
||||
from django.views import View
|
||||
|
||||
from bookwyrm.activitypub import ActivitypubResponse
|
||||
from bookwyrm.settings import PAGE_LENGTH
|
||||
from .helpers import get_user_from_username, is_api_request
|
||||
|
||||
|
||||
# pylint: disable=no-self-use
|
||||
class Relationships(View):
|
||||
"""list of followers/following view"""
|
||||
|
||||
def get(self, request, username, direction):
|
||||
"""list of followers"""
|
||||
user = get_user_from_username(request.user, username)
|
||||
|
||||
if is_api_request(request):
|
||||
if direction == "followers":
|
||||
return ActivitypubResponse(user.to_followers_activity(**request.GET))
|
||||
return ActivitypubResponse(user.to_following_activity(**request.GET))
|
||||
|
||||
if user.hide_follows and user != request.user:
|
||||
raise PermissionDenied()
|
||||
|
||||
annotation_queryset = (
|
||||
user.followers if direction == "followers" else user.following
|
||||
)
|
||||
follows = annotate_if_follows(request.user, annotation_queryset)
|
||||
|
||||
paginated = Paginator(follows.all(), PAGE_LENGTH)
|
||||
data = {
|
||||
"user": user,
|
||||
"is_self": request.user.id == user.id,
|
||||
"follow_list": paginated.get_page(request.GET.get("page")),
|
||||
}
|
||||
return TemplateResponse(request, f"user/relationships/{direction}.html", data)
|
||||
|
||||
|
||||
def annotate_if_follows(user, queryset):
|
||||
"""Sort a list of users by if you follow them"""
|
||||
if not user.is_authenticated:
|
||||
return queryset.order_by("-created_date")
|
||||
|
||||
return queryset.annotate(
|
||||
request_user_follows=Count("followers", filter=Q(followers=user))
|
||||
).order_by("-request_user_follows", "-created_date")
|
|
@ -1,8 +1,6 @@
|
|||
""" non-interactive pages """
|
||||
""" The user profile """
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.core.paginator import Paginator
|
||||
from django.db.models import Q, Count
|
||||
from django.http import Http404
|
||||
from django.shortcuts import redirect
|
||||
from django.template.response import TemplateResponse
|
||||
|
@ -102,62 +100,6 @@ class User(View):
|
|||
return TemplateResponse(request, "user/user.html", data)
|
||||
|
||||
|
||||
class Followers(View):
|
||||
"""list of followers view"""
|
||||
|
||||
def get(self, request, username):
|
||||
"""list of followers"""
|
||||
user = get_user_from_username(request.user, username)
|
||||
|
||||
if is_api_request(request):
|
||||
return ActivitypubResponse(user.to_followers_activity(**request.GET))
|
||||
|
||||
if user.hide_follows and user != request.user:
|
||||
raise PermissionDenied()
|
||||
|
||||
followers = annotate_if_follows(request.user, user.followers)
|
||||
paginated = Paginator(followers.all(), PAGE_LENGTH)
|
||||
data = {
|
||||
"user": user,
|
||||
"is_self": request.user.id == user.id,
|
||||
"follow_list": paginated.get_page(request.GET.get("page")),
|
||||
}
|
||||
return TemplateResponse(request, "user/relationships/followers.html", data)
|
||||
|
||||
|
||||
class Following(View):
|
||||
"""list of following view"""
|
||||
|
||||
def get(self, request, username):
|
||||
"""list of followers"""
|
||||
user = get_user_from_username(request.user, username)
|
||||
|
||||
if is_api_request(request):
|
||||
return ActivitypubResponse(user.to_following_activity(**request.GET))
|
||||
|
||||
if user.hide_follows and user != request.user:
|
||||
raise PermissionDenied()
|
||||
|
||||
following = annotate_if_follows(request.user, user.following)
|
||||
paginated = Paginator(following.all(), PAGE_LENGTH)
|
||||
data = {
|
||||
"user": user,
|
||||
"is_self": request.user.id == user.id,
|
||||
"follow_list": paginated.get_page(request.GET.get("page")),
|
||||
}
|
||||
return TemplateResponse(request, "user/relationships/following.html", data)
|
||||
|
||||
|
||||
def annotate_if_follows(user, queryset):
|
||||
"""Sort a list of users by if you follow them"""
|
||||
if not user.is_authenticated:
|
||||
return queryset.order_by("-created_date")
|
||||
|
||||
return queryset.annotate(
|
||||
request_user_follows=Count("followers", filter=Q(followers=user))
|
||||
).order_by("-request_user_follows", "-created_date")
|
||||
|
||||
|
||||
@require_POST
|
||||
@login_required
|
||||
def hide_suggestions(request):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue