From 81b361859d62f7b0305e824c2867385f1e944e25 Mon Sep 17 00:00:00 2001 From: Deeman Date: Tue, 24 Feb 2026 01:15:44 +0100 Subject: [PATCH] feat: invalidate sitemap cache on article publish/delete/create Add invalidate_sitemap_cache() to sitemap.py and call it from article_publish, article_delete, and article_new admin routes. Subtask 6 of CMS admin improvement. Co-Authored-By: Claude Opus 4.6 --- web/src/padelnomics/admin/routes.py | 11 +++++++++++ web/src/padelnomics/sitemap.py | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/web/src/padelnomics/admin/routes.py b/web/src/padelnomics/admin/routes.py index da5cdea..b323977 100644 --- a/web/src/padelnomics/admin/routes.py +++ b/web/src/padelnomics/admin/routes.py @@ -1740,6 +1740,9 @@ async def article_new(): (url_path, article_slug, title, meta_description, og_image_url, country, region, status, pub_dt), ) + from ..sitemap import invalidate_sitemap_cache + invalidate_sitemap_cache() + await flash(f"Article '{title}' created.", "success") return redirect(url_for("admin.articles")) @@ -1828,6 +1831,10 @@ async def article_delete(article_id: int): md_path.unlink() await execute("DELETE FROM articles WHERE id = ?", (article_id,)) + + from ..sitemap import invalidate_sitemap_cache + invalidate_sitemap_cache() + await flash("Article deleted.", "success") return redirect(url_for("admin.articles")) @@ -1848,6 +1855,10 @@ async def article_publish(article_id: int): "UPDATE articles SET status = ?, updated_at = ? WHERE id = ?", (new_status, now, article_id), ) + + from ..sitemap import invalidate_sitemap_cache + invalidate_sitemap_cache() + await flash(f"Article status changed to {new_status}.", "success") return redirect(url_for("admin.articles")) diff --git a/web/src/padelnomics/sitemap.py b/web/src/padelnomics/sitemap.py index d7c1568..8a279cd 100644 --- a/web/src/padelnomics/sitemap.py +++ b/web/src/padelnomics/sitemap.py @@ -103,6 +103,13 @@ async def _generate_sitemap_xml(base_url: str) -> str: return xml +def invalidate_sitemap_cache() -> None: + """Force sitemap regeneration on next request.""" + global _cache_xml, _cache_timestamp # noqa: PLW0603 + _cache_xml = "" + _cache_timestamp = 0.0 + + async def sitemap_response(base_url: str) -> Response: """Return cached sitemap XML, regenerating if stale (1-hour TTL).""" global _cache_xml, _cache_timestamp # noqa: PLW0603