diff --git a/ram/bookshelf/migrations/0026_alter_basebook_language_alter_magazine_image_and_more.py b/ram/bookshelf/migrations/0026_alter_basebook_language_alter_magazine_image_and_more.py new file mode 100644 index 0000000..189c84b --- /dev/null +++ b/ram/bookshelf/migrations/0026_alter_basebook_language_alter_magazine_image_and_more.py @@ -0,0 +1,244 @@ +# Generated by Django 6.0 on 2025-12-10 20:59 + +import bookshelf.models +import ram.utils +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookshelf", "0025_magazine_magazineissue"), + ] + + operations = [ + migrations.AlterField( + model_name="basebook", + name="language", + field=models.CharField( + choices=[ + ("af", "Afrikaans"), + ("sq", "Albanian"), + ("ar-dz", "Algerian Arabic"), + ("ar", "Arabic"), + ("es-ar", "Argentinian Spanish"), + ("hy", "Armenian"), + ("ast", "Asturian"), + ("en-au", "Australian English"), + ("az", "Azerbaijani"), + ("eu", "Basque"), + ("be", "Belarusian"), + ("bn", "Bengali"), + ("bs", "Bosnian"), + ("pt-br", "Brazilian Portuguese"), + ("br", "Breton"), + ("en-gb", "British English"), + ("bg", "Bulgarian"), + ("my", "Burmese"), + ("ca", "Catalan"), + ("ckb", "Central Kurdish (Sorani)"), + ("es-co", "Colombian Spanish"), + ("hr", "Croatian"), + ("cs", "Czech"), + ("da", "Danish"), + ("nl", "Dutch"), + ("en", "English"), + ("eo", "Esperanto"), + ("et", "Estonian"), + ("fi", "Finnish"), + ("fr", "French"), + ("fy", "Frisian"), + ("gl", "Galician"), + ("ka", "Georgian"), + ("de", "German"), + ("el", "Greek"), + ("ht", "Haitian Creole"), + ("he", "Hebrew"), + ("hi", "Hindi"), + ("hu", "Hungarian"), + ("is", "Icelandic"), + ("io", "Ido"), + ("ig", "Igbo"), + ("id", "Indonesian"), + ("ia", "Interlingua"), + ("ga", "Irish"), + ("it", "Italian"), + ("ja", "Japanese"), + ("kab", "Kabyle"), + ("kn", "Kannada"), + ("kk", "Kazakh"), + ("km", "Khmer"), + ("ko", "Korean"), + ("ky", "Kyrgyz"), + ("lv", "Latvian"), + ("lt", "Lithuanian"), + ("dsb", "Lower Sorbian"), + ("lb", "Luxembourgish"), + ("mk", "Macedonian"), + ("ms", "Malay"), + ("ml", "Malayalam"), + ("mr", "Marathi"), + ("es-mx", "Mexican Spanish"), + ("mn", "Mongolian"), + ("ne", "Nepali"), + ("es-ni", "Nicaraguan Spanish"), + ("nb", "Norwegian Bokmål"), + ("nn", "Norwegian Nynorsk"), + ("os", "Ossetic"), + ("fa", "Persian"), + ("pl", "Polish"), + ("pt", "Portuguese"), + ("pa", "Punjabi"), + ("ro", "Romanian"), + ("ru", "Russian"), + ("gd", "Scottish Gaelic"), + ("sr", "Serbian"), + ("sr-latn", "Serbian Latin"), + ("zh-hans", "Simplified Chinese"), + ("sk", "Slovak"), + ("sl", "Slovenian"), + ("es", "Spanish"), + ("sw", "Swahili"), + ("sv", "Swedish"), + ("tg", "Tajik"), + ("ta", "Tamil"), + ("tt", "Tatar"), + ("te", "Telugu"), + ("th", "Thai"), + ("zh-hant", "Traditional Chinese"), + ("tr", "Turkish"), + ("tk", "Turkmen"), + ("udm", "Udmurt"), + ("uk", "Ukrainian"), + ("hsb", "Upper Sorbian"), + ("ur", "Urdu"), + ("ug", "Uyghur"), + ("uz", "Uzbek"), + ("es-ve", "Venezuelan Spanish"), + ("vi", "Vietnamese"), + ("cy", "Welsh"), + ], + default="en", + max_length=7, + ), + ), + migrations.AlterField( + model_name="magazine", + name="image", + field=models.ImageField( + blank=True, + storage=ram.utils.DeduplicatedStorage, + upload_to=bookshelf.models.magazine_image_upload, + ), + ), + migrations.AlterField( + model_name="magazine", + name="language", + field=models.CharField( + choices=[ + ("af", "Afrikaans"), + ("sq", "Albanian"), + ("ar-dz", "Algerian Arabic"), + ("ar", "Arabic"), + ("es-ar", "Argentinian Spanish"), + ("hy", "Armenian"), + ("ast", "Asturian"), + ("en-au", "Australian English"), + ("az", "Azerbaijani"), + ("eu", "Basque"), + ("be", "Belarusian"), + ("bn", "Bengali"), + ("bs", "Bosnian"), + ("pt-br", "Brazilian Portuguese"), + ("br", "Breton"), + ("en-gb", "British English"), + ("bg", "Bulgarian"), + ("my", "Burmese"), + ("ca", "Catalan"), + ("ckb", "Central Kurdish (Sorani)"), + ("es-co", "Colombian Spanish"), + ("hr", "Croatian"), + ("cs", "Czech"), + ("da", "Danish"), + ("nl", "Dutch"), + ("en", "English"), + ("eo", "Esperanto"), + ("et", "Estonian"), + ("fi", "Finnish"), + ("fr", "French"), + ("fy", "Frisian"), + ("gl", "Galician"), + ("ka", "Georgian"), + ("de", "German"), + ("el", "Greek"), + ("ht", "Haitian Creole"), + ("he", "Hebrew"), + ("hi", "Hindi"), + ("hu", "Hungarian"), + ("is", "Icelandic"), + ("io", "Ido"), + ("ig", "Igbo"), + ("id", "Indonesian"), + ("ia", "Interlingua"), + ("ga", "Irish"), + ("it", "Italian"), + ("ja", "Japanese"), + ("kab", "Kabyle"), + ("kn", "Kannada"), + ("kk", "Kazakh"), + ("km", "Khmer"), + ("ko", "Korean"), + ("ky", "Kyrgyz"), + ("lv", "Latvian"), + ("lt", "Lithuanian"), + ("dsb", "Lower Sorbian"), + ("lb", "Luxembourgish"), + ("mk", "Macedonian"), + ("ms", "Malay"), + ("ml", "Malayalam"), + ("mr", "Marathi"), + ("es-mx", "Mexican Spanish"), + ("mn", "Mongolian"), + ("ne", "Nepali"), + ("es-ni", "Nicaraguan Spanish"), + ("nb", "Norwegian Bokmål"), + ("nn", "Norwegian Nynorsk"), + ("os", "Ossetic"), + ("fa", "Persian"), + ("pl", "Polish"), + ("pt", "Portuguese"), + ("pa", "Punjabi"), + ("ro", "Romanian"), + ("ru", "Russian"), + ("gd", "Scottish Gaelic"), + ("sr", "Serbian"), + ("sr-latn", "Serbian Latin"), + ("zh-hans", "Simplified Chinese"), + ("sk", "Slovak"), + ("sl", "Slovenian"), + ("es", "Spanish"), + ("sw", "Swahili"), + ("sv", "Swedish"), + ("tg", "Tajik"), + ("ta", "Tamil"), + ("tt", "Tatar"), + ("te", "Telugu"), + ("th", "Thai"), + ("zh-hant", "Traditional Chinese"), + ("tr", "Turkish"), + ("tk", "Turkmen"), + ("udm", "Udmurt"), + ("uk", "Ukrainian"), + ("hsb", "Upper Sorbian"), + ("ur", "Urdu"), + ("ug", "Uyghur"), + ("uz", "Uzbek"), + ("es-ve", "Venezuelan Spanish"), + ("vi", "Vietnamese"), + ("cy", "Welsh"), + ], + default="en", + max_length=7, + ), + ), + ] diff --git a/ram/bookshelf/models.py b/ram/bookshelf/models.py index d8a98ed..58de694 100644 --- a/ram/bookshelf/models.py +++ b/ram/bookshelf/models.py @@ -43,8 +43,8 @@ class BaseBook(BaseModel): ISBN = models.CharField(max_length=17, blank=True) # 13 + dashes language = models.CharField( max_length=7, - choices=settings.LANGUAGES, - default='en' + choices=sorted(settings.LANGUAGES, key=lambda s: s[1]), + default="en", ) number_of_pages = models.SmallIntegerField(null=True, blank=True) publication_year = models.SmallIntegerField(null=True, blank=True) @@ -177,7 +177,7 @@ class Magazine(BaseModel): ) language = models.CharField( max_length=7, - choices=settings.LANGUAGES, + choices=sorted(settings.LANGUAGES, key=lambda s: s[1]), default='en' ) tags = models.ManyToManyField( @@ -234,6 +234,10 @@ class MagazineIssue(BaseBook): def preview(self): return self.image.first().image_thumbnail(100) + @property + def publisher(self): + return self.magazine.publisher + def get_absolute_url(self): return reverse( "issue", diff --git a/ram/portal/templates/bookshelf/book.html b/ram/portal/templates/bookshelf/book.html index 778fcd4..34c66d1 100644 --- a/ram/portal/templates/bookshelf/book.html +++ b/ram/portal/templates/bookshelf/book.html @@ -89,7 +89,30 @@ Publisher - {{ book.publisher }} + + {{ book.publisher.country }} {{ book.publisher }} + {% if book.publisher.website %} {% endif %} + + + {% elif type == "magazineissue" %} + + Magazine + {{ book.magazine }} + + + Publisher + + {{ book.publisher.country }} {{ book.publisher }} + {% if book.publisher.website %} {% endif %} + + + + Issue + {{ book.issue_number }} + + + Date + {{ book.publication_year|default:"-" }} / {{ book.publication_month|default:"-" }} {% endif %} @@ -104,10 +127,12 @@ Number of pages {{ book.number_of_pages|default:"-" }} + {% if type == "boook" or type == "catalog" %} Publication year {{ book.publication_year|default:"-" }} + {% endif %} {% if book.description %} Description diff --git a/ram/portal/templates/bookshelf/bookshelf_menu.html b/ram/portal/templates/bookshelf/bookshelf_menu.html index 7321045..a10e207 100644 --- a/ram/portal/templates/bookshelf/bookshelf_menu.html +++ b/ram/portal/templates/bookshelf/bookshelf_menu.html @@ -10,6 +10,9 @@ {% if catalogs_menu %}
  • Catalogs
  • {% endif %} + {% if magazines_menu %} +
  • Magazines
  • + {% endif %} {% endif %} diff --git a/ram/portal/templates/cards.html b/ram/portal/templates/cards.html index ba81806..fc64027 100644 --- a/ram/portal/templates/cards.html +++ b/ram/portal/templates/cards.html @@ -18,7 +18,7 @@ {% include "cards/consist.html" %} {% elif d.type == "manufacturer" %} {% include "cards/manufacturer.html" %} - {% elif d.type == "magazine" or d.type == "issue" %} + {% elif d.type == "magazine" or d.type == "magazineissue" %} {% include "cards/magazine.html" %} {% elif d.type == "book" or d.type == "catalog" %} {% include "cards/book.html" %} diff --git a/ram/portal/templates/cards/magazine.html b/ram/portal/templates/cards/magazine.html index 3d23d19..8e90c29 100644 --- a/ram/portal/templates/cards/magazine.html +++ b/ram/portal/templates/cards/magazine.html @@ -1,5 +1,4 @@ {% load static %} -
    {% if d.type == "magazine" %} @@ -15,9 +14,7 @@ {{ d.item }} {% endif %} - {% endif %} - - {% if d.type == "issue" %} + {% elif d.type == "magazineissue" %} {% if d.item.image.exists %} {{ d.item }} @@ -54,10 +51,33 @@ + {% if d.type == "magazineissue" %} + + Magazine + {{ d.item.magazine }} + + {% endif %} Publisher - {{ d.item.publisher.country }} {{ d.item.publisher }} + + {{ d.item.publisher.country }} {{ d.item.publisher }} + {% if d.item.publisher.website %} {% endif %} + + {% if d.type == "magazineissue" %} + + Issue + {{ d.item.issue_number }} + + + Date + {{ d.item.publication_year|default:"-" }} / {{ d.item.publication_month|default:"-" }} + + + Pages + {{ d.item.number_of_pages|default:"-" }} + + {% endif %} Language {{ d.item.get_language_display }} @@ -65,8 +85,12 @@
    + {% if d.type == "magazine" %} + Show {{ d.item.issues }} issue{{ d.item.issues|pluralize }} + {% else %} Show all data - {% if request.user.is_staff %}Edit{% endif %} + {% endif %} + {% if request.user.is_staff %}Edit{% endif %}
    diff --git a/ram/portal/templates/cards/manufacturer.html b/ram/portal/templates/cards/manufacturer.html index c7e41e0..fbcfd3f 100644 --- a/ram/portal/templates/cards/manufacturer.html +++ b/ram/portal/templates/cards/manufacturer.html @@ -31,7 +31,7 @@
    {% with items=d.item.num_items %} - Show {{ items }} item{{ items | pluralize}} + Show {{ items }} item{{ items|pluralize }} {% if request.user.is_staff %}Edit{% endif %} {% endwith %}
    diff --git a/ram/portal/templates/magazine.html b/ram/portal/templates/magazine.html index 40f64d1..05f7630 100644 --- a/ram/portal/templates/magazine.html +++ b/ram/portal/templates/magazine.html @@ -1,6 +1,6 @@ {% extends "cards.html" %} - {% block header %} + {{ block.super }} {% if magazine.tags.all %}

    Tags: {% for t in magazine.tags.all %} @@ -87,13 +87,19 @@ - Company + Name + {{ magazine }} + + + Publisher + {{ magazine.publisher.country }} {{ magazine.publisher }} + {% if magazine.publisher.website %} {% endif %} - Era - {{ magazine.era }} + ISBN + {{ magazine.ISBN | default:"-" }} {% if magazine.description %} @@ -101,14 +107,6 @@ {{ magazine.description | safe }} {% endif %} - - Length - {{ magazine.length }} - - - Composition - {% for t in magazine.get_type_count %}{{ t.count }}x {{ t.type }} {{t.category }}{% if not forloop.last %} » {% endif %}{% endfor %} - diff --git a/ram/portal/templatetags/show_menu.py b/ram/portal/templatetags/show_menu.py index 35421dd..4ae0fd9 100644 --- a/ram/portal/templatetags/show_menu.py +++ b/ram/portal/templatetags/show_menu.py @@ -1,6 +1,6 @@ from django import template from portal.models import Flatpage -from bookshelf.models import Book, Catalog +from bookshelf.models import Book, Catalog, Magazine register = template.Library() @@ -8,10 +8,14 @@ register = template.Library() @register.inclusion_tag('bookshelf/bookshelf_menu.html') def show_bookshelf_menu(): # FIXME: Filter out unpublished books and catalogs? + books = Book.objects.exists() + catalogs = Catalog.objects.exists() + magazines = Magazine.objects.exists() return { - "bookshelf_menu": (Book.objects.exists() or Catalog.objects.exists()), - "books_menu": Book.objects.exists(), - "catalogs_menu": Catalog.objects.exists(), + "bookshelf_menu": (books or catalogs or magazines), + "books_menu": books, + "catalogs_menu": catalogs, + "magazines_menu": magazines, } diff --git a/ram/portal/views.py b/ram/portal/views.py index 88a19be..8141761 100644 --- a/ram/portal/views.py +++ b/ram/portal/views.py @@ -646,7 +646,7 @@ class Magazines(GetData): Magazine.objects.get_published(request.user) .all() .annotate( - num_issues=Count( + issues=Count( "issue", filter=Q( issue__in=( @@ -668,7 +668,7 @@ class GetMagazine(View): raise Http404 data = [ { - "type": "issue", + "type": "magazineissue", "item": i, } for i in magazine.issue.get_published(request.user).all() @@ -686,6 +686,7 @@ class GetMagazine(View): "title": magazine, "magazine": magazine, "data": data, + "matches": paginator.count, "page_range": page_range, }, ) diff --git a/ram/ram/__init__.py b/ram/ram/__init__.py index 4e27f29..01e66b5 100644 --- a/ram/ram/__init__.py +++ b/ram/ram/__init__.py @@ -1,4 +1,4 @@ from ram.utils import git_suffix -__version__ = "0.18.00" +__version__ = "0.18.1" __version__ += git_suffix(__file__)