feat: allow unassigning interventions to revert status to backlog and clear schedule dates

This commit is contained in:
kdeterme 2026-08-12 08:32:59 +02:00
parent 093457ce8d
commit 8590ddb17c
2 changed files with 42 additions and 10 deletions

View file

@ -290,6 +290,32 @@ class CalendarEventsTests(TestCase):
self.assertTrue(len(data['team_history']) >= 1)
self.assertEqual(data['team_history'][0]['team_name'], self.team_a.name)
def test_unassign_sans_equipe_reverts_status_to_backlog(self):
itv = Intervention.objects.create(
title='Unassigned Test',
status='to_be_processed',
maintain_type='corrective',
priority='2',
planned_begin_time=timezone.now(),
planned_end_time=timezone.now() + timedelta(hours=2),
)
url = reverse('interventions:interventions_schedule_update')
payload = {
'intervention_id': itv.id,
'member_id': None,
'team_id': None,
'unassign': True,
}
response = self.client.post(url, json.dumps(payload), content_type='application/json')
self.assertEqual(response.status_code, 200)
itv.refresh_from_db()
self.assertEqual(itv.status, 'to_be_planned')
self.assertIsNone(itv.planned_begin_time)
self.assertIsNone(itv.planned_end_time)
self.assertIsNone(itv.assigned_team)
self.assertIsNone(itv.assigned_member)

View file

@ -1213,14 +1213,20 @@ def interventions_schedule_update(request):
if planned_end and is_naive(planned_end):
planned_end = make_aware(planned_end, tz)
if not planned_begin:
return JsonResponse({'error': _('La date de début planifiée est obligatoire.')}, status=400)
if planned_begin.date() < timezone.now().date():
return JsonResponse({'error': _("Il est interdit de planifier ou d'assigner une intervention dans le passé.")}, status=400)
if not planned_end:
planned_end = planned_begin + timedelta(hours=2)
if planned_end <= planned_begin:
return JsonResponse({'error': _('La fin planifiée doit être postérieure au début planifié.')}, status=400)
unassign = payload.get('unassign', False) or payload.get('to_backlog', False) or (member_key_present and team_key_present and not member_id and not team_id)
if not unassign:
if not planned_begin:
return JsonResponse({'error': _('La date de début planifiée est obligatoire.')}, status=400)
if planned_begin.date() < timezone.now().date():
return JsonResponse({'error': _("Il est interdit de planifier ou d'assigner une intervention dans le passé.")}, status=400)
if not planned_end:
planned_end = planned_begin + timedelta(hours=2)
if planned_end <= planned_begin:
return JsonResponse({'error': _('La fin planifiée doit être postérieure au début planifié.')}, status=400)
else:
planned_begin = None
planned_end = None
prev_begin = intervention.planned_begin_time
prev_end = intervention.planned_end_time
@ -1256,13 +1262,13 @@ def interventions_schedule_update(request):
# Check if intervention is being assigned (to member or team)
is_now_assigned = intervention.assigned_member_id is not None or intervention.assigned_team_id is not None
was_assigned = prev_member_id is not None or prev_team_id is not None
is_unassigning = unassign or (not is_now_assigned)
# If intervention was "to_be_planned" and is now assigned -> change to "to_be_processed"
if prev_status == 'to_be_planned' and is_now_assigned:
new_status = 'to_be_processed'
# If intervention is being unassigned (back to backlog) -> change to "to_be_planned"
elif was_assigned and not is_now_assigned and prev_status in ('to_be_processed', 'assigned'):
elif is_unassigning and prev_status in ('to_be_processed', 'assigned'):
new_status = 'to_be_planned'
if new_status != prev_status: