1.19.0 — Bounded PostgreSQL pooling and complete transactional email templates
Editorial identity incomplete
2026-08-24
django-mojo 1.19.0 uses bounded, health-checked psycopg 3 pools for PostgreSQL under ASGI, completes the built-in transactional account email templates, and treats paid database/cache redundancy as an explicit availability choice.
Breaking
- PostgreSQL deployments now standardize on psycopg 3 with its native pool package. Django ORM users should be transparent, but application code that imports
psycopg2directly or relies on psycopg2-specific raw-driver behavior must migrate or be tested before upgrading. - Otherwise-unconfigured PostgreSQL aliases now receive a native pool per process with
min_size=1,max_size=4,timeout=5,max_idle=300, andmax_lifetime=1800;CONN_MAX_AGEremains0as required for Django pooling under ASGI. With the default four Uvicorn workers this permits up to 16 connections per node per alias.
Added
- Default templates now cover every built-in transactional account email flow, including invitations, magic login, password reset, email verification, email change, and account deactivation.
Changed
- Derived database-reader aliases receive an independent bounded pool instead of a 60-second persistent connection.
- Transactional link emails now render server-resolved frontend URLs instead of raw tokens or placeholder hosts.
- The reference AWS audit now treats a writer-only Aurora cluster or single-node cache as an explicit cost/recovery choice rather than a deployment failure; misconfigured paid replicas remain visible as warnings.
Fixed
- Missing template seeds and placeholder-host link templates no longer silently leave built-in account flows with unusable email.
Upgrade notes
- Replace the default pool globally with
DATABASE_POOL_OPTIONS, or set it toFalseto disable automatic pooling. An explicit per-aliasCONN_MAX_AGEor the legacyDATABASE_CONN_MAX_AGEalso opts that alias out. - Size connection capacity as
nodes × Uvicorn workers × sum(alias max_size), leaving headroom for migrations, background processes, operators, and failover. - RDS Proxy and PgBouncer remain separate infrastructure layers. Transaction-mode poolers require
DISABLE_SERVER_SIDE_CURSORS = True; django-mojo's session advisory-lock paths must be isolated or redesigned before using PgBouncer transaction mode. RDS Proxy preserves those paths by pinning their client connections, reducing multiplexing. - Shipped template loading remains missing-only and will not overwrite customized database rows. Run
python manage.py seed_email_templates --update-existingonly when you intend to replace existing templates with the shipped versions.