From bd1d29468a3153fe85025c84899250a78604a9e7 Mon Sep 17 00:00:00 2001 From: Deeman Date: Tue, 24 Feb 2026 00:21:00 +0100 Subject: [PATCH] fix(content): handle None values in template pattern rendering DuckDB rows can have NULL columns (e.g. market_score, median_peak_rate). Replace None with 0 in render context so numeric Jinja2 filters like round() and int don't crash with "NoneType doesn't define __round__". Co-Authored-By: Claude Opus 4.6 --- web/src/padelnomics/content/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/web/src/padelnomics/content/__init__.py b/web/src/padelnomics/content/__init__.py index 548c17e..9ee25a3 100644 --- a/web/src/padelnomics/content/__init__.py +++ b/web/src/padelnomics/content/__init__.py @@ -12,7 +12,7 @@ from pathlib import Path import mistune import yaml -from jinja2 import Environment +from jinja2 import ChainableUndefined, Environment from ..analytics import fetch_analytics from ..core import execute, fetch_one, slugify @@ -146,10 +146,12 @@ def _datetimeformat(value: str, fmt: str = "%Y-%m-%d") -> str: def _render_pattern(pattern: str, context: dict) -> str: """Render a Jinja2 pattern string with context variables.""" - env = Environment() + env = Environment(undefined=ChainableUndefined) env.filters["slugify"] = slugify env.filters["datetimeformat"] = _datetimeformat - return env.from_string(pattern).render(**context) + # Replace None values with 0 so numeric filters (round, int) don't crash + safe_context = {k: (v if v is not None else 0) for k, v in context.items()} + return env.from_string(pattern).render(**safe_context) def _extract_faq_pairs(markdown: str) -> list[dict]: