Skip to content
Snippets Groups Projects
Commit 43656520 authored by jan.bednarik's avatar jan.bednarik
Browse files

elections2021: Program point with benefits

parent 7b83e726
No related branches found
No related tags found
2 merge requests!222elections2021: Program point with benefits,!221elections2021: Program point with benefits
Pipeline #3538 passed
Showing
with 260 additions and 17 deletions
......@@ -146,3 +146,23 @@ TARGET_CHOICES = (
(HOUSING, "bydlení"),
(EDUCATION, "vzdělávání"),
)
BENEFITS = (
# (id, název, pracovní název)
("1", "Pro mladé a bezdětné", "mladí a bezdětní včetně studentů"),
("2", "Pro rodiny s dětmi", "rodiny s dětmi"),
("3", "Pro lidi ve zralém věku", "zralí"),
("4", "Pro seniory", "senioři a důchodci"),
("5", "Pro zaměstnance", "zaměstnanci"),
("6", "Pro živnostníky a podnikatele", "živnostníci a podnikatelé"),
("7", "Pro lidi ve finanční tísni", "ekonomicky ohrožení"),
("8", "Pro nás pro všechny", "společnost"),
("9", "Pro veřejné finance", "Veřejné finance:"),
("10", "Pro rozvoj obcí a měst", "obce"),
("11", "Pro lékaře a zdravotníky", "zdravotníci"),
("12", "Pro zemědělce", "zemědělci"),
("13", "Pro děti", "děti"),
)
BENEFITS_CHOICES = [(num, name) for num, name, _ in BENEFITS]
......@@ -6,9 +6,11 @@ from wagtail.admin.forms import WagtailAdminPageForm
from .parser import (
parse_program_html,
prepare_benefit_for_all,
prepare_benefits,
prepare_faq,
prepare_horizon,
prepare_main_benefits,
prepare_point,
)
......@@ -18,6 +20,7 @@ class ProgramPointPageForm(WagtailAdminPageForm):
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"]
......@@ -26,11 +29,9 @@ class ProgramPointPageForm(WagtailAdminPageForm):
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.")
cleaned_data["_import_data"] = data
else:
cleaned_data["_import_data"] = None
return cleaned_data
......@@ -39,22 +40,29 @@ class ProgramPointPageForm(WagtailAdminPageForm):
if self.cleaned_data["_import_data"]:
point = prepare_point(self.cleaned_data["_import_data"]["sekce"])
benefits = prepare_benefits(self.cleaned_data["_import_data"]["benefity"])
page.title = point["nadpis"]
page.slug = slugify(page.title)
page.annotation = point["anotace"]
page.problem = point["problem"]
page.context = point["kontext-problemu"]
page.ideal = point["ideal"]
page.proposal = point["navrhovana-opatreni"]
page.already_done = point["co-jsme-uz-udelali"]
page.sources = point["zdroje"]
text, number, unit = prepare_horizon(point["casovy-horizont"])
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["faq"])
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()
......
# Generated by Django 3.1.7 on 2021-05-12 19:32
import wagtail.core.blocks
import wagtail.core.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("elections2021", "0006_auto_20210511_0048"),
]
operations = [
migrations.AddField(
model_name="elections2021programpointpage",
name="benefit_for_all",
field=wagtail.core.fields.RichTextField(
blank=True, null=True, verbose_name="benefit pro společnost"
),
),
migrations.AddField(
model_name="elections2021programpointpage",
name="benefits",
field=wagtail.core.fields.StreamField(
[
(
"benefit",
wagtail.core.blocks.StructBlock(
[
("title", wagtail.core.blocks.CharBlock(label="název")),
(
"text",
wagtail.core.blocks.RichTextBlock(
features=[
"h4",
"ul-elections2021",
"superscript",
"link",
"italic",
],
label="text",
),
),
]
),
)
],
blank=True,
verbose_name="ostatní benefity",
),
),
migrations.AddField(
model_name="elections2021programpointpage",
name="benefits_main",
field=wagtail.core.fields.StreamField(
[
(
"benefit",
wagtail.core.blocks.StructBlock(
[
(
"variant",
wagtail.core.blocks.ChoiceBlock(
choices=[
("1", "Pro mladé a bezdětné"),
("2", "Pro rodiny s dětmi"),
("3", "Pro lidi ve zralém věku"),
("4", "Pro seniory"),
("5", "Pro zaměstnance"),
("6", "Pro živnostníky a podnikatele"),
("7", "Pro lidi ve finanční tísni"),
("8", "Pro nás pro všechny"),
("9", "Pro veřejné finance"),
("10", "Pro rozvoj obcí a měst"),
("11", "Pro lékaře a zdravotníky"),
("12", "Pro zemědělce"),
("13", "Pro děti"),
],
label="název",
),
),
(
"text",
wagtail.core.blocks.RichTextBlock(
features=[
"h4",
"ul-elections2021",
"superscript",
"link",
"italic",
],
label="text",
),
),
]
),
)
],
blank=True,
verbose_name="hlavní benefity",
),
),
]
......@@ -29,6 +29,7 @@ from tuning import help
from .constants import (
ARTICLE_RICH_TEXT_FEATURES,
ARTICLES_PER_PAGE,
BENEFITS_CHOICES,
CANDIDATE_RICH_TEXT_FEATURES,
EXTRA_FEATURES,
PARTY_CHOICES,
......@@ -516,6 +517,34 @@ class QuestionBlock(blocks.StructBlock):
template = "elections2021/_question_block.html"
class MainBenefitBlock(blocks.StructBlock):
variant = blocks.ChoiceBlock(BENEFITS_CHOICES, label="název")
text = blocks.RichTextBlock(label="text", features=STANDARD_FEATURES)
class Meta:
label = "hlavní benefit"
icon = "pick"
template = "elections2021/_main_benefit_block.html"
def get_context(self, value, parent_context=None):
context = super().get_context(value, parent_context=parent_context)
context["photo"] = f"elections2021/images/benefits/{value['variant']}.jpg"
context["title"] = next(
title for num, title in BENEFITS_CHOICES if num == value["variant"]
)
return context
class BenefitBlock(blocks.StructBlock):
title = blocks.CharBlock(label="název")
text = blocks.RichTextBlock(label="text", features=STANDARD_FEATURES)
class Meta:
label = "benefit"
icon = "pick"
template = "elections2021/_benefit_block.html"
class Elections2021ProgramPointPage(SubpageMixin, MetadataPageMixin, Page):
### FIELDS
......@@ -564,6 +593,19 @@ class Elections2021ProgramPointPage(SubpageMixin, MetadataPageMixin, Page):
verbose_name="související body",
blank=True,
)
benefit_for_all = RichTextField(
"benefit pro společnost", blank=True, null=True, features=RESTRICTED_FEATURES
)
benefits_main = StreamField(
[("benefit", MainBenefitBlock())],
verbose_name="hlavní benefity",
blank=True,
)
benefits = StreamField(
[("benefit", BenefitBlock())],
verbose_name="ostatní benefity",
blank=True,
)
# target weights
weight_childless = models.IntegerField("váha bezdětní", default=0)
......@@ -667,6 +709,12 @@ class Elections2021ProgramPointPage(SubpageMixin, MetadataPageMixin, Page):
related_panels = [StreamFieldPanel("related_points")]
benefits_panels = [
FieldPanel("benefit_for_all"),
StreamFieldPanel("benefits_main"),
StreamFieldPanel("benefits"),
]
weights_panels = [
MultiFieldPanel(
[
......@@ -748,6 +796,7 @@ class Elections2021ProgramPointPage(SubpageMixin, MetadataPageMixin, Page):
ObjectList(content_panels, heading=gettext_lazy("Content")),
ObjectList(promote_panels, heading=gettext_lazy("Promote")),
ObjectList(faq_panels, heading="FAQ"),
ObjectList(benefits_panels, heading="benefity"),
ObjectList(related_panels, heading="související"),
ObjectList(weights_panels, heading="váhy"),
ObjectList(import_panels, heading="import"),
......
......@@ -8,6 +8,8 @@ import bleach
import bs4
from django.utils.text import slugify
from .constants import BENEFITS
KNOWN_KEYS = [
"nadpis",
"anotace",
......@@ -22,6 +24,10 @@ KNOWN_KEYS = [
"zdroje",
]
BENEFIT_FOR_ALL = "společnost jako celek"
MAIN_BENEFITS = {slugify(old_name): num for num, _, old_name in BENEFITS}
def parse_program_html(fp):
# Načteme celý dokument.
......@@ -200,9 +206,12 @@ def strip_html(value):
return bleach.clean(value, tags=[], attributes={}, styles=[], strip=True)
def strip_div(value):
return value.replace("<div>", "").replace("</div>", "")
def replace_tags(value):
value = value.replace("<div>", "")
value = value.replace("</div>", "")
value = strip_div(value)
if not value.startswith("<p>"):
value = f"<p>{value}</p>"
return value
......@@ -278,5 +287,43 @@ def prepare_point(source):
return point
def prepare_benefits(benefits):
def prepare_benefit_for_all(benefits):
if BENEFIT_FOR_ALL in benefits:
text = benefits[BENEFIT_FOR_ALL]
return strip_div(text)
return None
def prepare_main_benefits(benefits):
data = []
for name, text in benefits.items():
if name == BENEFIT_FOR_ALL:
continue
name_slug = slugify(name)
if name_slug in MAIN_BENEFITS:
data.append(
{
"type": "benefit",
"value": {
"variant": MAIN_BENEFITS[name_slug],
"text": strip_div(text),
},
}
)
return json.dumps(data) if data else None
def prepare_benefits(benefits):
data = []
for name, text in benefits.items():
if name == BENEFIT_FOR_ALL:
continue
name_slug = slugify(name)
if name_slug not in MAIN_BENEFITS:
data.append(
{
"type": "benefit",
"value": {"title": name, "text": strip_div(text)},
}
)
return json.dumps(data) if data else None
elections2021/static/elections2021/images/benefits/1.jpg

49.9 KiB

elections2021/static/elections2021/images/benefits/10.jpg

106 KiB

elections2021/static/elections2021/images/benefits/11.jpg

50.5 KiB

elections2021/static/elections2021/images/benefits/12.jpg

67.2 KiB

elections2021/static/elections2021/images/benefits/13.jpg

65 KiB

elections2021/static/elections2021/images/benefits/2.jpg

79.3 KiB

elections2021/static/elections2021/images/benefits/3.jpg

65 KiB

elections2021/static/elections2021/images/benefits/4.jpg

57.6 KiB

elections2021/static/elections2021/images/benefits/5.jpg

69.2 KiB

elections2021/static/elections2021/images/benefits/6.jpg

57.3 KiB

elections2021/static/elections2021/images/benefits/7.jpg

68 KiB

elections2021/static/elections2021/images/benefits/8.jpg

134 KiB

elections2021/static/elections2021/images/benefits/9.jpg

77.8 KiB

{% load wagtailcore_tags elections2021_extras %}
<div class="card shadow-none bg-acidgreen text-black card--hoveractive">
<div class="card__body">
<h1 class="card-headline mb-8">{{ block.value.title }}</h1>
<p class="card-body-text">{{ block.value.text|richtext|format_sources }}</p>
</div>
</div>
{% load static wagtailcore_tags elections2021_extras %}
<div class="benefit">
<img src="{% static photo %}">
<div class="benefit-detail bg-acidgreen">
<p class="head-heavy-sm w-full pr-8">{{ title }}</p>
<p class="text-sm">{{ block.value.text|richtext|format_sources }}</p>
</div>
</div>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment