diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index cdfebfd0d..4e464b3cb 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -173,6 +173,7 @@ class FederatedStream(ActivityStream): privacy_levels=["public"], ) + class BooksStream(ActivityStream): """books on your shelves""" @@ -182,30 +183,46 @@ class BooksStream(ActivityStream): """anyone with the mentioned book on their shelves""" # only show public statuses on the books feed, # and only statuses that mention books - if status.privacy != "public" or not (status.mention_books.exists() or hasattr(status, "book")): + if status.privacy != "public" or not ( + status.mention_books.exists() or hasattr(status, "book") + ): return [] - work = status.book.parent_work if hasattr(status, "book") else status.mention_books.first().parent_work + work = ( + status.book.parent_work + if hasattr(status, "book") + else status.mention_books.first().parent_work + ) audience = super().get_audience(status) if not audience: return [] - return audience.filter( - shelfbook__book__parent_work=work - ).distinct() + return audience.filter(shelfbook__book__parent_work=work).distinct() def get_statuses_for_user(self, user): """any public status that mentions their books""" + books = user.shelfbook_set.values_list( + "book__parent_work__id", flat=True + ).distinct() return privacy_filter( user, - models.Status.objects.select_subclasses().filter(, + models.Status.objects.select_subclasses() + .filter( + Q(comment__book__parent_work__id__in=books) + | Q(quotation__book__parent_work__id__in=books) + | Q(review__book__parent_work__id__in=books) + | Q(mention_books__parent_work__id__in=books) + ) + .distinct(), privacy_levels=["public"], ) + streams = { "home": HomeStream(), "local": LocalStream(), "federated": FederatedStream(), + "books": BooksStream(), } diff --git a/bookwyrm/migrations/0080_alter_shelfbook_options.py b/bookwyrm/migrations/0080_alter_shelfbook_options.py new file mode 100644 index 000000000..b5ee7e673 --- /dev/null +++ b/bookwyrm/migrations/0080_alter_shelfbook_options.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.4 on 2021-08-05 00:00 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0079_merge_20210804_1746"), + ] + + operations = [ + migrations.AlterModelOptions( + name="shelfbook", + options={"ordering": ("-shelved_date", "-created_date", "-updated_date")}, + ), + ] diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 17fcfabe5..a10f128d6 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -118,7 +118,7 @@ REDIS_ACTIVITY_PORT = env("REDIS_ACTIVITY_PORT", 6379) REDIS_ACTIVITY_PASSWORD = env("REDIS_ACTIVITY_PASSWORD", None) MAX_STREAM_LENGTH = int(env("MAX_STREAM_LENGTH", 200)) -STREAMS = ["home", "local", "federated"] +STREAMS = ["home", "books"] # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 7eccfd651..3d39b9d52 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -23,6 +23,8 @@ STATUS_PATH = r"%s/(%s)/(?P\d+)" % (USER_PATH, "|".join(status_types) BOOK_PATH = r"^book/(?P\d+)" +STREAMS = "|".join(settings.STREAMS) + urlpatterns = [ path("admin/", admin.site.urls), path( @@ -177,7 +179,7 @@ urlpatterns = [ name="get-started-users", ), # feeds - re_path(r"^(?Phome|local|federated)/?$", views.Feed.as_view()), + re_path(r"^(?P{:s})/?$".format(STREAMS), views.Feed.as_view()), re_path( r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages" ),