diff --git a/ram/bookshelf/admin.py b/ram/bookshelf/admin.py index f2d7e70..c44a239 100644 --- a/ram/bookshelf/admin.py +++ b/ram/bookshelf/admin.py @@ -2,7 +2,13 @@ from django.contrib import admin from adminsortable2.admin import SortableAdminBase, SortableInlineAdminMixin from bookshelf.models import ( - BaseBookProperty, BaseBookImage, Book, Author, Publisher, Catalog + BaseBookProperty, + BaseBookImage, + BaseBookDocument, + Book, + Author, + Publisher, + Catalog, ) @@ -15,6 +21,13 @@ class BookImageInline(SortableInlineAdminMixin, admin.TabularInline): verbose_name = "Image" +class BookDocInline(admin.TabularInline): + model = BaseBookDocument + min_num = 0 + extra = 0 + classes = ["collapse"] + + class BookPropertyInline(admin.TabularInline): model = BaseBookProperty min_num = 0 @@ -26,7 +39,11 @@ class BookPropertyInline(admin.TabularInline): @admin.register(Book) class BookAdmin(SortableAdminBase, admin.ModelAdmin): - inlines = (BookImageInline, BookPropertyInline,) + inlines = ( + BookPropertyInline, + BookImageInline, + BookDocInline, + ) list_display = ( "title", "get_authors", @@ -83,7 +100,10 @@ class BookAdmin(SortableAdminBase, admin.ModelAdmin): @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): - search_fields = ("first_name", "last_name",) + search_fields = ( + "first_name", + "last_name", + ) list_filter = ("last_name",) @@ -95,7 +115,11 @@ class PublisherAdmin(admin.ModelAdmin): @admin.register(Catalog) class CatalogAdmin(SortableAdminBase, admin.ModelAdmin): - inlines = (BookImageInline, BookPropertyInline,) + inlines = ( + BookPropertyInline, + BookImageInline, + BookDocInline, + ) list_display = ( "manufacturer", "years", diff --git a/ram/bookshelf/migrations/0017_alter_basebook_options_basebookdocument.py b/ram/bookshelf/migrations/0017_alter_basebook_options_basebookdocument.py new file mode 100644 index 0000000..b05aa6e --- /dev/null +++ b/ram/bookshelf/migrations/0017_alter_basebook_options_basebookdocument.py @@ -0,0 +1,52 @@ +# Generated by Django 5.1.2 on 2024-12-22 20:38 + +import django.db.models.deletion +import ram.utils +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookshelf", "0016_basebook_book_catalogue"), + ] + + operations = [ + migrations.AlterModelOptions( + name="basebook", + options={}, + ), + migrations.CreateModel( + name="BaseBookDocument", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("description", models.CharField(blank=True, max_length=128)), + ( + "file", + models.FileField( + storage=ram.utils.DeduplicatedStorage(), upload_to="files/" + ), + ), + ("private", models.BooleanField(default=False)), + ( + "book", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="document", + to="bookshelf.basebook", + ), + ), + ], + options={ + "unique_together": {("book", "file")}, + }, + ), + ] diff --git a/ram/bookshelf/migrations/0018_alter_basebookdocument_options.py b/ram/bookshelf/migrations/0018_alter_basebookdocument_options.py new file mode 100644 index 0000000..5e3adff --- /dev/null +++ b/ram/bookshelf/migrations/0018_alter_basebookdocument_options.py @@ -0,0 +1,17 @@ +# Generated by Django 5.1.4 on 2024-12-22 20:44 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookshelf", "0017_alter_basebook_options_basebookdocument"), + ] + + operations = [ + migrations.AlterModelOptions( + name="basebookdocument", + options={"verbose_name_plural": "Documents"}, + ), + ] diff --git a/ram/bookshelf/models.py b/ram/bookshelf/models.py index a632bdf..b5c0e9a 100644 --- a/ram/bookshelf/models.py +++ b/ram/bookshelf/models.py @@ -9,7 +9,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 ram.models import BaseModel, Image, Document, PropertyInstance from metadata.models import Scale, Manufacturer @@ -83,6 +83,16 @@ class BaseBookImage(Image): ) +class BaseBookDocument(Document): + book = models.ForeignKey( + BaseBook, on_delete=models.CASCADE, related_name="document" + ) + + class Meta: + verbose_name_plural = "Documents" + unique_together = ("book", "file") + + class BaseBookProperty(PropertyInstance): book = models.ForeignKey( BaseBook, diff --git a/ram/ram/models.py b/ram/ram/models.py index 8e5b1b9..9720b00 100644 --- a/ram/ram/models.py +++ b/ram/ram/models.py @@ -32,6 +32,7 @@ class Document(models.Model): class Meta: abstract = True + verbose_name_plural = "Documents" def __str__(self): return "{0}".format(os.path.basename(self.file.name)) diff --git a/ram/roster/migrations/0029_alter_rollingstockimage_options.py b/ram/roster/migrations/0029_alter_rollingstockimage_options.py new file mode 100644 index 0000000..22efd26 --- /dev/null +++ b/ram/roster/migrations/0029_alter_rollingstockimage_options.py @@ -0,0 +1,17 @@ +# Generated by Django 5.1.2 on 2024-12-22 20:38 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("roster", "0028_rollingstock_published"), + ] + + operations = [ + migrations.AlterModelOptions( + name="rollingstockimage", + options={"ordering": ["order"], "verbose_name_plural": "Images"}, + ), + ]