diff --git a/streetup/interventions/tests/test_calendar.py b/streetup/interventions/tests/test_calendar.py index 228ddc6..7d0ee83 100644 --- a/streetup/interventions/tests/test_calendar.py +++ b/streetup/interventions/tests/test_calendar.py @@ -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) + diff --git a/streetup/interventions/views/calendar.py b/streetup/interventions/views/calendar.py index 9946380..9eb7d8a 100644 --- a/streetup/interventions/views/calendar.py +++ b/streetup/interventions/views/calendar.py @@ -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: