# SPDX-FileCopyrightText: 2024 Thomas Breitner <t.breitner@csl.mpg.de>
#
# SPDX-License-Identifier: EUPL-1.2
from wagtail.admin.forms import WagtailAdminPageForm
from ..core.utils import generate_cover_image
from .utils import word2html
from .export_pdf import set_article_pdf
[docs]
class ArticleForm(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):
cleaned_data = super().clean()
try:
self.cleaned_data["word_file"]
if self.instance.word_file != cleaned_data["word_file"]:
self.cleaned_data["word_changed"] = True
else:
self.cleaned_data["word_changed"] = False
except KeyError as error:
error_msg = 'No word file available: KeyError - reason "{}"'.format(error)
self.add_error("word_file", error_msg)
except Exception as exception:
self.add_error(
"Unhandled exception related to word_file: {}".format(exception)
)
# This whole cover image generation is only applicable if a pdf_file is uploaded
# which in our case was only once the case.
if cleaned_data.get("pdf_file"):
try:
_cover_obj = cleaned_data["pdf_file"]
_cover_obj.seek(0)
cover_image = generate_cover_image(_cover_obj)
except AttributeError as e:
print(f"AttributeError: Problem generating cover_image: {e=}")
except Exception as e:
print(f"Exception: Problem generating cover_image: {e=}")
else:
cleaned_data.update(
{
"pdf_file_cover_image": cover_image,
}
)
return cleaned_data
[docs]
def save(self, commit=True):
page = super().save(commit=False)
# Convert uploaded word file to a html5 representation:
word_as_html5 = word2html(self.cleaned_data)
page.as_html5 = word_as_html5.as_html5
page.auto_excerpt = word_as_html5.auto_excerpt
if page.pdf_file and self.cleaned_data.get("pdf_file_cover_image"):
page.pdf_file_cover_image = self.cleaned_data["pdf_file_cover_image"]
if commit:
page.save()
# We need a pk for new article_pages to attach the PDF
set_article_pdf(article_page=page, save=True)
page.save_revision().publish()
else:
set_article_pdf(article_page=page, save=False)
return page