feat: SSG-inspired pSEO CMS — git templates + DuckDB direct reads

Replace the old CSV-upload-based CMS with an SSG architecture where
templates live in git as .md.jinja files with YAML frontmatter and
data comes directly from DuckDB serving tables. Only articles and
published_scenarios remain in SQLite for routing/state.

- Content module: discover, load, generate, preview functions
- Migration 0018: drop article_templates + template_data, recreate
  articles + published_scenarios without FK references, add
  template_slug/language/date_modified/seo_head columns
- Admin routes: read-only template views with generate/regenerate/preview
- SEO pipeline: canonical URLs, hreflang (EN+DE), JSON-LD (Article,
  FAQPage, BreadcrumbList), Open Graph tags baked at generation time
- Example template: city-cost-de.md.jinja for German city market data

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Deeman
2026-02-23 12:25:44 +01:00
parent 5b6c4182f7
commit f1181342ad
15 changed files with 1153 additions and 899 deletions

View File

@@ -6,6 +6,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased]
### Changed
- **pSEO CMS: SSG architecture** — templates now live in git as `.md.jinja` files with YAML
frontmatter (slug, data_table, url_pattern, etc.) instead of SQLite `article_templates` table;
data comes directly from DuckDB serving tables instead of intermediary `template_data` table;
admin template views are read-only (edit in git, preview/generate in admin)
- **pSEO CMS: SEO pipeline** — article generation bakes canonical URLs, hreflang links (EN + DE),
JSON-LD structured data (Article, FAQPage, BreadcrumbList), and Open Graph tags into each
article's `seo_head` column at generation time; articles stored with `template_slug`, `language`,
and `date_modified` columns for regeneration and freshness tracking
### Removed
- `article_templates` and `template_data` SQLite tables (migration 0018) — replaced by git
template files + direct DuckDB reads; `template_data_id` FK removed from `articles` and
`published_scenarios` tables
- Admin template CRUD routes (create/edit/delete) and CSV upload — replaced by read-only views
with generate/regenerate/preview actions
- `template_form.html` and `template_data.html` admin templates
### Changed
- **Extraction: one file per source** — replaced monolithic `execute.py` with per-source
modules (`overpass.py`, `eurostat.py`, `playtomic_tenants.py`, `playtomic_availability.py`);