From eb28f7453b8fe3b404732c3b36435da913d8f673 Mon Sep 17 00:00:00 2001 From: Stephan Kerkman Date: Thu, 28 May 2026 16:43:15 +0200 Subject: [PATCH] fix: clear overdue when pruned after the scheduled month Previously only a log in the exact scheduled month cleared overdue. Now any log on or after the start of the scheduled month counts, so pruning late (e.g. in May for a March schedule) correctly shows upcoming. Co-Authored-By: Claude Sonnet 4.6 --- plants/tests/test_pruning.py | 9 +++++++++ plants/utils/pruning.py | 13 +++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/plants/tests/test_pruning.py b/plants/tests/test_pruning.py index 68f06cf..042ebf8 100644 --- a/plants/tests/test_pruning.py +++ b/plants/tests/test_pruning.py @@ -58,6 +58,15 @@ def test_not_overdue_when_past_month_logged(): assert pruning_status(plant, today) == 'upcoming' +@pytest.mark.django_db +def test_not_overdue_when_logged_after_scheduled_month(): + # Pruned in May clears a March schedule — the common real-world case + today = date(2026, 5, 28) + plant = Plant.objects.create(name='Rose', location='Garden', pruning_months=[3]) + PruningLog.objects.create(plant=plant, pruned_on=date(2026, 5, 28)) + assert pruning_status(plant, today) == 'upcoming' + + @pytest.mark.django_db def test_upcoming_future_month(): today = date(2026, 5, 15) diff --git a/plants/utils/pruning.py b/plants/utils/pruning.py index a92ebf4..8dc1743 100644 --- a/plants/utils/pruning.py +++ b/plants/utils/pruning.py @@ -23,11 +23,10 @@ def pruning_status(plant, today=None): if not months: return 'no_schedule' - logs = plant.pruning_logs.all() - logged = {(log.pruned_on.year, log.pruned_on.month) for log in logs} + logs = list(plant.pruning_logs.all()) if today.month in months: - if (today.year, today.month) not in logged: + if not any(l.pruned_on.year == today.year and l.pruned_on.month == today.month for l in logs): return 'due_this_month' return 'upcoming' @@ -36,8 +35,10 @@ def pruning_status(plant, today=None): if past.month in months: if i >= 6: return 'upcoming' - if (past.year, past.month) not in logged: - return 'overdue' - return 'upcoming' + # Any log on or after the start of the scheduled month clears overdue + cutoff = date(past.year, past.month, 1) + if any(l.pruned_on >= cutoff for l in logs): + return 'upcoming' + return 'overdue' return 'upcoming'