From aee5f509dad8953eca8a5ca864e8b4edcca59b2b Mon Sep 17 00:00:00 2001 From: Vince Salvino Date: Thu, 6 Feb 2025 17:43:56 -0500 Subject: [PATCH 1/5] Implement wagtail-seo 3.0 --- ...coderedpage_struct_org_actions_and_more.py | 147 ++++++++++++++++++ coderedcms/models/page_models.py | 2 +- .../templates/coderedcms/pages/base.html | 1 + pyproject.toml | 2 +- 4 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 coderedcms/migrations/0043_remove_coderedpage_struct_org_actions_and_more.py diff --git a/coderedcms/migrations/0043_remove_coderedpage_struct_org_actions_and_more.py b/coderedcms/migrations/0043_remove_coderedpage_struct_org_actions_and_more.py new file mode 100644 index 00000000..4ab0aad2 --- /dev/null +++ b/coderedcms/migrations/0043_remove_coderedpage_struct_org_actions_and_more.py @@ -0,0 +1,147 @@ +# Generated by Django 4.2.16 on 2025-02-06 22:18 + +from django.db import migrations, models +import django.db.models.deletion +from wagtail.images import get_image_model_string + + +STRUCT_ORG_FIELDS = [ + "struct_org_type", + "struct_org_name", + "struct_org_logo_id", + "struct_org_image_id", + "struct_org_phone", + "struct_org_address_street", + "struct_org_address_locality", + "struct_org_address_region", + "struct_org_address_postal", + "struct_org_address_country", + "struct_org_geo_lat", + "struct_org_geo_lng", + "struct_org_hours", + "struct_org_actions", + "struct_org_extra_json", +] + + +def copy_struct_org(apps, schema_editor): + """ + Copy struct org data from each site's Root Page to the site's + settings. + """ + + SeoSettings = apps.get_model("wagtailseo", "SeoSettings") + Site = apps.get_model("wagtailcore", "Site") + + for site in Site.objects.all().select_related("root_page"): + homepage = site.root_page.specific + if page: + seo_settings, _ = SeoSettings.objects.get_or_create(site=site) + for field in STRUCT_ORG_FIELDS: + setattr(seo_settings, field, getattr(page, field)) + seo_settings.save() + + +def reverse_struct_org(apps, schema_editor): + """ + The reverse migration. + + For every site, find the most top-level page inheriting from SeoMixin + and fill its struct information using the site's settings + """ + SeoSettings = apps.get_model("wagtailseo", "SeoSettings") + for seo_settings in SeoSettings.objects.all().select_related( + "site", "site__root_page" + ): + page = seo_setting.site.root_page + if page: + for field in STRUCT_ORG_FIELDS: + setattr(page, field, getattr(seo_settings, field)) + page.save() + + +class Migration(migrations.Migration): + dependencies = [ + ("wagtailimages", "0027_image_description"), + ("coderedcms", "0042_remove_coderedsessionformsubmission_thumbnails_by_path"), + ("wagtailseo", "0003_seosettings_struct_org_fields"), + ] + + operations = [ + migrations.RunPython( + copy_struct_org, reverse_struct_org + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_actions", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_address_country", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_address_locality", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_address_postal", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_address_region", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_address_street", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_extra_json", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_geo_lat", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_geo_lng", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_hours", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_image", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_logo", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_name", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_phone", + ), + migrations.RemoveField( + model_name="coderedpage", + name="struct_org_type", + ), + migrations.AlterField( + model_name="coderedpage", + name="og_image", + field=models.ForeignKey( + blank=True, + help_text="Shown when linking to this page on social media. If blank, may show an image from the page, or the default from Settings > SEO.", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=get_image_model_string(), + verbose_name="Preview image", + ), + ), + ] diff --git a/coderedcms/models/page_models.py b/coderedcms/models/page_models.py index e7f95039..151aa33a 100755 --- a/coderedcms/models/page_models.py +++ b/coderedcms/models/page_models.py @@ -363,7 +363,7 @@ class Meta: ), ] - promote_panels = SeoMixin.seo_meta_panels + SeoMixin.seo_struct_panels + promote_panels = SeoMixin.seo_meta_panels settings_panels = Page.settings_panels + [ FieldPanel("content_walls"), diff --git a/coderedcms/templates/coderedcms/pages/base.html b/coderedcms/templates/coderedcms/pages/base.html index de5f4c6a..f3cf7cb3 100755 --- a/coderedcms/templates/coderedcms/pages/base.html +++ b/coderedcms/templates/coderedcms/pages/base.html @@ -183,6 +183,7 @@

{% trans "Related" %}

{% block struct_seo %} {% include "wagtailseo/struct_data.html" %} + {% include "wagtailseo/struct_org_data.html" %} {% block struct_seo_extra %}{% endblock %} {% endblock %} diff --git a/pyproject.toml b/pyproject.toml index 55f8fb39..b06bc03f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dependencies = [ "wagtail>=6.3,<7.0", "wagtail-cache>=2.4,<3", "wagtail-flexible-forms==2.*", - "wagtail-seo>=2.5,<3", + "wagtail-seo==3.*", ] description = "Wagtail + CodeRed Extensions enabling rapid development of marketing-focused websites." dynamic = ["version"] From 6de0d94f7a0d557bd25dda93fe35483d209d0000 Mon Sep 17 00:00:00 2001 From: Vince Salvino Date: Thu, 6 Feb 2025 18:05:07 -0500 Subject: [PATCH 2/5] Add migration --- ...coderedpage_struct_org_actions_and_more.py | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/coderedcms/migrations/0043_remove_coderedpage_struct_org_actions_and_more.py b/coderedcms/migrations/0043_remove_coderedpage_struct_org_actions_and_more.py index 4ab0aad2..27f4733f 100644 --- a/coderedcms/migrations/0043_remove_coderedpage_struct_org_actions_and_more.py +++ b/coderedcms/migrations/0043_remove_coderedpage_struct_org_actions_and_more.py @@ -34,12 +34,19 @@ def copy_struct_org(apps, schema_editor): Site = apps.get_model("wagtailcore", "Site") for site in Site.objects.all().select_related("root_page"): - homepage = site.root_page.specific - if page: - seo_settings, _ = SeoSettings.objects.get_or_create(site=site) - for field in STRUCT_ORG_FIELDS: - setattr(seo_settings, field, getattr(page, field)) - seo_settings.save() + # We are assuming that all pages in coderedcms inherit from + # ``CoderedPage``, which is what contains the SEO data. If the + # root page is not a CoderedPage, then simply skip it as it + # will likely be the site owner's reponsibility to handle this + # migration manually. + if not hasattr(site.root_page, "coderedpage"): + return + page = site.root_page.coderedpage + seo_settings, _ = SeoSettings.objects.get_or_create(site=site) + for field in STRUCT_ORG_FIELDS: + print(f"Copy {page.title} : {field}") + setattr(seo_settings, field, getattr(page, field)) + seo_settings.save() def reverse_struct_org(apps, schema_editor): @@ -54,10 +61,12 @@ def reverse_struct_org(apps, schema_editor): "site", "site__root_page" ): page = seo_setting.site.root_page - if page: - for field in STRUCT_ORG_FIELDS: - setattr(page, field, getattr(seo_settings, field)) - page.save() + if not hasattr(page, "coderedpage"): + return + cr_page = page.coderedpage + for field in STRUCT_ORG_FIELDS: + setattr(cr_page, field, getattr(seo_settings, field)) + cr_page.save() class Migration(migrations.Migration): From ad2e5d0879aaf018d777f6758ffa037a528f18da Mon Sep 17 00:00:00 2001 From: Vince Salvino Date: Thu, 6 Feb 2025 18:11:20 -0500 Subject: [PATCH 3/5] Ruff --- coderedcms/models/integration_models.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/coderedcms/models/integration_models.py b/coderedcms/models/integration_models.py index dd1e8ed0..53204ff8 100755 --- a/coderedcms/models/integration_models.py +++ b/coderedcms/models/integration_models.py @@ -95,14 +95,14 @@ def build_list_library(self): } list_library[mlist["id"]]["merge_fields"] = ( - mailchimp.get_merge_fields_for_list(mlist["id"])[ - "merge_fields" - ] + mailchimp.get_merge_fields_for_list( + mlist["id"] + )["merge_fields"] ) list_library[mlist["id"]]["interest_categories"] = ( - mailchimp.get_interest_categories_for_list(mlist["id"])[ - "categories" - ] + mailchimp.get_interest_categories_for_list( + mlist["id"] + )["categories"] ) for category in list_library[mlist["id"]][ From c669c66208a8ad12ff56457def16b98ed181e83b Mon Sep 17 00:00:00 2001 From: Vince Salvino Date: Thu, 6 Feb 2025 18:22:16 -0500 Subject: [PATCH 4/5] Ruff with latest version --- coderedcms/models/integration_models.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/coderedcms/models/integration_models.py b/coderedcms/models/integration_models.py index 53204ff8..dd1e8ed0 100755 --- a/coderedcms/models/integration_models.py +++ b/coderedcms/models/integration_models.py @@ -95,14 +95,14 @@ def build_list_library(self): } list_library[mlist["id"]]["merge_fields"] = ( - mailchimp.get_merge_fields_for_list( - mlist["id"] - )["merge_fields"] + mailchimp.get_merge_fields_for_list(mlist["id"])[ + "merge_fields" + ] ) list_library[mlist["id"]]["interest_categories"] = ( - mailchimp.get_interest_categories_for_list( - mlist["id"] - )["categories"] + mailchimp.get_interest_categories_for_list(mlist["id"])[ + "categories" + ] ) for category in list_library[mlist["id"]][ From 7fb48db5ac7814ccc9e66f89485c613d40600362 Mon Sep 17 00:00:00 2001 From: Vince Salvino Date: Thu, 6 Feb 2025 18:29:06 -0500 Subject: [PATCH 5/5] Add seo preview mode on form pages --- coderedcms/models/page_models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/coderedcms/models/page_models.py b/coderedcms/models/page_models.py index 151aa33a..7480ef2d 100755 --- a/coderedcms/models/page_models.py +++ b/coderedcms/models/page_models.py @@ -1613,6 +1613,7 @@ def data_to_dict(self, processed_data, request): preview_modes = [ ("form", _("Form")), ("landing", _("Thank you page")), + ("wagtail-seo", _("SEO Preview")), ] def serve_preview(self, request, mode):