diff --git a/.idea/iamkonstantin-web.iml b/.idea/iamkonstantin-web.iml index 2d23290..79d7ae9 100644 --- a/.idea/iamkonstantin-web.iml +++ b/.idea/iamkonstantin-web.iml @@ -17,7 +17,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index 2a30ec5..6de942c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index ecefe3a..0000000 --- a/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -python 3.12.8 diff --git a/Makefile b/Makefile index aa1009d..bf0f14d 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,12 @@ -.PHONY: help bump publish -VERSION = 1.9.15 +.PHONY: help build publish +VERSION = 1.7.0 help: @perl -nle'print $& if m{^[a-zA-Z_-]+:.*?## .*$$}' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' +build: + @docker build -t code.headbright.be/konstantin/iamkonstantin:$(VERSION) . + publish: # something to try: --provenance=false @docker buildx build -t code.headbright.be/konstantin/iamkonstantin:$(VERSION) --platform linux/arm64 --push . diff --git a/base/wagtail_hooks.py b/base/wagtail_hooks.py index 84e328b..135e5e2 100644 --- a/base/wagtail_hooks.py +++ b/base/wagtail_hooks.py @@ -5,8 +5,6 @@ from urllib.parse import urlparse from base.indexnow import get_key import requests -from blog.models import BlogPage - @hooks.register('after_publish_page') def after_publish_page(request, page): @@ -16,9 +14,6 @@ def after_publish_page(request, page): if urlparse(page_url).hostname == "localhost": print("not notifying indexnow for localhost" + get_key() + ", page url: " + page_url) return - if urlparse(page_url).path.endswith("--priv") or urlparse(page_url).path.endswith("--priv/"): - print("not notifying indexnow for blog page --priv") - return session = requests.Session() session.post( "https://api.indexnow.org/indexnow", diff --git a/blog/migrations/0015_remove_blogindexpage_struct_org_actions_and_more.py b/blog/migrations/0015_remove_blogindexpage_struct_org_actions_and_more.py deleted file mode 100644 index f9b57b6..0000000 --- a/blog/migrations/0015_remove_blogindexpage_struct_org_actions_and_more.py +++ /dev/null @@ -1,218 +0,0 @@ -# Generated by Django 5.1.6 on 2025-05-06 17:00 - -import django.db.models.deletion -from django.db import migrations, models - -from home.models import HomePage - -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", ] -# put here every model names of yours that could have been filled with structured seo data; -# order will matter when searching for pages data -SEO_MODELS = [HomePage] - - -def fill_settings_from_pages_struct_org(apps, schema_editor): - """ - Search for pages where seo struct info was filled and use that to - fill new settings struct data - """ - - SeoSettings = apps.get_model("wagtailseo", "SeoSettings") - Site = apps.get_model("wagtailcore", "Site") - - for site in Site.objects.all().select_related("root_page"): - for model_name in SEO_MODELS: - model = apps.get_model("home", model_name) - page = model.objects.filter( - path__startswith=site.root_page.path, - depth__gte=site.root_page.depth - ).order_by( - 'path' - ).exclude(struct_org_name__exact="").first() - # if you are sure that only root pages were used to fill structured data, - # you can directly use: - # page = site.root_page.specific if site.root_page.specific._meta.model_name in SEO_MODELS else None - if page is not None: - 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() - break - - -def fill_pages_from_settings_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"): - for model_name in SEO_MODELS: - model = apps.get_model("home", model_name) - page = model.objects.filter( - path__startswith=seo_settings.site.root_page.path, - depth__gte=seo_settings.site.root_page.depth - ).order_by('path').first() - if page is not None: - for field in STRUCT_ORG_FIELDS: - setattr(page, field, getattr(seo_settings, field)) - page.save() - break - -class Migration(migrations.Migration): - - dependencies = [ - ('blog', '0014_alter_blogpage_body'), - ('wagtailimages', '0027_image_description'), - ("wagtailseo", "0003_seosettings_struct_org_fields"), - ] - - operations = [ - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_actions', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_address_country', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_address_locality', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_address_postal', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_address_region', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_address_street', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_extra_json', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_geo_lat', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_geo_lng', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_hours', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_image', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_logo', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_name', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_phone', - ), - migrations.RemoveField( - model_name='blogindexpage', - name='struct_org_type', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_actions', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_address_country', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_address_locality', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_address_postal', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_address_region', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_address_street', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_extra_json', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_geo_lat', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_geo_lng', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_hours', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_image', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_logo', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_name', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_phone', - ), - migrations.RemoveField( - model_name='blogpage', - name='struct_org_type', - ), - migrations.AlterField( - model_name='blogindexpage', - 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='wagtailimages.image', verbose_name='Preview image'), - ), - migrations.AlterField( - model_name='blogpage', - 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='wagtailimages.image', verbose_name='Preview image'), - ), - ] diff --git a/blog/templates/blog/blog_page.html b/blog/templates/blog/blog_page.html index 3ad8acd..c790824 100644 --- a/blog/templates/blog/blog_page.html +++ b/blog/templates/blog/blog_page.html @@ -5,7 +5,7 @@ {% block body_class %}template-blogpage{% endblock %} {% block content %} -
+

{{ page.title }}

@@ -54,12 +54,12 @@ {% with tags=page.tags.all %} {% if tags %} -
+

Tags

    {% for tag in tags %} -
  • 🏷 +
  • 🏷️ {{ tag }}
  • {% endfor %} @@ -74,9 +74,13 @@
-
+ +
+ {% include 'newsletter/snippets/signup_form.html' %} +
{% endblock %} \ No newline at end of file diff --git a/home/migrations/0007_remove_homepage_struct_org_actions_and_more.py b/home/migrations/0007_remove_homepage_struct_org_actions_and_more.py deleted file mode 100644 index 1ae5f5c..0000000 --- a/home/migrations/0007_remove_homepage_struct_org_actions_and_more.py +++ /dev/null @@ -1,80 +0,0 @@ -# Generated by Django 5.1.6 on 2025-05-06 17:00 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('home', '0006_alter_homepage_body'), - ('wagtailimages', '0027_image_description'), - ] - - operations = [ - migrations.RemoveField( - model_name='homepage', - name='struct_org_actions', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_address_country', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_address_locality', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_address_postal', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_address_region', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_address_street', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_extra_json', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_geo_lat', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_geo_lng', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_hours', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_image', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_logo', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_name', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_phone', - ), - migrations.RemoveField( - model_name='homepage', - name='struct_org_type', - ), - migrations.AlterField( - model_name='homepage', - 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='wagtailimages.image', verbose_name='Preview image'), - ), - ] diff --git a/home/templates/home/home_page.html b/home/templates/home/home_page.html index 00ed3b9..fb01ee1 100644 --- a/home/templates/home/home_page.html +++ b/home/templates/home/home_page.html @@ -60,7 +60,6 @@

{{ post.intro }}

- {% if post.main_image %}
{% with post.main_image as main_image %} @@ -82,4 +81,7 @@
+
+ {% include 'newsletter/snippets/signup_form.html' %} +
{% endblock content %} \ No newline at end of file diff --git a/iamkonstantin_web/templates/base.html b/iamkonstantin_web/templates/base.html index 33932cd..90c1c93 100644 --- a/iamkonstantin_web/templates/base.html +++ b/iamkonstantin_web/templates/base.html @@ -4,8 +4,7 @@ - - + {% include "wagtailseo/meta.html" %} {% block title %} @@ -81,6 +80,5 @@ {# Override this in templates to add extra javascript #} {% endblock %} {% include "wagtailseo/struct_data.html" %} -{% include "wagtailseo/struct_org_data.html" %} </body> </html> diff --git a/iamkonstantin_web/templates/includes/header.html b/iamkonstantin_web/templates/includes/header.html index 406c2ea..9df9919 100644 --- a/iamkonstantin_web/templates/includes/header.html +++ b/iamkonstantin_web/templates/includes/header.html @@ -3,7 +3,7 @@ <a href="#main" class="skip-link">Skip to content</a> {% get_site_root as site_root %} - <nav class="w-full flex justify-center my-8 main"> + <nav class="w-full flex justify-center my-8"> <ul class="flex space-x-8"> <li><a href="{% pageurl site_root %}">{{ site_root.title }}</a></li> {% for menuitem in site_root.get_children.live.in_menu %} diff --git a/portfolio/templates/portfolio/portfolio_page.html b/portfolio/templates/portfolio/portfolio_page.html index 2e3a8a5..8e395fe 100644 --- a/portfolio/templates/portfolio/portfolio_page.html +++ b/portfolio/templates/portfolio/portfolio_page.html @@ -4,14 +4,8 @@ {% block body_class %}template-portfolio{% endblock %} - {% block content %} - <section class="flex flex-col items-center justify-center h-full px-0 md:px-4 lg:px-8"> - <article class="mb-16 px-1 md:px-4 lg:px-8"> - <h1>{{ page.title }}</h1> - <div class="blog-content w-full"> - {{ page.body }} - </div> - </article> - </section> + <h1>{{ page.title }}</h1> + + {{ page.body }} {% endblock %} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 0f0ad01..2f1f0bf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ -Django>=5.2.1,<5.3 -wagtail>=6.4,<7.1 +Django>=4.2,<5.2 +wagtail>=6.3.1,<6.4 whitenoise>=6.6,<7.0 wagtailcodeblock>=1.29.0.2,<2.0 django-tailwind>=3.6.0 django-browser-reload>=1.17 Wand==0.6.13 -wagtail-seo==3.0.0 \ No newline at end of file +wagtail-seo==2.5.0 \ No newline at end of file diff --git a/search/templates/search/search.html b/search/templates/search/search.html index 75556cb..0a067f5 100644 --- a/search/templates/search/search.html +++ b/search/templates/search/search.html @@ -13,11 +13,13 @@ <form action="{% url 'search' %}" method="get" class="container"> <div class="flex flex-col space-y-4"> <label for="query" class="sr-only block text-sm font-medium leading-6">Search</label> - <div class="mt-2 flex space-x-4"> + <div class="mt-2"> <input type="text" placeholder="Type search keywords..." - class="block w-full rounded-xl border-0 py-1.5 px-2 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-klavender sm:text-sm sm:leading-6" + class="block w-full rounded-md border-0 py-1.5 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-klavender sm:text-sm sm:leading-6" id="query" name="query"{% if search_query %} value="{{ search_query }}"{% endif %}> + </div> + <div> <input type="submit" class="primary-button" value="Search"> </div> </div> @@ -28,7 +30,7 @@ </div> </section> - <section class="h-full px-0 md:px-4 lg:px-8 search"> + <section class="h-full px-0 md:px-4 lg:px-8"> <div class="px-0 md:px-4 lg:px-8"> <h2 class="sr-only">Search results</h2> @@ -46,8 +48,6 @@ <h4><a href="{% pageurl result %}">{{ result }}</a></h4> {% if result.search_description %} {{ result.search_description }} - {% elif result.post.intro %} - {{ result.post.intro }} {% endif %} </li> {% endfor %} diff --git a/theme/static_src/src/styles.css b/theme/static_src/src/styles.css index a93a4a8..3a2011b 100644 --- a/theme/static_src/src/styles.css +++ b/theme/static_src/src/styles.css @@ -45,7 +45,7 @@ } h3 { - @apply mt-10 mb-3 text-xl sm:text-2xl lg:text-2xl leading-none font-extrabold tracking-tight text-black dark:text-white; + @apply mt-12 mb-2 text-xl sm:text-2xl lg:text-2xl leading-none font-extrabold tracking-tight text-black dark:text-white; } h4 { @@ -56,23 +56,11 @@ @apply my-2 mb-3 text-lg leading-relaxed; } - li { - @apply my-2 text-lg; - } - - .search li { - @apply my-6; - } - - .search li h4 { - @apply inline; - } - .blog-content ul, .home-content ul { @apply list-none list-inside; } - .blog-content ul li::before, .home-content ul li::before, .search li::before { + .blog-content ul li::before, .home-content ul li::before { content: "👉"; font-family: NotoEmoji; @apply inline-block mr-2 py-1; @@ -89,57 +77,24 @@ @media print { h1 { - @apply m-0 my-2 text-xl; + @apply mt-6 mb-4 text-xl; } h2 { - @apply m-0 mt-2 text-base; + @apply mt-4 mb-2 text-base; } h3 { - @apply m-0 mt-2 text-base; - } - - h4 { - @apply m-0 text-base; + @apply text-base; } p { @apply text-sm my-1; } - li { - @apply text-sm my-0; - } - .ppb { page-break-before: always; } - - nav.main { - @apply hidden; - } - - main { - @apply mx-0 px-0; - } - - footer { - @apply hidden !important; - } - - nav.return { - @apply hidden; - } - - /*.blog-content ul, .home-content ul {*/ - /* @apply list-none list-inside list-disc;*/ - /* @apply inline-block mr-0;*/ - /*}*/ - - /*.blog-content ul li::before, .home-content ul li::before, .search li::before {*/ - /* content: "";*/ - /*}*/ } .primary-button { @@ -157,11 +112,11 @@ } .tags ul { - @apply flex-col sm:flex-row sm:space-x-2 text-center text-sm; + @apply flex space-x-4 text-center text-sm; } .tags li { - @apply p-3 inline-flex items-center rounded-2xl px-2 py-1 text-sm text-black dark:text-white ring-1 ring-inset ring-orange-700/20 dark:ring-white bg-orange-50 dark:bg-transparent; + @apply p-4 inline-flex items-center rounded-2xl bg-green-50 px-2 py-1 font-medium text-green-700 ring-1 ring-inset ring-green-600/20; } .tags ul li::before { @@ -170,7 +125,7 @@ } .tags a { - @apply border-b-0 w-full m-0; + @apply border-b-0 w-full; } .blog-pages a {