From 25a3a7763cadda8e1b04b5e81ceab3a0ba40d1d3 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 27 Mar 2021 08:15:39 -0700 Subject: [PATCH] Adds books in common as a recommendation metric --- bookwyrm/views/feed.py | 15 +++++++++++---- bookwyrm/views/helpers.py | 39 ++++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index 901049122..d068834ac 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -1,7 +1,7 @@ """ non-interactive pages """ from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator -from django.db.models import Count, Q +from django.db.models import Q from django.http import HttpResponseNotFound from django.template.response import TemplateResponse from django.utils import timezone @@ -34,9 +34,16 @@ class Feed(View): paginated = Paginator(activities, PAGE_LENGTH) - suggested_users = get_suggested_users( - request.user, ~Q(id=request.user.id), bookwyrm_user=True - ).order_by("-mutuals", "-last_active_date").all()[:5] + suggested_users = ( + get_suggested_users( + request.user, + ~Q(id=request.user.id), + ~Q(followers=request.user), + bookwyrm_user=True, + ) + .order_by("-mutuals", "-last_active_date") + .all()[:5] + ) data = { **feed_page_data(request.user), diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index b664bcb13..2a5f9d105 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -194,25 +194,26 @@ def get_discover_books(): def get_suggested_users(user, *args, **kwargs): """ Users, annotated with things they have in common """ - return models.User.objects.filter( - discoverable=True, is_active=True, *args, **kwargs - ).exclude( - Q(id__in=user.blocks.all()) | Q(blocks=user) - ).annotate( - mutuals=Count( - "following", - filter=Q( - ~Q(id=user.id), - ~Q(id__in=user.following.all()), - following__in=user.following.all() + return ( + models.User.objects.filter(discoverable=True, is_active=True, *args, **kwargs) + .exclude(Q(id__in=user.blocks.all()) | Q(blocks=user)) + .annotate( + mutuals=Count( + "following", + filter=Q( + ~Q(id=user.id), + ~Q(id__in=user.following.all()), + following__in=user.following.all(), + ), + ), + shared_books=Count( + "shelfbook", + filter=Q( + ~Q(id=user.id), + shelfbook__book__parent_work__in=[ + s.book.parent_work for s in user.shelfbook_set.all() + ], + ), ), - ), - shared_books=Count( - "shelfbook", - filter=Q( - ~Q(id=user.id), - shelfbook__book__parent_work__in=[ - s.book.parent_work for s in user.shelfbook_set.all()] - ) ) )