diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a4e7a7165ec95e1058c23c607eee7d9fe8288f26..04c1a791037e353ef252b9db115d16f77fb2388b 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,5 +1,5 @@
 default_language_version:
-  python: python3.7
+  python: python3.8
 
 exclude: snapshots/
 repos:
diff --git a/district/blocks.py b/district/blocks.py
index 7be87e526faf9e92144ae9bbe7d464f66449f166..1d960c44a5c53be1ef27df54cfc2e965c8f1c78d 100644
--- a/district/blocks.py
+++ b/district/blocks.py
@@ -45,7 +45,9 @@ class ProgramItemBlock(StructBlock):
 class ProgramBlock(StructBlock):
     headline = CharBlock(label="Titulek bloku", required=True)
     perex = TextBlock(label="Krátký text pod nadpisem", required=True)
-    person = PersonChooserBlock(label="Osoba", required=True)  # TODO Page chooser block should suffice
+    person = PersonChooserBlock(
+        label="Osoba", required=True
+    )  # TODO Page chooser block should suffice
     completion_percentage = IntegerBlock(label="Procento dokončení", required=True)
     program_items = ListBlock(ProgramItemBlock())
     # program_items = TableBlock(label="Tabulka plnění programu", required=True)
diff --git a/district/migrations/0005_auto_20211108_2126.py b/district/migrations/0005_auto_20211108_2126.py
index 8fca73009d2a20ec4c4d2425896802efee946acc..1cdb8e07da43ca97f7cbef49f5e7de6cf9f550b3 100644
--- a/district/migrations/0005_auto_20211108_2126.py
+++ b/district/migrations/0005_auto_20211108_2126.py
@@ -1,120 +1,304 @@
 # Generated by Django 3.2.8 on 2021-11-08 20:26
 
-import district.blocks
-from django.db import migrations, models
 import django.db.models.deletion
 import modelcluster.contrib.taggit
 import modelcluster.fields
-import shared.models
 import wagtail.core.blocks
 import wagtail.core.fields
 import wagtail.images.blocks
 import wagtailmetadata.models
+from django.db import migrations, models
+
+import district.blocks
+import shared.models
 
 
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('wagtailimages', '0023_add_choose_permissions'),
-        ('wagtailcore', '0062_comment_models_and_pagesubscription'),
-        ('shared', '0001_initial'),
-        ('taggit', '0003_taggeditem_add_unique_index'),
-        ('district', '0004_auto_20210209_1222'),
+        ("wagtailimages", "0023_add_choose_permissions"),
+        ("wagtailcore", "0062_comment_models_and_pagesubscription"),
+        ("shared", "0001_initial"),
+        ("taggit", "0003_taggeditem_add_unique_index"),
+        ("district", "0004_auto_20210209_1222"),
     ]
 
     operations = [
         migrations.AlterModelOptions(
-            name='districthomepage',
-            options={'verbose_name': 'Web místního sdružení'},
+            name="districthomepage",
+            options={"verbose_name": "Web místního sdružení"},
         ),
         migrations.RemoveField(
-            model_name='districthomepage',
-            name='content',
+            model_name="districthomepage",
+            name="content",
         ),
         migrations.AddField(
-            model_name='districtcontactpage',
-            name='text',
-            field=wagtail.core.fields.RichTextField(blank=True, verbose_name='Text'),
+            model_name="districtcontactpage",
+            name="text",
+            field=wagtail.core.fields.RichTextField(blank=True, verbose_name="Text"),
         ),
         migrations.AddField(
-            model_name='districthomepage',
-            name='articles_title',
-            field=models.CharField(default='Děje se', max_length=256, verbose_name='Nadpis článků'),
+            model_name="districthomepage",
+            name="articles_title",
+            field=models.CharField(
+                default="Děje se", max_length=256, verbose_name="Nadpis článků"
+            ),
             preserve_default=False,
         ),
         migrations.AddField(
-            model_name='districthomepage',
-            name='calendar_button_text',
-            field=models.CharField(default='Kalendář', max_length=256, verbose_name='Text tlačítka kalendáře'),
+            model_name="districthomepage",
+            name="calendar_button_text",
+            field=models.CharField(
+                default="Kalendář",
+                max_length=256,
+                verbose_name="Text tlačítka kalendáře",
+            ),
         ),
         migrations.AddField(
-            model_name='districthomepage',
-            name='calendar_embed_link',
-            field=models.URLField(default='', help_text="Mělo by začínat 'https://calendar.google.com/calendar/embed?...'", verbose_name='Odkaz na embed kalendář'),
+            model_name="districthomepage",
+            name="calendar_embed_link",
+            field=models.URLField(
+                default="",
+                help_text="Mělo by začínat 'https://calendar.google.com/calendar/embed?...'",
+                verbose_name="Odkaz na embed kalendář",
+            ),
             preserve_default=False,
         ),
         migrations.AddField(
-            model_name='districthomepage',
-            name='region_map_button_text',
-            field=models.CharField(default='Piráti v krajích', max_length=256, verbose_name='Text tlačítka mapy'),
+            model_name="districthomepage",
+            name="region_map_button_text",
+            field=models.CharField(
+                default="Piráti v krajích",
+                max_length=256,
+                verbose_name="Text tlačítka mapy",
+            ),
         ),
         migrations.AddField(
-            model_name='districthomepage',
-            name='subheader',
-            field=wagtail.core.fields.StreamField([('header', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(label='Titulek', required=True)), ('subtitle', wagtail.core.blocks.CharBlock(label='Podtitulek', required=False)), ('image', wagtail.images.blocks.ImageChooserBlock())]))], blank=True, verbose_name='Blok pod headerem'),
+            model_name="districthomepage",
+            name="subheader",
+            field=wagtail.core.fields.StreamField(
+                [
+                    (
+                        "header",
+                        wagtail.core.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.core.blocks.CharBlock(
+                                        label="Titulek", required=True
+                                    ),
+                                ),
+                                (
+                                    "subtitle",
+                                    wagtail.core.blocks.CharBlock(
+                                        label="Podtitulek", required=False
+                                    ),
+                                ),
+                                ("image", wagtail.images.blocks.ImageChooserBlock()),
+                            ]
+                        ),
+                    )
+                ],
+                blank=True,
+                verbose_name="Blok pod headerem",
+            ),
         ),
         migrations.AddField(
-            model_name='districthomepage',
-            name='twitter',
-            field=models.URLField(blank=True, null=True, verbose_name='Twitter URL'),
+            model_name="districthomepage",
+            name="twitter",
+            field=models.URLField(blank=True, null=True, verbose_name="Twitter URL"),
         ),
         migrations.AddField(
-            model_name='districthomepage',
-            name='youtube',
-            field=models.URLField(blank=True, null=True, verbose_name='YouTube URL'),
+            model_name="districthomepage",
+            name="youtube",
+            field=models.URLField(blank=True, null=True, verbose_name="YouTube URL"),
         ),
         migrations.AlterField(
-            model_name='districthomepage',
-            name='footperson_coord',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='district_footperson_coord', to='shared.person', verbose_name='Koordinátor'),
+            model_name="districthomepage",
+            name="footperson_coord",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.PROTECT,
+                related_name="district_footperson_coord",
+                to="shared.person",
+                verbose_name="Koordinátor",
+            ),
         ),
         migrations.AlterField(
-            model_name='districthomepage',
-            name='footperson_electman',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='district_footperson_electman', to='shared.person', verbose_name='Volební manažer'),
+            model_name="districthomepage",
+            name="footperson_electman",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.PROTECT,
+                related_name="district_footperson_electman",
+                to="shared.person",
+                verbose_name="Volební manažer",
+            ),
         ),
         migrations.AlterField(
-            model_name='districthomepage',
-            name='footperson_media',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='district_footperson_media', to='shared.person', verbose_name='Kontakt pro média'),
+            model_name="districthomepage",
+            name="footperson_media",
+            field=models.ForeignKey(
+                blank=True,
+                null=True,
+                on_delete=django.db.models.deletion.PROTECT,
+                related_name="district_footperson_media",
+                to="shared.person",
+                verbose_name="Kontakt pro média",
+            ),
         ),
         migrations.CreateModel(
-            name='DistrictProgramPage',
+            name="DistrictProgramPage",
             fields=[
-                ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
-                ('perex', models.TextField(blank=True, verbose_name='Perex')),
-                ('content', wagtail.core.fields.StreamField([('program_block', wagtail.core.blocks.StructBlock([('headline', wagtail.core.blocks.CharBlock(label='Titulek bloku', required=True)), ('perex', wagtail.core.blocks.TextBlock(label='Krátký text pod nadpisem', required=True)), ('person', district.blocks.PersonChooserBlock(label='Osoba', required=True)), ('completion_percentage', wagtail.core.blocks.IntegerBlock(label='Procento dokončení', required=True)), ('program_items', wagtail.core.blocks.ListBlock(wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(label='Název', required=True)), ('issue_link', wagtail.core.blocks.URLBlock(label='Odkaz na redmine', required=True)), ('completion_percentage', wagtail.core.blocks.IntegerBlock(label='Procento dokončení', required=True))])))]))], blank=True, verbose_name='obsah stránky')),
-                ('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')),
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                ("perex", models.TextField(blank=True, verbose_name="Perex")),
+                (
+                    "content",
+                    wagtail.core.fields.StreamField(
+                        [
+                            (
+                                "program_block",
+                                wagtail.core.blocks.StructBlock(
+                                    [
+                                        (
+                                            "headline",
+                                            wagtail.core.blocks.CharBlock(
+                                                label="Titulek bloku", required=True
+                                            ),
+                                        ),
+                                        (
+                                            "perex",
+                                            wagtail.core.blocks.TextBlock(
+                                                label="Krátký text pod nadpisem",
+                                                required=True,
+                                            ),
+                                        ),
+                                        (
+                                            "person",
+                                            district.blocks.PersonChooserBlock(
+                                                label="Osoba", required=True
+                                            ),
+                                        ),
+                                        (
+                                            "completion_percentage",
+                                            wagtail.core.blocks.IntegerBlock(
+                                                label="Procento dokončení",
+                                                required=True,
+                                            ),
+                                        ),
+                                        (
+                                            "program_items",
+                                            wagtail.core.blocks.ListBlock(
+                                                wagtail.core.blocks.StructBlock(
+                                                    [
+                                                        (
+                                                            "title",
+                                                            wagtail.core.blocks.CharBlock(
+                                                                label="Název",
+                                                                required=True,
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "issue_link",
+                                                            wagtail.core.blocks.URLBlock(
+                                                                label="Odkaz na redmine",
+                                                                required=True,
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "completion_percentage",
+                                                            wagtail.core.blocks.IntegerBlock(
+                                                                label="Procento dokončení",
+                                                                required=True,
+                                                            ),
+                                                        ),
+                                                    ]
+                                                )
+                                            ),
+                                        ),
+                                    ]
+                                ),
+                            )
+                        ],
+                        blank=True,
+                        verbose_name="obsah stránky",
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
             ],
             options={
-                'verbose_name': 'Program',
+                "verbose_name": "Program",
             },
-            bases=(shared.models.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
         ),
         migrations.CreateModel(
-            name='DistrictPersonTag',
+            name="DistrictPersonTag",
             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='district.districtpersonpage')),
-                ('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='district_districtpersontag_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="district.districtpersonpage",
+                    ),
+                ),
+                (
+                    "tag",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="district_districtpersontag_items",
+                        to="taggit.tag",
+                    ),
+                ),
             ],
             options={
-                'abstract': False,
+                "abstract": False,
             },
         ),
         migrations.AddField(
-            model_name='districtpersonpage',
-            name='groups',
-            field=modelcluster.contrib.taggit.ClusterTaggableManager(blank=True, help_text='Skupina pro zařazení na stránce Lidé', through='district.DistrictPersonTag', to='taggit.Tag', verbose_name='Tags'),
+            model_name="districtpersonpage",
+            name="groups",
+            field=modelcluster.contrib.taggit.ClusterTaggableManager(
+                blank=True,
+                help_text="Skupina pro zařazení na stránce Lidé",
+                through="district.DistrictPersonTag",
+                to="taggit.Tag",
+                verbose_name="Tags",
+            ),
         ),
     ]
diff --git a/district/models.py b/district/models.py
index 0d1b76fc2cbd6bb83eebb5a3432d52cea7770bf5..e5d49e4bcb60020905c058a34d0dda54d6815cbc 100644
--- a/district/models.py
+++ b/district/models.py
@@ -6,7 +6,6 @@ from django.utils.translation import gettext_lazy
 from modelcluster.contrib.taggit import ClusterTaggableManager
 from modelcluster.fields import ParentalKey
 from taggit.models import Tag, TaggedItemBase
-from uniweb.constants import RICH_TEXT_FEATURES
 from wagtail.admin.edit_handlers import (
     CommentPanel,
     FieldPanel,
@@ -19,6 +18,7 @@ from wagtail.core.models import Page
 from wagtailmetadata.models import MetadataPageMixin
 
 from shared.models import ArticleMixin, Person, SubpageMixin
+from uniweb.constants import RICH_TEXT_FEATURES
 
 from .blocks import HomepageHeaderBlock, ProgramBlock
 
diff --git a/region/blocks.py b/region/blocks.py
index 117fe9171ba5674babb82a731fad6babdc4ca44e..ec1d2dfa54324a4296107e9e6e9de505dc5a6515 100644
--- a/region/blocks.py
+++ b/region/blocks.py
@@ -1,8 +1,4 @@
-from wagtail.core.blocks import (
-    CharBlock,
-    StructBlock,
-    URLBlock,
-)
+from wagtail.core.blocks import CharBlock, StructBlock, URLBlock
 from wagtail.images.blocks import ImageChooserBlock
 
 
diff --git a/region/migrations/0001_initial.py b/region/migrations/0001_initial.py
index 5e59b9d1413fbc61fe8e8dc2f77c08653326063e..48c4c34c4435ee270a121c72802e060b78518b61 100644
--- a/region/migrations/0001_initial.py
+++ b/region/migrations/0001_initial.py
@@ -1,14 +1,15 @@
 # Generated by Django 3.2.8 on 2021-11-08 20:43
 
-from django.db import migrations, models
 import django.db.models.deletion
 import django.utils.timezone
 import modelcluster.contrib.taggit
 import modelcluster.fields
-import shared.models
 import wagtail.core.blocks
 import wagtail.core.fields
 import wagtailmetadata.models
+from django.db import migrations, models
+
+import shared.models
 
 
 class Migration(migrations.Migration):
@@ -16,125 +17,468 @@ class Migration(migrations.Migration):
     initial = True
 
     dependencies = [
-        ('wagtailcore', '0062_comment_models_and_pagesubscription'),
-        ('wagtailimages', '0023_add_choose_permissions'),
-        ('shared', '0001_initial'),
-        ('taggit', '0003_taggeditem_add_unique_index'),
+        ("wagtailcore", "0062_comment_models_and_pagesubscription"),
+        ("wagtailimages", "0023_add_choose_permissions"),
+        ("shared", "0001_initial"),
+        ("taggit", "0003_taggeditem_add_unique_index"),
     ]
 
     operations = [
         migrations.CreateModel(
-            name='RegionArticlePage',
+            name="RegionArticlePage",
             fields=[
-                ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
-                ('date', models.DateField(default=django.utils.timezone.now, verbose_name='datum')),
-                ('perex', models.TextField(verbose_name='perex')),
-                ('text', wagtail.core.fields.RichTextField(blank=True, verbose_name='článek')),
-                ('author', models.CharField(blank=True, max_length=250, null=True, verbose_name='autor')),
-                ('image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='wagtailimages.image', verbose_name='obrázek')),
-                ('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')),
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "date",
+                    models.DateField(
+                        default=django.utils.timezone.now, verbose_name="datum"
+                    ),
+                ),
+                ("perex", models.TextField(verbose_name="perex")),
+                (
+                    "text",
+                    wagtail.core.fields.RichTextField(
+                        blank=True, verbose_name="článek"
+                    ),
+                ),
+                (
+                    "author",
+                    models.CharField(
+                        blank=True, max_length=250, null=True, verbose_name="autor"
+                    ),
+                ),
+                (
+                    "image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.PROTECT,
+                        to="wagtailimages.image",
+                        verbose_name="obrázek",
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
             ],
             options={
-                'verbose_name': 'Aktualita',
+                "verbose_name": "Aktualita",
             },
-            bases=(shared.models.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
         ),
         migrations.CreateModel(
-            name='RegionTagsPage',
+            name="RegionTagsPage",
             fields=[
-                ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
-                ('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')),
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
             ],
             options={
-                'verbose_name': 'Stránka s tagy',
+                "verbose_name": "Stránka s tagy",
             },
-            bases=(shared.models.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
         ),
         migrations.CreateModel(
-            name='RegionPersonPage',
+            name="RegionPersonPage",
             fields=[
-                ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
-                ('perex', models.TextField(blank=True, verbose_name='Perex osoby')),
-                ('person', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='shared.person')),
-                ('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')),
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                ("perex", models.TextField(blank=True, verbose_name="Perex osoby")),
+                (
+                    "person",
+                    models.ForeignKey(
+                        null=True,
+                        on_delete=django.db.models.deletion.PROTECT,
+                        to="shared.person",
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
             ],
             options={
-                'verbose_name': 'Detail osoby',
+                "verbose_name": "Detail osoby",
             },
-            bases=(shared.models.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
         ),
         migrations.CreateModel(
-            name='RegionPeoplePage',
+            name="RegionPeoplePage",
             fields=[
-                ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
-                ('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')),
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
             ],
             options={
-                'verbose_name': 'Lidé',
+                "verbose_name": "Lidé",
             },
-            bases=(shared.models.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
         ),
         migrations.CreateModel(
-            name='RegionHomePage',
+            name="RegionHomePage",
             fields=[
-                ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
-                ('content', wagtail.core.fields.StreamField([('title', wagtail.core.blocks.CharBlock(icon='title', label='nadpis'))], blank=True, verbose_name='obsah stránky')),
-                ('facebook', models.URLField(blank=True, null=True, verbose_name='Facebook URL')),
-                ('forum', models.URLField(blank=True, null=True, verbose_name='Fórum URL')),
-                ('contact_email', models.EmailField(blank=True, max_length=250, verbose_name='kontaktni email')),
-                ('contact_phone', models.TextField(blank=True, max_length=250, verbose_name='kontaktni telefon')),
-                ('contact_newcomers', models.URLField(blank=True, null=True, verbose_name='URL pro zájemce o členství')),
-                ('donation_page', models.URLField(blank=True, null=True, verbose_name='URL pro příjem darů')),
-                ('matomo_id', models.IntegerField(blank=True, null=True, verbose_name='Matomo ID pro sledování návštěvnosti')),
-                ('footperson_coord', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='region_footperson_coord', to='shared.person', verbose_name='Koordinátor')),
-                ('footperson_electman', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='region_footperson_electman', to='shared.person', verbose_name='Volební manažer')),
-                ('footperson_media', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='region_footperson_media', to='shared.person', verbose_name='Kontakt pro média')),
-                ('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')),
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "content",
+                    wagtail.core.fields.StreamField(
+                        [
+                            (
+                                "title",
+                                wagtail.core.blocks.CharBlock(
+                                    icon="title", label="nadpis"
+                                ),
+                            )
+                        ],
+                        blank=True,
+                        verbose_name="obsah stránky",
+                    ),
+                ),
+                (
+                    "facebook",
+                    models.URLField(blank=True, null=True, verbose_name="Facebook URL"),
+                ),
+                (
+                    "forum",
+                    models.URLField(blank=True, null=True, verbose_name="Fórum URL"),
+                ),
+                (
+                    "contact_email",
+                    models.EmailField(
+                        blank=True, max_length=250, verbose_name="kontaktni email"
+                    ),
+                ),
+                (
+                    "contact_phone",
+                    models.TextField(
+                        blank=True, max_length=250, verbose_name="kontaktni telefon"
+                    ),
+                ),
+                (
+                    "contact_newcomers",
+                    models.URLField(
+                        blank=True, null=True, verbose_name="URL pro zájemce o členství"
+                    ),
+                ),
+                (
+                    "donation_page",
+                    models.URLField(
+                        blank=True, null=True, verbose_name="URL pro příjem darů"
+                    ),
+                ),
+                (
+                    "matomo_id",
+                    models.IntegerField(
+                        blank=True,
+                        null=True,
+                        verbose_name="Matomo ID pro sledování návštěvnosti",
+                    ),
+                ),
+                (
+                    "footperson_coord",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.PROTECT,
+                        related_name="region_footperson_coord",
+                        to="shared.person",
+                        verbose_name="Koordinátor",
+                    ),
+                ),
+                (
+                    "footperson_electman",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.PROTECT,
+                        related_name="region_footperson_electman",
+                        to="shared.person",
+                        verbose_name="Volební manažer",
+                    ),
+                ),
+                (
+                    "footperson_media",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.PROTECT,
+                        related_name="region_footperson_media",
+                        to="shared.person",
+                        verbose_name="Kontakt pro média",
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
             ],
             options={
-                'verbose_name': 'Web regionálního sdružení',
+                "verbose_name": "Web regionálního sdružení",
             },
-            bases=(wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
+            bases=(
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
         ),
         migrations.CreateModel(
-            name='RegionContactPage',
+            name="RegionContactPage",
             fields=[
-                ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
-                ('contact_people', wagtail.core.fields.StreamField([('item', wagtail.core.blocks.StructBlock([('name', wagtail.core.blocks.CharBlock(label='Role')), ('person', wagtail.core.blocks.PageChooserBlock(label='Osoba', page_type=['region.RegionPersonPage']))]))], blank=True, verbose_name='Kontakty')),
-                ('text', wagtail.core.fields.RichTextField(blank=True, verbose_name='Text')),
-                ('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')),
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "contact_people",
+                    wagtail.core.fields.StreamField(
+                        [
+                            (
+                                "item",
+                                wagtail.core.blocks.StructBlock(
+                                    [
+                                        (
+                                            "name",
+                                            wagtail.core.blocks.CharBlock(label="Role"),
+                                        ),
+                                        (
+                                            "person",
+                                            wagtail.core.blocks.PageChooserBlock(
+                                                label="Osoba",
+                                                page_type=["region.RegionPersonPage"],
+                                            ),
+                                        ),
+                                    ]
+                                ),
+                            )
+                        ],
+                        blank=True,
+                        verbose_name="Kontakty",
+                    ),
+                ),
+                (
+                    "text",
+                    wagtail.core.fields.RichTextField(blank=True, verbose_name="Text"),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
             ],
             options={
-                'verbose_name': 'Kontakty',
+                "verbose_name": "Kontakty",
             },
-            bases=(shared.models.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
         ),
         migrations.CreateModel(
-            name='RegionArticleTag',
+            name="RegionArticleTag",
             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='region.regionarticlepage')),
-                ('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='region_regionarticletag_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="region.regionarticlepage",
+                    ),
+                ),
+                (
+                    "tag",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        related_name="region_regionarticletag_items",
+                        to="taggit.tag",
+                    ),
+                ),
             ],
             options={
-                'abstract': False,
+                "abstract": False,
             },
         ),
         migrations.CreateModel(
-            name='RegionArticlesPage',
+            name="RegionArticlesPage",
             fields=[
-                ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')),
-                ('max_items', models.IntegerField(default=12, verbose_name='Počet článků na stránce')),
-                ('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')),
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "max_items",
+                    models.IntegerField(
+                        default=12, verbose_name="Počet článků na stránce"
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
             ],
             options={
-                'verbose_name': 'Aktuality',
+                "verbose_name": "Aktuality",
             },
-            bases=(shared.models.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
         ),
         migrations.AddField(
-            model_name='regionarticlepage',
-            name='tags',
-            field=modelcluster.contrib.taggit.ClusterTaggableManager(blank=True, help_text='A comma-separated list of tags.', through='region.RegionArticleTag', to='taggit.Tag', verbose_name='Tags'),
+            model_name="regionarticlepage",
+            name="tags",
+            field=modelcluster.contrib.taggit.ClusterTaggableManager(
+                blank=True,
+                help_text="A comma-separated list of tags.",
+                through="region.RegionArticleTag",
+                to="taggit.Tag",
+                verbose_name="Tags",
+            ),
         ),
     ]
diff --git a/region/models.py b/region/models.py
index e781bffd45d5b8049f70e5cefa918cbffa183d9e..dfeda9b4e021ac5d81d9f2f8ccd0e0f93f92c3bd 100644
--- a/region/models.py
+++ b/region/models.py
@@ -6,7 +6,6 @@ from django.utils.translation import gettext_lazy
 from modelcluster.contrib.taggit import ClusterTaggableManager
 from modelcluster.fields import ParentalKey
 from taggit.models import TaggedItemBase
-from uniweb.constants import RICH_TEXT_FEATURES
 from wagtail.admin.edit_handlers import (
     CommentPanel,
     FieldPanel,
@@ -19,7 +18,7 @@ from wagtail.core.models import Page
 from wagtailmetadata.models import MetadataPageMixin
 
 from shared.models import ArticleMixin, Person, SubpageMixin
-
+from uniweb.constants import RICH_TEXT_FEATURES
 
 # TODO zatím prakticky shodné s district.models - až bude hotové, tak společné věci přenést do shared