feat: add calendar view for interventions with user preference persistence

This commit is contained in:
Karl Determe 2026-09-03 17:05:20 +02:00
parent d131fcb0d6
commit 74679289a4
2 changed files with 46 additions and 1 deletions

View file

@ -387,6 +387,47 @@ class CalendarEventsTests(TestCase):
self.assertEqual(ids, [itv_urgent_new.id, itv_urgent_old.id, itv_low_old.id]) 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): def test_member_history_ajax_permissions_and_data(self):
from contracts.models import CompanyMember, CompanyMemberHistory from contracts.models import CompanyMember, CompanyMemberHistory
from interventions.models import Intervention from interventions.models import Intervention

View file

@ -126,6 +126,7 @@ logger = logging.getLogger(__name__)
from interventions.views.helpers import * from interventions.views.helpers import *
FINISHED_STATUSES = {'finished', 'processed', 'corrected', 'validated', 'invoiced', 'closed', 'canceled'}
def interventions_calendar(request): 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) end_window_filter = Q(effective_end__gte=start) | Q(effective_end__isnull=True)
if view_mode in ('members', 'teams_daily'): 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 = (
interventions interventions
.filter(end_window_filter) .filter(backlog_window_filter)
.filter(Q(effective_begin__lte=end) | Q(effective_begin__isnull=True)) .filter(Q(effective_begin__lte=end) | Q(effective_begin__isnull=True))
) )
else: else: