mirror of
https://github.com/daniviga/django-ram.git
synced 2025-08-04 13:17:50 +02:00
WIP: implement catalogue type of books
This commit is contained in:
@@ -1,11 +1,13 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from adminsortable2.admin import SortableAdminBase, SortableInlineAdminMixin
|
from adminsortable2.admin import SortableAdminBase, SortableInlineAdminMixin
|
||||||
|
|
||||||
from bookshelf.models import BookProperty, BookImage, Book, Author, Publisher
|
from bookshelf.models import (
|
||||||
|
BaseBookProperty, BaseBookImage, Book, Author, Publisher
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class BookImageInline(SortableInlineAdminMixin, admin.TabularInline):
|
class BookImageInline(SortableInlineAdminMixin, admin.TabularInline):
|
||||||
model = BookImage
|
model = BaseBookImage
|
||||||
min_num = 0
|
min_num = 0
|
||||||
extra = 0
|
extra = 0
|
||||||
readonly_fields = ("image_thumbnail",)
|
readonly_fields = ("image_thumbnail",)
|
||||||
@@ -13,7 +15,7 @@ class BookImageInline(SortableInlineAdminMixin, admin.TabularInline):
|
|||||||
|
|
||||||
|
|
||||||
class BookPropertyInline(admin.TabularInline):
|
class BookPropertyInline(admin.TabularInline):
|
||||||
model = BookProperty
|
model = BaseBookProperty
|
||||||
min_num = 0
|
min_num = 0
|
||||||
extra = 0
|
extra = 0
|
||||||
autocomplete_fields = ("property",)
|
autocomplete_fields = ("property",)
|
||||||
|
128
ram/bookshelf/migrations/0016_basebook_book_catalogue.py
Normal file
128
ram/bookshelf/migrations/0016_basebook_book_catalogue.py
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-11-27 16:35
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
def nil(apps, schema_editor):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("bookshelf", "0015_alter_book_authors"),
|
||||||
|
("metadata", "0019_alter_scale_gauge"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name="BookImage",
|
||||||
|
new_name="BaseBookImage",
|
||||||
|
),
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name="BookProperty",
|
||||||
|
new_name="BaseBookProperty",
|
||||||
|
),
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name="Book",
|
||||||
|
new_name="BaseBook",
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name="basebook",
|
||||||
|
old_name="title",
|
||||||
|
new_name="old_title",
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name="basebook",
|
||||||
|
old_name="authors",
|
||||||
|
new_name="old_authors",
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name="basebook",
|
||||||
|
old_name="publisher",
|
||||||
|
new_name="old_publisher",
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="Book",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"basebook_ptr",
|
||||||
|
models.OneToOneField(
|
||||||
|
auto_created=True,
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
parent_link=True,
|
||||||
|
primary_key=True,
|
||||||
|
serialize=False,
|
||||||
|
to="bookshelf.basebook",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("title", models.CharField(max_length=200)),
|
||||||
|
(
|
||||||
|
"authors",
|
||||||
|
models.ManyToManyField(
|
||||||
|
blank=True,
|
||||||
|
to="bookshelf.author"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"publisher",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="bookshelf.publisher"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
"ordering": ["title"],
|
||||||
|
},
|
||||||
|
bases=("bookshelf.basebook",),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="Catalog",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"basebook_ptr",
|
||||||
|
models.OneToOneField(
|
||||||
|
auto_created=True,
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
parent_link=True,
|
||||||
|
primary_key=True,
|
||||||
|
serialize=False,
|
||||||
|
to="bookshelf.basebook",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("years", models.CharField(max_length=12)),
|
||||||
|
(
|
||||||
|
"manufacturer",
|
||||||
|
models.ForeignKey(
|
||||||
|
blank=True,
|
||||||
|
null=True,
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="metadata.manufacturer",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("scales", models.ManyToManyField(to="metadata.scale")),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
"ordering": ["manufacturer", "publication_year"],
|
||||||
|
},
|
||||||
|
bases=("bookshelf.basebook",),
|
||||||
|
),
|
||||||
|
migrations.RunPython(
|
||||||
|
nil,
|
||||||
|
reverse_code=migrations.RunPython.noop
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name="basebook",
|
||||||
|
name="old_title",
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name="basebook",
|
||||||
|
name="old_authors",
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name="basebook",
|
||||||
|
name="old_publisher",
|
||||||
|
),
|
||||||
|
]
|
@@ -10,6 +10,7 @@ from tinymce import models as tinymce
|
|||||||
from metadata.models import Tag
|
from metadata.models import Tag
|
||||||
from ram.utils import DeduplicatedStorage
|
from ram.utils import DeduplicatedStorage
|
||||||
from ram.models import BaseModel, Image, PropertyInstance
|
from ram.models import BaseModel, Image, PropertyInstance
|
||||||
|
from metadata.models import Scale, Manufacturer
|
||||||
|
|
||||||
|
|
||||||
class Publisher(models.Model):
|
class Publisher(models.Model):
|
||||||
@@ -38,10 +39,7 @@ class Author(models.Model):
|
|||||||
return f"{self.last_name} {self.first_name[0]}."
|
return f"{self.last_name} {self.first_name[0]}."
|
||||||
|
|
||||||
|
|
||||||
class Book(BaseModel):
|
class BaseBook(BaseModel):
|
||||||
title = models.CharField(max_length=200)
|
|
||||||
authors = models.ManyToManyField(Author, blank=True)
|
|
||||||
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
|
|
||||||
ISBN = models.CharField(max_length=17, blank=True) # 13 + dashes
|
ISBN = models.CharField(max_length=17, blank=True) # 13 + dashes
|
||||||
language = models.CharField(
|
language = models.CharField(
|
||||||
max_length=7,
|
max_length=7,
|
||||||
@@ -56,15 +54,6 @@ class Book(BaseModel):
|
|||||||
Tag, related_name="bookshelf", blank=True
|
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):
|
def get_absolute_url(self):
|
||||||
return reverse("book", kwargs={"uuid": self.uuid})
|
return reverse("book", kwargs={"uuid": self.uuid})
|
||||||
|
|
||||||
@@ -75,7 +64,7 @@ class Book(BaseModel):
|
|||||||
),
|
),
|
||||||
ignore_errors=True
|
ignore_errors=True
|
||||||
)
|
)
|
||||||
super(Book, self).delete(*args, **kwargs)
|
super(BaseBook, self).delete(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def book_image_upload(instance, filename):
|
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 = models.ForeignKey(
|
||||||
Book, on_delete=models.CASCADE, related_name="image"
|
BaseBook, on_delete=models.CASCADE, related_name="image"
|
||||||
)
|
)
|
||||||
image = models.ImageField(
|
image = models.ImageField(
|
||||||
upload_to=book_image_upload,
|
upload_to=book_image_upload,
|
||||||
@@ -97,11 +86,44 @@ class BookImage(Image):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class BookProperty(PropertyInstance):
|
class BaseBookProperty(PropertyInstance):
|
||||||
book = models.ForeignKey(
|
book = models.ForeignKey(
|
||||||
Book,
|
BaseBook,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
null=False,
|
null=False,
|
||||||
blank=False,
|
blank=False,
|
||||||
related_name="property",
|
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)
|
||||||
|
Reference in New Issue
Block a user