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

program2021: R.I.P.

parent 43656520
No related branches found
No related tags found
2 merge requests!224release,!223Upgrade
Showing
with 0 additions and 1526 deletions
......@@ -37,7 +37,6 @@ Rozšíření která používáme:
├── districts = app na web kraje.pirati.cz
├── region = app na weby krajskych sdruzeni
├── district = app na weby mistnich sdruzeni
├── program2021 = app na prezentaci programu 2021
├── uniweb = app na univerzalni webove stranky
...
├── majak = Django projekt s konfigurací Majáku
......
......@@ -38,7 +38,6 @@ INSTALLED_APPS = [
"donate",
"senat_campaign",
"home",
"program2021",
"uniweb",
"region",
"district",
......
from django.apps import AppConfig
class Program2021Config(AppConfig):
name = "program2021"
[
{
"model": "program2021.SearchCharacteristic",
"pk": 1,
"fields": {
"name": "Žena",
"form_param": "female"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 2,
"fields": {
"name": "Muž",
"form_param": "male"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 3,
"fields": {
"name": "věk do 30",
"form_param": "age30"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 4,
"fields": {
"name": "věk 30-49",
"form_param": "age50"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 5,
"fields": {
"name": "věk 50-64",
"form_param": "age65"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 6,
"fields": {
"name": "věk 65+",
"form_param": "age99"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 7,
"fields": {
"name": "mám děti",
"form_param": "kids"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 8,
"fields": {
"name": "bezdětný/á",
"form_param": "nokids"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 9,
"fields": {
"name": "Student",
"form_param": "student"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 10,
"fields": {
"name": "zaměstnanec*kyně ve veřejné sféře",
"form_param": "employee-public"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 11,
"fields": {
"name": "zaměstnanec*kyně v soukromé sféře",
"form_param": "employee-private"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 12,
"fields": {
"name": "podnikatel*ka",
"form_param": "entrepreneur"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 13,
"fields": {
"name": "na mateřské / rodičovské",
"form_param": "maternity"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 14,
"fields": {
"name": "v důchodu",
"form_param": "retired"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 15,
"fields": {
"name": "Životní údeoveň velmi dobrá",
"form_param": "wealth-great"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 16,
"fields": {
"name": "Životní úroveň dobrá",
"form_param": "wealth-good"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 17,
"fields": {
"name": "Životní úroveň průmerná",
"form_param": "wealth-average"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 18,
"fields": {
"name": "Životní úroveň špatná",
"form_param": "wealth-bad"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 19,
"fields": {
"name": "Cestuji na kole",
"form_param": "travel-bike"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 20,
"fields": {
"name": "Cestuji autem",
"form_param": "travel-car"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 21,
"fields": {
"name": "Cestuji veřejnou dopravou",
"form_param": "travel-public"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 22,
"fields": {
"name": "Žiji ve velkém městě",
"form_param": "metropolis"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 23,
"fields": {
"name": "Žiji ve středním městě",
"form_param": "town"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 24,
"fields": {
"name": "Žiji v malém městě / na vesnici",
"form_param": "village"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 25,
"fields": {
"name": "Základní škola",
"form_param": "zs"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 26,
"fields": {
"name": "Střední škola bez maturity",
"form_param": "ss"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 27,
"fields": {
"name": "SŠ s maturitou",
"form_param": "maturita"
}
},
{
"model": "program2021.SearchCharacteristic",
"pk": 28,
"fields": {
"name": "Vysoká škola",
"form_param": "vs"
}
}
]
# 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",
),
),
]
# Generated by Django 3.0.8 on 2020-08-05 05:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("program2021", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="program2021homepage",
name="headline",
field=models.CharField(
blank=True,
help_text="Hlavní titulek domovské stránky",
max_length=100,
null=True,
verbose_name="název programu",
),
),
migrations.AddField(
model_name="program2021homepage",
name="perex",
field=models.TextField(
blank=True,
help_text="Text pod titulkem",
max_length=512,
null=True,
verbose_name="perex",
),
),
]
# Generated by Django 3.0.8 on 2020-08-05 08:34
import django.db.models.deletion
import modelcluster.contrib.taggit
import modelcluster.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("taggit", "0003_taggeditem_add_unique_index"),
("program2021", "0002_auto_20200805_0726"),
]
operations = [
migrations.CreateModel(
name="Program2021PointPageSearchTag",
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_program2021pointpagesearchtag_items",
to="taggit.Tag",
),
),
],
options={
"abstract": False,
},
),
migrations.AddField(
model_name="program2021pointpage",
name="search_tags",
field=modelcluster.contrib.taggit.ClusterTaggableManager(
blank=True,
help_text='Tagy pro vyhledavani. Musi byt zadany presne, aby to fungovalo. Tagy jsou deleny do skupin se spolecnym prefixem, napr. "gender". \nPriklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every". Seznam tagu a skupin:\nx y z\nb d f\nl o p q\n ',
related_name="search_tags",
through="program2021.Program2021PointPageSearchTag",
to="taggit.Tag",
verbose_name="Tags",
),
),
]
# Generated by Django 3.0.8 on 2020-08-06 08:54
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailimages", "0022_uploadedimage"),
("program2021", "0002_auto_20200805_0726"),
]
operations = [
migrations.AddField(
model_name="program2021pointpage",
name="image_title",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
to="wagtailimages.Image",
verbose_name="titulní obrázek",
),
),
]
# Generated by Django 3.1.1 on 2020-09-30 09:56
import wagtail.core.blocks
import wagtail.core.fields
import wagtail.images.blocks
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("program2021", "0003_program2021pointpage_image_title"),
]
operations = [
migrations.AlterField(
model_name="program2021pointpage",
name="images",
field=wagtail.core.fields.StreamField(
[
(
"item",
wagtail.core.blocks.StructBlock(
[
(
"image",
wagtail.images.blocks.ImageChooserBlock(
label="ilustrační obrázek"
),
),
("title", wagtail.core.blocks.CharBlock(label="popis")),
],
label="obrázek",
),
)
],
blank=True,
verbose_name="ilustrační obrázky",
),
),
]
# Generated by Django 3.0.8 on 2020-08-12 11:37
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("program2021", "0003_auto_20200805_1034"),
("program2021", "0003_program2021pointpage_image_title"),
]
operations = []
# Generated by Django 3.0.8 on 2020-08-12 11:37
import django.db.models.deletion
import modelcluster.contrib.taggit
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("taggit", "0003_taggeditem_add_unique_index"),
("program2021", "0004_merge_20200812_1337"),
]
operations = [
migrations.CreateModel(
name="SearchCharacteristic",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"name",
models.CharField(
max_length=200,
verbose_name="lidský název pro použití v administraci",
),
),
],
),
migrations.AlterField(
model_name="program2021pointpage",
name="search_tags",
field=modelcluster.contrib.taggit.ClusterTaggableManager(
blank=True,
help_text='Deleny do skupin se spolecnym prefixem, napr. "gender". Pokud je bod spolecny pro vsechny moznosti dane skupiny, pouzij tag se suffixem "-every". \nPriklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every". \nPro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do vysledku vyhledavani. Seznam tagu po skupinach:\n(gender-male gender-female gender-every) \n(age-30 age-50 age-65 age-99 age-every) \n(kids-yes kids-no kids-every)\n(occupation-student occupation-employee-public occupation-employee-private occupation-entrepreneur occupation-maternity occupation-retired occupation-every)\n(wealth-excelent wealth-good wealth-average wealth-bad wealth-every)\n(travel-bike travel-car travel-public travel-every)\n(housing-metropolis housing-town housing-village housing-every) \n(education-zs education-ss education-maturita education-vs education-every)\n ',
related_name="search_tags",
through="program2021.Program2021PointPageSearchTag",
to="taggit.Tag",
verbose_name="Tagy pro vyhledávání",
),
),
migrations.CreateModel(
name="CharacteristicWeight",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("weight", models.IntegerField()),
(
"program_point",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="program2021.Program2021PointPage",
),
),
(
"search_characteristic",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="program2021.SearchCharacteristic",
),
),
],
),
]
# Generated by Django 3.0.8 on 2020-08-12 13:56
import django.db.models.deletion
import modelcluster.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("program2021", "0005_auto_20200812_1337"),
]
operations = [
migrations.AlterField(
model_name="characteristicweight",
name="program_point",
field=modelcluster.fields.ParentalKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="program_point_link",
to="program2021.Program2021PointPage",
),
),
migrations.AlterField(
model_name="characteristicweight",
name="search_characteristic",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="program2021.SearchCharacteristic",
verbose_name="Charakteristika",
),
),
migrations.AlterField(
model_name="characteristicweight",
name="weight",
field=models.IntegerField(verbose_name="Váha"),
),
]
# Generated by Django 3.0.8 on 2020-08-12 17:51
import django.db.models.deletion
import modelcluster.contrib.taggit
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("taggit", "0003_taggeditem_add_unique_index"),
("program2021", "0006_auto_20200812_1556"),
]
operations = [
migrations.AddField(
model_name="searchcharacteristic",
name="form_param",
field=models.CharField(
blank=True,
max_length=20,
null=True,
verbose_name="ID parametru ve formuláři",
),
),
migrations.AlterField(
model_name="characteristicweight",
name="search_characteristic",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="program2021.SearchCharacteristic",
verbose_name="Zadáno",
),
),
migrations.AlterField(
model_name="program2021pointpage",
name="search_tags",
field=modelcluster.contrib.taggit.ClusterTaggableManager(
blank=True,
help_text='Deleny do skupin se spolecnym prefixem, napr. "gender". Pokud je bod spolecny pro vsechny moznosti dane skupiny, pouzij tag se suffixem "-every".\nPriklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every".\nPro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do vysledku vyhledavani. Seznam tagu po skupinach:\n(gender-male gender-female gender-every)\n(age-30 age-50 age-65 age-99 age-every)\n(kids-yes kids-no kids-every)\n(occupation-student occupation-employee-public occupation-employee-private occupation-entrepreneur occupation-maternity occupation-retired occupation-every)\n(wealth-excelent wealth-good wealth-average wealth-bad wealth-every)\n(travel-bike travel-car travel-public travel-every)\n(housing-metropolis housing-town housing-village housing-every)\n(education-zs education-ss education-maturita education-vs education-every)\n ',
related_name="search_tags",
through="program2021.Program2021PointPageSearchTag",
to="taggit.Tag",
verbose_name="Tagy pro vyhledávání",
),
),
migrations.AlterField(
model_name="searchcharacteristic",
name="name",
field=models.CharField(max_length=200, verbose_name="Název"),
),
]
# Generated by Django 3.0.8 on 2020-08-12 19:17
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("program2021", "0007_auto_20200812_1951"),
]
operations = [
migrations.RemoveField(
model_name="program2021pointpage",
name="search_tags",
),
migrations.DeleteModel(
name="Program2021PointPageSearchTag",
),
]
# Generated by Django 3.1.2 on 2020-10-26 22:45
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("program2021", "0008_auto_20200812_2117"),
("program2021", "0004_auto_20200930_1156"),
]
operations = []
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,
InlinePanel,
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 SearchCharacteristic(models.Model):
""" Ciselnik charakteristik odesilanych uzivatelem, napriklad vek65+ """
name = models.CharField("Název", max_length=200, blank=False, null=False)
# mapování chareakteristiky na přislusnou POST promennou odeslanou HTML formularem
form_param = models.CharField(
"ID parametru ve formuláři", max_length=20, blank=True, null=True
)
def __str__(self):
return self.name
class CharacteristicWeight(models.Model):
""" Prirazeni vahy jedntlivych charakteristik programovym blokum """
search_characteristic = models.ForeignKey(
SearchCharacteristic, on_delete=models.CASCADE, verbose_name="Zadáno"
)
program_point = ParentalKey(
"Program2021PointPage",
on_delete=models.CASCADE,
related_name="program_point_link",
)
weight = models.IntegerField(verbose_name="Váha")
panels = [
FieldPanel("search_characteristic"),
FieldPanel("weight"),
]
class Program2021HomePage(Page):
### FIELDS
headline = models.CharField(
"název programu",
max_length=100,
blank=True,
null=True,
help_text="Hlavní titulek domovské stránky",
)
perex = models.TextField(
"perex",
max_length=512,
blank=True,
null=True,
help_text="Text pod titulkem",
)
### PANELS
content_panels = Page.content_panels + [
MultiFieldPanel(
[
FieldPanel("headline"),
FieldPanel("perex"),
],
heading="Vyhledávací formulář",
),
]
settings_panels = []
### RELATIONS
subpage_types = ["program2021.Program2021PointPage"]
### OTHERS
class Meta:
verbose_name = "Program 2021"
def get_context(self, request):
context = super().get_context(request)
if request.method == "POST":
sent_tags = [request.POST.get(x, None) for x in request.POST.keys()]
sent_tags = [x for x in sent_tags if x]
# dopocitej vahu podle predanych parametru z vyhledavani...
context["points"] = self.get_children().live().specific()
for point in context["points"]:
point.weight = point.get_weight(sent_tags)
# ...a setrid dle ni vysledky. HACK: pomale, ale pocitame max. v desitkach zaznamu, tedy acceptable
context["points"] = sorted(context["points"], key=lambda x: -x.weight)
else:
# neformular - vrat vsechny body
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,
)
image_title = models.ForeignKey(
"wagtailimages.Image",
verbose_name="titulní obrázek",
on_delete=models.PROTECT,
null=True,
blank=True,
)
images = StreamField(
[
(
"item",
blocks.StructBlock(
[
("image", ImageChooserBlock(label="ilustrační obrázek")),
("title", blocks.CharBlock(label="popis")),
],
label="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"),
ImageChooserPanel("image_title"),
],
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"),
]
search_panels = [InlinePanel("program_point_link", label="Váhy vyhledávání")]
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(search_panels, heading="Hledání"),
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"
def get_weight(self, param_ids):
""" Vraci celkovou vahu tagu, predanych v seznamu param_ids """
# Kvuli prehlednosti nepisu jako oneliner :)
my_weights = self.program_point_link.all()
involved_weights = [
x.weight
for x in my_weights
if x.search_characteristic.form_param in param_ids
]
return sum(involved_weights)
{% load static wagtailcore_tags wagtailimages_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>&nbsp;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>
{% extends "program2021/base.html" %}
{% load static wagtailimages_tags wagtailcore_tags %}
{% block content %}
<section class="jumbotron text-center">
<div class="container">
<h1>{{ page.headline }}</h1>
<p class="lead mt-3"><big>{{ page.perex }}</big></p>
<form class="text-left mt-5" action="{% pageurl page %}" method="POST">
{% csrf_token %}
<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" value="female" autocomplete="off"> žena
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="gender" id="gender2" value="male" autocomplete="off"> muž
</label>
<label class="btn btn-outline-secondary active">
<input type="radio" name="gender" id="gender3" value="" autocomplete="off"> 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" value="age30" autocomplete="off"> do 30 let
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="age" id="age2" value="age50" autocomplete="off"> 30 - 49 let
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="age" id="age3" value="age65" autocomplete="off"> 50 - 64 let
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="age" id="age4" value="age99" autocomplete="off"> 65+ let
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="age" id="age5" value="" autocomplete="off"> 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" value="kids" autocomplete="off"> ano
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="kids" id="kids2" value="nokids" autocomplete="off"> ne
</label>
<label class="btn btn-outline-secondary active">
<input type="radio" name="kids" id="kids3" value="" autocomplete="off"> 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" name="occupation">
<option value="">jiné / nechci uvést</option>
<option value="student">studující</option>
<option value="employee-public">zaměstnaný/á ve veřejné sféře</option>
<option value="employee-private">zaměstnaný/á v soukromé sféře</option>
<option value="entrepreneur">podnikající</option>
<option value="maternity">na mateřské / rodičovské</option>
<option value="retired">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" name="wealth">
<option value="">jiné / nechci uvést</option>
<option value="wealth-great">velmi dobrá</option>
<option value="wealth-good">dobrá</option>
<option value="wealth-average">ani dobrá, ani špatná</option>
<option value="wealth-bad">š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" value="travel-bike" name="travel-bike">
<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" value="travel-car" name="travel-car">
<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" value="travel-public" name="travel-public">
<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" name="housing">
<option value="">jiné / nechci uvést</option>
<option value="metropolis">ve velkém městě nebo jeho okolí</option>
<option value="town">ve středně velkém městě (10 - 50 tis.)</option>
<option value="village">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" value="zs" autocomplete="off">
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="education" id="education2" value="ss" autocomplete="off"> SŠ bez maturity
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="education" id="education3" value="maturita" autocomplete="off"> SŠ s maturitou
</label>
<label class="btn btn-outline-secondary">
<input type="radio" name="education" id="education4" value="vs" autocomplete="off">
</label>
<label class="btn btn-outline-secondary active">
<input type="radio" name="education" id="education5" value="" autocomplete="off"> nechci uvést
</label>
</div>
</div>
<div class="row form-group">
<div class="col-2">
</div>
<div class="col-4">
<input type="submit" value="Vyhledat">
</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">
<div class="mb-3">
{% image point.image_title max-400x200 class="lazyload img-fluid w-100" %}
</div>
<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 %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment