Source code for eucrim.issue.forms

# SPDX-FileCopyrightText: 2024 Thomas Breitner <t.breitner@csl.mpg.de>
#
# SPDX-License-Identifier: EUPL-1.2

from django.core.files.base import ContentFile
from wagtail.admin.forms import WagtailAdminPageForm

from eucrim.core.utils import generate_cover_image
from .utils import (
    canonical_issue_filename,
    extract_focuses,
    generate_wordcloud,
)


[docs] class IssueForm(WagtailAdminPageForm): """ Override the standard WagtailAdminPageForm for custom validation that appears as a non-field error see: http://docs.wagtail.io/en/stable/advanced_topics/customisation/page_editing_interface.html#customising-generated-forms # noqa: E501 """
[docs] def clean(self): from .models import IssueIndexPage cleaned_data = super().clean() _slug = canonical_issue_filename( cleaned_data["year"], cleaned_data["issue_number"], ) cleaned_data.update( { "_slug": _slug, } ) if cleaned_data["pdf"]: try: cover_filename = canonical_issue_filename( cleaned_data["year"], cleaned_data["issue_number"], "jpg", ) _cover_obj = cleaned_data["pdf"] # TODO: Remove this call+method+model field in favor of convert_pdf2imagefile and cover_image # Generate bitmap cover file from uploaded pdf: # cover_bitmap_obj = convert_pdf2bitmap(_cover_obj) # Extract cover bitmap from pdf file: _cover_obj.seek(0) cover_image = generate_cover_image(_cover_obj, cover_filename) # Generate wordcloud for issue: _cover_obj.seek(0) _pdf_contentfile = ContentFile(_cover_obj.file.read()) stopwords = IssueIndexPage.objects.live().first().wordcloud_stopwords stopwords = stopwords.splitlines() stopwords = [stopword.strip() for stopword in stopwords] stopwords = list(filter(bool, stopwords)) stopwords = set(stopwords) # Case sensitivity? _pdf_contentfile.seek(0) generate_wordcloud(_pdf_contentfile, _slug, custom_stopwords=stopwords) # Extract focuses/titles/toc from uploaded pdf: _pdf_contentfile.seek(0) ( focus_en, focus_fr, focus_ge, _unused_legacy_toc, error_focuses, ) = extract_focuses(_pdf_contentfile) if error_focuses: self.add_error("pdf", error_focuses) except KeyError: pass else: cleaned_data.update( { # "cover_bitmap_obj": cover_bitmap_obj, # "cover_filename": cover_filename, "focus_en": focus_en, "focus_fr": focus_fr, "focus_ge": focus_ge, "cover_image": cover_image, } ) return cleaned_data
[docs] def save(self, commit=True): page = super().save(commit=False) # Save data to instance: page.title = self.cleaned_data["_slug"] page.slug = self.cleaned_data["_slug"] try: page.focus_en = self.cleaned_data["focus_en"] page.focus_fr = self.cleaned_data["focus_fr"] page.focus_ge = self.cleaned_data["focus_ge"] page.cover_image = self.cleaned_data["cover_image"] except KeyError: # These attributes/keys do not exist if a IssuePage without # a PDF file is saved. pass # TODO: Delete page.cover.save block when page.cover_image is final # I don't know why, but I need `save=False` - otherwise a new instance # will not get saved... # page.cover.save( # self.cleaned_data["cover_filename"], # self.cleaned_data["cover_bitmap_obj"], # save=False, # ) if commit: page.save() page.save_revision().publish() return page