From 0012f4464d80b30b5f4b4698ef3b34ab43e99c16 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 14 Dec 2021 11:07:36 -0800 Subject: [PATCH] Consider group membership for list cache --- bookwyrm/lists_stream.py | 31 +++++++++++++++------- bookwyrm/tests/lists_stream/test_stream.py | 26 +++++++++++++++--- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/bookwyrm/lists_stream.py b/bookwyrm/lists_stream.py index da8cdb21..f44ef028 100644 --- a/bookwyrm/lists_stream.py +++ b/bookwyrm/lists_stream.py @@ -64,19 +64,32 @@ class ListsStream(RedisStore): Q(id__in=book_list.user.blocks.all()) | Q(blocks=book_list.user) ) - # TODO: groups - + group = book_list.group # only visible to the poster and mentioned users if book_list.privacy == "direct": - audience = audience.filter( - Q(id=book_list.user.id) # if the user is the post's author - ) + if group: + audience = audience.filter( + Q(id=book_list.user.id) # if the user is the post's author + | ~Q(groups=group.memberships) # if the user is in the group + ) + else: + audience = audience.filter( + Q(id=book_list.user.id) # if the user is the post's author + ) # only visible to the poster's followers and tagged users elif book_list.privacy == "followers": - audience = audience.filter( - Q(id=book_list.user.id) # if the user is the post's author - | Q(following=book_list.user) # if the user is following the author - ) + if group: + audience = audience.filter( + Q(id=book_list.user.id) # if the user is the list's owner + | Q(following=book_list.user) # if the user is following the pwmer + # if a user is in the group + | Q(memberships__group__id=book_list.group.id) + ) + else: + audience = audience.filter( + Q(id=book_list.user.id) # if the user is the list's owner + | Q(following=book_list.user) # if the user is following the pwmer + ) return audience.distinct() def get_stores_for_object(self, obj): diff --git a/bookwyrm/tests/lists_stream/test_stream.py b/bookwyrm/tests/lists_stream/test_stream.py index e7157152..d5357b17 100644 --- a/bookwyrm/tests/lists_stream/test_stream.py +++ b/bookwyrm/tests/lists_stream/test_stream.py @@ -92,7 +92,7 @@ class ListsStream(TestCase): book_list = models.List.objects.create( user=self.local_user, name="hi", - privacy="direct", + privacy="followers", ) users = self.stream.get_audience(book_list) self.assertTrue(self.local_user in users) @@ -105,9 +105,29 @@ class ListsStream(TestCase): book_list = models.List.objects.create( user=self.remote_user, name="hi", - privacy="direct", + privacy="followers", + ) + users = self.stream.get_audience(book_list) + self.assertTrue(self.local_user in users) + self.assertFalse(self.another_user in users) + + def test_get_audience_followers_with_group(self, *_): + """get a list of users that should see a list""" + group = models.Group.objects.create(name="test group", user=self.remote_user) + models.GroupMember.objects.create( + group=group, + user=self.local_user, + ) + + book_list = models.List.objects.create( + user=self.remote_user, name="hi", privacy="followers", curation="group" ) users = self.stream.get_audience(book_list) self.assertFalse(self.local_user in users) + + book_list.group = group + book_list.save(broadcast=False) + + users = self.stream.get_audience(book_list) + self.assertTrue(self.local_user in users) self.assertFalse(self.another_user in users) - self.assertFalse(self.remote_user in users)