From: Radek Czajka Date: Fri, 23 Jun 2023 11:56:17 +0000 (+0200) Subject: New covers. X-Git-Url: https://git.mdrn.pl/redakcja.git/commitdiff_plain/17ed87c493556adae66975e6cee1454b74e0c904?ds=inline;hp=119bbb84ddb0e54bb3ffadda2df1920f45655ad5 New covers. --- diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 73a9a0e0..cc6b09d9 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -10,7 +10,7 @@ python-slugify==8.0.1 python-docx==0.8.11 Wikidata==0.7 -librarian==2.5.1 +librarian==2.6 ## Django Django==4.1.9 diff --git a/src/cover/views.py b/src/cover/views.py index 25663a09..a12dce73 100644 --- a/src/cover/views.py +++ b/src/cover/views.py @@ -32,6 +32,10 @@ def preview(request, book, chunk=None, rev=None): If rev is not given, use publishable version. """ chunk = Chunk.get(book, chunk) + + if chunk.book.cover and rev is None and not request.GET.get('width') and not request.GET.get('height'): + return HttpResponseRedirect(chunk.book.cover.url) + if rev is not None: try: revision = chunk.at_revision(rev) diff --git a/src/documents/migrations/0009_book_cover.py b/src/documents/migrations/0009_book_cover.py new file mode 100644 index 00000000..b74b0f34 --- /dev/null +++ b/src/documents/migrations/0009_book_cover.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.9 on 2023-06-20 09:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("documents", "0008_book_legimi_id"), + ] + + operations = [ + migrations.AddField( + model_name="book", + name="cover", + field=models.FileField(blank=True, upload_to=""), + ), + ] diff --git a/src/documents/models/book.py b/src/documents/models/book.py index 23d3344b..1b34fb64 100644 --- a/src/documents/models/book.py +++ b/src/documents/models/book.py @@ -2,6 +2,7 @@ # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # from django.apps import apps +from django.core.files.base import ContentFile from django.contrib.sites.models import Site from django.db import connection, models, transaction from django.template.loader import render_to_string @@ -9,7 +10,8 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from django.conf import settings from slugify import slugify - +from librarian.cover import make_cover +from librarian.dcparser import BookInfo import apiclient from documents.helpers import cached_in_field, GalleryMerger @@ -22,6 +24,7 @@ import os import shutil import re + class Book(models.Model): """ A document edited on the wiki """ @@ -42,6 +45,7 @@ class Book(models.Model): dc_cover_image = models.ForeignKey(Image, blank=True, null=True, db_index=True, on_delete=models.SET_NULL, editable=False) dc = models.JSONField(null=True, editable=False) + cover = models.FileField(blank=True, upload_to='documents/cover') catalogue_book = models.ForeignKey( 'catalogue.Book', models.DO_NOTHING, @@ -392,6 +396,21 @@ class Book(models.Model): } Book.objects.filter(pk=self.pk).update(**update) self.refresh_dc_cache() + self.build_cover() + + def build_cover(self): + width, height = 216, 300 + try: + xml = self.materialize(publishable=True).encode('utf-8') + info = BookInfo.from_bytes(xml) + cover = make_cover(info, width=width, height=height) + out = BytesIO() + ext = cover.ext() + cover.save(out) + self.cover.save(f'{self.slug}.{ext}', out, save=False) + type(self).objects.filter(pk=self.pk).update(cover=self.cover) + except: + type(self).objects.filter(pk=self.pk).update(cover='') # Materializing & publishing # ========================== diff --git a/src/documents/templates/documents/book_detail.html b/src/documents/templates/documents/book_detail.html index 5a3734fe..ee053d57 100644 --- a/src/documents/templates/documents/book_detail.html +++ b/src/documents/templates/documents/book_detail.html @@ -94,9 +94,9 @@ Pobierz okładkę: