From 2b883b8759cf18db6b8c796fcac0ccf0f77eba48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20Farka?= <stepanfarka11@gmail.com>
Date: Thu, 2 Jun 2022 16:56:38 +0200
Subject: [PATCH] [FIX] ContactItemBlock to PersonCustomPositionBlock

---
 district/blocks.py                            | 12 ---
 ...lter_districtcontactpage_contact_people.py | 96 +++++++++++++++++++
 district/models.py                            |  2 +-
 .../district/district_contact_page.html       | 14 ++-
 4 files changed, 107 insertions(+), 17 deletions(-)
 create mode 100644 district/migrations/0083_alter_districtcontactpage_contact_people.py

diff --git a/district/blocks.py b/district/blocks.py
index ef39822e..423bf15b 100644
--- a/district/blocks.py
+++ b/district/blocks.py
@@ -137,18 +137,6 @@ class CenterContactBlock(StructBlock):
         label = "Kontakt"
 
 
-class ContactItemBlock(StructBlock):
-    name = CharBlock(label="Role")
-    person = PageChooserBlock(
-        label="Osoba",
-        page_type=["district.DistrictPersonPage"],
-    )
-
-    class Meta:
-        icon = "mail"
-        label = "Kontakt"
-
-
 class HomepageHeaderBlock(StructBlock):
     title = CharBlock(label="Titulek", required=False, help_text="Nap")
     image = ImageChooserBlock()
diff --git a/district/migrations/0083_alter_districtcontactpage_contact_people.py b/district/migrations/0083_alter_districtcontactpage_contact_people.py
new file mode 100644
index 00000000..aeb74ce8
--- /dev/null
+++ b/district/migrations/0083_alter_districtcontactpage_contact_people.py
@@ -0,0 +1,96 @@
+# Generated by Django 4.0.4 on 2022-06-02 14:33
+
+import wagtail.core.blocks
+import wagtail.core.fields
+from django.db import migrations
+from wagtail.core.blocks import StreamValue
+
+
+def name_to_position(block):
+    block["value"]["position"] = block["value"]["name"]
+    del block["value"]["name"]
+    return block
+
+
+def position_to_name(block):
+    block["value"]["name"] = block["value"]["position"]
+    del block["value"]["position"]
+
+    return block
+
+
+def get_content(page, mapper):
+    stream_data = []
+    mapped = False
+
+    for block in page.contact_people.raw_data:
+        if block["type"] == "item":
+            stream_data.append(mapper(block))
+            mapped = True
+
+        else:
+            stream_data.append(block)
+
+    return stream_data, mapped
+
+
+def migrate(apps, mapper):
+    DistrictContactPage = apps.get_model("district", "DistrictContactPage")
+
+    for page in DistrictContactPage.objects.all():
+        contact_people, mapped = get_content(page, mapper)
+
+        if mapped:
+            page.contact_people = StreamValue(
+                page.contact_people, contact_people, is_lazy=True
+            )
+            page.save()
+
+
+def forwards(apps, schema_editor):
+    migrate(apps, name_to_position)
+
+
+def backwards(apps, schema_editor):
+    migrate(apps, position_to_name)
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("district", "0082_alter_districtcenterpage_sidebar_content_and_more"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="districtcontactpage",
+            name="contact_people",
+            field=wagtail.core.fields.StreamField(
+                [
+                    (
+                        "item",
+                        wagtail.core.blocks.StructBlock(
+                            [
+                                (
+                                    "position",
+                                    wagtail.core.blocks.CharBlock(
+                                        label="Název pozice", required=False
+                                    ),
+                                ),
+                                (
+                                    "person",
+                                    wagtail.core.blocks.PageChooserBlock(
+                                        label="Osoba",
+                                        page_type=["district.DistrictPersonPage"],
+                                    ),
+                                ),
+                            ]
+                        ),
+                    )
+                ],
+                blank=True,
+                verbose_name="Kontakty",
+            ),
+        ),
+        migrations.RunPython(forwards, backwards),
+    ]
diff --git a/district/models.py b/district/models.py
index 10420258..b5a0ce91 100644
--- a/district/models.py
+++ b/district/models.py
@@ -450,7 +450,7 @@ class DistrictContactPage(
     ### FIELDS
 
     contact_people = StreamField(
-        [("item", blocks.ContactItemBlock())],
+        [("item", blocks.PersonCustomPositionBlock())],
         verbose_name="Kontakty",
         blank=True,
     )
diff --git a/district/templates/district/district_contact_page.html b/district/templates/district/district_contact_page.html
index 63adf19e..12a27634 100644
--- a/district/templates/district/district_contact_page.html
+++ b/district/templates/district/district_contact_page.html
@@ -17,12 +17,18 @@
 
         {% for item in page.contact_people %}
           <div>
-            <h2 class="head-heavy-sm mb-2 lg:mb-4">
-              {{ item.value.name }}
-            </h2>
+              {% if item.value.position %}
+                  <h2 class="head-heavy-sm mb-2 lg:mb-4">
+                      {{ item.value.position }}
+                  </h2>
+              {% elif item.value.person.job_function %}
+                  <h2 class="head-heavy-sm mb-2 lg:mb-4">
+                      {{ item.value.person.job_function }}
+                  </h2>
+              {% endif %}
             <div class="card elevation-3">
               <div class="card__body">
-                {% include "shared/person_badge_wide_snippet.html" with person_page=item.value.person %}
+                {% include "shared/person_badge_wide_snippet.html" with person_page=item.value.person title=item.value.position %}
               </div>
             </div>
           </div>
-- 
GitLab