diff --git a/bookwyrm/templates/discover/large-book.html b/bookwyrm/templates/discover/large-book.html index 401411a11..7881a33ab 100644 --- a/bookwyrm/templates/discover/large-book.html +++ b/bookwyrm/templates/discover/large-book.html @@ -3,7 +3,7 @@
{% include 'snippets/book_cover.html' with book=book size="large" %} - {% include 'snippets/stars.html' with rating=ratings|dict_key:book.id %} + {% include 'snippets/stars.html' with rating=book|rating:request.user %}

{{ book.title }}

diff --git a/bookwyrm/templates/discover/small-book.html b/bookwyrm/templates/discover/small-book.html index d1676b6b1..72108c309 100644 --- a/bookwyrm/templates/discover/small-book.html +++ b/bookwyrm/templates/discover/small-book.html @@ -1,9 +1,7 @@ {% load bookwyrm_tags %} {% if book %} {% include 'snippets/book_cover.html' with book=book %} -{% if ratings %} -{% include 'snippets/stars.html' with rating=ratings|dict_key:book.id %} -{% endif %} +{% include 'snippets/stars.html' with rating=book|rating:request.user %}

{{ book.title }}

{% if book.authors %} diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py index 10221933c..c61505c2e 100644 --- a/bookwyrm/tests/views/test_helpers.py +++ b/bookwyrm/tests/views/test_helpers.py @@ -106,7 +106,7 @@ class ViewsHelpers(TestCase): statuses = views.helpers.get_activity_feed( self.local_user, - ['public', 'unlisted', 'followers'], + privacy=['public', 'unlisted', 'followers'], following_only=True, queryset=models.Comment.objects ) @@ -115,7 +115,7 @@ class ViewsHelpers(TestCase): statuses = views.helpers.get_activity_feed( self.local_user, - ['public', 'followers'], + privacy=['public', 'followers'], local_only=True ) self.assertEqual(len(statuses), 2) @@ -128,7 +128,7 @@ class ViewsHelpers(TestCase): statuses = views.helpers.get_activity_feed( self.local_user, - ['public', 'followers'], + privacy=['public', 'followers'], ) self.assertEqual(len(statuses), 3) self.assertEqual(statuses[2], public_status) @@ -137,7 +137,7 @@ class ViewsHelpers(TestCase): statuses = views.helpers.get_activity_feed( self.local_user, - ['public', 'unlisted', 'followers'], + privacy=['public', 'unlisted', 'followers'], following_only=True ) self.assertEqual(len(statuses), 2) @@ -147,7 +147,7 @@ class ViewsHelpers(TestCase): rat.followers.add(self.local_user) statuses = views.helpers.get_activity_feed( self.local_user, - ['public', 'unlisted', 'followers'], + privacy=['public', 'unlisted', 'followers'], following_only=True ) self.assertEqual(len(statuses), 5) @@ -170,18 +170,18 @@ class ViewsHelpers(TestCase): content='blah blah', user=rat) statuses = views.helpers.get_activity_feed( - self.local_user, ['public']) + self.local_user, privacy=['public']) self.assertEqual(len(statuses), 2) # block relationship rat.blocks.add(self.local_user) statuses = views.helpers.get_activity_feed( - self.local_user, ['public']) + self.local_user, privacy=['public']) self.assertEqual(len(statuses), 1) self.assertEqual(statuses[0], public_status) statuses = views.helpers.get_activity_feed( - rat, ['public']) + rat, privacy=['public']) self.assertEqual(len(statuses), 1) self.assertEqual(statuses[0], rat_public) diff --git a/bookwyrm/views/books.py b/bookwyrm/views/books.py index 3d4b3fafd..d59eb4aa0 100644 --- a/bookwyrm/views/books.py +++ b/bookwyrm/views/books.py @@ -50,9 +50,7 @@ class Book(View): ) # all reviews for the book reviews = get_activity_feed( - request.user, - ['public', 'unlisted', 'followers', 'direct'], - queryset=reviews + request.user, queryset=reviews ) # the reviews to show diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index d309df945..a320162d7 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -11,8 +11,7 @@ from django.views import View from bookwyrm import forms, models from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.settings import PAGE_LENGTH -from .helpers import get_activity_feed -from .helpers import get_user_from_username +from .helpers import get_activity_feed, get_user_from_username from .helpers import is_api_request, is_bookwyrm_request, object_visible_to_user @@ -28,15 +27,8 @@ class Feed(View): page = 1 if tab == 'home': - activities = get_activity_feed(request.user, following_only=True) - # we only want to show private messages if they're related to books - activities = activities.exclude( - review__isnull=True, - comment__isnull=True, - quotation__isnull=True, - generatednote__isnull=True, - privacy='direct' - ) + activities = get_activity_feed( + request.user, following_only=True, hide_dms=True) elif tab == 'local': activities = get_activity_feed( request.user, privacy=['public', 'followers'], local_only=True) diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index 1e96ec1c3..78f210bfb 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -1,6 +1,7 @@ ''' helper functions used in various views ''' import re from requests import HTTPError +from django.core.exceptions import FieldError from django.db.models import Q from bookwyrm import activitypub, models @@ -98,17 +99,23 @@ def privacy_filter(viewer, queryset, privacy_levels=None, following_only=False): # exclude direct messages not intended for the user if 'direct' in privacy_levels: - queryset = queryset.exclude( - ~Q( - Q(user=viewer) | Q(mention_users=viewer) - ), privacy='direct' - ) + try: + queryset = queryset.exclude( + ~Q( + Q(user=viewer) | Q(mention_users=viewer) + ), privacy='direct' + ) + except FieldError: + queryset = queryset.exclude( + ~Q(user=viewer), privacy='direct' + ) + return queryset def get_activity_feed( user, privacy=None, local_only=False, following_only=False, - queryset=None): + queryset=None, hide_dms=False): ''' get a filtered queryset of statuses ''' if not queryset: queryset = models.Status.objects.select_subclasses() @@ -120,6 +127,16 @@ def get_activity_feed( queryset = privacy_filter( user, queryset, privacy, following_only=following_only) + if hide_dms: + # dms are direct statuses not related to books + queryset = queryset.exclude( + review__isnull=True, + comment__isnull=True, + quotation__isnull=True, + generatednote__isnull=True, + privacy='direct' + ) + # filter for only local status if local_only: queryset = queryset.filter(user__local=True) diff --git a/bookwyrm/views/landing.py b/bookwyrm/views/landing.py index 3be3eb312..2774e7428 100644 --- a/bookwyrm/views/landing.py +++ b/bookwyrm/views/landing.py @@ -1,11 +1,10 @@ ''' non-interactive pages ''' -from django.db.models import Avg, Max +from django.db.models import Max from django.template.response import TemplateResponse from django.views import View from bookwyrm import forms, models from .feed import Feed -from .helpers import get_activity_feed # pylint: disable= no-self-use @@ -34,6 +33,7 @@ class Discover(View): ''' tiled book activity page ''' books = models.Edition.objects.filter( review__published_date__isnull=False, + review__deleted=False, review__user__local=True, review__privacy__in=['public', 'unlisted'], ).exclude( @@ -42,18 +42,9 @@ class Discover(View): Max('review__published_date') ).order_by('-review__published_date__max')[:6] - ratings = {} - for book in books: - reviews = models.Review.objects.filter( - book__in=book.parent_work.editions.all() - ) - reviews = get_activity_feed( - request.user, ['public', 'unlisted'], queryset=reviews) - ratings[book.id] = reviews.aggregate(Avg('rating'))['rating__avg'] data = { 'title': 'Discover', 'register_form': forms.RegisterForm(), 'books': list(set(books)), - 'ratings': ratings } return TemplateResponse(request, 'discover/discover.html', data) diff --git a/bookwyrm/views/rss_feed.py b/bookwyrm/views/rss_feed.py index aad227bff..c211f991f 100644 --- a/bookwyrm/views/rss_feed.py +++ b/bookwyrm/views/rss_feed.py @@ -27,7 +27,7 @@ class RssFeed(Feed): def items(self, obj): ''' the user's activity feed ''' return get_activity_feed( - obj, ['public', 'unlisted'], queryset=obj.status_set) + obj, privacy=['public', 'unlisted'], queryset=obj.status_set) def item_link(self, item): diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index 7a238ce7c..01002ce54 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -71,8 +71,8 @@ class User(View): # user's posts activities = get_activity_feed( request.user, - ['public', 'unlisted', 'followers'], - queryset=user.status_set + queryset=user.status_set.select_subclasses(), + hide_dms=True ) paginated = Paginator(activities, PAGE_LENGTH) goal = models.AnnualGoal.objects.filter(