Select Git revision
TheJoeCoder authored
views.py 5.13 KiB
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")
@login_required(login_url='login')
def create_book(request):
if request.method == "POST":
form = BookForm(data=request.POST, files=request.FILES, request=request)
if form.is_valid():
permission_checks = True
permission_checks = permission_checks and (
request.user.has_perm("reader.book_create_public")
if form.cleaned_data["public"] else True
)
permission_checks = permission_checks and (
request.user.has_perm("reader.book_create_loanable")
if form.cleaned_data["loanable"]
or (form.cleaned_data["loanable_copies"] != 0) else True
)
permission_checks = permission_checks and (
request.user.has_perm("reader.book_create_no_owner")
if not form.cleaned_data["owner"] else True
)
permission_checks = permission_checks and (
request.user.has_perm("reader.book_create_others_owner")
if form.cleaned_data["owner"] != request.user else True
)
if permission_checks:
obj = form.save(commit=False)
obj.created_by = request.user
obj.save()
return redirect("index") # TODO change this URL
else:
form.add_error(None, "You do not have permission to use the options you have selected")
else:
form = BookForm(request=request)
return render(request, "reader/book_form.html", {
"title": "Create Book",
"form": form
})
def browse_books(request):
books = Book.objects.filter(public=True)
books_private = []
if request.user.is_authenticated:
books_private_q = Book.objects.filter(public=False)
for book in books_private_q:
# Filter books that the user has permission to view and hasn't read
if ((book.owner == request.user
or request.user.has_perm("reader.book_view_others", book)
or request.user.has_perm("reader.book_view_others"))
and (book.userbook_set.filter(user=request.user).count() == 0)):
books_private.append(book)
return render(request, "reader/browse.html", {
"page": "browse",
"books": books,
"books_private": books_private
})
def view_book(request, book_id):
# Get book
book = get_object_or_404(Book, id=book_id)
# Check user has permission to access this book
if not user_can_access_book(request, book):
raise PermissionDenied
# Get the user's book stats for this book
user_book_q = None
if request.user.is_authenticated:
user_book_q = UserBook.objects.filter(book=book, user=request.user)
user_in_library = False if user_book_q is None else user_book_q.count() > 0
# Render
return render(request, "reader/view_book.html", {
"book": book,
"user_book": user_book_q.first(),
"user_in_library": user_in_library
})
@login_required(login_url='login')
def library(request):
userbooks = UserBook.objects.filter(user=request.user)
books = []
for userbook in userbooks:
ub = {
"id": userbook.book.id,
"userbook_id": userbook.id,
"title": userbook.book.title,
"author": userbook.book.author,
"publisher": userbook.book.publisher,
"ids": userbook.book.ids,
"description": userbook.book.description,
"owner": userbook.book.owner,
"public": userbook.book.public,
"loanable": userbook.book.loanable,
"image": userbook.book.image,
"loanable_copies": userbook.book.loanable_copies,
"percentage_read": userbook.percentage_read,
"percentage_read_whole": round(userbook.percentage_read * 100),
"last_read": userbook.last_read,
"last_progress_device": userbook.last_progress_device,
}
books.append(ub)
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("view_book", book_id=book_id)