Skip to content

Commit cc420fd

Browse files
committed
[OS-1693] IUFC > checklist > add the personal data tab
1 parent 9bd052f commit cc420fd

File tree

32 files changed

+1170
-191
lines changed

32 files changed

+1170
-191
lines changed

auth/roles/central_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,10 +198,10 @@ def common_rule_set(cls, is_entity_manager: callable):
198198
& (general.in_sic_status | continuing.is_submitted | doctorate.in_sic_status)
199199
& ~is_sent_to_epc,
200200
'admission.change_personal_data_checklist_status_to_be_processed': is_entity_manager
201-
& (general.in_sic_status | doctorate.in_sic_status)
201+
& (general.in_sic_status | continuing.is_submitted | doctorate.in_sic_status)
202202
& ~is_sent_to_epc,
203203
'admission.change_personal_data_checklist_status_cleaned': is_entity_manager
204-
& (general.in_sic_status | doctorate.in_sic_status)
204+
& (general.in_sic_status | continuing.is_submitted | doctorate.in_sic_status)
205205
& ~is_sent_to_epc,
206206
'admission.change_checklist_iufc': is_entity_manager & continuing.is_submitted & ~is_sent_to_epc,
207207
'admission.cancel_admission_iufc': is_entity_manager & continuing.is_submitted,

auth/roles/program_manager.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,17 @@ def rule_set(cls):
9191
'admission.view_admission_person': is_part_of_education_group,
9292
'admission.change_admission_person': is_part_of_education_group
9393
& (
94-
general.in_manager_status & personal_data_checklist_status_is_not_validated
94+
general.in_manager_status
9595
| continuing.in_manager_status & ~candidate_has_other_doctorate_or_general_admissions
96-
| doctorate.in_manager_status & personal_data_checklist_status_is_not_validated
96+
| doctorate.in_manager_status
9797
)
98+
& personal_data_checklist_status_is_not_validated
9899
& ~is_sent_to_epc
99100
& ~workflow_injection_signaletique_en_cours,
100101
'admission.view_admission_coordinates': is_part_of_education_group,
101102
'admission.change_admission_coordinates': is_part_of_education_group
102-
& (
103-
general.in_manager_status & personal_data_checklist_status_is_not_validated
104-
| continuing.in_manager_status
105-
| doctorate.in_manager_status & personal_data_checklist_status_is_not_validated
106-
)
103+
& (general.in_manager_status | continuing.in_manager_status | doctorate.in_manager_status)
104+
& personal_data_checklist_status_is_not_validated
107105
& ~is_sent_to_epc
108106
& ~workflow_injection_signaletique_en_cours,
109107
'admission.view_admission_secondary_studies': is_part_of_education_group,
@@ -199,11 +197,11 @@ def rule_set(cls):
199197
& continuing.is_submitted
200198
& ~is_sent_to_epc,
201199
'admission.change_personal_data_checklist_status_to_be_processed': is_part_of_education_group
202-
& (general.in_manager_status | doctorate.in_manager_status)
200+
& (general.in_manager_status | doctorate.in_manager_status | continuing.is_submitted)
203201
& personal_data_checklist_status_is_cleaned
204202
& ~is_sent_to_epc,
205203
'admission.change_personal_data_checklist_status_cleaned': is_part_of_education_group
206-
& (general.in_manager_status | doctorate.in_manager_status)
204+
& (general.in_manager_status | doctorate.in_manager_status | continuing.is_submitted)
207205
& personal_data_checklist_status_is_to_be_processed
208206
& ~is_sent_to_epc,
209207
'admission.cancel_admission_iufc': is_part_of_education_group

ddd/admission/doctorat/preparation/domain/model/statut_checklist.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def get_status(self, status: str, extra: Optional[Dict[str, any]] = None) -> Opt
152152

153153
STATUTS_CHECKLIST_PAR_ONGLET: Dict[str, Dict[str, ConfigurationStatutChecklist]] = {}
154154

155-
onglet_donnes_personnelles = ConfigurationOngletChecklist(
155+
onglet_donnees_personnelles = ConfigurationOngletChecklist(
156156
identifiant=OngletsChecklist.donnees_personnelles,
157157
statuts=[
158158
ConfigurationStatutChecklist(
@@ -508,7 +508,7 @@ def get_status(self, status: str, extra: Optional[Dict[str, any]] = None) -> Opt
508508
)
509509

510510
ORGANISATION_ONGLETS_CHECKLIST: List[ConfigurationOngletChecklist] = [
511-
onglet_donnes_personnelles,
511+
onglet_donnees_personnelles,
512512
onglet_assimilation,
513513
onglet_parcours_anterieur,
514514
onglets_parcours_anterieur_experiences,

ddd/admission/formation_continue/domain/model/enums.py

Lines changed: 4 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-2026 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
@@ -24,7 +24,8 @@
2424
#
2525
# ##############################################################################
2626

27-
from django.utils.translation import gettext_lazy as _, pgettext_lazy
27+
from django.utils.translation import gettext_lazy as _
28+
from django.utils.translation import pgettext_lazy
2829

2930
from base.models.utils.utils import ChoiceEnum
3031

@@ -131,3 +132,4 @@ class ChoixEdition(ChoiceEnum):
131132
class OngletsChecklist(ChoiceEnum):
132133
fiche_etudiant = _("Student report")
133134
decision = _("Decision")
135+
donnees_personnelles = _("Personal data")

ddd/admission/formation_continue/domain/model/proposition.py

Lines changed: 14 additions & 14 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-2025 Université catholique de Louvain (http://www.uclouvain.be)
9+
# Copyright (C) 2015-2026 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
@@ -31,18 +31,6 @@
3131
from django.utils.timezone import now
3232
from django.utils.translation import gettext_noop as __
3333

34-
from admission.ddd.admission.shared_kernel.domain.model._profil_candidat import ProfilCandidat
35-
from admission.ddd.admission.shared_kernel.domain.model.formation import FormationIdentity
36-
from admission.ddd.admission.shared_kernel.domain.model.question_specifique import QuestionSpecifique
37-
from admission.ddd.admission.shared_kernel.domain.service.i_profil_candidat import (
38-
IProfilCandidatTranslator,
39-
)
40-
from admission.ddd.admission.shared_kernel.domain.service.i_question_specifique import (
41-
ISuperQuestionSpecifiqueTranslator,
42-
)
43-
from admission.ddd.admission.shared_kernel.domain.service.profil_candidat import (
44-
ProfilCandidat as ProfilCandidatService,
45-
)
4634
from admission.ddd.admission.formation_continue.domain.model._adresse import Adresse
4735
from admission.ddd.admission.formation_continue.domain.model.enums import (
4836
ChoixEdition,
@@ -71,6 +59,18 @@
7159
MettreEnAttenteValidatorList,
7260
RefuserPropositionValidatorList,
7361
)
62+
from admission.ddd.admission.shared_kernel.domain.model._profil_candidat import ProfilCandidat
63+
from admission.ddd.admission.shared_kernel.domain.model.formation import FormationIdentity
64+
from admission.ddd.admission.shared_kernel.domain.model.question_specifique import QuestionSpecifique
65+
from admission.ddd.admission.shared_kernel.domain.service.i_profil_candidat import (
66+
IProfilCandidatTranslator,
67+
)
68+
from admission.ddd.admission.shared_kernel.domain.service.i_question_specifique import (
69+
ISuperQuestionSpecifiqueTranslator,
70+
)
71+
from admission.ddd.admission.shared_kernel.domain.service.profil_candidat import (
72+
ProfilCandidat as ProfilCandidatService,
73+
)
7474
from base.models.enums.academic_calendar_type import AcademicCalendarTypes
7575
from ddd.logic.formation_catalogue.formation_continue.dtos.informations_specifiques import (
7676
InformationsSpecifiquesDTO,
@@ -391,7 +391,7 @@ def approuver_proposition(
391391
profil_candidat_translator: IProfilCandidatTranslator,
392392
):
393393
ApprouverPropositionValidatorList(
394-
checklist_statut=self.checklist_actuelle.decision,
394+
checklist_actuelle=self.checklist_actuelle,
395395
).validate()
396396

397397
ProfilCandidatService.verifier_quarantaine(

ddd/admission/formation_continue/domain/model/statut_checklist.py

Lines changed: 41 additions & 4 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-2026 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
@@ -24,10 +24,11 @@
2424
#
2525
# ##############################################################################
2626
from enum import Enum
27-
from typing import List, Optional, Dict
27+
from typing import Dict, List, Optional
2828

2929
import attr
30-
from django.utils.translation import gettext_lazy as _, pgettext_lazy
30+
from django.utils.translation import gettext_lazy as _
31+
from django.utils.translation import pgettext_lazy
3132

3233
from admission.ddd.admission.formation_continue.domain.model.enums import ChoixStatutChecklist, OngletsChecklist
3334
from osis_common.ddd import interface
@@ -61,6 +62,7 @@ def _serialize(cls, inst, field, value):
6162

6263
@attr.dataclass
6364
class StatutsChecklistContinue:
65+
donnees_personnelles: StatutChecklist
6466
decision: StatutChecklist
6567
fiche_etudiant: StatutChecklist
6668

@@ -79,7 +81,8 @@ def recuperer_enfant(self, onglet, identifiant_enfant) -> StatutChecklist:
7981

8082

8183
INDEX_ONGLETS_CHECKLIST = {
82-
onglet: index for index, onglet in enumerate(attr.fields_dict(StatutsChecklistContinue)) # type: ignore
84+
onglet: index
85+
for index, onglet in enumerate(attr.fields_dict(StatutsChecklistContinue)) # type: ignore
8386
}
8487

8588

@@ -188,8 +191,42 @@ def get_status(self, status: str, extra: Optional[Dict[str, any]] = None) -> Opt
188191
],
189192
)
190193

194+
onglet_donnees_personnelles = ConfigurationOngletChecklist(
195+
identifiant=OngletsChecklist.donnees_personnelles,
196+
statuts=[
197+
ConfigurationStatutChecklist(
198+
identifiant='A_TRAITER',
199+
libelle=_('To be processed'),
200+
statut=ChoixStatutChecklist.INITIAL_CANDIDAT,
201+
),
202+
ConfigurationStatutChecklist(
203+
identifiant='TOILETTEES',
204+
libelle=pgettext_lazy('plural', 'Cleaned'),
205+
statut=ChoixStatutChecklist.GEST_EN_COURS,
206+
),
207+
ConfigurationStatutChecklist(
208+
identifiant='A_COMPLETER',
209+
libelle=_('To be completed'),
210+
statut=ChoixStatutChecklist.GEST_BLOCAGE,
211+
extra={'fraud': '0'},
212+
),
213+
ConfigurationStatutChecklist(
214+
identifiant='FRAUDEUR',
215+
libelle=_('Fraudster'),
216+
statut=ChoixStatutChecklist.GEST_BLOCAGE,
217+
extra={'fraud': '1'},
218+
),
219+
ConfigurationStatutChecklist(
220+
identifiant='VALIDEES',
221+
libelle=pgettext_lazy('plural', 'Validated'),
222+
statut=ChoixStatutChecklist.GEST_REUSSITE,
223+
),
224+
],
225+
)
226+
191227

192228
ORGANISATION_ONGLETS_CHECKLIST: List[ConfigurationOngletChecklist] = [
229+
onglet_donnees_personnelles,
193230
onglet_decision,
194231
]
195232

ddd/admission/formation_continue/domain/service/checklist.py

Lines changed: 5 additions & 1 deletion
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-2026 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
@@ -62,4 +62,8 @@ def recuperer_checklist_initiale(
6262
libelle=_('To be processed'),
6363
statut=ChoixStatutChecklist.INITIAL_CANDIDAT,
6464
),
65+
donnees_personnelles=StatutChecklist(
66+
libelle=_("To be processed"),
67+
statut=ChoixStatutChecklist.INITIAL_CANDIDAT,
68+
),
6569
)

ddd/admission/formation_continue/domain/validator/_should_informations_checklist_etre_completees.py

Lines changed: 18 additions & 5 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-2026 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,14 +29,18 @@
2929
from admission.ddd.admission.formation_continue.domain.model.enums import (
3030
ChoixStatutChecklist,
3131
)
32-
from admission.ddd.admission.formation_continue.domain.model.statut_checklist import StatutChecklist
32+
from admission.ddd.admission.formation_continue.domain.model.statut_checklist import (
33+
StatutChecklist,
34+
StatutsChecklistContinue,
35+
)
3336
from admission.ddd.admission.formation_continue.domain.validator.exceptions import (
34-
ApprouverPropositionTransitionStatutException,
3537
AnnulerPropositionTransitionStatutException,
36-
RefuserPropositionTransitionStatutException,
3738
ApprouverParFacTransitionStatutException,
38-
MettreEnAttenteTransitionStatutException,
39+
ApprouverPropositionTransitionStatutException,
40+
EtatChecklistDonneesPersonnellesNonValidePourApprouverDemande,
3941
MettreAValiderTransitionStatutException,
42+
MettreEnAttenteTransitionStatutException,
43+
RefuserPropositionTransitionStatutException,
4044
)
4145
from base.ddd.utils.business_validator import BusinessValidator
4246

@@ -118,3 +122,12 @@ class ShouldPeutCloturerProposition(BusinessValidator):
118122

119123
def validate(self, *args, **kwargs):
120124
pass
125+
126+
127+
@attr.dataclass(frozen=True, slots=True)
128+
class ShouldDonneesPersonnellesEtreDansEtatCorrectPourApprouverDemande(BusinessValidator):
129+
checklist_actuelle: StatutsChecklistContinue
130+
131+
def validate(self, *args, **kwargs):
132+
if self.checklist_actuelle.donnees_personnelles.statut != ChoixStatutChecklist.GEST_REUSSITE:
133+
raise EtatChecklistDonneesPersonnellesNonValidePourApprouverDemande

ddd/admission/formation_continue/domain/validator/exceptions.py

Lines changed: 9 additions & 1 deletion
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-2026 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
@@ -128,3 +128,11 @@ class MettreAValiderTransitionStatutException(BusinessException):
128128
def __init__(self, **kwargs):
129129
message = _('You can only transition to the "To validate IUFC" status from the "Approved" status.')
130130
super().__init__(message, **kwargs)
131+
132+
133+
class EtatChecklistDonneesPersonnellesNonValidePourApprouverDemande(BusinessException):
134+
status_code = "FORMATION-CONTINUE-13"
135+
136+
def __init__(self, **kwargs):
137+
message = _('The status of the checklist for the personal data must be "Validated".')
138+
super().__init__(message, **kwargs)

ddd/admission/formation_continue/domain/validator/validator_by_business_actions.py

Lines changed: 14 additions & 7 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-2026 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
@@ -27,18 +27,22 @@
2727

2828
import attr
2929

30-
from admission.ddd.admission.formation_continue.domain.model.statut_checklist import StatutChecklist
30+
from admission.ddd.admission.formation_continue.domain.model.statut_checklist import (
31+
StatutChecklist,
32+
StatutsChecklistContinue,
33+
)
3134
from admission.ddd.admission.formation_continue.domain.validator import (
3235
ShouldRenseignerExperiencesCurriculum,
3336
)
3437
from admission.ddd.admission.formation_continue.domain.validator._should_informations_checklist_etre_completees import (
35-
ShouldPeutMettreEnAttente,
36-
ShouldPeutApprouverParFac,
37-
ShouldPeutRefuserProposition,
38+
ShouldDonneesPersonnellesEtreDansEtatCorrectPourApprouverDemande,
3839
ShouldPeutAnnulerProposition,
40+
ShouldPeutApprouverParFac,
3941
ShouldPeutApprouverProposition,
4042
ShouldPeutCloturerProposition,
4143
ShouldPeutMettreAValider,
44+
ShouldPeutMettreEnAttente,
45+
ShouldPeutRefuserProposition,
4246
)
4347
from base.ddd.utils.business_validator import BusinessValidator, TwoStepsMultipleBusinessExceptionListValidator
4448

@@ -122,15 +126,18 @@ def get_invariants_validators(self) -> List[BusinessValidator]:
122126

123127
@attr.dataclass(frozen=True, slots=True)
124128
class ApprouverPropositionValidatorList(TwoStepsMultipleBusinessExceptionListValidator):
125-
checklist_statut: StatutChecklist
129+
checklist_actuelle: StatutsChecklistContinue
126130

127131
def get_data_contract_validators(self) -> List[BusinessValidator]:
128132
return []
129133

130134
def get_invariants_validators(self) -> List[BusinessValidator]:
131135
return [
132136
ShouldPeutApprouverProposition(
133-
checklist_statut=self.checklist_statut,
137+
checklist_statut=self.checklist_actuelle.decision,
138+
),
139+
ShouldDonneesPersonnellesEtreDansEtatCorrectPourApprouverDemande(
140+
checklist_actuelle=self.checklist_actuelle,
134141
),
135142
]
136143

0 commit comments

Comments
 (0)