Skip to content

Commit ab65d7a

Browse files
committed
[OS-1499] Updates related to the quarantine criteria
1 parent c1a5f4b commit ab65d7a

File tree

8 files changed

+58
-31
lines changed

8 files changed

+58
-31
lines changed

admin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@ def queryset(self, request, queryset):
690690
quarantaine=Case(
691691
When(
692692
Q(candidate__personmergeproposal__status__in=PersonMergeStatus.quarantine_statuses())
693+
| ~Q(candidate__personmergeproposal__validation__has_key='valid')
693694
| ~Q(candidate__personmergeproposal__validation__valid=True),
694695
then=Value(True),
695696
),

ddd/admission/domain/validator/_should_ne_pas_etre_en_quarantaine.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# The core business involves the administration of students, teachers,
77
# courses, programs and so on.
88
#
9-
# Copyright (C) 2015-2024 Université catholique de Louvain (http://www.uclouvain.be)
9+
# Copyright (C) 2015-2025 Université catholique de Louvain (http://www.uclouvain.be)
1010
#
1111
# This program is free software: you can redistribute it and/or modify
1212
# it under the terms of the GNU General Public License as published by
@@ -38,6 +38,6 @@ class ShouldNePasEtreEnQuarantaine(BusinessValidator):
3838
def validate(self, *args, **kwargs):
3939
if self.merge_proposal and (
4040
self.merge_proposal.status in PersonMergeStatus.quarantine_statuses()
41-
or not self.merge_proposal.validation.get('valid', True)
41+
or not self.merge_proposal.validation.get('valid', False)
4242
):
4343
raise EnQuarantaineException

models/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,9 @@ def filter_in_quarantine(self):
394394
Q(candidate__personmergeproposal__isnull=False)
395395
& Q(
396396
Q(candidate__personmergeproposal__status__in=PersonMergeStatus.quarantine_statuses())
397-
|
398397
# Cas validation ticket Digit en erreur
399-
~Q(candidate__personmergeproposal__validation__valid=True)
398+
| ~Q(candidate__personmergeproposal__validation__valid=True)
399+
| ~Q(candidate__personmergeproposal__validation__has_key='valid')
400400
)
401401
)
402402

templates/admission/details/person.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* The core business involves the administration of students, teachers,
99
* courses, programs and so on.
1010
*
11-
* Copyright (C) 2015-2023 Université catholique de Louvain (http://www.uclouvain.be)
11+
* Copyright (C) 2015-2025 Université catholique de Louvain (http://www.uclouvain.be)
1212
*
1313
* This program is free software: you can redistribute it and/or modify
1414
* it under the terms of the GNU General Public License as published by

tests/contrib/models/test_base.py

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# The core business involves the administration of students, teachers,
77
# courses, programs and so on.
88
#
9-
# Copyright (C) 2015-2024 Université catholique de Louvain (http://www.uclouvain.be)
9+
# Copyright (C) 2015-2025 Université catholique de Louvain (http://www.uclouvain.be)
1010
#
1111
# This program is free software: you can redistribute it and/or modify
1212
# it under the terms of the GNU General Public License as published by
@@ -29,29 +29,42 @@
2929
from django.db import IntegrityError
3030
from django.test import TestCase
3131

32-
from admission.constants import CONTEXT_GENERAL, CONTEXT_CONTINUING, CONTEXT_DOCTORATE
33-
from admission.models import AdmissionViewer, ContinuingEducationAdmissionProxy
34-
from admission.models.base import admission_directory_path, BaseAdmission
35-
from admission.ddd.admission.doctorat.preparation.domain.model.enums import ChoixStatutPropositionDoctorale
36-
from admission.ddd.admission.formation_continue.domain.model.enums import ChoixStatutPropositionContinue
37-
from admission.ddd.admission.formation_generale.domain.model.enums import ChoixStatutPropositionGenerale
32+
from admission.constants import CONTEXT_CONTINUING, CONTEXT_DOCTORATE, CONTEXT_GENERAL
33+
from admission.ddd.admission.doctorat.preparation.domain.model.enums import (
34+
ChoixStatutPropositionDoctorale,
35+
)
36+
from admission.ddd.admission.formation_continue.domain.model.enums import (
37+
ChoixStatutPropositionContinue,
38+
)
39+
from admission.ddd.admission.formation_generale.domain.model.enums import (
40+
ChoixStatutPropositionGenerale,
41+
)
3842
from admission.infrastructure.admission.domain.service.annee_inscription_formation import (
3943
continuing_education_types_as_set,
4044
doctorate_types_as_set,
4145
)
46+
from admission.models import AdmissionViewer, ContinuingEducationAdmissionProxy
47+
from admission.models.base import BaseAdmission, admission_directory_path
4248
from admission.tests.factories import DoctorateAdmissionFactory
4349
from admission.tests.factories.admission_viewer import AdmissionViewerFactory
44-
from admission.tests.factories.continuing_education import ContinuingEducationAdmissionFactory
50+
from admission.tests.factories.continuing_education import (
51+
ContinuingEducationAdmissionFactory,
52+
)
4553
from admission.tests.factories.general_education import GeneralEducationAdmissionFactory
4654
from base.models.entity_version import EntityVersion
47-
from base.models.enums.education_group_types import TrainingType, AllTypes
55+
from base.models.enums.education_group_types import AllTypes, TrainingType
4856
from base.models.enums.entity_type import EntityType
4957
from base.models.person_merge_proposal import PersonMergeProposal, PersonMergeStatus
5058
from base.tests.factories.academic_year import AcademicYearFactory
5159
from base.tests.factories.education_group_type import EducationGroupTypeFactory
52-
from base.tests.factories.entity_version import MainEntityVersionFactory, EntityVersionFactory
60+
from base.tests.factories.entity_version import (
61+
EntityVersionFactory,
62+
MainEntityVersionFactory,
63+
)
5364
from base.tests.factories.person import PersonFactory
54-
from epc.tests.factories.inscription_programme_annuel import InscriptionProgrammeAnnuelFactory
65+
from epc.tests.factories.inscription_programme_annuel import (
66+
InscriptionProgrammeAnnuelFactory,
67+
)
5568

5669

5770
class BaseTestCase(TestCase):
@@ -171,7 +184,7 @@ def test_admission_in_quarantine(self):
171184

172185
for status in PersonMergeStatus:
173186
proposal.status = status.name
174-
proposal.validation = {}
187+
proposal.validation = {'valid': True}
175188
proposal.save()
176189

177190
admission = BaseAdmission.objects.get(pk=admission.pk)
@@ -187,6 +200,14 @@ def test_admission_in_quarantine(self):
187200

188201
self.assertTrue(admission.is_in_quarantine)
189202

203+
# The admission is always in quarantine if the valid property is not specified
204+
proposal.validation = {}
205+
proposal.save()
206+
207+
admission = BaseAdmission.objects.get(pk=admission.pk)
208+
209+
self.assertTrue(admission.is_in_quarantine)
210+
190211

191212
@freezegun.freeze_time('2023-01-01')
192213
class AdmissionFormattedReferenceTestCase(TestCase):

utils.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import uuid
2828
from collections import defaultdict
2929
from contextlib import suppress
30-
from typing import Dict, Iterable, List, Union, Optional
30+
from typing import Dict, Iterable, List, Optional, Union
3131

3232
import weasyprint
3333
from django.conf import settings
@@ -98,7 +98,7 @@
9898
def get_cached_admission_perm_obj(admission_uuid):
9999
qs = DoctorateAdmission.objects.select_related(
100100
'supervision_group',
101-
'candidate__personmergeproposal',
101+
'candidate',
102102
'training__academic_year',
103103
'training__education_group_type',
104104
'determined_academic_year',
@@ -111,7 +111,7 @@ def get_cached_admission_perm_obj(admission_uuid):
111111

112112
def get_cached_general_education_admission_perm_obj(admission_uuid):
113113
qs = GeneralEducationAdmission.objects.select_related(
114-
'candidate__personmergeproposal',
114+
'candidate',
115115
'training__academic_year',
116116
'training__education_group_type',
117117
'determined_academic_year',
@@ -124,7 +124,7 @@ def get_cached_general_education_admission_perm_obj(admission_uuid):
124124

125125
def get_cached_continuing_education_admission_perm_obj(admission_uuid):
126126
qs = ContinuingEducationAdmission.objects.select_related(
127-
'candidate__personmergeproposal',
127+
'candidate',
128128
'training__academic_year',
129129
'training__specificiufcinformations',
130130
)

views/common/mixins.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
person_is_sic,
118118
)
119119
from admission.views.list import BaseAdmissionList
120-
from base.models.person_merge_proposal import PersonMergeStatus
120+
from base.models.person_merge_proposal import PersonMergeProposal, PersonMergeStatus
121121
from ddd.logic.financabilite.domain.model.enums.etat import EtatFinancabilite
122122
from ddd.logic.gestion_des_comptes.queries import GetPropositionFusionQuery
123123
from infrastructure.messages_bus import message_bus_instance
@@ -296,7 +296,7 @@ def injection_possible(self):
296296
elif contexte == CONTEXT_CONTINUING:
297297
if not self.admission.training.specificiufcinformations.registration_required:
298298
return False, "La formation doit avoir l'inscription au rôle requise"
299-
personmergeproposal = getattr(self.admission.candidate, 'personmergeproposal', None)
299+
personmergeproposal = self.current_merge_proposal
300300
if not (personmergeproposal and personmergeproposal.registration_id_sent_to_digit):
301301
return False, "Il manque le noma"
302302
if not self.admission.candidate.global_id.startswith('00'):
@@ -309,12 +309,23 @@ def injection_possible(self):
309309
return False, "La demande est en quarantaine"
310310
return True, ''
311311

312+
@cached_property
313+
def current_merge_proposal(self):
314+
return PersonMergeProposal.objects.filter(original_person=self.admission.candidate).first()
315+
312316
@cached_property
313317
def demande_est_en_quarantaine(self) -> bool:
318+
person_merge_proposal = self.current_merge_proposal
319+
person_merge_proposal = getattr(self.admission.candidate, 'personmergeproposal', None)
320+
person_merge_proposal = getattr(self.admission.candidate, 'personmergeproposal', None)
314321
person_merge_proposal = getattr(self.admission.candidate, 'personmergeproposal', None)
322+
person_merge_proposal = getattr(self.admission.candidate, 'personmergeproposal', None)
323+
person_merge_proposal = getattr(self.admission.candidate, 'personmergeproposal', None)
324+
person_merge_proposal = getattr(self.admission.candidate, 'personmergeproposal', None)
325+
315326
if person_merge_proposal and (
316327
person_merge_proposal.status in PersonMergeStatus.quarantine_statuses()
317-
or not person_merge_proposal.validation.get('valid', True)
328+
or not person_merge_proposal.validation.get('valid', False)
318329
):
319330
# Cas display warning when quarantaine
320331
# (cf. admission/infrastructure/admission/domain/service/lister_toutes_demandes.py)

views/doctorate/details/checklist/mixins.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,7 @@ def get_context_data(self, **kwargs):
164164
if has_comment:
165165
checklist_additional_icons['decision_cdd'] = 'fa-regular fa-comment'
166166

167-
person_merge_proposal = getattr(self.admission.candidate, 'personmergeproposal', None)
168-
if person_merge_proposal and (
169-
person_merge_proposal.status in PersonMergeStatus.quarantine_statuses()
170-
or not person_merge_proposal.validation.get('valid', True)
171-
):
172-
# Cas display warning when quarantaine
173-
# (cf. admission/infrastructure/admission/domain/service/lister_toutes_demandes.py)
167+
if self.demande_est_en_quarantaine:
174168
checklist_additional_icons['donnees_personnelles'] = 'fas fa-warning text-warning'
175169

176170
candidate_admissions: List[DemandeRechercheDTO] = message_bus_instance.invoke(

0 commit comments

Comments
 (0)