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

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) 

11 

12from .models import Book, Review 

13 

14 

15class BookCreateView(LoginRequiredMixin, CreateView): 

16 model = Book 

17 fields = [ 

18 "title", 

19 "author", 

20 "description", 

21 "price", 

22 "publisher", 

23 "pubdate", 

24 "cover", 

25 ] 

26 

27 def form_valid(self, form): 

28 form.instance.creator = self.request.user 1b

29 return super().form_valid(form) 1b

30 

31 

32class BookDetailView(DetailView): 

33 model = Book 

34 context_object_name = "book" 

35 login_url = "account_login" 

36 

37 

38class BookListView(ListView): 

39 model = Book 

40 context_object_name = "book_list" 

41 login_url = "account_login" 

42 

43 paginate_by = 5 

44 

45 

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" 

58 

59 

60class ReviewCreateView(LoginRequiredMixin, CreateView): 

61 model = Review 

62 fields = ["book", "review"] 

63 

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 

69 

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 

76 

77 def form_valid(self, form): 

78 form.instance.creator = self.request.user 

79 return super().form_valid(form) 

80 

81 def get_success_url(self): 

82 return reverse("book_detail", args=[self.object.book_id]) 

83 

84 

85class ReviewDetailView(LoginRequiredMixin, DetailView): 

86 model = Review 

87 context_object_name = "review" 

88 

89 

90class ReviewUpdateView(LoginRequiredMixin, UpdateView): 

91 model = Review 

92 fields = ["book", "review"] 

93 action = "Update" 

94 

95 def get_success_url(self): 

96 return reverse("book_detail", args=[self.object.book_id]) 

97 

98 

99class ReviewDeleteView(DeleteView): 

100 model = Review 

101 

102 def get_success_url(self): 

103 return reverse("book_detail", args=[self.object.book_id]) 

104 

105 

106class SearchResultsListView(ListView): 

107 model = Book 

108 context_object_name = "book_list" 

109 template_name = "books/search_results.html" 

110 

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 )