diff --git a/bookwyrm/templates/user/shelf.html b/bookwyrm/templates/user/shelf.html index 5173da07..cc4d8d37 100644 --- a/bookwyrm/templates/user/shelf.html +++ b/bookwyrm/templates/user/shelf.html @@ -20,10 +20,13 @@
@@ -81,7 +84,6 @@ {% endif %} {% for book in books %} - {% with book=book.book %} {% include 'snippets/book_cover.html' with book=book size="small" %} @@ -113,13 +115,12 @@ {% endif %} - {% endwith %} {% endfor %}
{% else %}

{% trans "This shelf is empty." %}

- {% if shelf.editable %} + {% if shelf.id and shelf.editable %}
{% csrf_token %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index cd7a4e41..27fb678f 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -151,8 +151,8 @@ urlpatterns = [ re_path( r"^list/(?P\d+)/curate/?$", views.Curate.as_view(), name="list-curate" ), - # shelf - re_path(r"%s/books/?$" % user_path, views.user_shelves_page, name="user-shelves"), + # Uyser books + re_path(r"%s/books/?$" % user_path, views.Shelf.as_view(), name="user-shelves"), re_path( r"^%s/(helf|books)/(?P[\w-]+)(.json)?/?$" % user_path, views.Shelf.as_view(), diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 693a7744..fead2a32 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -27,7 +27,7 @@ from .rss_feed import RssFeed from .password import PasswordResetRequest, PasswordReset, ChangePassword from .search import Search from .shelf import Shelf -from .shelf import user_shelves_page, create_shelf, delete_shelf +from .shelf import create_shelf, delete_shelf from .shelf import shelve, unshelve from .site import Site from .status import CreateStatus, DeleteStatus diff --git a/bookwyrm/views/shelf.py b/bookwyrm/views/shelf.py index 75d915cd..ad1128e2 100644 --- a/bookwyrm/views/shelf.py +++ b/bookwyrm/views/shelf.py @@ -1,4 +1,6 @@ """ shelf views""" +from collections import namedtuple + from django.db import IntegrityError from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator @@ -6,6 +8,7 @@ from django.http import HttpResponseBadRequest, HttpResponseNotFound from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator +from django.utils.translation import gettext as _ from django.views import View from django.views.decorators.http import require_POST @@ -13,14 +16,14 @@ from bookwyrm import forms, models from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.settings import PAGE_LENGTH from .helpers import is_api_request, get_edition, get_user_from_username -from .helpers import handle_reading_status +from .helpers import handle_reading_status, privacy_filter, object_visible_to_user # pylint: disable= no-self-use class Shelf(View): """ shelf page """ - def get(self, request, username, shelf_identifier): + def get(self, request, username, shelf_identifier=None): """ display a shelf """ try: user = get_user_from_username(request.user, username) @@ -32,35 +35,28 @@ class Shelf(View): except ValueError: page = 1 + shelves = privacy_filter(request.user, user.shelf_set) + + # get the shelf and make sure the logged in user should be able to see it if shelf_identifier: shelf = user.shelf_set.get(identifier=shelf_identifier) + if not object_visible_to_user(request.user, shelf): + return HttpResponseNotFound() + # this is a constructed "all books" view, with a fake "shelf" obj else: - shelf = user.shelf_set.first() + FakeShelf = namedtuple("Shelf", ("identifier", "name", "user", "books")) + books = models.Edition.objects.filter( + shelfbook__shelf__in=shelves.all() + ).distinct() + shelf = FakeShelf("all", _("All books"), user, books) is_self = request.user == user - shelves = user.shelf_set - if not is_self: - follower = user.followers.filter(id=request.user.id).exists() - # make sure the user has permission to view the shelf - if shelf.privacy == "direct" or ( - shelf.privacy == "followers" and not follower - ): - return HttpResponseNotFound() - - # only show other shelves that should be visible - if follower: - shelves = shelves.filter(privacy__in=["public", "followers"]) - else: - shelves = shelves.filter(privacy="public") - if is_api_request(request): return ActivitypubResponse(shelf.to_activity(**request.GET)) paginated = Paginator( - models.ShelfBook.objects.filter(user=user, shelf=shelf) - .order_by("-updated_date") - .all(), + shelf.books.order_by("-updated_date").all(), PAGE_LENGTH, ) @@ -95,11 +91,6 @@ class Shelf(View): return redirect(shelf.local_path) -def user_shelves_page(request, username): - """ default shelf """ - return Shelf.as_view()(request, username, None) - - @login_required @require_POST def create_shelf(request): @@ -176,7 +167,8 @@ def shelve(request): models.ShelfBook.objects.create( book=book, shelf=desired_shelf, user=request.user ) - # The book is already on this shelf. Might be good to alert, or reject the action? + # The book is already on this shelf. + # Might be good to alert, or reject the action? except IntegrityError: pass return redirect(request.headers.get("Referer", "/"))