X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/c30cd74f1f4dcf0bfbabb0e5a739bcdf236b4946..3ca475c8e10c811633dec531772e18da6e5fa33d:/src/documents/models/book.py diff --git a/src/documents/models/book.py b/src/documents/models/book.py index 0e696e40..bede8d09 100644 --- a/src/documents/models/book.py +++ b/src/documents/models/book.py @@ -2,14 +2,16 @@ # 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 models, transaction +from django.db import connection, models, transaction from django.template.loader import render_to_string from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +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 """ @@ -41,6 +44,8 @@ class Book(models.Model): _on_track = models.IntegerField(null=True, blank=True, db_index=True, editable=False) 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, @@ -68,6 +73,14 @@ class Book(models.Model): qs = qs.filter(public=True) return qs + @staticmethod + def q_dc(field, field_plural, value, prefix=''): + if connection.features.supports_json_field_contains: + return models.Q(**{f'{prefix}dc__{field_plural}__contains': value}) + else: + return models.Q(**{f'{prefix}dc__{field}': value}) + + # Representing # ============ @@ -273,7 +286,7 @@ class Book(models.Model): 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 @@ -367,6 +380,7 @@ class Book(models.Model): else: if info.cover_source == image.get_full_url(): update['dc_cover_image'] = image + update['dc'] = info.to_dict() Book.objects.filter(pk=self.pk).update(**update) def touch(self): @@ -378,6 +392,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 = 212, 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 # ========================== @@ -413,7 +442,7 @@ class Book(models.Model): from librarian.parser import WLDocument from librarian.document import WLDocument as WLDocument2 - provider = RedakcjaDocProvider(publishable=publishable), + provider = RedakcjaDocProvider(publishable=publishable) xml = self.materialize(publishable=publishable, changes=changes).encode('utf-8') if librarian2: