Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion api/serializers/person.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# The core business involves the administration of students, teachers,
# courses, programs and so on.
#
# Copyright (C) 2015-2023 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2026 Université catholique de Louvain (http://www.uclouvain.be)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -101,5 +101,7 @@ def validate(self, data):


class IdentificationDTOSerializer(DTOSerializer):
statut_validation_donnees_personnelles = None

class Meta:
source = IdentificationDTO
7 changes: 4 additions & 3 deletions auth/predicates/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
from admission.constants import CONTEXT_CONTINUING, CONTEXT_DOCTORATE, CONTEXT_GENERAL
from admission.models import DoctorateAdmission, GeneralEducationAdmission
from admission.models.base import BaseAdmission
from base.models.enums.personal_data import ChoixStatutValidationDonneesPersonnelles
from osis_role.errors import predicate_failed_msg


Expand Down Expand Up @@ -231,7 +232,7 @@ def past_experiences_checklist_tab_is_not_sufficient(
message=_("The \"Personal data\" checklist tab must be in the \"Cleaned\" status in order to do this action.")
)
def personal_data_checklist_status_is_cleaned(self, user: User, obj: BaseAdmission):
return obj.checklist.get('current', {}).get('donnees_personnelles', {}).get('statut') == 'GEST_EN_COURS'
return obj.candidate.personal_data_validation_status == ChoixStatutValidationDonneesPersonnelles.TOILETTEES.name


@predicate(bind=True)
Expand All @@ -241,12 +242,12 @@ def personal_data_checklist_status_is_cleaned(self, user: User, obj: BaseAdmissi
)
)
def personal_data_checklist_status_is_to_be_processed(self, user: User, obj: BaseAdmission):
return obj.checklist.get('current', {}).get('donnees_personnelles', {}).get('statut') == 'INITIAL_CANDIDAT'
return obj.candidate.personal_data_validation_status == ChoixStatutValidationDonneesPersonnelles.A_TRAITER.name


@predicate(bind=True)
@predicate_failed_msg(
message=_("The \"Personal data\" checklist tab must not be in the \"Validated\" status in order to do this action.")
)
def personal_data_checklist_status_is_not_validated(self, user: User, obj: BaseAdmission):
return obj.checklist.get('current', {}).get('donnees_personnelles', {}).get('statut') != 'GEST_REUSSITE'
return obj.candidate.personal_data_validation_status != ChoixStatutValidationDonneesPersonnelles.VALIDEES.name
4 changes: 2 additions & 2 deletions auth/roles/central_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,10 +198,10 @@ def common_rule_set(cls, is_entity_manager: callable):
& (general.in_sic_status | continuing.is_submitted | doctorate.in_sic_status)
& ~is_sent_to_epc,
'admission.change_personal_data_checklist_status_to_be_processed': is_entity_manager
& (general.in_sic_status | doctorate.in_sic_status)
& (general.in_sic_status | continuing.is_submitted | doctorate.in_sic_status)
& ~is_sent_to_epc,
'admission.change_personal_data_checklist_status_cleaned': is_entity_manager
& (general.in_sic_status | doctorate.in_sic_status)
& (general.in_sic_status | continuing.is_submitted | doctorate.in_sic_status)
& ~is_sent_to_epc,
'admission.change_checklist_iufc': is_entity_manager & continuing.is_submitted & ~is_sent_to_epc,
'admission.cancel_admission_iufc': is_entity_manager & continuing.is_submitted,
Expand Down
16 changes: 7 additions & 9 deletions auth/roles/program_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,19 +91,17 @@ def rule_set(cls):
'admission.view_admission_person': is_part_of_education_group,
'admission.change_admission_person': is_part_of_education_group
& (
general.in_manager_status & personal_data_checklist_status_is_not_validated
general.in_manager_status
| continuing.in_manager_status & ~candidate_has_other_doctorate_or_general_admissions
| doctorate.in_manager_status & personal_data_checklist_status_is_not_validated
| doctorate.in_manager_status
)
& personal_data_checklist_status_is_not_validated
& ~is_sent_to_epc
& ~workflow_injection_signaletique_en_cours,
'admission.view_admission_coordinates': is_part_of_education_group,
'admission.change_admission_coordinates': is_part_of_education_group
& (
general.in_manager_status & personal_data_checklist_status_is_not_validated
| continuing.in_manager_status
| doctorate.in_manager_status & personal_data_checklist_status_is_not_validated
)
& (general.in_manager_status | continuing.in_manager_status | doctorate.in_manager_status)
& personal_data_checklist_status_is_not_validated
& ~is_sent_to_epc
& ~workflow_injection_signaletique_en_cours,
'admission.view_admission_secondary_studies': is_part_of_education_group,
Expand Down Expand Up @@ -199,11 +197,11 @@ def rule_set(cls):
& continuing.is_submitted
& ~is_sent_to_epc,
'admission.change_personal_data_checklist_status_to_be_processed': is_part_of_education_group
& (general.in_manager_status | doctorate.in_manager_status)
& (general.in_manager_status | doctorate.in_manager_status | continuing.is_submitted)
& personal_data_checklist_status_is_cleaned
& ~is_sent_to_epc,
'admission.change_personal_data_checklist_status_cleaned': is_part_of_education_group
& (general.in_manager_status | doctorate.in_manager_status)
& (general.in_manager_status | doctorate.in_manager_status | continuing.is_submitted)
& personal_data_checklist_status_is_to_be_processed
& ~is_sent_to_epc,
'admission.cancel_admission_iufc': is_part_of_education_group
Expand Down
11 changes: 5 additions & 6 deletions ddd/admission/doctorat/preparation/domain/model/proposition.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# The core business involves the administration of students, teachers,
# courses, programs and so on.
#
# Copyright (C) 2015-2025 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2026 Université catholique de Louvain (http://www.uclouvain.be)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -111,11 +111,6 @@
from admission.ddd.admission.shared_kernel.domain.model.complement_formation import (
ComplementFormationIdentity,
)
from admission.ddd.admission.shared_kernel.domain.model.enums.equivalence import (
EtatEquivalenceTitreAcces,
StatutEquivalenceTitreAcces,
TypeEquivalenceTitreAcces,
)
from admission.ddd.admission.shared_kernel.domain.model.enums.type_gestionnaire import (
TypeGestionnaire,
)
Expand Down Expand Up @@ -143,6 +138,7 @@
from admission.ddd.admission.shared_kernel.domain.validator.exceptions import (
ExperienceNonTrouveeException,
)
from admission.ddd.admission.shared_kernel.dtos import IdentificationDTO
from admission.ddd.admission.shared_kernel.dtos.emplacement_document import (
EmplacementDocumentDTO,
)
Expand Down Expand Up @@ -1026,13 +1022,15 @@ def approuver_par_sic(
experience_parcours_interne_translator: IExperienceParcoursInterneTranslator,
grade_academique_formation_proposition: str,
annee_formation: AcademicYear,
identification_dto: IdentificationDTO,
):
if self.type_demande == TypeDemande.INSCRIPTION:
ApprouverInscriptionParSicValidatorList(
statut=self.statut,
checklist=self.checklist_actuelle,
besoin_de_derogation=self.besoin_de_derogation,
documents_dto=documents_dto,
statut_validation_donnees_personnelles=identification_dto.statut_validation_donnees_personnelles,
).validate()

else:
Expand All @@ -1042,6 +1040,7 @@ def approuver_par_sic(
complements_formation=self.complements_formation,
checklist=self.checklist_actuelle,
documents_dto=documents_dto,
statut_validation_donnees_personnelles=identification_dto.statut_validation_donnees_personnelles,
).validate()

try:
Expand Down
32 changes: 19 additions & 13 deletions ddd/admission/doctorat/preparation/domain/model/statut_checklist.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
from admission.ddd.admission.shared_kernel.domain.model.enums.authentification import (
EtatAuthentificationParcours,
)
from base.models.enums.personal_data import ChoixStatutValidationDonneesPersonnelles
from osis_common.ddd import interface


Expand Down Expand Up @@ -71,7 +72,6 @@ def _serialize(cls, inst, field, value):

@attr.dataclass
class StatutsChecklistDoctorale:
donnees_personnelles: StatutChecklist
assimilation: StatutChecklist
parcours_anterieur: StatutChecklist
financabilite: StatutChecklist
Expand Down Expand Up @@ -140,6 +140,12 @@ def merge_statuses(self, other_status):
identifiant_parent=self.identifiant_parent,
)

def to_dict(self):
return {
'extra': self.extra,
'statut': self.statut.name,
}


@attr.dataclass
class ConfigurationOngletChecklist(interface.ValueObject):
Expand All @@ -152,34 +158,34 @@ def get_status(self, status: str, extra: Optional[Dict[str, any]] = None) -> Opt

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

onglet_donnes_personnelles = ConfigurationOngletChecklist(
onglet_donnees_personnelles = ConfigurationOngletChecklist(
identifiant=OngletsChecklist.donnees_personnelles,
statuts=[
ConfigurationStatutChecklist(
identifiant='A_TRAITER',
libelle=_('To be processed'),
identifiant=ChoixStatutValidationDonneesPersonnelles.A_TRAITER.name,
libelle=ChoixStatutValidationDonneesPersonnelles.A_TRAITER.value,
statut=ChoixStatutChecklist.INITIAL_CANDIDAT,
),
ConfigurationStatutChecklist(
identifiant='TOILETTEES',
libelle=pgettext_lazy('plural', 'Cleaned'),
identifiant=ChoixStatutValidationDonneesPersonnelles.TOILETTEES.name,
libelle=ChoixStatutValidationDonneesPersonnelles.TOILETTEES.value,
statut=ChoixStatutChecklist.GEST_EN_COURS,
),
ConfigurationStatutChecklist(
identifiant='A_COMPLETER',
libelle=_('To be completed'),
identifiant=ChoixStatutValidationDonneesPersonnelles.A_COMPLETER.name,
libelle=ChoixStatutValidationDonneesPersonnelles.A_COMPLETER.value,
statut=ChoixStatutChecklist.GEST_BLOCAGE,
extra={'fraud': '0'},
),
ConfigurationStatutChecklist(
identifiant='FRAUDEUR',
libelle=_('Fraudster'),
identifiant=ChoixStatutValidationDonneesPersonnelles.FRAUDEUR.name,
libelle=ChoixStatutValidationDonneesPersonnelles.FRAUDEUR.value,
statut=ChoixStatutChecklist.GEST_BLOCAGE,
extra={'fraud': '1'},
),
ConfigurationStatutChecklist(
identifiant='VALIDEES',
libelle=pgettext_lazy('plural', 'Validated'),
identifiant=ChoixStatutValidationDonneesPersonnelles.VALIDEES.name,
libelle=ChoixStatutValidationDonneesPersonnelles.VALIDEES.value,
statut=ChoixStatutChecklist.GEST_REUSSITE,
),
],
Expand Down Expand Up @@ -508,7 +514,7 @@ def get_status(self, status: str, extra: Optional[Dict[str, any]] = None) -> Opt
)

ORGANISATION_ONGLETS_CHECKLIST: List[ConfigurationOngletChecklist] = [
onglet_donnes_personnelles,
onglet_donnees_personnelles,
onglet_assimilation,
onglet_parcours_anterieur,
onglets_parcours_anterieur_experiences,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# The core business involves the administration of students, teachers,
# courses, programs and so on.
#
# Copyright (C) 2015-2024 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2026 Université catholique de Louvain (http://www.uclouvain.be)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
Expand All @@ -32,8 +32,8 @@
from admission.ddd.admission.doctorat.preparation.domain.model.enums.checklist import ChoixStatutChecklist
from admission.ddd.admission.doctorat.preparation.domain.model.proposition import Proposition
from admission.ddd.admission.doctorat.preparation.domain.model.statut_checklist import (
StatutsChecklistDoctorale,
StatutChecklist,
StatutsChecklistDoctorale,
)
from admission.ddd.admission.shared_kernel.domain.model.enums.authentification import EtatAuthentificationParcours
from admission.ddd.admission.shared_kernel.domain.service.i_profil_candidat import IProfilCandidatTranslator
Expand Down Expand Up @@ -73,10 +73,6 @@ def recuperer_checklist_initiale(
)

return StatutsChecklistDoctorale(
donnees_personnelles=StatutChecklist(
libelle=_("To be processed"),
statut=ChoixStatutChecklist.INITIAL_CANDIDAT,
),
assimilation=StatutChecklist(
libelle=_("Not concerned")
if identification_dto.pays_nationalite_europeen
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# The core business involves the administration of students, teachers,
# courses, programs and so on.
#
# Copyright (C) 2015-2025 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2026 Université catholique de Louvain (http://www.uclouvain.be)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -82,6 +82,7 @@
)
from admission.ddd.admission.shared_kernel.enums.type_demande import TypeDemande
from base.ddd.utils.business_validator import BusinessValidator
from base.models.enums.personal_data import ChoixStatutValidationDonneesPersonnelles
from epc.models.enums.condition_acces import ConditionAcces


Expand Down Expand Up @@ -309,10 +310,10 @@ def validate(self, *args, **kwargs):

@attr.dataclass(frozen=True, slots=True)
class ShouldDonneesPersonnellesEtreDansEtatCorrectPourApprouverDemande(BusinessValidator):
checklist_actuelle: StatutsChecklistDoctorale
statut_validation_donnees_personnelles: str

def validate(self, *args, **kwargs):
if self.checklist_actuelle.donnees_personnelles.statut != ChoixStatutChecklist.GEST_REUSSITE:
if self.statut_validation_donnees_personnelles != ChoixStatutValidationDonneesPersonnelles.VALIDEES.name:
raise EtatChecklistDonneesPersonnellesNonValidePourApprouverDemande


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# The core business involves the administration of students, teachers,
# courses, programs and so on.
#
# Copyright (C) 2015-2025 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2026 Université catholique de Louvain (http://www.uclouvain.be)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -735,6 +735,8 @@ class ApprouverAdmissionParSicValidatorList(TwoStepsMultipleBusinessExceptionLis
checklist: StatutsChecklistDoctorale
documents_dto: List[EmplacementDocumentDTO]

statut_validation_donnees_personnelles: str

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

Expand All @@ -744,7 +746,7 @@ def get_invariants_validators(self) -> List[BusinessValidator]:
statut=self.statut,
),
ShouldDonneesPersonnellesEtreDansEtatCorrectPourApprouverDemande(
checklist_actuelle=self.checklist,
statut_validation_donnees_personnelles=self.statut_validation_donnees_personnelles,
),
ShouldDecisionCddEtreDansEtatCorrectPourApprouverDemande(
checklist_actuelle=self.checklist,
Expand All @@ -770,6 +772,8 @@ class ApprouverInscriptionParSicValidatorList(TwoStepsMultipleBusinessExceptionL

documents_dto: List[EmplacementDocumentDTO]

statut_validation_donnees_personnelles: str

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

Expand All @@ -779,7 +783,7 @@ def get_invariants_validators(self) -> List[BusinessValidator]:
statut=self.statut,
),
ShouldDonneesPersonnellesEtreDansEtatCorrectPourApprouverDemande(
checklist_actuelle=self.checklist,
statut_validation_donnees_personnelles=self.statut_validation_donnees_personnelles,
),
ShouldDecisionCddEtreDansEtatCorrectPourApprouverDemande(
checklist_actuelle=self.checklist,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# The core business involves the administration of students, teachers,
# courses, programs and so on.
#
# Copyright (C) 2015-2025 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2026 Université catholique de Louvain (http://www.uclouvain.be)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -213,7 +213,6 @@ class Meta:
model = StatutsChecklistDoctorale
abstract = False

donnees_personnelles = factory.SubFactory(StatutChecklistFactory)
assimilation = factory.SubFactory(StatutChecklistFactory)
choix_formation = factory.SubFactory(StatutChecklistFactory)
parcours_anterieur = factory.SubFactory(StatutChecklistFactory)
Expand Down Expand Up @@ -341,7 +340,6 @@ class Params:
StatutsChecklistDoctoraleFactory,
financabilite__statut=ChoixStatutChecklist.GEST_REUSSITE,
financabilite__extra={'reussite': 'financable'},
donnees_personnelles__statut=ChoixStatutChecklist.GEST_REUSSITE,
decision_cdd__statut=ChoixStatutChecklist.GEST_REUSSITE,
),
)
Expand Down
Loading