Skip to content
Snippets Groups Projects
forms.py 3.38 KiB
from django import forms
from wagtail.admin.forms import WagtailAdminPageForm
from wagtail.core.models.collections import Collection

from .jekyll_import import perform_import


class JekyllImportForm(WagtailAdminPageForm):
    do_import = forms.BooleanField(
        initial=False, required=False, label="Provést import z Jekyllu"
    )
    collection = forms.ModelChoiceField(
        queryset=Collection.objects.all(), required=False, label="Kolekce obrázků"
    )
    dry_run = forms.BooleanField(
        initial=True,
        required=False,
        label="Jenom na zkoušku",
        help_text="Žádné články se neuloží, vypíše případné problémy či "
        "již existující články - 'ostrému' importu existující "
        "články nevadí, přeskočí je",
    )
    use_git = forms.BooleanField(
        initial=False,
        required=False,
        label="Použít Git",
        help_text="Umožňuje jednodušší zpracování, ale vyžaduje nainstalovaný Git.",
    )
    jekyll_repo_url = forms.URLField(
        max_length=512,
        required=False,
        help_text="V GitHubu tlačítko Code -> a odkaz z Download zip"
        "např. 'https://github.com/pirati-web/cb.pirati.cz/archive/refs/heads/gh-pages.zip',"
        "pokud máte nainstalovaný Git, zvolte Použít Git a vložte"
        "jednoduše URL repozitáře "
        "např. 'https://github.com/pirati-web/cb.pirati.cz'",
    )

    # def __init__(self):
    #     pass

    def clean(self):
        cleaned_data = super().clean()

        if not cleaned_data.get("do_import"):
            return cleaned_data
        else:
            if not cleaned_data.get("collection"):
                self.add_error("collection", "Pro import je toto pole povinné")
            if not cleaned_data.get("jekyll_repo_url"):
                self.add_error("jekyll_repo_url", "Pro import je toto pole povinné")

        if cleaned_data.get("use_git"):
            if cleaned_data.get("jekyll_repo_url", "").endswith(".zip"):
                self.add_error(
                    "jekyll_repo_url", "Vložte odkaz pouze na repozitář, ne na zip"
                )
        else:
            if not cleaned_data.get("jekyll_repo_url", "").endswith(".zip"):
                self.add_error("jekyll_repo_url", "Odkaz nesměřuje na soubor '.zip'")

        if len(self.errors):
            return cleaned_data

        if cleaned_data.get("dry_run"):
            error_list = perform_import(
                article_parent_page=self.instance,
                collection=self.cleaned_data["collection"],
                url=self.cleaned_data["jekyll_repo_url"],
                dry_run=True,
                use_git=self.cleaned_data["use_git"],
            )
            # self.instance.import_error_list = error_list

            for error in error_list:
                self.add_error("jekyll_repo_url", error)

        return cleaned_data

    def save(self, commit=True):
        if self.cleaned_data.get("do_import") and not self.cleaned_data["dry_run"]:
            error_list = perform_import(
                article_parent_page=self.instance,
                collection=self.cleaned_data["collection"],
                url=self.cleaned_data["jekyll_repo_url"],
                dry_run=False,
                use_git=self.cleaned_data["use_git"],
            )
            self.instance.import_error_list = error_list

        return super().save(commit=commit)