Coverage for books/views.py: 74.60%
63 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-24 18:34 -0700
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-24 18:34 -0700
1from django.contrib.auth.mixins import LoginRequiredMixin
2from django.db.models import Q
3from django.urls import reverse
4from django.views.generic import (
5 CreateView,
6 DeleteView,
7 DetailView,
8 ListView,
9 UpdateView,
10)
12from .models import Book, Review
15class BookCreateView(LoginRequiredMixin, CreateView):
16 model = Book
17 fields = [
18 "title",
19 "author",
20 "description",
21 "price",
22 "publisher",
23 "pubdate",
24 "cover",
25 ]
27 def form_valid(self, form):
28 form.instance.creator = self.request.user 1b
29 return super().form_valid(form) 1b
32class BookDetailView(DetailView):
33 model = Book
34 context_object_name = "book"
35 login_url = "account_login"
38class BookListView(ListView):
39 model = Book
40 context_object_name = "book_list"
41 login_url = "account_login"
43 paginate_by = 5
46class BookUpdateView(LoginRequiredMixin, UpdateView):
47 model = Book
48 fields = [
49 "title",
50 "author",
51 "description",
52 "price",
53 "publisher",
54 "pubdate",
55 "cover",
56 ]
57 action = "Update"
60class ReviewCreateView(LoginRequiredMixin, CreateView):
61 model = Review
62 fields = ["book", "review"]
64 def get_initial(self):
65 initial_data = super(ReviewCreateView, self).get_initial()
66 book = Book.objects.get(id=self.kwargs["book_id"])
67 initial_data["book"] = book
68 return initial_data
70 def get_context_data(self):
71 context = super(ReviewCreateView, self).get_context_data()
72 book = Book.objects.get(id=self.kwargs["book_id"])
73 context["book"] = book
74 context["title"] = "Add a new review"
75 return context
77 def form_valid(self, form):
78 form.instance.creator = self.request.user
79 return super().form_valid(form)
81 def get_success_url(self):
82 return reverse("book_detail", args=[self.object.book_id])
85class ReviewDetailView(LoginRequiredMixin, DetailView):
86 model = Review
87 context_object_name = "review"
90class ReviewUpdateView(LoginRequiredMixin, UpdateView):
91 model = Review
92 fields = ["book", "review"]
93 action = "Update"
95 def get_success_url(self):
96 return reverse("book_detail", args=[self.object.book_id])
99class ReviewDeleteView(DeleteView):
100 model = Review
102 def get_success_url(self):
103 return reverse("book_detail", args=[self.object.book_id])
106class SearchResultsListView(ListView):
107 model = Book
108 context_object_name = "book_list"
109 template_name = "books/search_results.html"
111 def get_queryset(self):
112 query = self.request.GET.get("q")
113 return Book.objects.filter(
114 Q(title__icontains=query) | Q(author__icontains=query)
115 )