diff --git a/.isort.cfg b/.isort.cfg index b1d9cc78fc0f276b22216a69376fd883cc21b6c8..d5b27543aa4fbfff99aac25c87805e9a4f9c9e8d 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -4,4 +4,4 @@ line_length = 88 multi_line_output = 3 default_sectiont = "THIRDPARTY" include_trailing_comma = true -known_third_party = arrow,django,environ,faker,ics,pirates,pytest,pytz,requests,snapshottest,wagtail,wagtailmetadata +known_third_party = arrow,django,environ,faker,ics,modelcluster,pirates,pytest,pytz,requests,snapshottest,taggit,wagtail,wagtailmetadata diff --git a/README.md b/README.md index 0bcb7943edd65427314ec21e3e0306ec848f6d06..6a6bdb533a023458f8ece3c0dbc1a0127cac75e3 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Rozšíření která používáme: ├── senate = app na web senat.pirati.cz ├── senat_campaign = app na weby kandidátů na senátory ├── districts = app na web kraje.pirati.cz + ├── program2021 = app na prezentaci programu 2021 ... ├── majak = Django projekt s konfigurací Majáku ├── shared = app se sdílenými static soubory a templaty pro weby diff --git a/majak/settings/base.py b/majak/settings/base.py index 15b4b71feec1301272dbc84664edd3ab36599f13..24035e1f7cd0e60079540d11d12430426b3d969c 100644 --- a/majak/settings/base.py +++ b/majak/settings/base.py @@ -36,6 +36,7 @@ INSTALLED_APPS = [ "donate", "senat_campaign", "home", + "program2021", "shared", "calendar_utils", "users", diff --git a/program2021/__init__.py b/program2021/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/program2021/apps.py b/program2021/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..1f3815405c4fd2088b9fd7ddd967015e3f34256e --- /dev/null +++ b/program2021/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class Program2021Config(AppConfig): + name = "program2021" diff --git a/program2021/migrations/0001_initial.py b/program2021/migrations/0001_initial.py new file mode 100644 index 0000000000000000000000000000000000000000..0d09f03a1628fa81651b6733693055b8fb3fe466 --- /dev/null +++ b/program2021/migrations/0001_initial.py @@ -0,0 +1,310 @@ +# Generated by Django 3.0.8 on 2020-07-24 02:35 + +import django.db.models.deletion +import modelcluster.contrib.taggit +import modelcluster.fields +import wagtail.core.blocks +import wagtail.core.fields +import wagtail.images.blocks +import wagtailmetadata.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("wagtailcore", "0045_assign_unlock_grouppagepermission"), + ("taggit", "0003_taggeditem_add_unique_index"), + ("wagtailimages", "0022_uploadedimage"), + ] + + operations = [ + migrations.CreateModel( + name="Program2021HomePage", + fields=[ + ( + "page_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="wagtailcore.Page", + ), + ), + ], + options={"verbose_name": "Program 2021",}, + bases=("wagtailcore.page",), + ), + migrations.CreateModel( + name="Program2021PointPage", + fields=[ + ( + "page_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="wagtailcore.Page", + ), + ), + ( + "public_title", + models.CharField( + blank=True, + help_text="Navrhují markeťáci. Max 46 znaků.", + max_length=46, + null=True, + verbose_name="veřejný název", + ), + ), + ( + "code", + models.CharField( + blank=True, + help_text="Ideálně jedno nebo dvě slova ke krátkému neformálnímu označení tématu. Max 20 znaků.", + max_length=20, + null=True, + verbose_name="kód", + ), + ), + ( + "annotation", + models.TextField( + blank=True, + help_text="Text anotace by měl jasně prezentovat přínos a být dostatečně konkrétní, a to i když konkrétní parametr může být předmětem podrobnějších analýz a diskuse. Anotace má až na výjimky obsahovat konkrétní číslo reprezentující rozsah problému nebo přínos jeho řešení (v tomto případě ušetření 4 miliard). Tato část bodu společně s veřejným názvem je schvalována republikovým výborem jako závazný program do voleb. Max 140 znaků.", + max_length=140, + null=True, + verbose_name="anotace", + ), + ), + ( + "problem", + models.TextField( + blank=True, + help_text="Stručné vystižení podstaty problému ve vztahu k celé společnosti a klíčové cílové skupině. Může jít o budoucí hrozbu, náklady na odkládání či dosud nevyužitou příležitost. Max 280 znaků", + max_length=280, + null=True, + verbose_name="problém", + ), + ), + ( + "ideal", + models.TextField( + blank=True, + help_text="Max 280 znaků.", + max_length=280, + null=True, + verbose_name="ideál", + ), + ), + ( + "benefits_self_employed", + models.TextField( + blank=True, + help_text="Stručný popis dopadu na danou cílovou skupinu. Max 140 znaků.", + max_length=250, + null=True, + verbose_name="benefity OSVČ", + ), + ), + ( + "benefits_companies", + models.TextField( + blank=True, + help_text="Stručný popis dopadu na danou cílovou skupinu. Max 140 znaků.", + max_length=250, + null=True, + verbose_name="benefity firmy", + ), + ), + ( + "benefits_public_money", + models.TextField( + blank=True, + help_text="Rozpracuje tým finance. Úkolem finančního týmu není zpracovat to, ale dát k tomu metodiku a metodickou pomoc. V případě žádosti o pomoc se obracejte prosím na finančního analytika poslaneckého klubu Tomáše Kopečného. Max 140 znaků.", + max_length=250, + null=True, + verbose_name="benefity veřejné finance", + ), + ), + ( + "already_done", + wagtail.core.fields.RichTextField( + blank=True, + help_text="Max 1800 znaků.", + max_length=1800, + null=True, + verbose_name="co jsme už udělali", + ), + ), + ( + "proposals", + wagtail.core.fields.RichTextField( + blank=True, + help_text="Konkrétní (!) body specifikující náš postup v chronologickém pořadí. Max 1800 znaků.", + max_length=1800, + null=True, + verbose_name="navrhovaná opatření", + ), + ), + ( + "implementation_time", + models.CharField( + blank=True, + help_text="Doba, po které se projekt převede do standardního procesního řízení a lze vyhodnotit přinášený efekt. Jde pouze o realizační fázi, nikoliv celý životní cyklus.", + max_length=20, + null=True, + verbose_name="časový horizont realizace", + ), + ), + ( + "faq", + wagtail.core.fields.StreamField( + [ + ( + "item", + wagtail.core.blocks.StructBlock( + [ + ( + "question", + wagtail.core.blocks.CharBlock( + label="otázka" + ), + ), + ( + "answer", + wagtail.core.blocks.TextBlock( + label="odpověď" + ), + ), + ], + label="dotaz", + ), + ) + ], + blank=True, + verbose_name="často kladené dotazy", + ), + ), + ( + "sources", + wagtail.core.fields.RichTextField( + blank=True, + help_text="Naše vlastní údaje (odhady), které nevycházejí přímo z renomovaného zdroje, dokládáme vlastními analýzami na dané téma, které jsou v seznamu zdrojů a měly by procházet externí oponenturou.", + null=True, + verbose_name="zdroje", + ), + ), + ( + "related", + wagtail.core.fields.StreamField( + [ + ( + "point", + wagtail.core.blocks.PageChooserBlock( + label="programový bod", + page_type=["program2021.Program2021PointPage"], + ), + ) + ], + blank=True, + verbose_name="související body", + ), + ), + ( + "images", + wagtail.core.fields.StreamField( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + label="ilustrační obrázek" + ), + ) + ], + blank=True, + verbose_name="ilustrační obrázky", + ), + ), + ( + "owner_name", + models.TextField( + blank=True, + max_length=250, + null=True, + verbose_name="jméno garanta (zodpovědné osoby)", + ), + ), + ( + "owner_url", + models.URLField( + blank=True, null=True, verbose_name="odkaz na garanta" + ), + ), + ( + "search_image", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="wagtailimages.Image", + verbose_name="Search image", + ), + ), + ], + options={"verbose_name": "Programový bod",}, + bases=( + "wagtailcore.page", + wagtailmetadata.models.MetadataMixin, + models.Model, + ), + ), + migrations.CreateModel( + name="Program2021PointPageTag", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "content_object", + modelcluster.fields.ParentalKey( + on_delete=django.db.models.deletion.CASCADE, + to="program2021.Program2021PointPage", + ), + ), + ( + "tag", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="program2021_program2021pointpagetag_items", + to="taggit.Tag", + ), + ), + ], + options={"abstract": False,}, + ), + migrations.AddField( + model_name="program2021pointpage", + name="tags", + field=modelcluster.contrib.taggit.ClusterTaggableManager( + blank=True, + help_text="A comma-separated list of tags.", + through="program2021.Program2021PointPageTag", + to="taggit.Tag", + verbose_name="Tags", + ), + ), + ] diff --git a/program2021/migrations/__init__.py b/program2021/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/program2021/models.py b/program2021/models.py new file mode 100644 index 0000000000000000000000000000000000000000..10f9076e31821cf65fb431a84a7c5c4a94d86794 --- /dev/null +++ b/program2021/models.py @@ -0,0 +1,246 @@ +from django.db import models +from django.utils.translation import gettext_lazy +from modelcluster.contrib.taggit import ClusterTaggableManager +from modelcluster.fields import ParentalKey +from taggit.models import TaggedItemBase +from wagtail.admin.edit_handlers import ( + FieldPanel, + HelpPanel, + MultiFieldPanel, + ObjectList, + StreamFieldPanel, + TabbedInterface, +) +from wagtail.core import blocks +from wagtail.core.fields import RichTextField, StreamField +from wagtail.core.models import Page +from wagtail.images.blocks import ImageChooserBlock +from wagtail.images.edit_handlers import ImageChooserPanel +from wagtailmetadata.models import MetadataPageMixin + + +class Program2021HomePage(Page): + ### FIELDS + + ### PANELS + + settings_panels = [] + + ### RELATIONS + + subpage_types = ["program2021.Program2021PointPage"] + + ### OTHERS + + class Meta: + verbose_name = "Program 2021" + + def get_context(self, request): + context = super().get_context(request) + context["points"] = self.get_children().live().specific() + return context + + +class Program2021PointPageTag(TaggedItemBase): + content_object = ParentalKey( + "program2021.Program2021PointPage", on_delete=models.CASCADE + ) + + +class Program2021PointPage(Page, MetadataPageMixin): + RICH_TEXT_FEATURES = ["bold", "italic", "ol", "ul", "link", "document-link"] + + ### FIELDS + public_title = models.CharField( + "veřejný název", + max_length=46, + blank=True, + null=True, + help_text="Navrhují markeťáci. Max 46 znaků.", + ) + code = models.CharField( + "kód", + max_length=20, + blank=True, + null=True, + help_text="Ideálně jedno nebo dvě slova ke krátkému neformálnímu označení tématu. Max 20 znaků.", + ) + annotation = models.TextField( + "anotace", + max_length=140, + blank=True, + null=True, + help_text="Text anotace by měl jasně prezentovat přínos a být dostatečně konkrétní, a to i když konkrétní parametr může být předmětem podrobnějších analýz a diskuse. Anotace má až na výjimky obsahovat konkrétní číslo reprezentující rozsah problému nebo přínos jeho řešení (v tomto případě ušetření 4 miliard). Tato část bodu společně s veřejným názvem je schvalována republikovým výborem jako závazný program do voleb. Max 140 znaků.", + ) + problem = models.TextField( + "problém", + max_length=280, + blank=True, + null=True, + help_text="Stručné vystižení podstaty problému ve vztahu k celé společnosti a klíčové cílové skupině. Může jít o budoucí hrozbu, náklady na odkládání či dosud nevyužitou příležitost. Max 280 znaků", + ) + ideal = models.TextField( + "ideál", max_length=280, blank=True, null=True, help_text="Max 280 znaků." + ) + benefits_self_employed = models.TextField( + "benefity OSVČ", + max_length=250, + blank=True, + null=True, + help_text="Stručný popis dopadu na danou cílovou skupinu. Max 140 znaků.", + ) + benefits_companies = models.TextField( + "benefity firmy", + max_length=250, + blank=True, + null=True, + help_text="Stručný popis dopadu na danou cílovou skupinu. Max 140 znaků.", + ) + benefits_public_money = models.TextField( + "benefity veřejné finance", + max_length=250, + blank=True, + null=True, + help_text="Rozpracuje tým finance. Úkolem finančního týmu není zpracovat to, ale dát k tomu metodiku a metodickou pomoc. V případě žádosti o pomoc se obracejte prosím na finančního analytika poslaneckého klubu Tomáše Kopečného. Max 140 znaků.", + ) + already_done = RichTextField( + "co jsme už udělali", + max_length=1800, + blank=True, + null=True, + help_text="Max 1800 znaků.", + features=RICH_TEXT_FEATURES, + ) + proposals = RichTextField( + "navrhovaná opatření", + max_length=1800, + blank=True, + null=True, + help_text="Konkrétní (!) body specifikující náš postup v chronologickém pořadí. Max 1800 znaků.", + features=RICH_TEXT_FEATURES, + ) + implementation_time = models.CharField( + "časový horizont realizace", + max_length=20, + blank=True, + null=True, + help_text="Doba, po které se projekt převede do standardního procesního řízení a lze vyhodnotit přinášený efekt. Jde pouze o realizační fázi, nikoliv celý životní cyklus.", + ) + faq = StreamField( + [ + ( + "item", + blocks.StructBlock( + [ + ("question", blocks.CharBlock(label="otázka")), + ("answer", blocks.TextBlock(label="odpověď")), + ], + label="dotaz", + ), + ), + ], + verbose_name="často kladené dotazy", + blank=True, + ) + sources = RichTextField( + "zdroje", + blank=True, + null=True, + help_text="Naše vlastní údaje (odhady), které nevycházejí přímo z renomovaného zdroje, dokládáme vlastními analýzami na dané téma, které jsou v seznamu zdrojů a měly by procházet externí oponenturou.", + features=RICH_TEXT_FEATURES, + ) + related = StreamField( + [ + ( + "point", + blocks.PageChooserBlock( + label="programový bod", page_type="program2021.Program2021PointPage" + ), + ), + ], + verbose_name="související body", + blank=True, + ) + images = StreamField( + [("image", ImageChooserBlock(label="ilustrační obrázek"))], + verbose_name="ilustrační obrázky", + blank=True, + ) + owner_name = models.TextField( + "jméno garanta (zodpovědné osoby)", max_length=250, blank=True, null=True + ) + owner_url = models.URLField("odkaz na garanta", blank=True, null=True) + tags = ClusterTaggableManager(through=Program2021PointPageTag, blank=True) + + ### PANELS + + content_panels = Page.content_panels + [ + MultiFieldPanel( + [ + FieldPanel("public_title"), + FieldPanel("annotation"), + FieldPanel("tags"), + FieldPanel("problem"), + FieldPanel("ideal"), + FieldPanel("already_done"), + FieldPanel("proposals"), + FieldPanel("sources"), + FieldPanel("implementation_time"), + FieldPanel("code"), + ], + heading="základní informace", + ), + MultiFieldPanel( + [FieldPanel("owner_name"), FieldPanel("owner_url")], heading="garant", + ), + StreamFieldPanel("images"), + StreamFieldPanel("related"), + ] + + benefits_content_panels = [ + HelpPanel( + "V této části rozpracováváme benefity tak, abychom je mohli souhrnně nabídnout dané cílové skupině. Negativní věci zpracováváme typicky do často kladených otázek dole. U negativ se však vždy prezentuje i související přínos (tzv. balíčkovací zásada, např. snížíme daně z práce díky lepšímu zdanění zisků dnes vyváděných do zahraničí), aby nikdo nemohl takový bod vytrhnout z kontextu a prezentovat proti nám." + ), + MultiFieldPanel( + [ + FieldPanel("benefits_self_employed"), + FieldPanel("benefits_companies"), + FieldPanel("benefits_public_money"), + ] + ), + ] + + faq_content_panels = [ + StreamFieldPanel("faq"), + ] + + promote_panels = [ + MultiFieldPanel( + [ + FieldPanel("slug"), + FieldPanel("seo_title"), + FieldPanel("search_description"), + ImageChooserPanel("search_image"), + ], + gettext_lazy("Common page configuration"), + ), + ] + + edit_handler = TabbedInterface( + [ + ObjectList(content_panels, heading=gettext_lazy("Content")), + ObjectList(benefits_content_panels, heading="Benefity"), + ObjectList(faq_content_panels, heading="FAQ"), + ObjectList(promote_panels, heading=gettext_lazy("Promote")), + ] + ) + + ### RELATIONS + + parent_page_types = ["program2021.Program2021HomePage"] + subpage_types = [] + + ### OTHERS + + class Meta: + verbose_name = "Programový bod" diff --git a/program2021/templates/program2021/base.html b/program2021/templates/program2021/base.html new file mode 100644 index 0000000000000000000000000000000000000000..3bad8dad11e73384609c20037a3f8d11537c033e --- /dev/null +++ b/program2021/templates/program2021/base.html @@ -0,0 +1,52 @@ +{% load static wagtailcore_tags wagtailmetadata_tags %} +<!doctype html> +<html lang="en"> + <head> + <!-- Required meta tags --> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + + <!-- Bootstrap CSS --> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> + + <title>Program 2021</title> + + {% if settings.MAJAK_ENV == "test" %} + <meta name="robots" content="noindex, nofollow"> + {% endif %} + + <style type="text/css"> + .card a { + text-decoration: none; + color: inherit; + } + </style> + </head> + <body> + <header> + <div class="navbar navbar-dark bg-dark shadow-sm"> + <div class="container d-flex justify-content-between"> + <a href="/" class="navbar-brand d-flex align-items-center"> + <svg class="bi bi-file-earmark-check" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> + <path d="M9 1H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h5v-1H4a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h5v2.5A1.5 1.5 0 0 0 10.5 6H13v2h1V6L9 1z"/> + <path fill-rule="evenodd" d="M15.854 10.146a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 0 1 .708-.708l1.146 1.147 2.646-2.647a.5.5 0 0 1 .708 0z"/> + </svg> + <strong> Program 2021</strong> + </a> + </div> + </div> + </header> + + <main role="main"> + + {% block content %}{% endblock %} + + </main> + + <!-- Optional JavaScript --> + <!-- jQuery first, then Popper.js, then Bootstrap JS --> + <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> + <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script> + </body> +</html> diff --git a/program2021/templates/program2021/program2021_home_page.html b/program2021/templates/program2021/program2021_home_page.html new file mode 100644 index 0000000000000000000000000000000000000000..14984e29bab2a66cc8ad1a89e458cfc1bbcd8475 --- /dev/null +++ b/program2021/templates/program2021/program2021_home_page.html @@ -0,0 +1,181 @@ +{% extends "program2021/base.html" %} +{% load wagtailcore_tags %} +{% block content %} + +<section class="jumbotron text-center"> + <div class="container"> + <h1>Povězte nám kdo jste?</h1> + <p class="lead text-muted">Zkuste nám říci, kdo jste a my vám nabídneme to nejzajímavější z našeho programu pro vás!</p> + + <form class="text-left mt-5"> + + <div class="row my-3"> + <div class="col-2 text-right">pohlaví:</div> + <div class="col-4 btn-group btn-group-toggle" data-toggle="buttons"> + <label class="btn btn-outline-secondary"> + <input type="radio" name="gender" id="gender1" autocomplete="off"> žena + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="gender" id="gender2" autocomplete="off"> muž + </label> + <label class="btn btn-outline-secondary active"> + <input type="radio" name="gender" id="gender3" autocomplete="off" checked> jiné / nechci uvést + </label> + </div> + </div> + + <div class="row my-3"> + <div class="col-2 text-right">věk:</div> + <div class="col-6 btn-group btn-group-toggle" data-toggle="buttons"> + <label class="btn btn-outline-secondary active"> + <input type="radio" name="age" id="age1" autocomplete="off"> do 30 let + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="age" id="age2" autocomplete="off"> 30 - 49 let + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="age" id="age3" autocomplete="off"> 50 - 64 let + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="age" id="age4" autocomplete="off"> 65+ let + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="age" id="age5" autocomplete="off" checked> nechci uvést + </label> + </div> + </div> + + <div class="row my-3"> + <div class="col-2 text-right">mám děti:</div> + <div class="col-3 btn-group btn-group-toggle" data-toggle="buttons"> + <label class="btn btn-outline-secondary"> + <input type="radio" name="kids" id="kids1" autocomplete="off"> ano + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="kids" id="kids2" autocomplete="off"> ne + </label> + <label class="btn btn-outline-secondary active"> + <input type="radio" name="kids" id="kids3" autocomplete="off" checked> nechci uvést + </label> + </div> + </div> + + <div class="row form-group"> + <div class="col-2 text-right"> + <label for="occupation">jsem:</label> + </div> + <div class="col-4"> + <select class="form-control" id="occupation"> + <option>jiné / nechci uvést</option> + <option>student*ka</option> + <option>zaměstnanec*kyně ve veřejné sféře</option> + <option>zaměstnanec*kyně v soukromé sféře</option> + <option>podnikatel*ka</option> + <option>na mateřské / rodičovské</option> + <option>v důchodu</option> + </select> + </div> + </div> + + <div class="row form-group"> + <div class="col-2 text-right"> + <label for="wealth">životní úroveň:</label> + </div> + <div class="col-4"> + <select class="form-control" id="wealth"> + <option>jiné / nechci uvést</option> + <option>velmi dobrá</option> + <option>dobrá</option> + <option>ani dobrá, ani špatná</option> + <option>špatná</option> + </select> + </div> + </div> + + <div class="row form-group"> + <div class="col-2 text-right"> + často jezdím: + </div> + <div class="col-4"> + <div class="custom-control custom-checkbox"> + <input type="checkbox" class="custom-control-input" id="travel1"> + <label class="custom-control-label" for="travel1">na kole</label> + </div> + <div class="custom-control custom-checkbox"> + <input type="checkbox" class="custom-control-input" id="travel2"> + <label class="custom-control-label" for="travel2">autem</label> + </div> + <div class="custom-control custom-checkbox"> + <input type="checkbox" class="custom-control-input" id="travel3"> + <label class="custom-control-label" for="travel3">veřejnou dopravou</label> + </div> + </div> + </div> + + <div class="row form-group"> + <div class="col-2 text-right"> + <label for="housing">bydlím:</label> + </div> + <div class="col-4"> + <select class="form-control" id="housing"> + <option>jiné / nechci uvést</option> + <option>ve velkém městě nebo jeho okolí</option> + <option>ve středně velkém městě (10 - 50 tis.)</option> + <option>v malém městě nebo na vesnici</option> + </select> + </div> + </div> + + <div class="row my-3"> + <div class="col-2 text-right">vzdělání:</div> + <div class="col-6 btn-group btn-group-toggle" data-toggle="buttons"> + <label class="btn btn-outline-secondary"> + <input type="radio" name="education" id="education1" autocomplete="off"> ZŠ + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="education" id="education2" autocomplete="off"> SŠ bez maturity + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="education" id="education3" autocomplete="off"> SŠ s maturitou + </label> + <label class="btn btn-outline-secondary"> + <input type="radio" name="education" id="education4" autocomplete="off"> VŠ + </label> + <label class="btn btn-outline-secondary active"> + <input type="radio" name="education" id="education5" autocomplete="off" checked> nechci uvést + </label> + </div> + </div> + + </form> + + </div> +</section> + +<div class="my-5"> + <div class="container"> + <div class="row"> + + {% for point in points %} + <div class="col-md-4"> + <div class="card mb-4 shadow-sm"> + <a href="{% pageurl point %}"> + <div class="card-body"> + <h5 class="card-title">{{ point.public_title }}</h5> + <p class="card-text">{{ point.annotation }}</p> + <p class="card-text"> + {% for tag in point.tags.all %} + <span class="badge badge-light"># {{ tag }}</span> + {% endfor %} + </p> + </div> + </a> + </div> + </div> + {% endfor %} + + </div> + </div> +</div> + +{% endblock %} diff --git a/program2021/templates/program2021/program2021_point_page.html b/program2021/templates/program2021/program2021_point_page.html new file mode 100644 index 0000000000000000000000000000000000000000..025d5c3e89ee8b157e280557e5def7c84b8ae134 --- /dev/null +++ b/program2021/templates/program2021/program2021_point_page.html @@ -0,0 +1,83 @@ +{% extends "program2021/base.html" %} +{% load wagtailcore_tags %} +{% block content %} + +<div class="container"> + <div class="row"> + + <div class="jumbotron mb-5"> + <h1 class="display-4">{{ page.public_title }}</h1> + <p class="lead">{{ page.annotation }}</p> + <p class="mt-4 mb-0 text-right"> + {% for tag in page.tags.all %} + <span class="badge badge-light"># {{ tag }}</span> + {% endfor %} + </p> + </div> + + <div class="col-md-6 pr-5"> + <h3>Problém</h3> + <p>{{ page.problem }}</p> + </div> + + <div class="col-md-6 pl-5"> + <h3>Ideál</h3> + <p>{{ page.ideal }}</p> + </div> + + <div class="w-100 my-4"></div> + + <div class="col-md-6 pr-5"> + <h3>Navrhovaná opatření</h3> + <p>{{ page.proposals|richtext }}</p> + </div> + + <div class="col-md-6 pl-5"> + <h3>Co jsme už udělali</h3> + <p>{{ page.already_done|richtext }}</p> + </div> + + <div class="w-100 my-4"></div> + + <div class="col-md-6 pr-5"> + <h3>Benefity</h3> + <h5 class="mt-4">OSVČ</h5> + <p>{{ page.benefits_self_employed }}</p> + <h5 class="mt-4">Firmy</h5> + <p>{{ page.benefits_companies }}</p> + <h5 class="mt-4">Veřejné finance</h5> + <p>{{ page.benefits_public_money }}</p> + </div> + + <div class="col-md-6 pl-5"> + <h3>Často kladené otázky</h3> + {% for qa in page.faq %} + <h5 class="mt-4">{{ qa.value.question }}</h5> + <p>{{ qa.value.answer }}</p> + {% endfor %} + </div> + + <div class="w-100 my-4"></div> + + <div class="col-md-6 pr-5"> + <h3>Časový horizont</h3> + <p>{{ page.implementation_time }}</p> + <h3 class="mt-4">Související body</h3> + <ul> + {% for point in page.related %} + <li><a href="{% pageurl point.value %}">{{ point.value.title }}</a></li> + {% endfor %} + </ul> + </div> + + <div class="col-md-6 pl-5"> + <h3>Zdroje</h3> + <p>{{ page.sources|richtext }}</p> + </div> + + <div class="w-100 my-4"></div> + + </div> +</div> + +{% endblock %}