From 02c33408fac04245aca5536137adaac2a8d7136a Mon Sep 17 00:00:00 2001
From: Jarmil <jarmil.halamicek@seznam.cz>
Date: Wed, 12 Aug 2020 16:14:52 +0200
Subject: [PATCH] WIP: modifikovan model pro vahy programovych bodu, zakladni
 editace

---
 program2021/fixtures/characteristic.json      | 23 ++++++
 .../migrations/0003_auto_20200805_1034.py     | 52 +++++++++----
 .../migrations/0004_merge_20200812_1337.py    | 13 ++++
 .../migrations/0005_auto_20200812_1337.py     | 78 +++++++++++++++++++
 .../migrations/0006_auto_20200812_1556.py     | 38 +++++++++
 program2021/models.py                         | 68 +++++++++++++---
 6 files changed, 250 insertions(+), 22 deletions(-)
 create mode 100644 program2021/fixtures/characteristic.json
 create mode 100644 program2021/migrations/0004_merge_20200812_1337.py
 create mode 100644 program2021/migrations/0005_auto_20200812_1337.py
 create mode 100644 program2021/migrations/0006_auto_20200812_1556.py

diff --git a/program2021/fixtures/characteristic.json b/program2021/fixtures/characteristic.json
new file mode 100644
index 00000000..8e8f9039
--- /dev/null
+++ b/program2021/fixtures/characteristic.json
@@ -0,0 +1,23 @@
+[
+  {
+    "model": "program2021.SearchCharacteristic",
+    "pk": 1,
+    "fields": {
+      "name": "Pohlaví - žena"
+    }
+  },
+  {
+    "model": "program2021.SearchCharacteristic",
+    "pk": 2,
+    "fields": {
+      "name": "Pohlaví - muž"
+    }
+  },
+  {
+    "model": "program2021.SearchCharacteristic",
+    "pk": 3,
+    "fields": {
+      "name": "Pohlaví - nezadáno"
+    }
+  }
+]
diff --git a/program2021/migrations/0003_auto_20200805_1034.py b/program2021/migrations/0003_auto_20200805_1034.py
index 2f1685a8..396d02db 100644
--- a/program2021/migrations/0003_auto_20200805_1034.py
+++ b/program2021/migrations/0003_auto_20200805_1034.py
@@ -1,33 +1,59 @@
 # Generated by Django 3.0.8 on 2020-08-05 08:34
 
-from django.db import migrations, models
 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'),
+        ("taggit", "0003_taggeditem_add_unique_index"),
+        ("program2021", "0002_auto_20200805_0726"),
     ]
 
     operations = [
         migrations.CreateModel(
-            name='Program2021PointPageSearchTag',
+            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')),
+                (
+                    "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,
-            },
+            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'),
+            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",
+            ),
         ),
     ]
diff --git a/program2021/migrations/0004_merge_20200812_1337.py b/program2021/migrations/0004_merge_20200812_1337.py
new file mode 100644
index 00000000..8fed978f
--- /dev/null
+++ b/program2021/migrations/0004_merge_20200812_1337.py
@@ -0,0 +1,13 @@
+# 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 = []
diff --git a/program2021/migrations/0005_auto_20200812_1337.py b/program2021/migrations/0005_auto_20200812_1337.py
new file mode 100644
index 00000000..d2391ed2
--- /dev/null
+++ b/program2021/migrations/0005_auto_20200812_1337.py
@@ -0,0 +1,78 @@
+# 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",
+                    ),
+                ),
+            ],
+        ),
+    ]
diff --git a/program2021/migrations/0006_auto_20200812_1556.py b/program2021/migrations/0006_auto_20200812_1556.py
new file mode 100644
index 00000000..2741e763
--- /dev/null
+++ b/program2021/migrations/0006_auto_20200812_1556.py
@@ -0,0 +1,38 @@
+# 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"),
+        ),
+    ]
diff --git a/program2021/models.py b/program2021/models.py
index 15de764f..4c8abad7 100644
--- a/program2021/models.py
+++ b/program2021/models.py
@@ -6,6 +6,7 @@ from taggit.models import TaggedItemBase
 from wagtail.admin.edit_handlers import (
     FieldPanel,
     HelpPanel,
+    InlinePanel,
     MultiFieldPanel,
     ObjectList,
     StreamFieldPanel,
@@ -19,6 +20,34 @@ 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)
+
+    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(
@@ -70,12 +99,26 @@ class Program2021HomePage(Page):
                 required_tags.append("travel-every")
 
             # selecty mohou mit vzdy jen jednu hodnotu
-            for x in ["age", "gender", "kids", "occupation", "wealth", "housing", "education"]:
+            for x in [
+                "age",
+                "gender",
+                "kids",
+                "occupation",
+                "wealth",
+                "housing",
+                "education",
+            ]:
                 required_tags.append(x + "-" + (request.POST.get(x, "") or "every"))
 
             # TODO : rozpracovana vec, funguje spatne, vrati vsechny body co maji aspon jeden tag
             # bude treba prevest na vahy tagu
-            context["points"] = self.get_children().live().specific().filter(program2021pointpage__search_tags__name__in=required_tags).distinct()
+            context["points"] = (
+                self.get_children()
+                .live()
+                .specific()
+                .filter(program2021pointpage__search_tags__name__in=required_tags)
+                .distinct()
+            )
             raise NotImplementedError
 
         else:
@@ -227,20 +270,24 @@ class Program2021PointPage(Page, MetadataPageMixin):
     )
     owner_url = models.URLField("odkaz na garanta", blank=True, null=True)
     tags = ClusterTaggableManager(through=Program2021PointPageTag, blank=True)
-    search_tags = ClusterTaggableManager("Tagy pro vyhledávání", through=Program2021PointPageSearchTag, blank=True,
+    search_tags = ClusterTaggableManager(
+        "Tagy pro vyhledávání",
+        through=Program2021PointPageSearchTag,
+        blank=True,
         related_name="search_tags",
-        help_text="""Deleny do skupin se spolecnym prefixem, napr. "gender". Pokud je bod spolecny pro vsechny moznosti dane skupiny, pouzij tag se suffixem "-every".  
-Priklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every". 
+        help_text="""Deleny do skupin se spolecnym prefixem, napr. "gender". Pokud je bod spolecny pro vsechny moznosti dane skupiny, pouzij tag se suffixem "-every".
+Priklad: chces-li programovy bod pouze pro muze, zadej tag "gender-male", pokud je to jedno, musis zadat tag "gender-every".
 Pro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do vysledku vyhledavani. Seznam tagu po skupinach:
-(gender-male gender-female gender-every) 
-(age-30 age-50 age-65 age-99 age-every) 
+(gender-male gender-female gender-every)
+(age-30 age-50 age-65 age-99 age-every)
 (kids-yes kids-no kids-every)
 (occupation-student occupation-employee-public occupation-employee-private occupation-entrepreneur occupation-maternity occupation-retired occupation-every)
 (wealth-excelent wealth-good wealth-average wealth-bad wealth-every)
 (travel-bike travel-car travel-public travel-every)
-(housing-metropolis housing-town housing-village housing-every) 
+(housing-metropolis housing-town housing-village housing-every)
 (education-zs education-ss education-maturita education-vs education-every)
-         """)
+         """,
+    )
 
     ### PANELS
 
@@ -286,6 +333,8 @@ Pro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do
         StreamFieldPanel("faq"),
     ]
 
+    search_panels = [InlinePanel("program_point_link", label="Váhy vyhledávání")]
+
     promote_panels = [
         MultiFieldPanel(
             [
@@ -302,6 +351,7 @@ Pro kazdou skupinu musis zadat aspon jeden tag, jinak se bod nedostane nikdy do
         [
             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")),
         ]
-- 
GitLab