X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/4fae06ea1b9fec1a45482ac043aa049ebce3f465..51ea493dd4c46246c80ed3190b43ebfc0d75d67c:/src/documents/models/book.py diff --git a/src/documents/models/book.py b/src/documents/models/book.py index 23d3344b..fa93eeb9 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 @@ -21,6 +23,8 @@ from io import BytesIO import os import shutil import re +from urllib.parse import urljoin + class Book(models.Model): """ A document edited on the wiki """ @@ -42,6 +46,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, @@ -52,7 +57,6 @@ class Book(models.Model): related_name='document_books', related_query_name='document_book', ) - legimi_id = models.CharField(max_length=255, blank=True) class NoTextError(BaseException): pass @@ -278,15 +282,12 @@ class Book(models.Model): except IndexError: return None - def last_legimi_publish(self): - return self.legimibookpublish_set.order_by('-created_at').first() - def assert_publishable(self): assert self.chunk_set.exists(), _('No chunks in the book.') try: changes = self.get_current_changes(publishable=True) except self.NoTextError: - raise AssertionError(_('Not all chunks have publishable revisions.')) + raise AssertionError(_('Not all chunks have approved revisions.')) from librarian import NoDublinCore, ParseError, ValidationError @@ -392,6 +393,25 @@ 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 = 212, 300 + try: + xml = self.materialize(publishable=True).encode('utf-8') + info = BookInfo.from_bytes(xml) + kwargs = {} + if chunk.book.project is not None: + if chunk.book.project.logo_mono or chunk.book.project.logo: + kwargs['cover_logo'] = (chunk.book.project.logo_mono or chunk.book.project.logo).path + cover = make_cover(info, width=width, height=height, **kwargs) + 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 # ========================== @@ -449,6 +469,17 @@ class Book(models.Model): if not fake: book_xml = self.materialize(changes=changes) data = {"book_xml": book_xml, "days": days, "hidden": hidden} + if self.project is not None: + if self.project.logo: + data['logo'] = urljoin( + 'https://' + Site.objects.get_current().domain, + self.project.logo.url, + ) + if self.project.logo_mono: + data['logo_mono'] = urljoin( + 'https://' + Site.objects.get_current().domain, + self.project.logo.url, + ) if host: data['gallery_url'] = host + self.gallery_url() apiclient.api_call(user, "books/", data, beta=beta)