diff --git a/region/management/__init__.py b/region/management/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/region/management/commands/__init__.py b/region/management/commands/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/region/management/commands/convert_region_to_district.py b/region/management/commands/convert_region_to_district.py new file mode 100644 index 0000000000000000000000000000000000000000..d5b740de2e2f8be20d357a405c5fe426e79005bb --- /dev/null +++ b/region/management/commands/convert_region_to_district.py @@ -0,0 +1,160 @@ +from django.core.management.base import BaseCommand +from django.db import transaction +from wagtail.core.models import Page, Site + +from district.models import ( + DistrictAfterElectionPage, + DistrictArticlePage, + DistrictArticlesPage, + DistrictArticleTag, + DistrictCenterPage, + DistrictContactPage, + DistrictCrossroadPage, + DistrictCustomPage, + DistrictElectionBasePage, + DistrictElectionPage, + DistrictElectionPointPage, + DistrictHomePage, + DistrictPeoplePage, + DistrictPersonPage, + DistrictPersonPageForm, + DistrictPersonTag, + DistrictProgramPage, + DistrictTagsPage, +) +from region.models import ( + RegionAfterElectionPage, + RegionArticlePage, + RegionArticlesPage, + RegionArticleTag, + RegionCenterPage, + RegionContactPage, + RegionCrossroadPage, + RegionCustomPage, + RegionElectionBasePage, + RegionElectionPage, + RegionElectionPointPage, + RegionHomePage, + RegionPeoplePage, + RegionPersonPage, + RegionPersonPageForm, + RegionPersonTag, + RegionProgramPage, + RegionTagsPage, +) + +""" +Dict that holds related model from district module for region model +""" +migration_map = { + RegionHomePage: DistrictHomePage, + RegionArticleTag: DistrictArticleTag, + RegionArticlePage: DistrictArticlePage, + RegionArticlesPage: DistrictArticlesPage, + RegionContactPage: DistrictContactPage, + RegionTagsPage: DistrictTagsPage, + RegionPersonTag: DistrictPersonTag, + RegionPersonPageForm: DistrictPersonPageForm, + RegionPersonPage: DistrictPersonPage, + RegionPeoplePage: DistrictPeoplePage, + RegionElectionBasePage: DistrictElectionBasePage, + RegionAfterElectionPage: DistrictAfterElectionPage, + RegionElectionPointPage: DistrictElectionPointPage, + RegionElectionPage: DistrictElectionPage, + RegionProgramPage: DistrictProgramPage, + RegionCenterPage: DistrictCenterPage, + RegionCrossroadPage: DistrictCrossroadPage, + RegionCustomPage: DistrictCustomPage, +} + + +def get_page_data_dict(data_dict): + """ + Function that clear unnecessary data from page dict + """ + data_dict.pop("id") + data_dict.pop("alias_of_id") + data_dict.pop("content_type_id") + data_dict.pop("depth") + data_dict.pop("expire_at") + data_dict.pop("expired") + data_dict.pop("footperson_coord_id", None) + data_dict.pop("footperson_electman_id", None) + data_dict.pop("footperson_media_id", None) + data_dict.pop("go_live_at") + data_dict.pop("has_unpublished_changes") + data_dict.pop("last_published_at") + data_dict.pop("latest_revision_created_at") + data_dict.pop("live_revision_id") + data_dict.pop("live") + data_dict.pop("locale_id") + data_dict.pop("locked") + data_dict.pop("locked_at") + data_dict.pop("locked_by_id") + data_dict.pop("numchild") + data_dict.pop("path") + data_dict.pop("translation_key") + data_dict.pop("url_path") + data_dict.pop("page_ptr_id") + data_dict.pop("specific", None) + data_dict.pop("specific_class", None) + data_dict.pop("_cached_parent_obj", None) + data_dict.pop("_state") + data_dict.pop("_wagtail_cached_site_root_paths", None) + return data_dict + + +def handle_child_pages(region_root_page, district_root_page): + child_pages = list(region_root_page.get_children()) + while child_pages: + child = child_pages.pop(0) + child_specific = child.specific + page_class = child_specific.__class__ + + DistrictChildPage = migration_map[page_class] + + tmp_data_dict = child_specific.__dict__.copy() + data_dict = get_page_data_dict(tmp_data_dict) + + district_child_page = DistrictChildPage(**data_dict) + + district_root_page.add_child(instance=district_child_page) + + district_child_page.save() + district_child_page.save_revision().publish() + + if child.get_children(): + handle_child_pages(child, district_child_page) + + +class Command(BaseCommand): + help = """Zmigruje všechny stránky z modulu region do modulu district""" + + def handle(self, *args, **options): + with transaction.atomic(): + for region_hp in RegionHomePage.objects.all(): + + data_dict = region_hp.__dict__.copy() + + data = get_page_data_dict(data_dict) + + district_hp = DistrictHomePage(**data) + district_hp.slug = region_hp.slug + + region_hp.slug = "old_" + region_hp.slug + region_hp.save() + + root = Page.get_first_root_node() + root.add_child(instance=district_hp) + + district_hp.save() + district_hp.save_revision().publish() + + sites = Site.objects.filter(root_page_id=region_hp.id) + for site in sites: + site.root_page = district_hp + site.save() + + handle_child_pages(region_hp, district_hp) + + region_hp.delete() diff --git a/region/migrations/0038_alter_regionarticlepage_content_and_more.py b/region/migrations/0038_alter_regionarticlepage_content_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..36501679d43d489418485bae905e6f5c567f4f2b --- /dev/null +++ b/region/migrations/0038_alter_regionarticlepage_content_and_more.py @@ -0,0 +1,62 @@ +# Generated by Django 4.0.4 on 2022-05-11 12:58 + +import django.db.models.deletion +import wagtail.core.blocks +import wagtail.core.fields +import wagtail.images.blocks +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("region", "0037_alter_regionarticlepage_content"), + ] + + operations = [ + migrations.AlterField( + model_name="regionelectionpointpage", + name="guarantor", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="region.regionpersonpage", + ), + ), + migrations.AlterField( + model_name="regionhomepage", + name="footperson_coord", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="region.regionpersonpage", + verbose_name="Koordinátor", + ), + ), + migrations.AlterField( + model_name="regionhomepage", + name="footperson_electman", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="region.regionpersonpage", + verbose_name="Volební manažer", + ), + ), + migrations.AlterField( + model_name="regionhomepage", + name="footperson_media", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="region.regionpersonpage", + verbose_name="Kontakt pro média", + ), + ), + ] diff --git a/region/models.py b/region/models.py index 5531f0f7eaa247700b4db8f14c357b8d9c4c06b6..d721e4d4f1d636afd6c4945bb18f196f53e6408c 100644 --- a/region/models.py +++ b/region/models.py @@ -143,7 +143,7 @@ class RegionHomePage( footperson_coord = models.ForeignKey( "region.RegionPersonPage", verbose_name="Koordinátor", - on_delete=models.PROTECT, + on_delete=models.SET_NULL, null=True, blank=True, related_name="+", @@ -154,7 +154,7 @@ class RegionHomePage( footperson_electman = models.ForeignKey( "region.RegionPersonPage", verbose_name="Volební manažer", - on_delete=models.PROTECT, + on_delete=models.SET_NULL, null=True, blank=True, related_name="+", @@ -165,7 +165,7 @@ class RegionHomePage( footperson_media = models.ForeignKey( "region.RegionPersonPage", verbose_name="Kontakt pro média", - on_delete=models.PROTECT, + on_delete=models.SET_NULL, null=True, blank=True, related_name="+", @@ -766,7 +766,9 @@ class RegionAfterElectionPage(RegionElectionBasePage): class RegionElectionPointPage(RegionElectionBasePage): ### FIELDS - guarantor = models.ForeignKey("region.RegionPersonPage", on_delete=models.PROTECT) + guarantor = models.ForeignKey( + "region.RegionPersonPage", on_delete=models.SET_NULL, null=True + ) list_image = models.ForeignKey( "wagtailimages.Image", on_delete=models.PROTECT,