WIP: implement catalogue type of books

This commit is contained in:
2024-11-27 23:07:43 +01:00
parent 41d9338459
commit 119d25ede6
3 changed files with 173 additions and 21 deletions

View File

@@ -10,6 +10,7 @@ from tinymce import models as tinymce
from metadata.models import Tag
from ram.utils import DeduplicatedStorage
from ram.models import BaseModel, Image, PropertyInstance
from metadata.models import Scale, Manufacturer
class Publisher(models.Model):
@@ -38,10 +39,7 @@ class Author(models.Model):
return f"{self.last_name} {self.first_name[0]}."
class Book(BaseModel):
title = models.CharField(max_length=200)
authors = models.ManyToManyField(Author, blank=True)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
class BaseBook(BaseModel):
ISBN = models.CharField(max_length=17, blank=True) # 13 + dashes
language = models.CharField(
max_length=7,
@@ -56,15 +54,6 @@ class Book(BaseModel):
Tag, related_name="bookshelf", blank=True
)
class Meta:
ordering = ["title"]
def __str__(self):
return self.title
def publisher_name(self):
return self.publisher.name
def get_absolute_url(self):
return reverse("book", kwargs={"uuid": self.uuid})
@@ -75,7 +64,7 @@ class Book(BaseModel):
),
ignore_errors=True
)
super(Book, self).delete(*args, **kwargs)
super(BaseBook, self).delete(*args, **kwargs)
def book_image_upload(instance, filename):
@@ -87,9 +76,9 @@ def book_image_upload(instance, filename):
)
class BookImage(Image):
class BaseBookImage(Image):
book = models.ForeignKey(
Book, on_delete=models.CASCADE, related_name="image"
BaseBook, on_delete=models.CASCADE, related_name="image"
)
image = models.ImageField(
upload_to=book_image_upload,
@@ -97,11 +86,44 @@ class BookImage(Image):
)
class BookProperty(PropertyInstance):
class BaseBookProperty(PropertyInstance):
book = models.ForeignKey(
Book,
BaseBook,
on_delete=models.CASCADE,
null=False,
blank=False,
related_name="property",
)
class Book(BaseBook):
title = models.CharField(max_length=200)
authors = models.ManyToManyField(Author, blank=True)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
class Meta:
ordering = ["title"]
def __str__(self):
return self.title
def publisher_name(self):
return self.publisher.name
class Catalog(BaseBook):
manufacturer = models.ForeignKey(
Manufacturer,
on_delete=models.CASCADE,
null=True,
blank=True,
)
years = models.CharField(max_length=12)
scales = models.ManyToManyField(Scale)
class Meta:
ordering = ["manufacturer", "publication_year"]
def __str__(self):
scales = "/".join([s.scale for s in self.scales.all()])
return "%s %s %s" % (self.manufacturer.name, self.years, scales)