⚠️ This is a breaking release:
- All
Task Schedule records must be written in -local- cron, instead of legacy UTC cron.
- Environment Variables have replaced physical config files.
- A
bench migrate is mandatory after code upgrade.
- Version 1.0.0 of BTU Scheduler is -mandatory-
Key Highlights
- New official documentation: https://btu.datahenge.com
- Per-schedule timezone support. Each
BTU Task Schedule can now carry its own timezone; new tests added.
- Redis-based Scheduler messaging : Replaced Unix Domain Socket IPC with Redis blocking calls.
- Web calls to Scheduler now play nice with containers and K8s.
- Improved Web UI responsiveness.
- Added a cron generation dialog, reduced DocFields clutter, and reorganized infrequently edited fields into tabs.
- Dynamic IANA timezone dropdown —
Task Schedule timezone selection now pulls from a live IANA timezone list.
- One-shot double-fire prevention — Added checks to prevent a One Shot task from firing more than once.
- Logging overhaul: Replaced print() and dprint() calls throughout with proper Python logging.
Misc
- Improved email error handling — Failures in BTU's notification emails no longer propagate as hard errors.
- Scheduler defaults and retroactive change log — Better default values for new Tasks; added a retroactive change log entry.
- Remove BTU Queue; significant architectural simplification — Eliminated the BTU Queue DocType, fixed save() when the Scheduler is offline, removed the separate Email Account field, and replaced the timezone picker with an Autocomplete field.
- Directory restructuring: Moved non-BTU utility code out of the repo into Gists to reduce scope.
- Ruff linting integrated — Added AGENTS.md, workspace config, and Ruff; completed a first-pass cleanup of easy lint violations, unused imports, and type annotations.
- Fully-qualified function paths enforced — TaskComponent now requires dotted module paths instead of raw function objects.
- Advisory lock bug fix — poll_for_ready_work() was losing its SQL lock on frappe.db.commit(); switched to MariaDB/PostgreSQL advisory locks.
- RQ Job ID saved correctly — BTU Task Log now persists the Redis Queue Job ID properly.
- Resolved pickling failures for bound methods and Frappe Documents.
- Email failure isolation — A failure to send a post-task email no longer fails the task itself.