fix: reset is_blocked_due_to_contract flag when intervention is assigned to an unblocked contract
This commit is contained in:
parent
4824415290
commit
9429402292
2 changed files with 42 additions and 3 deletions
|
|
@ -499,6 +499,8 @@ class Intervention(models.Model):
|
||||||
self.is_blocked_due_to_contract = True
|
self.is_blocked_due_to_contract = True
|
||||||
if is_new and self.status in ('to_be_processed', 'assigned', 'in_progress'):
|
if is_new and self.status in ('to_be_processed', 'assigned', 'in_progress'):
|
||||||
self.status = 'in_preparation'
|
self.status = 'in_preparation'
|
||||||
|
else:
|
||||||
|
self.is_blocked_due_to_contract = False
|
||||||
|
|
||||||
if self.status in STATUS_ORDERS:
|
if self.status in STATUS_ORDERS:
|
||||||
self.status_order = STATUS_ORDERS[self.status]
|
self.status_order = STATUS_ORDERS[self.status]
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import json
|
import json
|
||||||
from django.test import TestCase
|
from django.test import TestCase, RequestFactory
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
|
|
@ -16,6 +16,7 @@ from interventions.views.helpers import get_contract_recipients, get_contract_cc
|
||||||
|
|
||||||
class BlockedContractsTests(TestCase):
|
class BlockedContractsTests(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
self.factory = RequestFactory()
|
||||||
self.User = get_user_model()
|
self.User = get_user_model()
|
||||||
self.thematic, _ = Thematic.objects.get_or_create(code='trafficlights', defaults={'name': 'Feux de signalisation'})
|
self.thematic, _ = Thematic.objects.get_or_create(code='trafficlights', defaults={'name': 'Feux de signalisation'})
|
||||||
self.category, _ = AssetCategory.objects.get_or_create(name_fr='Test Category', thematic=self.thematic)
|
self.category, _ = AssetCategory.objects.get_or_create(name_fr='Test Category', thematic=self.thematic)
|
||||||
|
|
@ -62,8 +63,8 @@ class BlockedContractsTests(TestCase):
|
||||||
uca_blocked = UserContractAccess.objects.create(user_config=self.internal_cfg, contract=self.contract_blocked, can_view_interventions=True)
|
uca_blocked = UserContractAccess.objects.create(user_config=self.internal_cfg, contract=self.contract_blocked, can_view_interventions=True)
|
||||||
from common.models import UserContractStatusPermission
|
from common.models import UserContractStatusPermission
|
||||||
for st in ['in_preparation', 'in_progress', 'to_be_processed']:
|
for st in ['in_preparation', 'in_progress', 'to_be_processed']:
|
||||||
UserContractStatusPermission.objects.create(user_contract=uca_active, status=st, can_view=True)
|
UserContractStatusPermission.objects.create(user_contract=uca_active, status=st, can_view=True, can_change_status_to=True)
|
||||||
UserContractStatusPermission.objects.create(user_contract=uca_blocked, status=st, can_view=True)
|
UserContractStatusPermission.objects.create(user_contract=uca_blocked, status=st, can_view=True, can_change_status_to=True)
|
||||||
|
|
||||||
# External user (contractor)
|
# External user (contractor)
|
||||||
self.external_user = self.User.objects.create_user(username='provider_user', password='pwd')
|
self.external_user = self.User.objects.create_user(username='provider_user', password='pwd')
|
||||||
|
|
@ -218,3 +219,39 @@ class BlockedContractsTests(TestCase):
|
||||||
filtered_unblocked = apply_intervention_filters_from_querydict(base_qs, qdict_unblocked)
|
filtered_unblocked = apply_intervention_filters_from_querydict(base_qs, qdict_unblocked)
|
||||||
self.assertIn(itv_active, filtered_unblocked)
|
self.assertIn(itv_active, filtered_unblocked)
|
||||||
self.assertNotIn(itv_blocked, filtered_unblocked)
|
self.assertNotIn(itv_blocked, filtered_unblocked)
|
||||||
|
|
||||||
|
def test_unblocking_when_changing_contract_to_active(self):
|
||||||
|
symptom = Symptom.objects.create(name_fr='Feu éteint', thematic=self.thematic)
|
||||||
|
# 1. Create intervention on blocked contract
|
||||||
|
itv = Intervention.objects.create(
|
||||||
|
title='Intervention initiale bloquée',
|
||||||
|
contract=self.contract_blocked,
|
||||||
|
assigned_provider=self.company,
|
||||||
|
status='in_preparation',
|
||||||
|
thematic=self.thematic,
|
||||||
|
asset_category=self.category,
|
||||||
|
symptom=symptom,
|
||||||
|
)
|
||||||
|
self.assertTrue(itv.is_blocked_due_to_contract)
|
||||||
|
self.assertTrue(itv.is_contract_blocked)
|
||||||
|
allowed_before = user_allowed_transitions(self.internal_user, 'in_preparation', intervention=itv)
|
||||||
|
self.assertNotIn('to_be_processed', allowed_before)
|
||||||
|
|
||||||
|
# 2. Reassign to active contract
|
||||||
|
itv.contract = self.contract_active
|
||||||
|
itv.save()
|
||||||
|
|
||||||
|
# 3. Verify flags are reset and workflow is unlocked
|
||||||
|
self.assertFalse(itv.is_blocked_due_to_contract)
|
||||||
|
self.assertFalse(itv.is_contract_blocked)
|
||||||
|
allowed_after = user_allowed_transitions(self.internal_user, 'in_preparation', intervention=itv)
|
||||||
|
self.assertIn('to_be_processed', allowed_after)
|
||||||
|
|
||||||
|
# 4. Verify transition to to_be_processed succeeds
|
||||||
|
request = self.factory.post('/workflow/update-status/')
|
||||||
|
request.user = self.internal_user
|
||||||
|
success, msg, _ = attempt_status_update(request, itv, self.internal_user, 'to_be_processed')
|
||||||
|
self.assertTrue(success)
|
||||||
|
itv.refresh_from_db()
|
||||||
|
self.assertEqual(itv.status, 'to_be_processed')
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue