From ad65874d0d7766fa114c801e50b44102355283b1 Mon Sep 17 00:00:00 2001
From: Jarmil <jarmil.halamicek@seznam.cz>
Date: Wed, 30 Sep 2020 13:29:34 +0200
Subject: [PATCH] Pruzne cilove skupiny u programovych bodu. Solves #20

---
 .../migrations/0004_auto_20200930_1230.py     | 66 +++++++++++++++++++
 .../migrations/0005_auto_20200930_1328.py     | 40 +++++++++++
 program2021/models.py                         | 64 ++++++++++--------
 .../program2021/program2021_point_page.html   | 10 ++-
 program2021/wagtail_hooks.py                  | 18 +++++
 5 files changed, 164 insertions(+), 34 deletions(-)
 create mode 100644 program2021/migrations/0004_auto_20200930_1230.py
 create mode 100644 program2021/migrations/0005_auto_20200930_1328.py
 create mode 100644 program2021/wagtail_hooks.py

diff --git a/program2021/migrations/0004_auto_20200930_1230.py b/program2021/migrations/0004_auto_20200930_1230.py
new file mode 100644
index 00000000..6a3e2556
--- /dev/null
+++ b/program2021/migrations/0004_auto_20200930_1230.py
@@ -0,0 +1,66 @@
+# Generated by Django 3.1.1 on 2020-09-30 10:30
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("program2021", "0003_program2021pointpage_image_title"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="Program2021TargetGroup",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("name", models.CharField(max_length=200)),
+            ],
+        ),
+        migrations.CreateModel(
+            name="Program2021TargetGroupBenefit",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("benefit", models.CharField(max_length=200)),
+                (
+                    "program_point",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to="program2021.program2021pointpage",
+                    ),
+                ),
+                (
+                    "target_group",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to="program2021.program2021targetgroup",
+                    ),
+                ),
+            ],
+        ),
+        migrations.AddField(
+            model_name="program2021pointpage",
+            name="benefits",
+            field=models.ManyToManyField(
+                through="program2021.Program2021TargetGroupBenefit",
+                to="program2021.Program2021TargetGroup",
+            ),
+        ),
+    ]
diff --git a/program2021/migrations/0005_auto_20200930_1328.py b/program2021/migrations/0005_auto_20200930_1328.py
new file mode 100644
index 00000000..2eab2e99
--- /dev/null
+++ b/program2021/migrations/0005_auto_20200930_1328.py
@@ -0,0 +1,40 @@
+# Generated by Django 3.1.1 on 2020-09-30 11:28
+
+import django.db.models.deletion
+import modelcluster.fields
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("program2021", "0004_auto_20200930_1230"),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name="program2021targetgroup",
+            options={
+                "verbose_name": "Cílová skupina",
+                "verbose_name_plural": "Cílové skupiny",
+            },
+        ),
+        migrations.RemoveField(
+            model_name="program2021pointpage", name="benefits_companies",
+        ),
+        migrations.RemoveField(
+            model_name="program2021pointpage", name="benefits_public_money",
+        ),
+        migrations.RemoveField(
+            model_name="program2021pointpage", name="benefits_self_employed",
+        ),
+        migrations.AlterField(
+            model_name="program2021targetgroupbenefit",
+            name="program_point",
+            field=modelcluster.fields.ParentalKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="my_benefits",
+                to="program2021.program2021pointpage",
+            ),
+        ),
+    ]
diff --git a/program2021/models.py b/program2021/models.py
index d0f7eb24..501488a1 100644
--- a/program2021/models.py
+++ b/program2021/models.py
@@ -115,6 +115,31 @@ class Program2021PointPageTag(TaggedItemBase):
     )
 
 
+class Program2021TargetGroup(models.Model):
+    """ Ciselnik: cilove skupiny pro programove body """
+
+    name = models.CharField(max_length=200)
+
+    panels = [FieldPanel("name")]
+
+    def __str__(self):
+        return self.name
+
+    class Meta:
+        verbose_name_plural = "Cílové skupiny"
+        verbose_name = "Cílová skupina"
+
+
+class Program2021TargetGroupBenefit(models.Model):
+    """ Many2Many vazba programovy bod - cilova skupina. Popis, jaky benefit bod skupine prinese """
+
+    target_group = models.ForeignKey("Program2021TargetGroup", on_delete=models.CASCADE)
+    program_point = ParentalKey(
+        "Program2021PointPage", on_delete=models.CASCADE, related_name="my_benefits"
+    )
+    benefit = models.CharField(max_length=200)
+
+
 class Program2021PointPage(Page, MetadataPageMixin):
     RICH_TEXT_FEATURES = ["bold", "italic", "ol", "ul", "link", "document-link"]
 
@@ -150,27 +175,10 @@ class Program2021PointPage(Page, MetadataPageMixin):
     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ů.",
+    benefits = models.ManyToManyField(
+        Program2021TargetGroup, through=Program2021TargetGroupBenefit
     )
+
     already_done = RichTextField(
         "co jsme už udělali",
         max_length=1800,
@@ -286,15 +294,15 @@ class Program2021PointPage(Page, MetadataPageMixin):
 
     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"),
-            ]
+            """ 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.
+                Cílové skupiny můžete definovat z levého menu.
+            """
         ),
+        InlinePanel("my_benefits", label="Benefity"),
     ]
 
     faq_content_panels = [
diff --git a/program2021/templates/program2021/program2021_point_page.html b/program2021/templates/program2021/program2021_point_page.html
index ea50b14b..b2f31550 100644
--- a/program2021/templates/program2021/program2021_point_page.html
+++ b/program2021/templates/program2021/program2021_point_page.html
@@ -57,12 +57,10 @@
 
     <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>
+      {% for benefit in page.my_benefits.all %}
+        <h5 class="mt-4">{{ benefit.target_group }}</h5>
+        <p>{{ benefit.benefit }}</p>
+      {% endfor %}
     </div>
 
     <div class="col-md-6 pl-5">
diff --git a/program2021/wagtail_hooks.py b/program2021/wagtail_hooks.py
new file mode 100644
index 00000000..692e6fb3
--- /dev/null
+++ b/program2021/wagtail_hooks.py
@@ -0,0 +1,18 @@
+""" Pridani editace non-page modelu do wagtail administrace """
+
+from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
+
+from .models import Program2021TargetGroup
+
+
+class TargetGroupAdmin(ModelAdmin):
+    model = Program2021TargetGroup
+    menu_icon = "group"
+    menu_order = 200
+    add_to_settings_menu = False
+    exclude_from_explorer = False
+    list_display = ("name",)
+    search_fields = ("name",)
+
+
+modeladmin_register(TargetGroupAdmin)
-- 
GitLab