Load lists from redis cache

This commit is contained in:
Mouse Reeve 2021-11-16 09:21:12 -08:00
parent fc520fdbdc
commit 1d28c7e73d
2 changed files with 9 additions and 17 deletions

View file

@ -1,7 +1,7 @@
""" access the activity streams stored in redis """ """ access the activity streams stored in redis """
from django.dispatch import receiver from django.dispatch import receiver
from django.db import transaction from django.db import transaction
from django.db.models import signals, Q from django.db.models import signals, Count, Q
from bookwyrm import models from bookwyrm import models
from bookwyrm.redis_store import RedisStore from bookwyrm.redis_store import RedisStore
@ -41,11 +41,13 @@ class ListsStream(RedisStore):
lists = self.get_store(self.stream_id(user)) lists = self.get_store(self.stream_id(user))
return ( return (
models.List.objects.filter(id__in=lists) models.List.objects.filter(id__in=lists)
.select_related( .annotate(item_count=Count("listitem", filter=Q(listitem__approved=True)))
"user", # hide lists with no approved books
) .filter(item_count__gt=0)
.select_related("user")
.prefetch_related("listitem_set") .prefetch_related("listitem_set")
.order_by("-updated_date") .order_by("-updated_date")
.distinct()
) )
def populate_streams(self, user): def populate_streams(self, user):

View file

@ -5,7 +5,7 @@ from urllib.parse import urlencode
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.db import IntegrityError, transaction from django.db import IntegrityError, transaction
from django.db.models import Avg, Count, DecimalField, Q, Max from django.db.models import Avg, DecimalField, Q, Max
from django.db.models.functions import Coalesce from django.db.models.functions import Coalesce
from django.http import HttpResponseBadRequest, HttpResponse from django.http import HttpResponseBadRequest, HttpResponse
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
@ -17,6 +17,7 @@ from django.views.decorators.http import require_POST
from bookwyrm import book_search, forms, models from bookwyrm import book_search, forms, models
from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.lists_stream import ListsStream
from bookwyrm.settings import PAGE_LENGTH from bookwyrm.settings import PAGE_LENGTH
from .helpers import is_api_request from .helpers import is_api_request
from .helpers import get_user_from_username from .helpers import get_user_from_username
@ -28,18 +29,7 @@ class Lists(View):
def get(self, request): def get(self, request):
"""display a book list""" """display a book list"""
# hide lists with no approved books lists = ListsStream().get_activity_stream(request.user)
lists = (
models.List.privacy_filter(
request.user, privacy_levels=["public", "followers"]
)
.annotate(item_count=Count("listitem", filter=Q(listitem__approved=True)))
.filter(item_count__gt=0)
.select_related("user")
.prefetch_related("listitem_set")
.order_by("-updated_date")
.distinct()
)
paginated = Paginator(lists, 12) paginated = Paginator(lists, 12)
data = { data = {
"lists": paginated.get_page(request.GET.get("page")), "lists": paginated.get_page(request.GET.get("page")),