Skip to content
Snippets Groups Projects
forms.py 2.98 KiB
import zipfile

from django import forms
from django.utils.text import slugify
from wagtail.admin.forms import WagtailAdminPageForm

from .constants import (
    AGE_30_49,
    AGE_CHOICES,
    OCCUPATION_CHOICES,
    OCCUPATION_WORKING,
    TOPIC_CHOICES,
    WEALTH_AVERAGE,
    WEALTH_CHOICES,
)
from .parser import (
    parse_program_html,
    prepare_benefit_for_all,
    prepare_benefits,
    prepare_faq,
    prepare_horizon,
    prepare_main_benefits,
    prepare_point,
)


class ProgramPointPageForm(WagtailAdminPageForm):
    import_file = forms.FileField(label="soubor s programem", required=False)

    def clean(self):
        cleaned_data = super().clean()
        cleaned_data["_import_data"] = None

        # extract data from ZIP file with HTML export
        import_file = cleaned_data["import_file"]
        if import_file:
            try:
                with zipfile.ZipFile(import_file) as archive:
                    name = archive.namelist()[0]
                    data = parse_program_html(archive.read(name))
                cleaned_data["_import_data"] = data
            except zipfile.BadZipFile:
                self.add_error("import_file", "Vadný ZIP soubor. Nelze rozbalit.")

        return cleaned_data

    def save(self, commit=True):
        page = super().save(commit=False)

        if self.cleaned_data["_import_data"]:
            point = prepare_point(self.cleaned_data["_import_data"]["sekce"])
            page.title = point["nadpis"]
            page.slug = slugify(page.title)
            page.annotation = point.get("anotace")
            page.problem = point.get("problem")
            page.context = point.get("kontext-problemu")
            page.ideal = point.get("ideal")
            page.proposal = point.get("navrhovana-opatreni")
            page.already_done = point.get("co-jsme-uz-udelali")
            page.sources = point.get("zdroje")
            text, number, unit = prepare_horizon(point.get("casovy-horizont", ""))
            page.time_horizon_text = text
            page.time_horizon_number = number
            page.time_horizon_unit = unit
            page.faq = prepare_faq(point.get("faq", ""))
            page.benefit_for_all = prepare_benefit_for_all(
                self.cleaned_data["_import_data"]["benefity"]
            )
            page.benefits_main = prepare_main_benefits(
                self.cleaned_data["_import_data"]["benefity"]
            )
            page.benefits = prepare_benefits(
                self.cleaned_data["_import_data"]["benefity"]
            )

        if commit:
            page.save()

        return page


class ProgramAppForm(forms.Form):
    age = forms.ChoiceField(choices=AGE_CHOICES, initial=AGE_30_49)
    kids = forms.BooleanField(required=False, initial=True)
    wealth = forms.ChoiceField(choices=WEALTH_CHOICES, initial=WEALTH_AVERAGE)
    occupation = forms.ChoiceField(
        choices=OCCUPATION_CHOICES, initial=OCCUPATION_WORKING
    )
    topics = forms.MultipleChoiceField(required=False, choices=TOPIC_CHOICES)