diff --git a/CHANGELOG.md b/CHANGELOG.md index 93cf8a7..257c110 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] ### Added +- **Python supervisor** (`src/padelnomics/supervisor.py`) — replaces `supervisor.sh`; + reads `infra/supervisor/workflows.toml` (module, schedule, entry, depends_on, + proxy_mode); runs due workflows in topological waves (parallel within each wave); + croniter-based `is_due()` check; systemd service updated to use `uv run python` +- **`workflows.toml` workflow registry** — 5 extractors registered: overpass, + eurostat, playtomic_tenants, playtomic_availability, playtomic_prices; cron + presets: hourly/daily/weekly/monthly; `playtomic_availability` depends on + `playtomic_tenants` +- **`proxy.py` proxy rotation** (`extract/padelnomics_extract/proxy.py`) — reads + `PROXY_URLS` env var; `make_round_robin_cycler()` for thread-safe round-robin; + `make_sticky_selector()` for consistent per-tenant proxy assignment (hash-based) +- **DB-backed feature flags** — `feature_flags` table (migration 0019); + `is_flag_enabled(name, default)` helper; `feature_gate(flag, template)` decorator + replaces `WAITLIST_MODE`/`waitlist_gate`; 5 flags seeded: `markets` (on), + `payments`, `planner_export`, `supplier_signup`, `lead_unlock` (all off) +- **Admin feature flags UI** — `/admin/flags` lists all flags with toggle; + `POST /admin/flags/toggle` flips enabled bit; requires admin role; flash message + on unknown flag +- **`lead_unlock` gate** — `unlock_lead` route returns HTTP 403 when `lead_unlock` + flag is disabled - **Playtomic full data extraction** — expanded venue bounding boxes from 4 regions (ES, UK, DE, FR) to 23 globally (Italy, Portugal, NL, BE, AT, CH, Nordics, Mexico, Argentina, Middle East, USA); PAGE_SIZE increased from 20 to 100; availability diff --git a/PROJECT.md b/PROJECT.md index 93adf10..72862ba 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -1,7 +1,7 @@ # Padelnomics — Project Tracker > Move tasks across columns as you work. Add new tasks at the top of the relevant column. -> Last updated: 2026-02-22. +> Last updated: 2026-02-23. --- @@ -59,7 +59,9 @@ - [x] Boost purchases (logo, highlight, verified, card color, sticky week/month) - [x] Credit pack purchases (25/50/100/250) - [x] Supplier subscription tiers (Basic free / Growth €149 / Pro €399, monthly + annual) -- [x] `WAITLIST_MODE` toggle — gates supplier signup + export on GET (default: false) +- [x] **Feature flags** (DB-backed, migration 0019) — `is_flag_enabled()` + `feature_gate()` decorator replace `WAITLIST_MODE`; 5 flags (markets, payments, planner_export, supplier_signup, lead_unlock); admin UI at `/admin/flags` with toggle +- [x] **Python supervisor** (`src/padelnomics/supervisor.py`) + `workflows.toml` — replaces `supervisor.sh`; topological wave scheduling; croniter-based `is_due()`; systemd service updated +- [x] **Proxy rotation** (`extract/padelnomics_extract/proxy.py`) — round-robin + sticky hash-based selector via `PROXY_URLS` env var - [x] Resend email integration (transactional: magic link, welcome, quote verify, lead forward, enquiry) - [x] Auto-create Resend audiences per blueprint (waitlist, planner nurture)