Skip to content
Snippets Groups Projects
0161_auto_20240513_1733.py 12.63 KiB
# Generated by Django 5.0.4 on 2024-05-13 15:33

import wagtail
from django.db import migrations, models
from wagtail.blocks import CharBlock, ListBlock, PageChooserBlock, StructBlock


def migrate_people_blocks(apps, schema_editor):
    # Recreate here because this block has been changed in the future

    class PeopleGroupBlock(StructBlock):
        title = CharBlock(label="Titulek")
        slug = CharBlock(
            label="Slug skupiny",
            required=False,
            help_text="Není třeba vyplňovat, bude automaticky vyplněno",
        )

        person_list = ListBlock(
            PageChooserBlock(
                page_type="district.DistrictPersonPage", label="Detail osoby"
            ),
            label="Skupina osob",
        )

    # Get the page model
    DistrictPeoplePage = apps.get_model("district", "DistrictPeoplePage")
    DistrictPersonPage = apps.get_model("district", "DistrictPersonPage")

    # Iterate over all pages that have the StreamField you want to update
    for number, people_page in enumerate(DistrictPeoplePage.objects.all()):
        # Get the old content
        old_content = people_page.content.get_prep_value()

        # Create a new list to store the merged blocks
        merged_blocks = []

        # Iterate over the old blocks and extract common fields
        for old_block in old_content:
            if old_block["type"] != "people_group":
                continue

            title = old_block["value"]["group_title"]
            people = []

            for person in old_block["value"]["person_list"]:
                person_id = (
                    DistrictPersonPage.objects.filter(id=person["value"]["person"])
                    .values_list("id", flat=True)
                    .first()
                )

                if person_id is None:
                    continue

                people.append(person_id)

            person_block_list = []

            for person_id in people:
                person_block_list.append(person_id)

            merged_blocks.append(
                PeopleGroupBlock().to_python(
                    {
                        "title": title,
                        "slug": str(number),
                        "person_list": person_block_list,
                    }
                )
            )

        for block in merged_blocks:
            people_page.people.append(("people_group", block))

        people_page.save()


class Migration(migrations.Migration):
    dependencies = [
        ("district", "0160_rename_background_photo_districtpersonpage_main_image"),
    ]

    operations = [
        migrations.AlterField(
            model_name="districtpeoplepage",
            name="people",
            field=wagtail.fields.StreamField(
                [
                    (
                        "people_group",
                        wagtail.blocks.StructBlock(
                            [
                                ("title", wagtail.blocks.CharBlock(label="Titulek")),
                                (
                                    "slug",
                                    wagtail.blocks.CharBlock(
                                        help_text="Není třeba vyplňovat, bude automaticky vyplněno",
                                        label="Slug skupiny",
                                        required=False,
                                    ),
                                ),
                                (
                                    "person_list",
                                    wagtail.blocks.ListBlock(
                                        wagtail.blocks.PageChooserBlock(
                                            label="Detail osoby",
                                            page_type=["district.DistrictPersonPage"],
                                        ),
                                        label="Skupina osob",
                                    ),
                                ),
                            ],
                            label="Seznam osob",
                        ),
                    ),
                    (
                        "team_group",
                        wagtail.blocks.StructBlock(
                            [
                                (
                                    "title",
                                    wagtail.blocks.CharBlock(label="Název sekce týmů"),
                                ),
                                (
                                    "slug",
                                    wagtail.blocks.CharBlock(
                                        help_text="Není třeba vyplňovat, bude automaticky vyplněno",
                                        label="Slug sekce",
                                        required=False,
                                    ),
                                ),
                                (
                                    "team_list",
                                    wagtail.blocks.ListBlock(
                                        wagtail.blocks.StructBlock(
                                            [
                                                (
                                                    "headline",
                                                    wagtail.blocks.CharBlock(
                                                        label="Titulek bloku",
                                                        required=False,
                                                    ),
                                                ),
                                                (
                                                    "card_items",
                                                    wagtail.blocks.ListBlock(
                                                        wagtail.blocks.StructBlock(
                                                            [
                                                                (
                                                                    "image",
                                                                    wagtail.images.blocks.ImageChooserBlock(
                                                                        label="Obrázek"
                                                                    ),
                                                                ),
                                                                (
                                                                    "title",
                                                                    wagtail.blocks.CharBlock(
                                                                        label="Titulek",
                                                                        required=True,
                                                                    ),
                                                                ),
                                                                (
                                                                    "text",
                                                                    wagtail.blocks.RichTextBlock(
                                                                        label="Krátký text pod nadpisem",
                                                                        required=False,
                                                                    ),
                                                                ),
                                                                (
                                                                    "page",
                                                                    wagtail.blocks.PageChooserBlock(
                                                                        label="Stránka",
                                                                        page_type=[
                                                                            "district.DistrictHomePage"
                                                                        ],
                                                                        required=False,
                                                                    ),
                                                                ),
                                                                (
                                                                    "link",
                                                                    wagtail.blocks.URLBlock(
                                                                        label="Odkaz",
                                                                        required=False,
                                                                    ),
                                                                ),
                                                            ],
                                                            template="styleguide2/includes/molecules/boxes/card_box_block.html",
                                                        ),
                                                        label="Karty s odkazy",
                                                    ),
                                                ),
                                            ],
                                            label="Karta týmu",
                                        ),
                                        label="Týmy",
                                    ),
                                ),
                            ]
                        ),
                    ),
                ],
                blank=True,
                verbose_name="Lidé a týmy",
            ),
        ),
        migrations.AddField(
            model_name="districtpersonpage",
            name="after_name",
            field=models.CharField(
                blank=True, max_length=16, null=True, verbose_name="Tituly za jménem"
            ),
        ),
        migrations.AddField(
            model_name="districtpersonpage",
            name="before_name",
            field=models.CharField(
                blank=True, max_length=32, null=True, verbose_name="Tituly před jménem"
            ),
        ),
        migrations.AddField(
            model_name="districtpersonpage",
            name="perex",
            field=models.TextField(default=""),
            preserve_default=False,
        ),
        migrations.AddField(
            model_name="districtpersonpage",
            name="position",
            field=models.CharField(
                blank=True, max_length=200, null=True, verbose_name="Pozice/povolání"
            ),
        ),
        migrations.AddField(
            model_name="districtpersonpage",
            name="primary_group",
            field=models.CharField(
                blank=True,
                help_text="např. 'Europarlament' nebo 'Sněmovna'",
                max_length=32,
                null=True,
                verbose_name="Kategorie",
            ),
        ),
        migrations.AddField(
            model_name="districtpersonpage",
            name="related_people",
            field=wagtail.fields.StreamField(
                [
                    (
                        "person",
                        wagtail.blocks.PageChooserBlock(
                            label="Detail osoby", page_type=["main.MainPersonPage"]
                        ),
                    )
                ],
                blank=True,
                verbose_name="Další lidé",
            ),
        ),
        migrations.AddField(
            model_name="districtpersonpage",
            name="social_links",
            field=wagtail.fields.StreamField(
                [
                    (
                        "social_links",
                        wagtail.blocks.StructBlock(
                            [
                                ("text", wagtail.blocks.CharBlock(label="Název")),
                                ("link", wagtail.blocks.URLBlock(label="Odkaz")),
                                (
                                    "icon",
                                    wagtail.blocks.CharBlock(
                                        help_text="Seznam ikon - https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons <br/>Název ikony zadejte bez tečky na začátku",
                                        label="Ikona",
                                    ),
                                ),
                            ]
                        ),
                    )
                ],
                blank=True,
                verbose_name="Odkazy na sociální sítě",
            ),
        ),
        migrations.RunPython(migrate_people_blocks),
    ]