From 568ad348bb45818c18c28793144ed7623531c011 Mon Sep 17 00:00:00 2001 From: David Slusser Date: Thu, 30 Apr 2026 18:04:01 -0700 Subject: [PATCH 1/3] seo updates --- src/django_project/core/settings.py | 1 + src/django_project/core/urls/urls.py | 8 +++- src/django_project/core/views.py | 1 + src/django_project/web/sitemaps.py | 19 ++++++++++ .../web/templates/web/full/index.html | 38 +++++++++++++++++-- .../templates/web/partials/future_events.htm | 20 ++++++++++ 6 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 src/django_project/web/sitemaps.py diff --git a/src/django_project/core/settings.py b/src/django_project/core/settings.py index 21fe367..5a4fe92 100644 --- a/src/django_project/core/settings.py +++ b/src/django_project/core/settings.py @@ -54,6 +54,7 @@ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "django.contrib.sitemaps", # third party apps "django_extensions", "django_filters", diff --git a/src/django_project/core/urls/urls.py b/src/django_project/core/urls/urls.py index 6cfcfe9..80d1867 100644 --- a/src/django_project/core/urls/urls.py +++ b/src/django_project/core/urls/urls.py @@ -14,15 +14,18 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ -from core.views import robots_txt from django.conf import settings from django.contrib import admin +from django.contrib.sitemaps.views import sitemap from django.urls import include, path from drf_spectacular.views import ( SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView, ) +from web.sitemaps import sitemaps + +from core.views import robots_txt urlpatterns = [ # Django provided URLs @@ -35,8 +38,9 @@ path("rest/schema/", SpectacularAPIView.as_view(), name="schema"), path("rest/swagger/", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger"), path("rest/redoc/", SpectacularRedocView.as_view(url_name="schema"), name="redoc"), - # project level URLs + # SEO URLs path("robots.txt", robots_txt), + path("sitemap.xml", sitemap, {"sitemaps": sitemaps}, name="django.contrib.sitemaps.views.sitemap"), # URLs to local apps path("", include("web.urls", namespace="web")), ] diff --git a/src/django_project/core/views.py b/src/django_project/core/views.py index dcdb286..0a8b28c 100644 --- a/src/django_project/core/views.py +++ b/src/django_project/core/views.py @@ -12,4 +12,5 @@ def robots_txt(request) -> HttpResponse: Disallow: /__debug__/ Disallow: /accounts/ Disallow: /admin/ +Sitemap: https://spokanepython.com/sitemap.xml """ diff --git a/src/django_project/web/sitemaps.py b/src/django_project/web/sitemaps.py new file mode 100644 index 0000000..b849f64 --- /dev/null +++ b/src/django_project/web/sitemaps.py @@ -0,0 +1,19 @@ +from django.contrib.sitemaps import Sitemap + + +class StaticViewSitemap(Sitemap): + """Sitemap for static pages.""" + + priority = 1.0 + changefreq = "daily" + + def items(self) -> list[str]: + return ["/"] + + def location(self, item: str) -> str: + return item + + +sitemaps = { + "static": StaticViewSitemap, +} diff --git a/src/django_project/web/templates/web/full/index.html b/src/django_project/web/templates/web/full/index.html index ce0bbe7..0680387 100644 --- a/src/django_project/web/templates/web/full/index.html +++ b/src/django_project/web/templates/web/full/index.html @@ -23,11 +23,25 @@ - + + + + + + + + + + Spokane Python User Group - + + + + + + @@ -37,8 +51,6 @@ background-color: #f1f1f1 } - @import url('https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;700&display=swap'); - body { font-family: 'Ubuntu', Arial, sans-serif; padding-top: 70px; @@ -135,6 +147,24 @@ } + + + diff --git a/src/django_project/web/templates/web/partials/future_events.htm b/src/django_project/web/templates/web/partials/future_events.htm index f5f76cf..bb8bf1c 100644 --- a/src/django_project/web/templates/web/partials/future_events.htm +++ b/src/django_project/web/templates/web/partials/future_events.htm @@ -1,4 +1,24 @@ {% for event in events %} +

{{ event.name }}

From 498ea1d9aad1eac4c80628c8c4b96b624a012156 Mon Sep 17 00:00:00 2001 From: David Slusser Date: Fri, 1 May 2026 14:56:29 -0700 Subject: [PATCH 2/3] update urls --- src/django_project/core/urls/urls.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/django_project/core/urls/urls.py b/src/django_project/core/urls/urls.py index 80d1867..30700c5 100644 --- a/src/django_project/core/urls/urls.py +++ b/src/django_project/core/urls/urls.py @@ -14,6 +14,7 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ +from core.views import robots_txt from django.conf import settings from django.contrib import admin from django.contrib.sitemaps.views import sitemap @@ -25,8 +26,6 @@ ) from web.sitemaps import sitemaps -from core.views import robots_txt - urlpatterns = [ # Django provided URLs path("console/", admin.site.urls), From 30b69f635ecf73754787beb6a17606fb442701dd Mon Sep 17 00:00:00 2001 From: David Slusser Date: Fri, 1 May 2026 15:46:58 -0700 Subject: [PATCH 3/3] updates per pr comments --- pyproject.toml | 4 ++-- src/django_project/web/templates/web/full/index.html | 4 ++-- src/docker/Dockerfile | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6166494..e54bd50 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] dependencies = [ - "django~=5.2.12", + "django~=5.2.13", "django-braces", "django-debug-toolbar", "django-environ", @@ -18,7 +18,7 @@ description = "Spokane Python Community" dynamic = ["version"] keywords = ["django"] license = {file = "LICENSE"} -name = "my_django_project" +name = "SpokanePythonCommunity" readme = "README.md" requires-python = ">=3.12" diff --git a/src/django_project/web/templates/web/full/index.html b/src/django_project/web/templates/web/full/index.html index 0680387..fed86b3 100644 --- a/src/django_project/web/templates/web/full/index.html +++ b/src/django_project/web/templates/web/full/index.html @@ -26,11 +26,11 @@ - + - + diff --git a/src/docker/Dockerfile b/src/docker/Dockerfile index 8a73246..b16b3fa 100644 --- a/src/docker/Dockerfile +++ b/src/docker/Dockerfile @@ -1,5 +1,5 @@ # === STAGE 1: Build dependencies in a virtual environment === -FROM python:3.12-alpine AS builder +FROM python:3.13-alpine AS builder WORKDIR /app @@ -20,7 +20,7 @@ RUN pip install .[docker] # === STAGE 2: Runtime with only necessary files === -FROM python:3.12-alpine +FROM python:3.13-alpine ARG IMAGE_TAG=dev ENV IMAGE_TAG=${IMAGE_TAG}