diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py
index a65317fa3..108f4345f 100644
--- a/bookwyrm/models/user.py
+++ b/bookwyrm/models/user.py
@@ -112,6 +112,16 @@ class User(OrderedCollectionPageMixin, AbstractUser):
activity_serializer = activitypub.Person
+ @classmethod
+ def viewer_aware_objects(cls, viewer):
+ ''' the user queryset filtered for the context of the logged in user '''
+ queryset = cls.objects.filter(is_active=True)
+ if viewer.is_authenticated:
+ queryset = queryset.exclude(
+ blocks=viewer
+ )
+ return queryset
+
def to_outbox(self, filter_type=None, **kwargs):
''' an ordered collection of statuses '''
if filter_type:
diff --git a/bookwyrm/templates/book.html b/bookwyrm/templates/book.html
index 3a2a6aa75..3ead69eab 100644
--- a/bookwyrm/templates/book.html
+++ b/bookwyrm/templates/book.html
@@ -42,26 +42,10 @@
Add cover
{% endif %}
diff --git a/bookwyrm/templates/edit_book.html b/bookwyrm/templates/edit_book.html
index 6e7e434e8..fb0bb81c3 100644
--- a/bookwyrm/templates/edit_book.html
+++ b/bookwyrm/templates/edit_book.html
@@ -62,7 +62,7 @@
Cover
-
{{ form.cover }}
+
{{ form.cover }}
{% for error in form.cover.errors %}
{{ error | escape }}
{% endfor %}
diff --git a/bookwyrm/templates/snippets/follow_button.html b/bookwyrm/templates/snippets/follow_button.html
index 7db69191e..f7286e67a 100644
--- a/bookwyrm/templates/snippets/follow_button.html
+++ b/bookwyrm/templates/snippets/follow_button.html
@@ -5,20 +5,29 @@
Follow request already sent.
+{% elif user in request.user.blocks.all %}
+{% include 'snippets/block_button.html' %}
{% else %}
-
-
+
+
+
+
+
+
+ {% include 'snippets/user_options.html' with user=user class="is-small" %}
+
+
{% endif %}
diff --git a/bookwyrm/templates/user/user_layout.html b/bookwyrm/templates/user/user_layout.html
index 979ee0b0b..9abc469aa 100644
--- a/bookwyrm/templates/user/user_layout.html
+++ b/bookwyrm/templates/user/user_layout.html
@@ -43,14 +43,7 @@
{% if not is_self and request.user.is_authenticated %}
-
-
- {% include 'snippets/follow_button.html' with user=user %}
-
-
- {% include 'snippets/user_options.html' with user=user class="is-small" %}
-
-
+ {% include 'snippets/follow_button.html' with user=user %}
{% endif %}
{% if is_self and user.follower_requests.all %}
diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py
index b3a79b326..10221933c 100644
--- a/bookwyrm/tests/views/test_helpers.py
+++ b/bookwyrm/tests/views/test_helpers.py
@@ -56,12 +56,14 @@ class ViewsHelpers(TestCase):
def test_get_user_from_username(self):
''' works for either localname or username '''
self.assertEqual(
- views.helpers.get_user_from_username('mouse'), self.local_user)
+ views.helpers.get_user_from_username(
+ self.local_user, 'mouse'), self.local_user)
self.assertEqual(
views.helpers.get_user_from_username(
- 'mouse@local.com'), self.local_user)
+ self.local_user, 'mouse@local.com'), self.local_user)
with self.assertRaises(models.User.DoesNotExist):
- views.helpers.get_user_from_username('mojfse@example.com')
+ views.helpers.get_user_from_username(
+ self.local_user, 'mojfse@example.com')
def test_is_api_request(self):
diff --git a/bookwyrm/tests/views/test_rss_feed.py b/bookwyrm/tests/views/test_rss_feed.py
index 2b5e415e7..3d5bec49a 100644
--- a/bookwyrm/tests/views/test_rss_feed.py
+++ b/bookwyrm/tests/views/test_rss_feed.py
@@ -41,6 +41,7 @@ class RssFeedView(TestCase):
''' load an rss feed '''
view = rss_feed.RssFeed()
request = self.factory.get('/user/rss_user/rss')
+ request.user = self.user
with patch("bookwyrm.models.SiteSettings.objects.get") as site:
site.return_value = self.site
result = view(request, username=self.user.username)
diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py
index 059237b98..c229b7c9e 100644
--- a/bookwyrm/views/feed.py
+++ b/bookwyrm/views/feed.py
@@ -65,7 +65,7 @@ class DirectMessage(View):
user = None
if username:
try:
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
pass
if user:
@@ -91,7 +91,7 @@ class Status(View):
def get(self, request, username, status_id):
''' display a particular status (and replies, etc) '''
try:
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
status = models.Status.objects.select_subclasses().get(
id=status_id, deleted=False)
except ValueError:
diff --git a/bookwyrm/views/follow.py b/bookwyrm/views/follow.py
index c59f2e6d2..e1b1a0bbd 100644
--- a/bookwyrm/views/follow.py
+++ b/bookwyrm/views/follow.py
@@ -13,7 +13,7 @@ def follow(request):
''' follow another user, here or abroad '''
username = request.POST['user']
try:
- to_follow = get_user_from_username(username)
+ to_follow = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
return HttpResponseBadRequest()
@@ -33,7 +33,7 @@ def unfollow(request):
''' unfollow a user '''
username = request.POST['user']
try:
- to_unfollow = get_user_from_username(username)
+ to_unfollow = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
return HttpResponseBadRequest()
@@ -52,7 +52,7 @@ def accept_follow_request(request):
''' a user accepts a follow request '''
username = request.POST['user']
try:
- requester = get_user_from_username(username)
+ requester = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
return HttpResponseBadRequest()
@@ -75,7 +75,7 @@ def delete_follow_request(request):
''' a user rejects a follow request '''
username = request.POST['user']
try:
- requester = get_user_from_username(username)
+ requester = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
return HttpResponseBadRequest()
diff --git a/bookwyrm/views/goal.py b/bookwyrm/views/goal.py
index 4f2d1b6f4..97f139136 100644
--- a/bookwyrm/views/goal.py
+++ b/bookwyrm/views/goal.py
@@ -18,7 +18,7 @@ class Goal(View):
''' track books for the year '''
def get(self, request, username, year):
''' reading goal page '''
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
year = int(year)
goal = models.AnnualGoal.objects.filter(
year=year, user=user
@@ -42,7 +42,7 @@ class Goal(View):
def post(self, request, username, year):
''' update or create an annual goal '''
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
if user != request.user:
return HttpResponseNotFound()
diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py
index 6eeaa9262..fac3ab0c6 100644
--- a/bookwyrm/views/helpers.py
+++ b/bookwyrm/views/helpers.py
@@ -9,13 +9,13 @@ from bookwyrm.status import create_generated_note
from bookwyrm.utils import regex
-def get_user_from_username(username):
+def get_user_from_username(viewer, username):
''' helper function to resolve a localname or a username to a user '''
# raises DoesNotExist if user is now found
try:
- return models.User.objects.get(localname=username)
+ return models.User.viewer_aware_objects(viewer).get(localname=username)
except models.User.DoesNotExist:
- return models.User.objects.get(username=username)
+ return models.User.viewer_aware_objects(viewer).get(username=username)
def is_api_request(request):
diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py
index cfdf6d769..7286bfb4f 100644
--- a/bookwyrm/views/list.py
+++ b/bookwyrm/views/list.py
@@ -65,7 +65,7 @@ class UserLists(View):
page = int(request.GET.get('page', 1))
except ValueError:
page = 1
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
lists = models.List.objects.filter(user=user).all()
lists = privacy_filter(
request.user, lists, ['public', 'followers', 'unlisted'])
diff --git a/bookwyrm/views/rss_feed.py b/bookwyrm/views/rss_feed.py
index 496689ff1..aad227bff 100644
--- a/bookwyrm/views/rss_feed.py
+++ b/bookwyrm/views/rss_feed.py
@@ -11,7 +11,7 @@ class RssFeed(Feed):
def get_object(self, request, username):
''' the user who's posts get serialized '''
- return get_user_from_username(username)
+ return get_user_from_username(request.user, username)
def link(self, obj):
diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py
index a4cd73374..98be166f4 100644
--- a/bookwyrm/views/search.py
+++ b/bookwyrm/views/search.py
@@ -33,7 +33,7 @@ class Search(View):
handle_remote_webfinger(query)
# do a user search
- user_results = models.User.objects.annotate(
+ user_results = models.User.viewer_aware_objects(request.user).annotate(
similarity=Greatest(
TrigramSimilarity('username', query),
TrigramSimilarity('localname', query),
diff --git a/bookwyrm/views/shelf.py b/bookwyrm/views/shelf.py
index 02502ff64..70d3d1dea 100644
--- a/bookwyrm/views/shelf.py
+++ b/bookwyrm/views/shelf.py
@@ -19,7 +19,7 @@ class Shelf(View):
def get(self, request, username, shelf_identifier):
''' display a shelf '''
try:
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
return HttpResponseNotFound()
diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py
index 4da0fdac1..7a238ce7c 100644
--- a/bookwyrm/views/user.py
+++ b/bookwyrm/views/user.py
@@ -26,7 +26,7 @@ class User(View):
def get(self, request, username):
''' profile page for a user '''
try:
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
return HttpResponseNotFound()
@@ -96,7 +96,7 @@ class Followers(View):
def get(self, request, username):
''' list of followers '''
try:
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
return HttpResponseNotFound()
@@ -121,7 +121,7 @@ class Following(View):
def get(self, request, username):
''' list of followers '''
try:
- user = get_user_from_username(username)
+ user = get_user_from_username(request.user, username)
except models.User.DoesNotExist:
return HttpResponseNotFound()