From bdce3628a3c2caf9380e597fc0408d02741ed7f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Bedna=C5=99=C3=ADk?= <jan.bednarik@gmail.com>
Date: Fri, 8 Apr 2022 01:23:57 +0200
Subject: [PATCH] Refactor promote panels and help

---
 czech_inspirational/models.py     |  22 ++++-
 district/models.py                |  51 ++++++++--
 districts/models.py               |   4 +-
 donate/models.py                  | 154 ++++++------------------------
 elections2021/models.py           |  70 +++++++++-----
 green_deal/models.py              |   6 +-
 region/models.py                  |  66 +++++++++----
 regulace_konopi/models.py         |  10 +-
 senat_campaign/models.py          |  20 ++--
 senate/models.py                  |   4 +-
 shared/models.py                  |   9 +-
 shared/utils.py                   |  31 ++++++
 tuning/{help.py => admin_help.py} |   0
 uniweb/models.py                  |  86 +++--------------
 14 files changed, 258 insertions(+), 275 deletions(-)
 rename tuning/{help.py => admin_help.py} (100%)

diff --git a/czech_inspirational/models.py b/czech_inspirational/models.py
index d23c5679..51c81fc7 100644
--- a/czech_inspirational/models.py
+++ b/czech_inspirational/models.py
@@ -17,7 +17,7 @@ from wagtailmetadata.models import MetadataPageMixin
 
 from shared.models import SubpageMixin
 from shared.utils import subscribe_to_newsletter
-from tuning import help
+from tuning import admin_help
 from uniweb.constants import RICH_TEXT_FEATURES
 
 
@@ -43,7 +43,7 @@ class CzechInspirationalHomePage(Page, MetadataPageMixin):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
+                HelpPanel(admin_help.build(admin_help.IMPORTANT_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -125,7 +125,11 @@ class CzechInspirationalChaptersPage(Page, SubpageMixin, MetadataPageMixin):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
+                HelpPanel(
+                    admin_help.build(
+                        admin_help.NO_SEO_TITLE, admin_help.NO_SEARCH_IMAGE
+                    )
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -188,7 +192,11 @@ class CzechInspirationalChapterPage(Page, SubpageMixin, MetadataPageMixin):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
+                HelpPanel(
+                    admin_help.build(
+                        admin_help.NO_SEO_TITLE, admin_help.NO_SEARCH_IMAGE
+                    )
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -242,7 +250,11 @@ class CzechInspirationalDownloadPage(Page, SubpageMixin, MetadataPageMixin):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
+                HelpPanel(
+                    admin_help.build(
+                        admin_help.NO_SEO_TITLE, admin_help.NO_SEARCH_IMAGE
+                    )
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
diff --git a/district/models.py b/district/models.py
index a98927ec..9c910866 100644
--- a/district/models.py
+++ b/district/models.py
@@ -9,7 +9,6 @@ from modelcluster.contrib.taggit import ClusterTaggableManager
 from modelcluster.fields import ParentalKey
 from taggit.models import Tag, TaggedItemBase
 from wagtail.admin.edit_handlers import (
-    CommentPanel,
     FieldPanel,
     HelpPanel,
     MultiFieldPanel,
@@ -28,6 +27,8 @@ from wagtailmetadata.models import MetadataPageMixin
 
 from calendar_utils.models import CalendarMixin
 from shared.models import ArticleMixin, MenuMixin, SubpageMixin
+from shared.utils import make_promote_panels
+from tuning import admin_help
 from uniweb.constants import RICH_TEXT_FEATURES
 
 from . import blocks
@@ -182,6 +183,8 @@ class DistrictHomePage(MenuMixin, MetadataPageMixin, CalendarMixin, Page):
         FieldPanel("show_calendar_on_hp"),
     ]
 
+    promote_panels = make_promote_panels(admin_help.build(admin_help.IMPORTANT_TITLE))
+
     settings_panels = [
         ImageChooserPanel("custom_logo"),
         FieldPanel("matomo_id"),
@@ -229,14 +232,14 @@ class DistrictHomePage(MenuMixin, MetadataPageMixin, CalendarMixin, Page):
             gettext_lazy("Nastavení lišty s kalendářem a mapou"),
         ),
         ImageChooserPanel("fallback_image"),
-        CommentPanel(),
     ]
 
     ### EDIT HANDLERS
+
     edit_handler = TabbedInterface(
         [
             ObjectList(content_panels, heading="Obsah"),
-            ObjectList(MetadataPageMixin.promote_panels, heading="Propagovat"),
+            ObjectList(promote_panels, heading="Propagovat"),
             ObjectList(settings_panels, heading="Nastavení"),
             ObjectList(MenuMixin.menu_panels, heading="Menu"),
         ]
@@ -341,6 +344,8 @@ class DistrictArticlePage(ArticleMixin, SubpageMixin, MetadataPageMixin, Page):
         FieldPanel("tags"),
     ]
 
+    promote_panels = make_promote_panels()
+
     ### RELATIONS
 
     parent_page_types = ["district.DistrictArticlesPage"]
@@ -376,7 +381,7 @@ class DistrictArticlesPage(SubpageMixin, MetadataPageMixin, Page):
         FieldPanel("max_items"),
     ]
 
-    settings_panels = [CommentPanel()]
+    promote_panels = make_promote_panels()
 
     import_panels = [
         MultiFieldPanel(
@@ -405,7 +410,7 @@ class DistrictArticlesPage(SubpageMixin, MetadataPageMixin, Page):
     edit_handler = TabbedInterface(
         [
             ObjectList(content_panels, heading="Obsah"),
-            ObjectList(settings_panels, heading="Nastavení"),
+            ObjectList(promote_panels, heading="Propagovat"),
             ObjectList(import_panels, heading="Import"),
         ]
     )
@@ -451,6 +456,10 @@ class DistrictContactPage(SubpageMixin, MetadataPageMixin, Page):
         FieldPanel("text"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["district.DistrictHomePage"]
@@ -465,7 +474,9 @@ class DistrictContactPage(SubpageMixin, MetadataPageMixin, Page):
 class DistrictTagsPage(SubpageMixin, MetadataPageMixin, Page):
     ### PANELS
 
-    settings_panels = [CommentPanel()]
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
 
     ### RELATIONS
 
@@ -695,7 +706,9 @@ class DistrictPeoplePage(SubpageMixin, MetadataPageMixin, Page):
 
     content_panels = Page.content_panels + [StreamFieldPanel("content")]
 
-    settings_panels = [CommentPanel()]
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
 
     ### RELATIONS
 
@@ -714,9 +727,11 @@ class DistrictElectionBasePage(SubpageMixin, MetadataPageMixin, Page):
 
     ### PANELS
 
-    content_panels = Page.content_panels + [
-        FieldPanel("text"),
-    ]
+    content_panels = Page.content_panels + [FieldPanel("text")]
+
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
 
     ### RELATIONS
 
@@ -840,6 +855,10 @@ class DistrictProgramPage(SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["district.DistrictHomePage"]
@@ -889,6 +908,10 @@ class DistrictCenterPage(CalendarMixin, SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("sidebar_content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["district.DistrictHomePage"]
@@ -940,6 +963,10 @@ class DistrictCrossroadPage(SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["district.DistrictHomePage"]
@@ -984,6 +1011,10 @@ class DistrictCustomPage(SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["district.DistrictHomePage", "district.DistrictCrossroadPage"]
diff --git a/districts/models.py b/districts/models.py
index 761e64c1..1d21e97e 100644
--- a/districts/models.py
+++ b/districts/models.py
@@ -10,7 +10,7 @@ from wagtail.core.models import Page
 from wagtail.images.edit_handlers import ImageChooserPanel
 from wagtailmetadata.models import MetadataPageMixin
 
-from tuning import help
+from tuning import admin_help
 
 
 class DistrictsHomePage(MetadataPageMixin, Page):
@@ -28,7 +28,7 @@ class DistrictsHomePage(MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
+                HelpPanel(admin_help.build(admin_help.IMPORTANT_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
diff --git a/donate/models.py b/donate/models.py
index ab3aee8e..f340fc05 100644
--- a/donate/models.py
+++ b/donate/models.py
@@ -6,18 +6,14 @@ from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
 from django.db import models
 from django.http import HttpResponseRedirect
 from django.shortcuts import redirect
-from django.utils.translation import gettext_lazy
 from modelcluster.fields import ParentalKey
 from wagtail.admin.edit_handlers import (
-    CommentPanel,
     FieldPanel,
-    HelpPanel,
     InlinePanel,
     MultiFieldPanel,
     PublishingPanel,
     StreamFieldPanel,
 )
-from wagtail.core import blocks
 from wagtail.core.fields import RichTextField, StreamField
 from wagtail.core.models import Orderable, Page
 from wagtail.images.blocks import ImageChooserBlock
@@ -25,8 +21,8 @@ from wagtail.images.edit_handlers import ImageChooserPanel
 from wagtailmetadata.models import MetadataPageMixin
 
 from shared.models import SubpageMixin
-from shared.utils import get_subpage_url
-from tuning import help
+from shared.utils import get_subpage_url, make_promote_panels
+from tuning import admin_help
 
 from .forms import DonateForm
 from .utils import get_donated_amount_from_api
@@ -138,17 +134,7 @@ class DonateHomePage(DonateFormMixin, DonateFormAmountsMixin, Page, MetadataPage
         ),
     ]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels(admin_help.build(admin_help.IMPORTANT_TITLE))
 
     settings_panels = [
         MultiFieldPanel(
@@ -171,7 +157,6 @@ class DonateHomePage(DonateFormMixin, DonateFormAmountsMixin, Page, MetadataPage
             ],
             "nastavení darů",
         ),
-        CommentPanel(),
     ]
 
     ### RELATIONS
@@ -235,20 +220,9 @@ class DonateHomePage(DonateFormMixin, DonateFormAmountsMixin, Page, MetadataPage
 class DonateRegionIndexPage(Page, SubpageMixin, MetadataPageMixin):
     ### PANELS
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels()
 
-    settings_panels = [CommentPanel()]
+    settings_panels = []
 
     ### RELATIONS
 
@@ -284,24 +258,13 @@ class DonateRegionPage(
         FieldPanel("body", classname="full"),
     ]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(
-                    help.build(
-                        "Pokud není zadán <strong>Titulek stránky</strong>, použije "
-                        "se <strong>Hlavní nadpis</strong> (tab obsah).",
-                        help.NO_SEARCH_IMAGE,
-                    )
-                ),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels(
+        admin_help.build(
+            "Pokud není zadán <strong>Titulek stránky</strong>, použije "
+            "se <strong>Hlavní nadpis</strong> (tab obsah).",
+            admin_help.NO_SEARCH_IMAGE,
+        )
+    )
 
     settings_panels = [
         MultiFieldPanel(
@@ -314,7 +277,6 @@ class DonateRegionPage(
             ],
             "nastavení darů",
         ),
-        CommentPanel(),
     ]
 
     ### RELATIONS
@@ -345,20 +307,9 @@ class DonateRegionPage(
 class DonateProjectIndexPage(Page, SubpageMixin, MetadataPageMixin):
     ### PANELS
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels()
 
-    settings_panels = [CommentPanel()]
+    settings_panels = []
 
     ### RELATIONS
 
@@ -449,23 +400,14 @@ class DonateProjectPage(
         StreamFieldPanel("gallery"),
     ]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                HelpPanel(
-                    help.build(
-                        "Pokud není zadán <strong>Titulek stránky</strong>, použije "
-                        "se „Podpoř projekt <strong>Název</strong>“ (tab obsah).",
-                        help.NO_DESCRIPTION_USE_PEREX,
-                    )
-                ),
-            ],
-            gettext_lazy("Common page configuration"),
+    promote_panels = make_promote_panels(
+        admin_help.build(
+            "Pokud není zadán <strong>Titulek stránky</strong>, použije "
+            "se „Podpoř projekt <strong>Název</strong>“ (tab obsah).",
+            admin_help.NO_DESCRIPTION_USE_PEREX,
         ),
-    ]
+        search_image=False,
+    )
 
     settings_panels = [
         PublishingPanel(),
@@ -483,7 +425,6 @@ class DonateProjectPage(
             "nastavení darů",
         ),
         FieldPanel("coalition_design"),
-        CommentPanel(),
     ]
 
     ### RELATIONS
@@ -561,24 +502,11 @@ class DonateTextPage(Page, SubpageMixin, MetadataPageMixin):
 
     ### PANELS
 
-    content_panels = Page.content_panels + [
-        FieldPanel("body", classname="full"),
-    ]
+    content_panels = Page.content_panels + [FieldPanel("body", classname="full")]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels()
 
-    settings_panels = [CommentPanel()]
+    settings_panels = []
 
     ### RELATIONS
 
@@ -601,24 +529,11 @@ class DonateInfoPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin):
 
     ### PANELS
 
-    content_panels = Page.content_panels + [
-        FieldPanel("body", classname="full"),
-    ]
+    content_panels = Page.content_panels + [FieldPanel("body", classname="full")]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels()
 
-    settings_panels = [CommentPanel()]
+    settings_panels = []
 
     ### RELATIONS
 
@@ -680,20 +595,9 @@ class DonateTargetedDonationsPage(
         MultiFieldPanel([InlinePanel("targeted_donations")], "adresné dary"),
     ]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels()
 
-    settings_panels = [CommentPanel()]
+    settings_panels = []
 
     ### RELATIONS
 
diff --git a/elections2021/models.py b/elections2021/models.py
index cb5c5b01..70a887db 100644
--- a/elections2021/models.py
+++ b/elections2021/models.py
@@ -39,7 +39,7 @@ from wagtailmetadata.models import MetadataPageMixin
 from calendar_utils.models import CalendarMixin
 from shared.models import ArticleMixin, SubpageMixin
 from shared.utils import get_subpage_url, subscribe_to_newsletter
-from tuning import help
+from tuning import admin_help
 
 from .constants import (
     AGE_30_49,
@@ -304,7 +304,7 @@ class Elections2021HomePage(MetadataPageMixin, RoutablePageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
+                HelpPanel(admin_help.build(admin_help.IMPORTANT_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -564,7 +564,11 @@ class Elections2021ArticlePage(ArticleMixin, SubpageMixin, MetadataPageMixin, Pa
                 FieldPanel("slug"),
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_DESCRIPTION_USE_PEREX)),
+                HelpPanel(
+                    admin_help.build(
+                        admin_help.NO_SEO_TITLE, admin_help.NO_DESCRIPTION_USE_PEREX
+                    )
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -628,7 +632,9 @@ class Elections2021ArticlesPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -686,7 +692,9 @@ class Elections2021CandidatesListPage(
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -764,7 +772,9 @@ class Elections2021CandidatesMapPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -1163,7 +1173,9 @@ class Elections2021ProgramPage(
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -1754,7 +1766,7 @@ class Elections2021ProgramPointPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -1985,7 +1997,9 @@ class Elections2021QuestionsPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2043,7 +2057,7 @@ class Elections2021ProgramAppPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2133,7 +2147,7 @@ class Elections2021TextPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2165,7 +2179,7 @@ class Elections2021StrategicListPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2237,7 +2251,7 @@ class Elections2021StrategicPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2276,7 +2290,7 @@ class Elections2021MythsPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2343,7 +2357,11 @@ class Elections2021MythPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("slug"),
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_DESCRIPTION_USE_PEREX)),
+                HelpPanel(
+                    admin_help.build(
+                        admin_help.NO_SEO_TITLE, admin_help.NO_DESCRIPTION_USE_PEREX
+                    )
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2435,7 +2453,7 @@ class Elections2021DownloadsPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2507,7 +2525,9 @@ class Elections2021GovernmentTeamPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2555,7 +2575,9 @@ class Elections2021CalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin,
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2671,7 +2693,9 @@ class Elections2021BannerListPage(
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2869,7 +2893,9 @@ class Elections2021MapPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)),
+                HelpPanel(
+                    admin_help.build(admin_help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -2949,7 +2975,7 @@ class Elections2021ProgramInNutshellPage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -3163,7 +3189,7 @@ class Elections2021GoingToVotePage(SubpageMixin, MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE)),
+                HelpPanel(admin_help.build(admin_help.NO_SEO_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
diff --git a/green_deal/models.py b/green_deal/models.py
index 03e9cc96..d4e05d8f 100644
--- a/green_deal/models.py
+++ b/green_deal/models.py
@@ -15,7 +15,7 @@ from wagtail.images.blocks import ImageChooserBlock
 from wagtail.images.edit_handlers import ImageChooserPanel
 from wagtailmetadata.models import MetadataPageMixin
 
-from tuning import help
+from tuning import admin_help
 
 RICH_TEXT_FEATURES = [
     "h2",
@@ -116,7 +116,7 @@ class GreenDealHomePage(MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
+                HelpPanel(admin_help.build(admin_help.IMPORTANT_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -169,7 +169,7 @@ class GreenDealSubPage(Page, MetadataPageMixin):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
+                HelpPanel(admin_help.build(admin_help.IMPORTANT_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
diff --git a/region/models.py b/region/models.py
index d75865e0..02a3d8a7 100644
--- a/region/models.py
+++ b/region/models.py
@@ -9,7 +9,6 @@ from modelcluster.contrib.taggit import ClusterTaggableManager
 from modelcluster.fields import ParentalKey
 from taggit.models import Tag, TaggedItemBase
 from wagtail.admin.edit_handlers import (
-    CommentPanel,
     FieldPanel,
     HelpPanel,
     MultiFieldPanel,
@@ -28,6 +27,8 @@ from wagtailmetadata.models import MetadataPageMixin
 
 from calendar_utils.models import CalendarMixin
 from shared.models import ArticleMixin, MenuMixin, SubpageMixin
+from shared.utils import make_promote_panels
+from tuning import admin_help
 from uniweb.constants import RICH_TEXT_FEATURES
 
 from . import blocks
@@ -182,17 +183,7 @@ class RegionHomePage(MenuMixin, MetadataPageMixin, CalendarMixin, Page):
         FieldPanel("show_calendar_on_hp"),
     ]
 
-    promote_panels = MetadataPageMixin.promote_panels + [
-        MultiFieldPanel(
-            [
-                FieldPanel("facebook"),
-                FieldPanel("forum"),
-                FieldPanel("twitter"),
-                FieldPanel("youtube"),
-            ],
-            gettext_lazy("Social page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels(admin_help.build(admin_help.IMPORTANT_TITLE))
 
     settings_panels = [
         ImageChooserPanel("custom_logo"),
@@ -233,14 +224,14 @@ class RegionHomePage(MenuMixin, MetadataPageMixin, CalendarMixin, Page):
             gettext_lazy("Nastavení lišty s kalendářem a mapou"),
         ),
         ImageChooserPanel("fallback_image"),
-        CommentPanel(),
     ]
 
     ### EDIT HANDLERS
+
     edit_handler = TabbedInterface(
         [
             ObjectList(content_panels, heading="Obsah"),
-            ObjectList(MetadataPageMixin.promote_panels, heading="Propagovat"),
+            ObjectList(promote_panels, heading="Propagovat"),
             ObjectList(settings_panels, heading="Nastavení"),
             ObjectList(MenuMixin.menu_panels, heading="Menu"),
         ]
@@ -343,6 +334,8 @@ class RegionArticlePage(ArticleMixin, SubpageMixin, MetadataPageMixin, Page):
         FieldPanel("tags"),
     ]
 
+    promote_panels = make_promote_panels()
+
     ### RELATIONS
 
     parent_page_types = ["region.RegionArticlesPage"]
@@ -378,7 +371,7 @@ class RegionArticlesPage(SubpageMixin, MetadataPageMixin, Page):
         FieldPanel("max_items"),
     ]
 
-    settings_panels = [CommentPanel()]
+    promote_panels = make_promote_panels()
 
     import_panels = [
         MultiFieldPanel(
@@ -407,7 +400,7 @@ class RegionArticlesPage(SubpageMixin, MetadataPageMixin, Page):
     edit_handler = TabbedInterface(
         [
             ObjectList(content_panels, heading="Obsah"),
-            ObjectList(settings_panels, heading="Nastavení"),
+            ObjectList(promote_panels, heading="Propagovat"),
             ObjectList(import_panels, heading="Import"),
         ]
     )
@@ -450,6 +443,10 @@ class RegionContactPage(SubpageMixin, MetadataPageMixin, Page):
         FieldPanel("text"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["region.RegionHomePage"]
@@ -464,7 +461,9 @@ class RegionContactPage(SubpageMixin, MetadataPageMixin, Page):
 class RegionTagsPage(SubpageMixin, MetadataPageMixin, Page):
     ### PANELS
 
-    settings_panels = [CommentPanel()]
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
 
     ### RELATIONS
 
@@ -691,7 +690,9 @@ class RegionPeoplePage(SubpageMixin, MetadataPageMixin, Page):
 
     content_panels = Page.content_panels + [StreamFieldPanel("content")]
 
-    settings_panels = [CommentPanel()]
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
 
     ### RELATIONS
 
@@ -706,13 +707,16 @@ class RegionPeoplePage(SubpageMixin, MetadataPageMixin, Page):
 
 class RegionElectionBasePage(SubpageMixin, MetadataPageMixin, Page):
     ### FIELDS
+
     text = RichTextField("text", blank=True, features=RICH_TEXT_FEATURES)
 
     ### PANELS
 
-    content_panels = Page.content_panels + [
-        FieldPanel("text"),
-    ]
+    content_panels = Page.content_panels + [FieldPanel("text")]
+
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
 
     ### RELATIONS
 
@@ -781,6 +785,10 @@ class RegionElectionPage(SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["region.RegionHomePage"]
@@ -834,6 +842,10 @@ class RegionProgramPage(SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["region.RegionHomePage"]
@@ -882,6 +894,10 @@ class RegionCenterPage(CalendarMixin, SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("sidebar_content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["region.RegionHomePage"]
@@ -933,6 +949,10 @@ class RegionCrossroadPage(SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["region.RegionHomePage"]
@@ -977,6 +997,10 @@ class RegionCustomPage(SubpageMixin, MetadataPageMixin, Page):
         StreamFieldPanel("content"),
     ]
 
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
     ### RELATIONS
 
     parent_page_types = ["region.RegionHomePage", "region.RegionCrossroadPage"]
diff --git a/regulace_konopi/models.py b/regulace_konopi/models.py
index 7c1f01ec..988f9bdb 100644
--- a/regulace_konopi/models.py
+++ b/regulace_konopi/models.py
@@ -14,7 +14,7 @@ from wagtail.images.blocks import ImageChooserBlock
 from wagtail.images.edit_handlers import ImageChooserPanel
 from wagtailmetadata.models import MetadataPageMixin
 
-from tuning import help
+from tuning import admin_help
 
 SUPPORT_CHOICES = ((1, "Pro"), (0, "Proti"), (-1, "Nevíme"))
 
@@ -129,7 +129,7 @@ class RegkonHomePage(MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
+                HelpPanel(admin_help.build(admin_help.IMPORTANT_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -222,7 +222,11 @@ class RegkonSubPage(Page, MetadataPageMixin):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
+                HelpPanel(
+                    admin_help.build(
+                        admin_help.NO_SEO_TITLE, admin_help.NO_SEARCH_IMAGE
+                    )
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
diff --git a/senat_campaign/models.py b/senat_campaign/models.py
index f670187b..71812244 100644
--- a/senat_campaign/models.py
+++ b/senat_campaign/models.py
@@ -19,7 +19,7 @@ from wagtailmetadata.models import MetadataPageMixin
 
 from calendar_utils.models import CalendarMixin
 from shared.models import SubpageMixin
-from tuning import help
+from tuning import admin_help
 
 HELP_COMBINED_TITLE = (
     "Pokud není zadán <strong>Titulek stránky</strong>, použije se "
@@ -160,8 +160,8 @@ class SenatCampaignHomePage(Page, MetadataPageMixin, CalendarMixin):
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
                 HelpPanel(
-                    help.build(
-                        help.IMPORTANT_TITLE,
+                    admin_help.build(
+                        admin_help.IMPORTANT_TITLE,
                         "Pokud není zadán <strong>Search image</strong>, použije se úvodní foto kandidáta.",
                     )
                 ),
@@ -292,7 +292,9 @@ class SenatCampaignNewsIndexPage(Page, SubpageMixin, MetaMixin, MetadataPageMixi
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(HELP_COMBINED_TITLE, help.NO_SEARCH_IMAGE)),
+                HelpPanel(
+                    admin_help.build(HELP_COMBINED_TITLE, admin_help.NO_SEARCH_IMAGE)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -364,7 +366,7 @@ class SenatCampaignNewsPage(Page, SubpageMixin, MetaMixin, MetadataPageMixin):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 HelpPanel(
-                    help.build(
+                    admin_help.build(
                         HELP_COMBINED_TITLE,
                         "Pokud není zadán <strong>Popis vyhledávání</strong>, použije se prvních 150 znaků <strong>Perexu</strong> (tab obsah).",
                     )
@@ -454,7 +456,9 @@ class SenatCampaignProgramPage(Page, SubpageMixin, MetaMixin, MetadataPageMixin)
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(HELP_COMBINED_TITLE, help.NO_SEARCH_IMAGE)),
+                HelpPanel(
+                    admin_help.build(HELP_COMBINED_TITLE, admin_help.NO_SEARCH_IMAGE)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
@@ -494,7 +498,9 @@ class SenatCampaignCookiesPage(Page, SubpageMixin, MetaMixin, MetadataPageMixin)
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(HELP_COMBINED_TITLE, help.NO_SEARCH_IMAGE)),
+                HelpPanel(
+                    admin_help.build(HELP_COMBINED_TITLE, admin_help.NO_SEARCH_IMAGE)
+                ),
             ],
             gettext_lazy("Common page configuration"),
         ),
diff --git a/senate/models.py b/senate/models.py
index 7aaad81f..f7ad86f4 100644
--- a/senate/models.py
+++ b/senate/models.py
@@ -14,7 +14,7 @@ from wagtail.images.blocks import ImageChooserBlock
 from wagtail.images.edit_handlers import ImageChooserPanel
 from wagtailmetadata.models import MetadataPageMixin
 
-from tuning import help
+from tuning import admin_help
 
 
 class PersonBlock(blocks.StructBlock):
@@ -61,7 +61,7 @@ class SenateHomePage(MetadataPageMixin, Page):
                 FieldPanel("seo_title"),
                 FieldPanel("search_description"),
                 ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
+                HelpPanel(admin_help.build(admin_help.IMPORTANT_TITLE)),
             ],
             gettext_lazy("Common page configuration"),
         ),
diff --git a/shared/models.py b/shared/models.py
index 847f5854..a145e548 100644
--- a/shared/models.py
+++ b/shared/models.py
@@ -1,6 +1,11 @@
 from django.db import models
 from django.utils import timezone
-from wagtail.admin.edit_handlers import FieldPanel, MultiFieldPanel, StreamFieldPanel
+from wagtail.admin.edit_handlers import (
+    FieldPanel,
+    MultiFieldPanel,
+    PublishingPanel,
+    StreamFieldPanel,
+)
 from wagtail.core.blocks import RichTextBlock
 from wagtail.core.fields import StreamField
 from wagtail.core.models import Page
@@ -79,6 +84,8 @@ class ArticleMixin(models.Model):
         ImageChooserPanel("image"),
     ]
 
+    settings_panels = [PublishingPanel()]
+
     class Meta:
         abstract = True
 
diff --git a/shared/utils.py b/shared/utils.py
index 7ecc0e5f..44972b09 100644
--- a/shared/utils.py
+++ b/shared/utils.py
@@ -3,7 +3,17 @@ import logging
 
 import requests
 from django.conf import settings
+from django.utils.translation import gettext_lazy
+from wagtail.admin.edit_handlers import (
+    CommentPanel,
+    FieldPanel,
+    HelpPanel,
+    MultiFieldPanel,
+)
 from wagtail.core.models import Page
+from wagtail.images.edit_handlers import ImageChooserPanel
+
+from tuning import admin_help
 
 logger = logging.getLogger()
 
@@ -15,6 +25,27 @@ def get_subpage_url(page, dest_page_type):
         return "#"
 
 
+def make_promote_panels(
+    help_content=None, *, seo_title=True, search_description=True, search_image=True
+):
+    if help_content is None:
+        help_content = admin_help.build(
+            admin_help.NO_SEO_TITLE, admin_help.NO_SEARCH_IMAGE
+        )
+
+    panels = [FieldPanel("slug")]
+    if seo_title:
+        panels.append(FieldPanel("seo_title"))
+    if search_description:
+        panels.append(FieldPanel("search_description"))
+    if search_image:
+        panels.append(ImageChooserPanel("search_image"))
+    panels.append(HelpPanel(help_content))
+    panels.append(CommentPanel())
+
+    return [MultiFieldPanel(panels, gettext_lazy("Common page configuration"))]
+
+
 def subscribe_to_newsletter(email, news_id, source):
     payload = {
         "email": email,
diff --git a/tuning/help.py b/tuning/admin_help.py
similarity index 100%
rename from tuning/help.py
rename to tuning/admin_help.py
diff --git a/uniweb/models.py b/uniweb/models.py
index 37b1bcd4..f4dc030c 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -9,7 +9,6 @@ from taggit.models import TaggedItemBase
 from wagtail.admin.edit_handlers import (
     CommentPanel,
     FieldPanel,
-    HelpPanel,
     InlinePanel,
     MultiFieldPanel,
     ObjectList,
@@ -24,12 +23,12 @@ from wagtail.core import blocks
 from wagtail.core.fields import StreamField
 from wagtail.core.models import Page
 from wagtail.images.blocks import ImageChooserBlock
-from wagtail.images.edit_handlers import ImageChooserPanel
 from wagtailmetadata.models import MetadataPageMixin
 
 from calendar_utils.models import CalendarMixin
 from shared.models import ArticleMixin, SubpageMixin
-from tuning import help
+from shared.utils import make_promote_panels
+from tuning import admin_help
 
 from .constants import (
     ALIGN_CHOICES,
@@ -323,21 +322,9 @@ class UniwebHomePage(Page, MetadataPageMixin, CalendarMixin):
 
     ### PANELS
 
-    content_panels = Page.content_panels + [
-        StreamFieldPanel("content"),
-    ]
+    content_panels = Page.content_panels + [StreamFieldPanel("content")]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.IMPORTANT_TITLE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels(admin_help.build(admin_help.IMPORTANT_TITLE))
 
     settings_panels = [
         MultiFieldPanel(
@@ -348,7 +335,6 @@ class UniwebHomePage(Page, MetadataPageMixin, CalendarMixin):
             "nastavení webu",
         ),
         FieldPanel("calendar_url"),
-        CommentPanel(),
         MultiFieldPanel(
             [
                 FieldPanel("show_logo"),
@@ -403,24 +389,13 @@ class UniwebFlexiblePage(Page, SubpageMixin, MetadataPageMixin):
 
     ### PANELS
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels()
 
     content_panels = Page.content_panels + [
         StreamFieldPanel("content"),
     ]
 
-    settings_panels = [CommentPanel()]
+    settings_panels = []
 
     ### RELATIONS
 
@@ -442,20 +417,9 @@ class UniwebArticlesIndexPage(Page, SubpageMixin, MetadataPageMixin):
 
     ### PANELS
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels()
 
-    settings_panels = [CommentPanel()]
+    settings_panels = []
 
     ### RELATIONS
 
@@ -486,7 +450,7 @@ class UniwebArticlesIndexPage(Page, SubpageMixin, MetadataPageMixin):
         return context
 
 
-class UniwebArticlePage(Page, ArticleMixin, SubpageMixin, MetadataPageMixin):
+class UniwebArticlePage(ArticleMixin, SubpageMixin, MetadataPageMixin, Page):
     ### FIELDS
 
     tags = ClusterTaggableManager(through=UniwebArticleTag, blank=True)
@@ -495,20 +459,7 @@ class UniwebArticlePage(Page, ArticleMixin, SubpageMixin, MetadataPageMixin):
 
     content_panels = ArticleMixin.content_panels + [FieldPanel("tags")]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
-
-    settings_panels = [PublishingPanel(), CommentPanel()]
+    promote_panels = make_promote_panels()
 
     ### RELATIONS
 
@@ -561,22 +512,9 @@ class UniwebFormPage(AbstractForm, SubpageMixin, MetadataPageMixin):
         StreamFieldPanel("content_landing"),
     ]
 
-    promote_panels = [
-        MultiFieldPanel(
-            [
-                FieldPanel("slug"),
-                FieldPanel("seo_title"),
-                FieldPanel("search_description"),
-                ImageChooserPanel("search_image"),
-                HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)),
-            ],
-            gettext_lazy("Common page configuration"),
-        ),
-    ]
+    promote_panels = make_promote_panels()
 
-    submissions_panels = [
-        FormSubmissionsPanel(),
-    ]
+    submissions_panels = [FormSubmissionsPanel()]
 
     edit_handler = TabbedInterface(
         [
-- 
GitLab