From e8c51873216400a2c1374cfde4db366d5d4395ec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20Farka?= <stepanfarka11@gmail.com>
Date: Thu, 9 Jun 2022 08:29:34 +0200
Subject: [PATCH] [ADD] district tags page via RoutablePageMixin

---
 district/blocks.py                            |   1 -
 ...istrictcrossroadpage_districtcustompage.py |   2 +-
 .../migrations/0038_auto_20220303_1107.py     |   2 +-
 ...ter_districtcrossroadpage_cards_content.py |   2 +-
 ...ter_districtcrossroadpage_cards_content.py |   2 +-
 ...8_districtelectioncampaignpage_and_more.py |   2 +-
 ...7_delete_all_districttagspage_instances.py |  23 ++++
 .../0088_delete_districttagspage.py           |  16 +++
 district/models.py                            | 115 +++++++-----------
 .../district/district_article_page.html       |   5 +-
 .../district/district_tags_page.html          |   8 +-
 shared/templates/shared/article_preview.html  |   5 +-
 .../styleguide/2.3.x/pagination.html          |   8 +-
 13 files changed, 106 insertions(+), 85 deletions(-)
 create mode 100644 district/migrations/0087_delete_all_districttagspage_instances.py
 create mode 100644 district/migrations/0088_delete_districttagspage.py

diff --git a/district/blocks.py b/district/blocks.py
index 423bf15b..1d10fa3e 100644
--- a/district/blocks.py
+++ b/district/blocks.py
@@ -76,7 +76,6 @@ class CardLinkBlock(StructBlock):
             "district.DistrictPersonPage",
             "district.DistrictPostElectionStrategyPage",
             "district.DistrictProgramPage",
-            "district.DistrictTagsPage",
         ],
         required=False,
     )
diff --git a/district/migrations/0037_districtcrossroadpage_districtcustompage.py b/district/migrations/0037_districtcrossroadpage_districtcustompage.py
index e23d9d25..e5487ee0 100644
--- a/district/migrations/0037_districtcrossroadpage_districtcustompage.py
+++ b/district/migrations/0037_districtcrossroadpage_districtcustompage.py
@@ -102,7 +102,7 @@ class Migration(migrations.Migration):
                                                     "district.DistrictElectionPage",
                                                     "district.DistrictPeoplePage",
                                                     "district.DistrictProgramPage",
-                                                    "district.DistrictTagsPage",
+                                                    # "district.DistrictTagsPage",
                                                 ],
                                             ),
                                         ),
diff --git a/district/migrations/0038_auto_20220303_1107.py b/district/migrations/0038_auto_20220303_1107.py
index 980e524f..9486a7a9 100644
--- a/district/migrations/0038_auto_20220303_1107.py
+++ b/district/migrations/0038_auto_20220303_1107.py
@@ -68,7 +68,7 @@ class Migration(migrations.Migration):
                                             "district.DistrictPeoplePage",
                                             "district.DistrictPersonPage",
                                             "district.DistrictProgramPage",
-                                            "district.DistrictTagsPage",
+                                            # "district.DistrictTagsPage",
                                         ],
                                     ),
                                 ),
diff --git a/district/migrations/0049_alter_districtcrossroadpage_cards_content.py b/district/migrations/0049_alter_districtcrossroadpage_cards_content.py
index 46f267ba..f79ec81e 100644
--- a/district/migrations/0049_alter_districtcrossroadpage_cards_content.py
+++ b/district/migrations/0049_alter_districtcrossroadpage_cards_content.py
@@ -62,7 +62,7 @@ class Migration(migrations.Migration):
                                                             "district.DistrictPeoplePage",
                                                             "district.DistrictPersonPage",
                                                             "district.DistrictProgramPage",
-                                                            "district.DistrictTagsPage",
+                                                            # "district.DistrictTagsPage",
                                                         ],
                                                         required=False,
                                                     ),
diff --git a/district/migrations/0053_alter_districtcrossroadpage_cards_content.py b/district/migrations/0053_alter_districtcrossroadpage_cards_content.py
index 48ce5262..fb422a6a 100644
--- a/district/migrations/0053_alter_districtcrossroadpage_cards_content.py
+++ b/district/migrations/0053_alter_districtcrossroadpage_cards_content.py
@@ -69,7 +69,7 @@ class Migration(migrations.Migration):
                                                             "district.DistrictPeoplePage",
                                                             "district.DistrictPersonPage",
                                                             "district.DistrictProgramPage",
-                                                            "district.DistrictTagsPage",
+                                                            # "district.DistrictTagsPage",
                                                         ],
                                                         required=False,
                                                     ),
diff --git a/district/migrations/0068_districtelectioncampaignpage_and_more.py b/district/migrations/0068_districtelectioncampaignpage_and_more.py
index bff113fb..89316b45 100644
--- a/district/migrations/0068_districtelectioncampaignpage_and_more.py
+++ b/district/migrations/0068_districtelectioncampaignpage_and_more.py
@@ -14974,7 +14974,7 @@ class Migration(migrations.Migration):
                                                             "district.DistrictPersonPage",
                                                             "district.DistrictPostElectionStrategyPage",
                                                             "district.DistrictProgramPage",
-                                                            "district.DistrictTagsPage",
+                                                            # "district.DistrictTagsPage",
                                                         ],
                                                         required=False,
                                                     ),
diff --git a/district/migrations/0087_delete_all_districttagspage_instances.py b/district/migrations/0087_delete_all_districttagspage_instances.py
new file mode 100644
index 00000000..b403aa62
--- /dev/null
+++ b/district/migrations/0087_delete_all_districttagspage_instances.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.4 on 2022-06-09 06:11
+
+from django.db import migrations
+
+
+def delete_all_district_tags_pages(apps, schema_editor):
+    Page = apps.get_model("wagtailcore", "Page")
+    ContentType = apps.get_model("contenttypes", "ContentType")
+
+    ct = ContentType.objects.get(app_label="district", model="districttagspage")
+
+    Page.objects.filter(content_type=ct).delete()
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("district", "0086_alter_districtcontactpage_contact_people"),
+    ]
+
+    operations = [
+        migrations.RunPython(delete_all_district_tags_pages, migrations.RunPython.noop),
+    ]
diff --git a/district/migrations/0088_delete_districttagspage.py b/district/migrations/0088_delete_districttagspage.py
new file mode 100644
index 00000000..c6611fdd
--- /dev/null
+++ b/district/migrations/0088_delete_districttagspage.py
@@ -0,0 +1,16 @@
+# Generated by Django 4.0.4 on 2022-06-09 06:18
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("district", "0087_delete_all_districttagspage_instances"),
+    ]
+
+    operations = [
+        migrations.DeleteModel(
+            name="DistrictTagsPage",
+        ),
+    ]
diff --git a/district/models.py b/district/models.py
index b5a0ce91..2f12b286 100644
--- a/district/models.py
+++ b/district/models.py
@@ -253,7 +253,6 @@ class DistrictHomePage(
         "district.DistrictElectionRootPage",
         "district.DistrictPeoplePage",
         "district.DistrictProgramPage",
-        "district.DistrictTagsPage",
         "district.DistrictGeoFeatureCollectionPage",
     ]
 
@@ -310,10 +309,6 @@ class DistrictHomePage(
     def root_page(self):
         return self
 
-    @property
-    def tags_page(self):
-        return self._first_subpage_of_type(DistrictTagsPage)
-
     @property
     def has_calendar(self):
         return self.calendar_id is not None
@@ -371,7 +366,7 @@ class DistrictArticlePage(
 
 
 class DistrictArticlesPage(
-    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
+    RoutablePageMixin, ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
 ):
     ### FIELDS
 
@@ -443,71 +438,22 @@ class DistrictArticlesPage(
         ).get_page(request.GET.get("page"))
         return context
 
+    @route(r"^tagy/$", name="tags")
+    def tags(self, request):
+        return render(
+            request,
+            "district/district_tags_page.html",
+            context=self.get_tags_page_context(request=request),
+        )
 
-class DistrictContactPage(
-    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
-):
-    ### FIELDS
-
-    contact_people = StreamField(
-        [("item", blocks.PersonCustomPositionBlock())],
-        verbose_name="Kontakty",
-        blank=True,
-    )
-    text = RichTextField("Text", blank=True, features=RICH_TEXT_DEFAULT_FEATURES)
-
-    ### PANELS
-
-    content_panels = Page.content_panels + [
-        StreamFieldPanel("contact_people"),
-        FieldPanel("text"),
-    ]
-
-    promote_panels = make_promote_panels()
-
-    settings_panels = []
-
-    ### RELATIONS
-
-    parent_page_types = ["district.DistrictHomePage"]
-    subpage_types = []
-
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Kontakty"
-
-
-class DistrictTagsPage(
-    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
-):
-    ### PANELS
-
-    promote_panels = make_promote_panels()
-
-    settings_panels = []
-
-    ### RELATIONS
-
-    parent_page_types = ["district.DistrictHomePage"]
-    subpage_types = []
-
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Stránka s tagy"
-
-    def get_context(self, request, *args, **kwargs) -> dict:
-        context = super().get_context(request)
-
+    def get_tags_page_context(self, request) -> dict:
         # Potřebujeme IDčka článků pro správnou root_page pro filtrování zobrazených
         # tagů i samotných stránek, protože se filtrují přes specifický field
         # (tags__slug)
+        context = super().get_context(request)
+
         site_article_ids = (
-            self.root_page.articles_page.get_children()
-            .live()
-            .specific()
-            .values_list("id", flat=True)
+            self.get_children().live().specific().values_list("id", flat=True)
         )
 
         # Naplním "tag" a "article_page_list" parametry
@@ -535,7 +481,7 @@ class DistrictTagsPage(
         return {
             "article_page_list": Paginator(
                 article_page_qs.order_by("-date"),
-                self.root_page.articles_page.max_items,
+                self.max_items,
             ).get_page(request.GET.get("page")),
             "tag": tag,
         }
@@ -554,6 +500,40 @@ class DistrictTagsPage(
         )
 
 
+class DistrictContactPage(
+    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
+):
+    ### FIELDS
+
+    contact_people = StreamField(
+        [("item", blocks.PersonCustomPositionBlock())],
+        verbose_name="Kontakty",
+        blank=True,
+    )
+    text = RichTextField("Text", blank=True, features=RICH_TEXT_DEFAULT_FEATURES)
+
+    ### PANELS
+
+    content_panels = Page.content_panels + [
+        StreamFieldPanel("contact_people"),
+        FieldPanel("text"),
+    ]
+
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
+    ### RELATIONS
+
+    parent_page_types = ["district.DistrictHomePage"]
+    subpage_types = []
+
+    ### OTHERS
+
+    class Meta:
+        verbose_name = "Kontakty"
+
+
 class DistrictPersonTag(TaggedItemBase):
     content_object = ParentalKey(
         "district.DistrictPersonPage", on_delete=models.CASCADE
@@ -1251,7 +1231,6 @@ class DistrictCrossroadPage(
         "district.DistrictPeoplePage",
         "district.DistrictPersonPage",
         "district.DistrictProgramPage",
-        "district.DistrictTagsPage",
     ]
     ### OTHERS
 
diff --git a/district/templates/district/district_article_page.html b/district/templates/district/district_article_page.html
index cf5e0a84..787b3ee4 100644
--- a/district/templates/district/district_article_page.html
+++ b/district/templates/district/district_article_page.html
@@ -1,7 +1,8 @@
 {% extends "district/base.html" %}
-{% load static wagtailcore_tags wagtailimages_tags %}
+{% load static wagtailcore_tags wagtailimages_tags wagtailroutablepage_tags %}
 
 {% block content %}
+{% routablepageurl page.root_page.articles_page "tags" as articles_tag_page_url %}
     <article>
       <link itemprop="mainEntityOfPage" href="{{ page.url }}">
       <meta itemprop="datePublished" content="{{ page.last_published_at }}">
@@ -24,7 +25,7 @@
         </div>
         <div class="my-4">
           {% for tag in page.tags.all %}
-            <a href="{{ page.root_page.tags_page.url }}?tag={{ tag.slug }}" class="btn btn--grey-125 btn--condensed">
+            <a href="{{ articles_tag_page_url }}?tag={{ tag.slug }}" class="btn btn--grey-125 btn--condensed">
               <div class="btn__body ">{{ tag }}</div>
             </a>
           {% endfor %}
diff --git a/district/templates/district/district_tags_page.html b/district/templates/district/district_tags_page.html
index 5728eda5..79f9bc87 100644
--- a/district/templates/district/district_tags_page.html
+++ b/district/templates/district/district_tags_page.html
@@ -1,6 +1,9 @@
 {% extends "district/base.html" %}
+{% load wagtailroutablepage_tags %}
 
 {% block content %}
+{% routablepageurl page "tags" as articles_tag_page_url %}
+
   <h1 class="head-alt-md md:head-alt-lg max-w-5xl mb-4">
     {% if tag %}{{ page.title }} "{{ tag.name }}"{% else %}Výběr z článků{% endif %}
   </h1>
@@ -12,15 +15,14 @@
       {% endfor %}
     </div>
 
-    {% include 'styleguide/2.3.x/pagination.html' with paginator=article_page_list %}
+    {% include 'styleguide/2.3.x/pagination.html' with page_url=articles_tag_page_url paginator=article_page_list %}
 
     <div>
       <h2 class="head-heavy-base mb-4">Další štítky</h2>
-
       <nav class="inline-block-nogap">
         {% for tag in tag_list %}
           <a
-            href="{{ page.url }}?tag={{ tag.slug }}"
+            href="{{ articles_tag_page_url }}?tag={{ tag.slug }}"
             class="btn btn--condensed font-light text-sm btn--grey-{% if tag.slug == request.GET.tag %}500{% else %}125{% endif %} btn--hoveractive mr-1 mb-1 inline-block"
           >
             <div class="btn__body ">{{ tag.name }} ({{ tag.count }})</div>
diff --git a/shared/templates/shared/article_preview.html b/shared/templates/shared/article_preview.html
index 1fe40b94..b6a1b7c3 100644
--- a/shared/templates/shared/article_preview.html
+++ b/shared/templates/shared/article_preview.html
@@ -1,4 +1,5 @@
-{% load wagtailcore_tags wagtailimages_tags %}
+{% load wagtailcore_tags wagtailimages_tags wagtailroutablepage_tags %}
+{% routablepageurl page.root_page.articles_page "tags" as articles_tag_page_url %}
 
 <article
   itemtype="http://schema.org/BlogPosting"
@@ -69,7 +70,7 @@
     <div class="inline-block-nogap mt-4">
         {% for tag in article.tags.all %}
           <a
-            href="{{ page.root_page.tags_page.url }}?tag={{ tag.slug }}"
+            href="{{ articles_tag_page_url }}?tag={{ tag.slug }}"
             class="btn article-card__category-button btn--condensed text-sm font-light btn--grey-{% if article.is_black %}700{% else %}125{% endif %} btn--hoveractive"
           >
             <div class="btn__body">{{ tag }}</div>
diff --git a/shared/templates/styleguide/2.3.x/pagination.html b/shared/templates/styleguide/2.3.x/pagination.html
index 005c5ea0..9725d5e4 100644
--- a/shared/templates/styleguide/2.3.x/pagination.html
+++ b/shared/templates/styleguide/2.3.x/pagination.html
@@ -5,7 +5,7 @@
     <nav class="pagination space-x-1">
 
       {% if paginator.has_previous %}
-      <a href="{% pageurl page %}?page={{ paginator.previous_page_number }}{{ extra_query }}" class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed btn--inverted-icon">
+      <a href="{% if page_url %}{{ page_url }}{% else %}{% pageurl page %}{% endif %}?page={{ paginator.previous_page_number }}{{ extra_query }}" class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed btn--inverted-icon">
         <div class="btn__body-wrap">
           <div class="btn__body ">Předchozí</div>
           <div class="btn__icon ">
@@ -17,16 +17,16 @@
       {% get_pagination_range paginator.number paginator.paginator.page_range as pagination_range %}
       {% for i in pagination_range %}
         {% if i == paginator.number %}
-        <a href="{% pageurl page %}?page={{ i }}{{ extra_query }}" class="btn btn--grey-500 btn--condensed hidden md:inline-block">
+        <a href="{% if page_url %}{{ page_url }}{% else %}{% pageurl page %}{% endif %}?page={{ i }}{{ extra_query }}" class="btn btn--grey-500 btn--condensed hidden md:inline-block">
         {% else %}
-        <a href="{% pageurl page %}?page={{ i }}{{ extra_query }}" class="btn btn--grey-125 btn--hoveractive btn--to-black btn--condensed hidden md:inline-block">
+        <a href="{% if page_url %}{{ page_url }}{% else %}{% pageurl page %}{% endif %}?page={{ i }}{{ extra_query }}" class="btn btn--grey-125 btn--hoveractive btn--to-black btn--condensed hidden md:inline-block">
         {% endif %}
           <div class="btn__body ">{{ i }}</div>
         </a>
       {% endfor %}
 
       {% if paginator.has_next %}
-      <a href="{% pageurl page %}?page={{ paginator.next_page_number }}{{ extra_query }}" class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed">
+      <a href="{% if page_url %}{{ page_url }}{% else %}{% pageurl page %}{% endif %}?page={{ paginator.next_page_number }}{{ extra_query }}" class="btn btn--icon btn--grey-125 btn--hoveractive btn--to-black btn--condensed">
         <div class="btn__body-wrap">
           <div class="btn__body ">Další</div>
           <div class="btn__icon ">
-- 
GitLab