Coverage for books/models.py: 100.00%
33 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-23 15:55 -0700
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-23 15:55 -0700
1import uuid 1a
2from typing import ClassVar 1a
4from django.contrib.auth import get_user_model 1a
5from django.db import models 1a
6from django.urls import reverse 1a
9class Book(models.Model): 1a
10 id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 1a
11 title = models.CharField(max_length=200) 1a
12 author = models.CharField(max_length=200) 1a
13 price = models.DecimalField(max_digits=6, decimal_places=2) 1a
14 publisher = models.CharField(max_length=50, blank=True) 1a
15 pubdate = models.DateField(null=True, blank=True, help_text="Date of Publication") 1a
16 description = models.TextField( 1a
17 max_length=1000,
18 blank=True,
19 help_text="Enter a brief description of the book.",
20 )
21 cover = models.ImageField(upload_to="covers/", blank=True) 1a
22 creator = models.ForeignKey(get_user_model(), null=True, on_delete=models.SET_NULL) 1a
24 objects = models.Manager() 1a
26 class Meta: 1a
27 indexes: ClassVar[list] = [ 1a
28 models.Index(fields=["id"], name="id_index"),
29 ]
30 ordering: ClassVar[list[str]] = ["title"] 1a
31 permissions: ClassVar[list[tuple]] = [ 1a
32 ("special_status", "Can read all books"),
33 ]
35 def __str__(self): 1a
36 return self.title 1a
38 def get_absolute_url(self): 1a
39 return reverse("book_detail", args=[str(self.id)]) 1a
42class Review(models.Model): 1a
43 book = models.ForeignKey( 1a
44 Book,
45 on_delete=models.CASCADE,
46 related_name="reviews",
47 )
48 review = models.TextField("Review", blank=True) 1a
49 date = models.DateTimeField(auto_now_add=True) 1a
50 creator = models.ForeignKey( 1a
51 get_user_model(),
52 on_delete=models.CASCADE,
53 )
55 def __str__(self): 1a
56 return self.review 1a
58 def get_absolute_url(self): 1a
59 return reverse("book_list") 1a