From 45146b49992a6b1380262dee43868a4edde158f7 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 8 Jun 2021 11:10:39 -0700 Subject: [PATCH 1/8] Convert start and finish reading into view classes --- bookwyrm/views/__init__.py | 2 +- bookwyrm/views/reading.py | 155 ++++++++++++++++++++----------------- bookwyrm/views/shelf.py | 2 +- 3 files changed, 84 insertions(+), 75 deletions(-) diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 8bfaa7da..9ed4e4bd 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -25,7 +25,7 @@ from .list import Lists, List, Curate, UserLists from .notifications import Notifications from .outbox import Outbox from .reading import edit_readthrough, create_readthrough, delete_readthrough -from .reading import start_reading, finish_reading, delete_progressupdate +from .reading import StartReading, FinishReading, delete_progressupdate from .reports import Report, Reports, make_report, resolve_report, suspend_user from .rss_feed import RssFeed from .password import PasswordResetRequest, PasswordReset, ChangePassword diff --git a/bookwyrm/views/reading.py b/bookwyrm/views/reading.py index 65ca717d..067336cd 100644 --- a/bookwyrm/views/reading.py +++ b/bookwyrm/views/reading.py @@ -7,6 +7,8 @@ from dateutil.parser import ParserError from django.contrib.auth.decorators import login_required from django.http import HttpResponseBadRequest, HttpResponseNotFound from django.shortcuts import get_object_or_404, redirect +from django.utils.decorators import method_decorator +from django.views import View from django.views.decorators.http import require_POST from bookwyrm import models @@ -14,88 +16,95 @@ from .helpers import get_edition, handle_reading_status from .shelf import handle_unshelve -# pylint: disable= no-self-use -@login_required -@require_POST -def start_reading(request, book_id): - """begin reading a book""" - book = get_edition(book_id) - reading_shelf = models.Shelf.objects.filter( - identifier=models.Shelf.READING, user=request.user - ).first() +@method_decorator(login_required, name="dispatch") +# pylint: disable=no-self-use +class StartReading(View): + """begin a book""" - # create a readthrough - readthrough = update_readthrough(request, book=book) - if readthrough: - readthrough.save() + def post(self, request, book_id): + """begin reading a book""" + book = get_edition(book_id) + reading_shelf = models.Shelf.objects.filter( + identifier=models.Shelf.READING, user=request.user + ).first() - # create a progress update if we have a page - readthrough.create_update() + # create a readthrough + readthrough = update_readthrough(request, book=book) + if readthrough: + readthrough.save() - current_status_shelfbook = ( - models.ShelfBook.objects.select_related("shelf") - .filter( - shelf__identifier__in=models.Shelf.READ_STATUS_IDENTIFIERS, - user=request.user, - book=book, + # create a progress update if we have a page + readthrough.create_update() + + current_status_shelfbook = ( + models.ShelfBook.objects.select_related("shelf") + .filter( + shelf__identifier__in=models.Shelf.READ_STATUS_IDENTIFIERS, + user=request.user, + book=book, + ) + .first() ) - .first() - ) - if current_status_shelfbook is not None: - if current_status_shelfbook.shelf.identifier != models.Shelf.READING: - handle_unshelve(book, current_status_shelfbook.shelf) - else: # It already was on the shelf - return redirect(request.headers.get("Referer", "/")) + if current_status_shelfbook is not None: + if current_status_shelfbook.shelf.identifier != models.Shelf.READING: + handle_unshelve(book, current_status_shelfbook.shelf) + else: # It already was on the shelf + return redirect(request.headers.get("Referer", "/")) - models.ShelfBook.objects.create(book=book, shelf=reading_shelf, user=request.user) - - # post about it (if you want) - if request.POST.get("post-status"): - privacy = request.POST.get("privacy") - handle_reading_status(request.user, reading_shelf, book, privacy) - - return redirect(request.headers.get("Referer", "/")) - - -@login_required -@require_POST -def finish_reading(request, book_id): - """a user completed a book, yay""" - book = get_edition(book_id) - finished_read_shelf = models.Shelf.objects.filter( - identifier=models.Shelf.READ_FINISHED, user=request.user - ).first() - - # update or create a readthrough - readthrough = update_readthrough(request, book=book) - if readthrough: - readthrough.save() - - current_status_shelfbook = ( - models.ShelfBook.objects.select_related("shelf") - .filter( - shelf__identifier__in=models.Shelf.READ_STATUS_IDENTIFIERS, - user=request.user, - book=book, + models.ShelfBook.objects.create( + book=book, shelf=reading_shelf, user=request.user ) - .first() - ) - if current_status_shelfbook is not None: - if current_status_shelfbook.shelf.identifier != models.Shelf.READ_FINISHED: - handle_unshelve(book, current_status_shelfbook.shelf) - else: # It already was on the shelf - return redirect(request.headers.get("Referer", "/")) - models.ShelfBook.objects.create( - book=book, shelf=finished_read_shelf, user=request.user - ) + # post about it (if you want) + if request.POST.get("post-status"): + privacy = request.POST.get("privacy") + handle_reading_status(request.user, reading_shelf, book, privacy) - # post about it (if you want) - if request.POST.get("post-status"): - privacy = request.POST.get("privacy") - handle_reading_status(request.user, finished_read_shelf, book, privacy) + return redirect(request.headers.get("Referer", "/")) - return redirect(request.headers.get("Referer", "/")) + +@method_decorator(login_required, name="dispatch") +# pylint: disable=no-self-use +class FinishReading(View): + """finish a book""" + + def post(self, request, book_id): + """a user completed a book, yay""" + book = get_edition(book_id) + finished_read_shelf = models.Shelf.objects.filter( + identifier=models.Shelf.READ_FINISHED, user=request.user + ).first() + + # update or create a readthrough + readthrough = update_readthrough(request, book=book) + if readthrough: + readthrough.save() + + current_status_shelfbook = ( + models.ShelfBook.objects.select_related("shelf") + .filter( + shelf__identifier__in=models.Shelf.READ_STATUS_IDENTIFIERS, + user=request.user, + book=book, + ) + .first() + ) + if current_status_shelfbook is not None: + if current_status_shelfbook.shelf.identifier != models.Shelf.READ_FINISHED: + handle_unshelve(book, current_status_shelfbook.shelf) + else: # It already was on the shelf + return redirect(request.headers.get("Referer", "/")) + + models.ShelfBook.objects.create( + book=book, shelf=finished_read_shelf, user=request.user + ) + + # post about it (if you want) + if request.POST.get("post-status"): + privacy = request.POST.get("privacy") + handle_reading_status(request.user, finished_read_shelf, book, privacy) + + return redirect(request.headers.get("Referer", "/")) @login_required diff --git a/bookwyrm/views/shelf.py b/bookwyrm/views/shelf.py index 538a8e34..4c6f94a2 100644 --- a/bookwyrm/views/shelf.py +++ b/bookwyrm/views/shelf.py @@ -20,7 +20,7 @@ from .helpers import is_api_request, get_edition, get_user_from_username from .helpers import handle_reading_status, privacy_filter -# pylint: disable= no-self-use +# pylint: disable=no-self-use class Shelf(View): """shelf page""" From 1231d40e80f6351885615d8a8d28b590fa4ab1f1 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 8 Jun 2021 11:23:53 -0700 Subject: [PATCH 2/8] Want to read view --- bookwyrm/templates/components/modal.html | 2 +- .../templates/reading_progress/start.html | 14 +++++ .../shelve_button/finish_reading_modal.html | 2 +- .../shelve_button/start_reading_modal.html | 6 ++- .../shelve_button/want_to_read_modal.html | 2 +- bookwyrm/urls.py | 8 +-- bookwyrm/views/__init__.py | 2 +- bookwyrm/views/reading.py | 51 ++++++++++++++++--- bookwyrm/views/shelf.py | 5 -- 9 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 bookwyrm/templates/reading_progress/start.html diff --git a/bookwyrm/templates/components/modal.html b/bookwyrm/templates/components/modal.html index 74dcadac..b29ff8d9 100644 --- a/bookwyrm/templates/components/modal.html +++ b/bookwyrm/templates/components/modal.html @@ -1,7 +1,7 @@ {% load i18n %}