Skip to content
Snippets Groups Projects
Select Git revision
  • 5ff74e520ebc9361476091465cb638c2fca75ceb
  • master default protected
2 results

views.py

Blame
  • TheJoeCoder's avatar
    5ff74e52
    History
    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)