diff --git a/ram/bookshelf/migrations/0028_alter_magazine_options_alter_magazineissue_options.py b/ram/bookshelf/migrations/0028_alter_magazine_options_alter_magazineissue_options.py new file mode 100644 index 0000000..688329b --- /dev/null +++ b/ram/bookshelf/migrations/0028_alter_magazine_options_alter_magazineissue_options.py @@ -0,0 +1,29 @@ +# Generated by Django 6.0 on 2025-12-21 21:56 + +import django.db.models.functions.text +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookshelf", "0027_magazine_website"), + ] + + operations = [ + migrations.AlterModelOptions( + name="magazine", + options={"ordering": [django.db.models.functions.text.Lower("name")]}, + ), + migrations.AlterModelOptions( + name="magazineissue", + options={ + "ordering": [ + "magazine", + "publication_year", + "publication_month", + "issue_number", + ] + }, + ), + ] diff --git a/ram/bookshelf/models.py b/ram/bookshelf/models.py index df556ce..f3b5f36 100644 --- a/ram/bookshelf/models.py +++ b/ram/bookshelf/models.py @@ -5,6 +5,7 @@ from django.db import models from django.conf import settings from django.urls import reverse from django.utils.dates import MONTHS +from django.db.models.functions import Lower from django.core.exceptions import ValidationError from django_countries.fields import CountryField @@ -59,36 +60,24 @@ class BaseBook(BaseModel): blank=True, ) purchase_date = models.DateField(null=True, blank=True) - tags = models.ManyToManyField( - Tag, related_name="bookshelf", blank=True - ) + tags = models.ManyToManyField(Tag, related_name="bookshelf", blank=True) def delete(self, *args, **kwargs): shutil.rmtree( os.path.join( settings.MEDIA_ROOT, "images", "books", str(self.uuid) ), - ignore_errors=True + ignore_errors=True, ) super(BaseBook, self).delete(*args, **kwargs) def book_image_upload(instance, filename): - return os.path.join( - "images", - "books", - str(instance.book.uuid), - filename - ) + return os.path.join("images", "books", str(instance.book.uuid), filename) def magazine_image_upload(instance, filename): - return os.path.join( - "images", - "magazines", - str(instance.uuid), - filename - ) + return os.path.join("images", "magazines", str(instance.uuid), filename) class BaseBookImage(Image): @@ -132,8 +121,7 @@ class Book(BaseBook): def get_absolute_url(self): return reverse( - "bookshelf_item", - kwargs={"selector": "book", "uuid": self.uuid} + "bookshelf_item", kwargs={"selector": "book", "uuid": self.uuid} ) @@ -158,12 +146,12 @@ class Catalog(BaseBook): def get_absolute_url(self): return reverse( - "bookshelf_item", - kwargs={"selector": "catalog", "uuid": self.uuid} + "bookshelf_item", kwargs={"selector": "catalog", "uuid": self.uuid} ) def get_scales(self): return "/".join([s.scale for s in self.scales.all()]) + get_scales.short_description = "Scales" @@ -180,32 +168,27 @@ class Magazine(BaseModel): language = models.CharField( max_length=7, choices=sorted(settings.LANGUAGES, key=lambda s: s[1]), - default='en' - ) - tags = models.ManyToManyField( - Tag, related_name="magazine", blank=True + default="en", ) + tags = models.ManyToManyField(Tag, related_name="magazine", blank=True) def delete(self, *args, **kwargs): shutil.rmtree( os.path.join( settings.MEDIA_ROOT, "images", "magazines", str(self.uuid) ), - ignore_errors=True + ignore_errors=True, ) super(Magazine, self).delete(*args, **kwargs) class Meta: - ordering = ["name"] + ordering = [Lower("name")] def __str__(self): return self.name def get_absolute_url(self): - return reverse( - "magazine", - kwargs={"uuid": self.uuid} - ) + return reverse("magazine", kwargs={"uuid": self.uuid}) def website_short(self): if self.website: @@ -218,14 +201,17 @@ class MagazineIssue(BaseBook): ) issue_number = models.CharField(max_length=100) publication_month = models.SmallIntegerField( - null=True, - blank=True, - choices=MONTHS.items() + null=True, blank=True, choices=MONTHS.items() ) class Meta: unique_together = ("magazine", "issue_number") - ordering = ["magazine", "issue_number"] + ordering = [ + "magazine", + "publication_year", + "publication_month", + "issue_number", + ] def __str__(self): return f"{self.magazine.name} - {self.issue_number}" @@ -246,9 +232,5 @@ class MagazineIssue(BaseBook): def get_absolute_url(self): return reverse( - "issue", - kwargs={ - "uuid": self.uuid, - "magazine": self.magazine.uuid - } + "issue", kwargs={"uuid": self.uuid, "magazine": self.magazine.uuid} ) diff --git a/ram/portal/templates/cards/book.html b/ram/portal/templates/cards/book.html index b425ba1..1421c61 100644 --- a/ram/portal/templates/cards/book.html +++ b/ram/portal/templates/cards/book.html @@ -13,13 +13,13 @@ {{ d.item }}
- {% if d.item.tags.all %}Tags: {% for t in d.item.tags.all %} {{ t.name }}{# new line is required #} + {% empty %} + {% endfor %}
- {% endif %}