diff --git a/reader/models.py b/reader/models.py index ba7b8d40a4b8f1f468a2186958f245c2cd168bd4..b86672f68adcafaa132a629702d81e71ebab4899 100644 --- a/reader/models.py +++ b/reader/models.py @@ -160,6 +160,9 @@ class UserBook(models.Model): # Last read last_read = models.DateTimeField(auto_now_add=True) + def percentage_read_whole(self): + return round(self.percentage_read * 100) + class Meta: constraints = [ UniqueConstraint(fields=['user', 'book'], name='unique_user_book'), diff --git a/reader/templates/reader/view_book.html b/reader/templates/reader/view_book.html index 3988bad978b51f94fd1f52f9d734c34e32da84f2..ef6611ebfb33d5009e6ffe2cfc7af2ced0699772 100644 --- a/reader/templates/reader/view_book.html +++ b/reader/templates/reader/view_book.html @@ -20,7 +20,35 @@ <i class="bi bi-lock"></i> {% endif %} </h1> + <h2 class="subtitle">{{ book.author }}</h2> <br> + {% if book.description %} + <p>{{ book.description|escape|truncatewords:20 }}</p> + {% endif %} + {% if user_in_library %} + <br> + <br> + <div class="columns"> + <div class="column"> + <progress class="progress is-success" value="{{ user_book.percentage_read_whole }}" max="100"> + {{ user_book.percentage_read_whole }}% + </progress> + </div> + <div class="column is-narrow"> + <span>{{ user_book.percentage_read_whole }}%</span> + </div> + <div class="column is-narrow"> + <a href="#" class="button is-success">Read</a> + </div> + </div> + {% elif user.is_authenticated %} + <form action="{% url 'add_to_library' book_id=book.id %}" method="post"> + {% csrf_token %} + <button type="submit" class="button is-success">Add to library</button> + </form> + {% else %} + <a href="{% url 'login' %}" class="button is-primary">Login to read</a> + {% endif %} </div> </div> diff --git a/reader/urls.py b/reader/urls.py index 7ea7ba329a432cdec764109616de83b5212486bd..46633ebc1987b3e3f2db1ef3da4e7f79662dd869 100644 --- a/reader/urls.py +++ b/reader/urls.py @@ -7,4 +7,5 @@ urlpatterns = [ path("library", views.library, name='library'), path("books/create", views.create_book, name='create_book'), path("books/<int:book_id>", views.view_book, name='view_book'), + path("books/<int:book_id>/to_library", views.add_to_library, name='edit_book'), ] \ No newline at end of file diff --git a/reader/views.py b/reader/views.py index 3287da7b5f1d8cbfb76bb4e4e59d6ee14379e3ef..c3aa5da6432c9a43fec7f2dcf503090b354ee7b4 100644 --- a/reader/views.py +++ b/reader/views.py @@ -1,11 +1,22 @@ from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect, get_object_or_404 +from django.views.decorators.http import require_POST from reader.forms import BookForm from reader.models import Book, UserBook +def user_can_access_book(request, book) -> bool: + has_permission = False + if book.public or book.owner == request.user: + has_permission = True + elif request.user.is_authenticated: + has_permission = (request.user.has_perm("reader.book_view_others", book) + or request.user.has_perm("reader.book_view_others")) + return has_permission + + def index(request): return render(request, "reader/index.html") @@ -70,16 +81,7 @@ def view_book(request, book_id): book = get_object_or_404(Book, id=book_id) # Check user has permission to access this book - has_permission = False - if book.public: - has_permission = True - elif book.owner == request.user: - has_permission = True - elif request.user.is_authenticated: - has_permission = (request.user.has_perm("reader.book_view_others", book) - or request.user.has_perm("reader.book_view_others")) - - if not has_permission: + if not user_can_access_book(request, book): raise PermissionDenied # Get the user's book stats for this book @@ -91,7 +93,7 @@ def view_book(request, book_id): # Render return render(request, "reader/view_book.html", { "book": book, - "user_book_q": user_book_q, + "user_book": user_book_q.first(), "user_in_library": user_in_library }) @@ -119,4 +121,14 @@ def library(request): "last_progress_device": userbook.last_progress_device, } books.append(ub) - return render(request, "reader/library.html", {"books": books, "page": "library"}) \ No newline at end of file + return render(request, "reader/library.html", {"books": books, "page": "library"}) + +@require_POST +@login_required(login_url='login') +def add_to_library(request, book_id): + book = get_object_or_404(Book, id=book_id) + if not user_can_access_book(request, book): + raise PermissionDenied + userbook = UserBook(book=book, user=request.user) + userbook.save() + return redirect("library")