Two refinements from live testing of the reminder feature:
- Due-time tasks scheduled "due now" and "overdue" at the exact same
moment. Task._due_and_overdue_moments() now delays "overdue" by an
hour so they don't arrive together. The overdue badge/styling
elsewhere is unaffected - only this notification's timing changes.
- Task.reschedule_reminders() only captures user.default_reminder_minutes
at the moment a task's own due_date/due_time is set, so changing the
profile setting didn't reach tasks whose due date was already set.
User.save() now detects a change to that setting and calls the new
User.reschedule_reminder_notifications(), which recomputes the
"before due" reminder on active due tasks that don't have their own
explicit reminder_at override.
8 new/updated tests cover the overdue delay and the retroactive
rescheduling (including that unrelated profile saves and tasks with an
explicit reminder_at are left untouched).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Only proactive notification was the once-a-day 6-7AM digest. Wires up
the previously-unused User.default_reminder_minutes profile setting
and ScheduledReminder model (Gitea #8) to send timely per-task alerts:
- Task.reschedule_reminders(), hooked into Task.save() via a dirty-check
against due_date/due_time/reminder_at/status/is_deleted, (re)creates up
to 3 ScheduledReminder rows per active due task: a "before due" reminder
(from reminder_at if set, else default_reminder_minutes before due), a
"due now" notification, and an "overdue" notification (mirroring
is_overdue's day-after rule for date-only due tasks). Hooking into
save() means every call site - web views, the API, and sync - picks
this up automatically.
- New Celery task send_scheduled_reminders (beat schedule: every 5 min)
sends due reminders via whichever of email/push the user has enabled,
reusing the existing per-user channel toggles, and logs them to the
Notification table.
- 14 new tests covering the scheduling math, due-date-change/completion/
deletion cleanup, and the sending task's channel and timing behavior.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Features:
- Django-based REST API with web interface
- Task management with tags, priorities, and due dates
- Time tracking with start/stop timers
- Subtasks support
- Task filtering (all, today, upcoming, overdue, completed)
- Tag-based organization with color coding
- Sorting by due date and priority
- Auto-assign tags when filtering
- Responsive 3-pane layout (sidebar, task list, detail panel)
- Task sharing between users
- Mobile-responsive design with dark mode support
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>