From ae6c53e5349e47238d1797e43f6e2ea6a052c70a Mon Sep 17 00:00:00 2001 From: James Biggs Date: Tue, 21 Jan 2025 15:08:59 +0000 Subject: [PATCH 1/6] Added `chip_override` field to BlogPage --- .../migrations/0011_blogpage_chip_override.py | 18 ++++++++++++++++++ etna/blog/models.py | 12 +++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 etna/blog/migrations/0011_blogpage_chip_override.py diff --git a/etna/blog/migrations/0011_blogpage_chip_override.py b/etna/blog/migrations/0011_blogpage_chip_override.py new file mode 100644 index 000000000..41aad91d8 --- /dev/null +++ b/etna/blog/migrations/0011_blogpage_chip_override.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.4 on 2025-01-21 14:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0010_alter_blogpostpage_body'), + ] + + operations = [ + migrations.AddField( + model_name='blogpage', + name='chip_override', + field=models.CharField(blank=True, help_text='Override the chip for child blog posts. If left blank, the chip will be the title of the blog.', max_length=255, null=True), + ), + ] diff --git a/etna/blog/models.py b/etna/blog/models.py index 3eba4d876..4793affc4 100644 --- a/etna/blog/models.py +++ b/etna/blog/models.py @@ -1,3 +1,4 @@ +from django.db import models from wagtail.admin.panels import FieldPanel from wagtail.api import APIField from wagtail.fields import StreamField @@ -35,6 +36,13 @@ class BlogPage(HeroImageMixin, BasePageWithRequiredIntro): blogs within this blog. """ + chip_override = models.CharField( + max_length=255, + blank=True, + null=True, + help_text="Override the chip for child blog posts. If left blank, the chip will be the title of the blog.", + ) + parent_page_types = [ "blog.BlogIndexPage", "blog.BlogPage", @@ -49,7 +57,9 @@ class BlogPage(HeroImageMixin, BasePageWithRequiredIntro): BasePageWithRequiredIntro.content_panels + HeroImageMixin.content_panels ) - promote_panels = BasePageWithRequiredIntro.promote_panels + promote_panels = BasePageWithRequiredIntro.promote_panels + [ + FieldPanel("chip_override"), + ] api_fields = BasePageWithRequiredIntro.api_fields + HeroImageMixin.api_fields From 8df30fdf7b6c02aa865d0fb05ec46500c693ef1e Mon Sep 17 00:00:00 2001 From: James Biggs Date: Thu, 23 Jan 2025 11:30:53 +0000 Subject: [PATCH 2/6] Update `type_label` override to use `chip_override` if it exists --- etna/blog/models.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/etna/blog/models.py b/etna/blog/models.py index 765894c86..161ccb1c6 100644 --- a/etna/blog/models.py +++ b/etna/blog/models.py @@ -1,6 +1,5 @@ from django.db import models from django.utils.functional import cached_property - from wagtail.admin.panels import FieldPanel from wagtail.api import APIField from wagtail.fields import StreamField @@ -91,12 +90,12 @@ def type_label(cls) -> str: Overrides the type_label method from BasePage, to return the correct type label for the blog post page. """ - parent = cls.get_parent() - if not parent: + top_level = cls.get_ancestors().type(BlogPage).first().specific + if not top_level: return "Blog post" - while parent.get_parent().specific_class == BlogPage: - parent = parent.get_parent() - return parent.title + if top_level.chip_override: + return top_level.chip_override + return top_level.title content_panels = ( BasePageWithRequiredIntro.content_panels From 6979f0ba0a68df6aa17f730b645caa9f611035e1 Mon Sep 17 00:00:00 2001 From: James Biggs Date: Thu, 23 Jan 2025 11:59:18 +0000 Subject: [PATCH 3/6] Add `chip_override` API field to BlogPage --- etna/blog/models.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/etna/blog/models.py b/etna/blog/models.py index 161ccb1c6..e2f34fd46 100644 --- a/etna/blog/models.py +++ b/etna/blog/models.py @@ -62,7 +62,11 @@ class BlogPage(HeroImageMixin, BasePageWithRequiredIntro): FieldPanel("chip_override"), ] - api_fields = BasePageWithRequiredIntro.api_fields + HeroImageMixin.api_fields + api_fields = ( + BasePageWithRequiredIntro.api_fields + + HeroImageMixin.api_fields + + [APIField("chip_override")] + ) class BlogPostPage( From bebd47875fdbe352b05dfce6465e6018535f3abf Mon Sep 17 00:00:00 2001 From: James Biggs Date: Thu, 23 Jan 2025 16:38:22 +0000 Subject: [PATCH 4/6] Display `chip_override` on top-level blog endpoint --- etna/api/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etna/api/urls.py b/etna/api/urls.py index ba79d697d..4e005e274 100644 --- a/etna/api/urls.py +++ b/etna/api/urls.py @@ -309,7 +309,7 @@ def top_level_blogs_list_view(self, request): queryset = queryset.not_descendant_of(blog, inclusive=False) blog_posts = BlogPostPage.objects.all().live().descendant_of(blog).count() blog_post_counts[blog.id] = blog_posts - serializer = DefaultPageSerializer(queryset, many=True) + serializer = DefaultPageSerializer(queryset, required_api_fields=["chip_override"], many=True) blogs = sorted(serializer.data, key=lambda x: x["title"]) blogs = [blog | {"posts": blog_post_counts[blog["id"]]} for blog in blogs] top_level_queryset = BlogIndexPage.objects.all().live() From d024e10e0226da0f1a928e6baf1ef8be8914627f Mon Sep 17 00:00:00 2001 From: James Biggs Date: Thu, 23 Jan 2025 17:07:37 +0000 Subject: [PATCH 5/6] `chip_override` -> `custom_type_label` --- etna/api/urls.py | 4 +++- ...override.py => 0011_blogpage_custom_type_label.py} | 6 +++--- etna/blog/models.py | 11 ++++++----- 3 files changed, 12 insertions(+), 9 deletions(-) rename etna/blog/migrations/{0011_blogpage_chip_override.py => 0011_blogpage_custom_type_label.py} (69%) diff --git a/etna/api/urls.py b/etna/api/urls.py index 4e005e274..fd3b23a96 100644 --- a/etna/api/urls.py +++ b/etna/api/urls.py @@ -309,7 +309,9 @@ def top_level_blogs_list_view(self, request): queryset = queryset.not_descendant_of(blog, inclusive=False) blog_posts = BlogPostPage.objects.all().live().descendant_of(blog).count() blog_post_counts[blog.id] = blog_posts - serializer = DefaultPageSerializer(queryset, required_api_fields=["chip_override"], many=True) + serializer = DefaultPageSerializer( + queryset, required_api_fields=["custom_type_label"], many=True + ) blogs = sorted(serializer.data, key=lambda x: x["title"]) blogs = [blog | {"posts": blog_post_counts[blog["id"]]} for blog in blogs] top_level_queryset = BlogIndexPage.objects.all().live() diff --git a/etna/blog/migrations/0011_blogpage_chip_override.py b/etna/blog/migrations/0011_blogpage_custom_type_label.py similarity index 69% rename from etna/blog/migrations/0011_blogpage_chip_override.py rename to etna/blog/migrations/0011_blogpage_custom_type_label.py index 41aad91d8..9c83889de 100644 --- a/etna/blog/migrations/0011_blogpage_chip_override.py +++ b/etna/blog/migrations/0011_blogpage_custom_type_label.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.4 on 2025-01-21 14:36 +# Generated by Django 5.1.4 on 2025-01-23 17:03 from django.db import migrations, models @@ -12,7 +12,7 @@ class Migration(migrations.Migration): operations = [ migrations.AddField( model_name='blogpage', - name='chip_override', - field=models.CharField(blank=True, help_text='Override the chip for child blog posts. If left blank, the chip will be the title of the blog.', max_length=255, null=True), + name='custom_type_label', + field=models.CharField(blank=True, help_text='Override the chip for child blog posts. If left blank, the chip will be the title of the blog.', max_length=255, null=True, verbose_name='Chip override'), ), ] diff --git a/etna/blog/models.py b/etna/blog/models.py index e2f34fd46..135d0aff2 100644 --- a/etna/blog/models.py +++ b/etna/blog/models.py @@ -37,11 +37,12 @@ class BlogPage(HeroImageMixin, BasePageWithRequiredIntro): blogs within this blog. """ - chip_override = models.CharField( + custom_type_label = models.CharField( max_length=255, blank=True, null=True, help_text="Override the chip for child blog posts. If left blank, the chip will be the title of the blog.", + verbose_name="Chip override", ) parent_page_types = [ @@ -59,13 +60,13 @@ class BlogPage(HeroImageMixin, BasePageWithRequiredIntro): ) promote_panels = BasePageWithRequiredIntro.promote_panels + [ - FieldPanel("chip_override"), + FieldPanel("custom_type_label"), ] api_fields = ( BasePageWithRequiredIntro.api_fields + HeroImageMixin.api_fields - + [APIField("chip_override")] + + [APIField("custom_type_label")] ) @@ -97,8 +98,8 @@ def type_label(cls) -> str: top_level = cls.get_ancestors().type(BlogPage).first().specific if not top_level: return "Blog post" - if top_level.chip_override: - return top_level.chip_override + if top_level.custom_type_label: + return top_level.custom_type_label return top_level.title content_panels = ( From 06942f1c782cdb273966a1ebc56031069d1b969e Mon Sep 17 00:00:00 2001 From: James Biggs Date: Tue, 28 Jan 2025 10:52:57 +0000 Subject: [PATCH 6/6] Update `custom_type_label` character limit --- etna/blog/migrations/0011_blogpage_custom_type_label.py | 4 ++-- etna/blog/models.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/etna/blog/migrations/0011_blogpage_custom_type_label.py b/etna/blog/migrations/0011_blogpage_custom_type_label.py index 9c83889de..819325a83 100644 --- a/etna/blog/migrations/0011_blogpage_custom_type_label.py +++ b/etna/blog/migrations/0011_blogpage_custom_type_label.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.4 on 2025-01-23 17:03 +# Generated by Django 5.1.4 on 2025-01-28 10:52 from django.db import migrations, models @@ -13,6 +13,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='blogpage', name='custom_type_label', - field=models.CharField(blank=True, help_text='Override the chip for child blog posts. If left blank, the chip will be the title of the blog.', max_length=255, null=True, verbose_name='Chip override'), + field=models.CharField(blank=True, help_text='Override the chip for child blog posts. If left blank, the chip will be the title of the blog.', max_length=20, null=True, verbose_name='Chip override'), ), ] diff --git a/etna/blog/models.py b/etna/blog/models.py index 135d0aff2..1e0271dbf 100644 --- a/etna/blog/models.py +++ b/etna/blog/models.py @@ -38,7 +38,7 @@ class BlogPage(HeroImageMixin, BasePageWithRequiredIntro): """ custom_type_label = models.CharField( - max_length=255, + max_length=20, blank=True, null=True, help_text="Override the chip for child blog posts. If left blank, the chip will be the title of the blog.",