From 74679289a4f6d54b96cdf37138855cd56eca41b0 Mon Sep 17 00:00:00 2001 From: Karl Determe Date: Thu, 3 Sep 2026 17:05:20 +0200 Subject: [PATCH] feat: add calendar view for interventions with user preference persistence --- loko/interventions/tests/test_calendar.py | 41 +++++++++++++++++++++++ loko/interventions/views/calendar.py | 6 +++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/loko/interventions/tests/test_calendar.py b/loko/interventions/tests/test_calendar.py index bed5cd3..2e4e488 100644 --- a/loko/interventions/tests/test_calendar.py +++ b/loko/interventions/tests/test_calendar.py @@ -387,6 +387,47 @@ class CalendarEventsTests(TestCase): self.assertEqual(ids, [itv_urgent_new.id, itv_urgent_old.id, itv_low_old.id]) + def test_calendar_backlog_includes_overdue_interventions_older_than_three_months(self): + old_date = timezone.now() - timedelta(days=150) + itv_old_unprocessed = Intervention.objects.create( + title='Old To Be Processed Intervention', + status='to_be_processed', + maintain_type='corrective', + expected_begin_time=old_date, + planned_begin_time=old_date, + ) + Intervention.objects.filter(id=itv_old_unprocessed.id).update(creation_time=old_date) + + itv_old_finished = Intervention.objects.create( + title='Old Finished Intervention', + status='finished', + maintain_type='corrective', + end_time=old_date, + ) + Intervention.objects.filter(id=itv_old_finished.id).update(creation_time=old_date) + + # Test in teams_daily view mode + url_daily = reverse('interventions:interventions_events') + '?view_mode=teams_daily' + response_daily = self.client.get(url_daily) + self.assertEqual(response_daily.status_code, 200) + data_daily = response_daily.json() + backlog_daily = data_daily.get('backlog_groups', {}).get('corrective', []) + backlog_daily_ids = [item['id'] for item in backlog_daily] + + self.assertIn(itv_old_unprocessed.id, backlog_daily_ids) + self.assertNotIn(itv_old_finished.id, backlog_daily_ids) + + # Test in members view mode + url_members = reverse('interventions:interventions_events') + '?view_mode=members' + response_members = self.client.get(url_members) + self.assertEqual(response_members.status_code, 200) + data_members = response_members.json() + backlog_members = data_members.get('backlog_groups', {}).get('corrective', []) + backlog_members_ids = [item['id'] for item in backlog_members] + + self.assertIn(itv_old_unprocessed.id, backlog_members_ids) + self.assertNotIn(itv_old_finished.id, backlog_members_ids) + def test_member_history_ajax_permissions_and_data(self): from contracts.models import CompanyMember, CompanyMemberHistory from interventions.models import Intervention diff --git a/loko/interventions/views/calendar.py b/loko/interventions/views/calendar.py index 9026337..672915c 100644 --- a/loko/interventions/views/calendar.py +++ b/loko/interventions/views/calendar.py @@ -126,6 +126,7 @@ logger = logging.getLogger(__name__) from interventions.views.helpers import * +FINISHED_STATUSES = {'finished', 'processed', 'corrected', 'validated', 'invoiced', 'closed', 'canceled'} def interventions_calendar(request): @@ -372,9 +373,12 @@ def interventions_events(request): end_window_filter = Q(effective_end__gte=start) | Q(effective_end__isnull=True) if view_mode in ('members', 'teams_daily'): + # Dans les vues par membres et par équipes journalières, le panneau latéral présente le backlog à assigner. + # Les interventions non terminées doivent rester visibles dans ce backlog même si leur date dépasse 3 mois. + backlog_window_filter = end_window_filter | ~Q(status__in=FINISHED_STATUSES) interventions = ( interventions - .filter(end_window_filter) + .filter(backlog_window_filter) .filter(Q(effective_begin__lte=end) | Q(effective_begin__isnull=True)) ) else: