From c3ef2d0a652f58f5f099fc699e099f4c30b0349b Mon Sep 17 00:00:00 2001 From: Gagaro Date: Tue, 24 Sep 2024 09:25:53 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20OS-597:=20En=20tant=20que=20gestionnaire?= =?UTF-8?q?=20CDD,=C2=A0je=20souhaite=20avoir=20une=20entr=C3=A9e=20de=20c?= =?UTF-8?q?hecklist=20"Projet=20de=20recherche",=20afin=20de=20me=20permet?= =?UTF-8?q?tre=20d'analyser=20le=20dossier=20du=20candidat=20doctorant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/statut_checklist.py | 18 +- locale/en/LC_MESSAGES/django.po | 9 +- locale/fr_BE/LC_MESSAGES/django.po | 9 +- templates/admission/doctorate/checklist.html | 8 +- .../includes/supervision_member_entry.html | 208 +++++++++--------- .../checklist/projet_recherche_detail.html | 149 +++++++++++++ views/doctorate/details/checklist/base.py | 23 +- 7 files changed, 308 insertions(+), 116 deletions(-) create mode 100644 templates/admission/doctorate/includes/checklist/projet_recherche_detail.html diff --git a/ddd/admission/doctorat/preparation/domain/model/statut_checklist.py b/ddd/admission/doctorat/preparation/domain/model/statut_checklist.py index 2536650d2..86abc5f22 100644 --- a/ddd/admission/doctorat/preparation/domain/model/statut_checklist.py +++ b/ddd/admission/doctorat/preparation/domain/model/statut_checklist.py @@ -374,7 +374,23 @@ def get_status(self, status: str, extra: Optional[Dict[str, any]] = None) -> Opt onglet_projet_recherche = ConfigurationOngletChecklist( identifiant=OngletsChecklist.projet_recherche, - statuts=[], + statuts=[ + ConfigurationStatutChecklist( + identifiant='A_TRAITER', + libelle=_('To be processed'), + statut=ChoixStatutChecklist.INITIAL_CANDIDAT, + ), + ConfigurationStatutChecklist( + identifiant='A_COMPLETER', + libelle=_('To be completed'), + statut=ChoixStatutChecklist.GEST_BLOCAGE, + ), + ConfigurationStatutChecklist( + identifiant='VALIDE', + libelle=_('Validated'), + statut=ChoixStatutChecklist.GEST_REUSSITE, + ), + ], ) onglet_decision_facultaire = ConfigurationOngletChecklist( diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 4be2b356b..8753aeebc 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -2478,13 +2478,13 @@ msgstr "" msgid "Doctorate free additional approval conditions" msgstr "" -msgid "Doctorate working list" +msgid "Doctorate thesis field" msgstr "" -msgid "Doctorate working lists" +msgid "Doctorate working list" msgstr "" -msgid "Doctorate thesis field" +msgid "Doctorate working lists" msgstr "" msgid "Document" @@ -8035,9 +8035,6 @@ msgstr "" msgid "Work contract should be set when funding type is set to work contract" msgstr "" -msgid "Work in progress" -msgstr "" - msgid "Work contract type" msgstr "" diff --git a/locale/fr_BE/LC_MESSAGES/django.po b/locale/fr_BE/LC_MESSAGES/django.po index d3d01e32b..7778440d6 100644 --- a/locale/fr_BE/LC_MESSAGES/django.po +++ b/locale/fr_BE/LC_MESSAGES/django.po @@ -2702,15 +2702,15 @@ msgstr "Condition complémentaire d'acceptation libre doctorale" msgid "Doctorate free additional approval conditions" msgstr "Conditions complémentaires d'acceptation libres doctorales" +msgid "Doctorate thesis field" +msgstr "Domaine de la thèse de doctorat" + msgid "Doctorate working list" msgstr "Liste de travail doctorale" msgid "Doctorate working lists" msgstr "Listes de travail doctorales" -msgid "Doctorate thesis field" -msgstr "Domaine de la thèse de doctorat" - msgid "Document" msgstr "Document" @@ -8915,9 +8915,6 @@ msgstr "" "Le contrat de travail doit être renseigné quand le type de financement est " "un contrat de travail" -msgid "Work in progress" -msgstr "En cours de réalisation" - msgid "Work contract type" msgstr "Type de contrat de travail" diff --git a/templates/admission/doctorate/checklist.html b/templates/admission/doctorate/checklist.html index 2904b3217..fe457acc6 100644 --- a/templates/admission/doctorate/checklist.html +++ b/templates/admission/doctorate/checklist.html @@ -224,10 +224,16 @@ {% with initial=original_admission.checklist.initial.projet_recherche current=original_admission.checklist.current.projet_recherche next_url=next_base_url|add:'projet_recherche' %}
-

{% translate 'Work in progress' %}

+ {% translate initial.libelle as initial_state_label %} + {% checklist_state_button tab='projet_recherche' label=initial_state_label icon='user' state=initial.statut class='muted' %} + {% checklist_state_button tab='projet_recherche' label=_("To be completed") icon='circle-stop' state='GEST_BLOCAGE' class='danger' %} + {% checklist_state_button tab='projet_recherche' label=_("Validated") icon='check' state='GEST_REUSSITE' class='success' %}
+ {% bootstrap_form comment_forms.choix_formation %} + {% include "admission/doctorate/includes/checklist/projet_recherche_detail.html" %} +
diff --git a/templates/admission/doctorate/details/includes/supervision_member_entry.html b/templates/admission/doctorate/details/includes/supervision_member_entry.html index a9341f7da..f292ce354 100644 --- a/templates/admission/doctorate/details/includes/supervision_member_entry.html +++ b/templates/admission/doctorate/details/includes/supervision_member_entry.html @@ -56,129 +56,135 @@ - {% has_perm 'admission.set_reference_promoter' as can_set_reference_promoter %} - {% if can_set_reference_promoter and type == 'PROMOTER' and member.matricule and member.uuid != supervision.promoteur_reference and admission.statut != "EN_ATTENTE_DE_SIGNATURE" %} -
- {% csrf_token %} - -
- {% endif %} - - {% has_perm 'admission.edit_external_supervision_member' as can_edit_external_supervision_member %} - {% if can_edit_external_supervision_member and member.est_externe and admission.statut != "EN_ATTENTE_DE_SIGNATURE" %} - - {% endif %} - - {% has_perm 'admission.remove_supervision_member' as can_remove_supervision_member %} - {% if can_remove_supervision_member and admission.statut != "EN_ATTENTE_DE_SIGNATURE" %} - - - {% trans "Remove" %} - - {% endif %} - - {# Action buttons #} - {% has_perm 'admission.approve_proposition_by_pdf' as can_approve_proposition_by_pdf %} - {% if can_approve_proposition_by_pdf and signature.statut == 'INVITED' %} - {% if type != 'PROMOTER' or member.est_externe %} + {% if not hide_actions %} + {% has_perm 'admission.set_reference_promoter' as can_set_reference_promoter %} + {% if can_set_reference_promoter and type == 'PROMOTER' and member.matricule and member.uuid != supervision.promoteur_reference and admission.statut != "EN_ATTENTE_DE_SIGNATURE" %} +
+ {% csrf_token %} + +
+ {% endif %} + + {% has_perm 'admission.edit_external_supervision_member' as can_edit_external_supervision_member %} + {% if can_edit_external_supervision_member and member.est_externe and admission.statut != "EN_ATTENTE_DE_SIGNATURE" %} {% endif %} - {% endif %} - - {% if can_approve_proposition_by_pdf and signature.statut == 'INVITED' and not member.matricule and admission.statut == "EN_BROUILLON" %} - - {% endif %} - - - {# Action buttons #} -
+ + {% has_perm 'admission.remove_supervision_member' as can_remove_supervision_member %} + {% if can_remove_supervision_member and admission.statut != "EN_ATTENTE_DE_SIGNATURE" %} + + + {% trans "Remove" %} + + {% endif %} + + {# Action buttons #} + {% has_perm 'admission.approve_proposition_by_pdf' as can_approve_proposition_by_pdf %} {% if can_approve_proposition_by_pdf and signature.statut == 'INVITED' %} {% if type != 'PROMOTER' or member.est_externe %} - {% panel _("Approve by PDF") id="approve-by-pdf-"|add:member.uuid additional_class="collapse" %} -
+ + {% endif %} + {% endif %} + + {% if can_approve_proposition_by_pdf and signature.statut == 'INVITED' and not member.matricule and admission.statut == "EN_BROUILLON" %} + + {% endif %} + + + {# Action buttons #} +
+ {% if can_approve_proposition_by_pdf and signature.statut == 'INVITED' %} + {% if type != 'PROMOTER' or member.est_externe %} + {% panel _("Approve by PDF") id="approve-by-pdf-"|add:member.uuid additional_class="collapse" %} + + {% csrf_token %} + {{ approve_by_pdf_form.pdf }} + + + + {% endpanel %} + {% endif %} + {% endif %} + + {% if can_approve_proposition_by_pdf and signature.statut == 'INVITED' and not member.matricule and admission.statut == "EN_BROUILLON" %} + {% panel _("Resend invitation") id="resend-invite-"|add:member.uuid additional_class="collapse" %} +
{% csrf_token %} - {{ approve_by_pdf_form.pdf }}
{% endpanel %} {% endif %} - {% endif %} - - {% if can_approve_proposition_by_pdf and signature.statut == 'INVITED' and not member.matricule and admission.statut == "EN_BROUILLON" %} - {% panel _("Resend invitation") id="resend-invite-"|add:member.uuid additional_class="collapse" %} -
+ + {% if can_edit_external_supervision_member and member.est_externe and admission.statut != "EN_ATTENTE_DE_SIGNATURE" %} + {% url 'admission:doctorate:update:edit-external-member' uuid=admission.uuid uuid_membre=member.uuid as edit_external_member_url %} + {% csrf_token %} - - -
- {% endpanel %} - {% endif %} - - {% if can_edit_external_supervision_member and member.est_externe and admission.statut != "EN_ATTENTE_DE_SIGNATURE" %} - {% url 'admission:doctorate:update:edit-external-member' uuid=admission.uuid uuid_membre=member.uuid as edit_external_member_url %} -
- {% csrf_token %} - {% edit_external_member_form member as edit_external_member_form %} -
-
-
- {% bootstrap_form edit_external_member_form %} - + {% edit_external_member_form member as edit_external_member_form %} +
+
+
+ {% bootstrap_form edit_external_member_form %} + +
-
- - {% endif %} - - {% if signature.motif_refus and signature.statut == 'DECLINED' %} -
{% trans "Grounds for denied" %} - {{ signature.motif_refus|linebreaks }}
+ + {% endif %} {% endif %} - {% if signature.commentaire_externe %} -
{% trans "Comment to the candidate:" %} - {{ signature.commentaire_externe|linebreaks }}
+ {% if hide_actions %} +
{% endif %} - {% if member.matricule == user.person.global_id and signature.commentaire_interne %} -
{% trans "Internal comment:" %} - {{ signature.commentaire_interne|linebreaks }}
- {% endif %} -
+ {% if signature.motif_refus and signature.statut == 'DECLINED' %} +
{% trans "Grounds for denied" %} + {{ signature.motif_refus|linebreaks }}
+ {% endif %} + + {% if signature.commentaire_externe %} +
{% trans "Comment to the candidate:" %} + {{ signature.commentaire_externe|linebreaks }}
+ {% endif %} + + {% if member.matricule == user.person.global_id and signature.commentaire_interne %} +
{% trans "Internal comment:" %} + {{ signature.commentaire_interne|linebreaks }}
+ {% endif %} +
{% if signature.pdf and signature.statut == 'APPROVED' %} diff --git a/templates/admission/doctorate/includes/checklist/projet_recherche_detail.html b/templates/admission/doctorate/includes/checklist/projet_recherche_detail.html new file mode 100644 index 000000000..6a1cb9b5d --- /dev/null +++ b/templates/admission/doctorate/includes/checklist/projet_recherche_detail.html @@ -0,0 +1,149 @@ +{% load admission enums i18n %} + +{% comment "License" %} + * OSIS stands for Open Student Information System. It's an application + * designed to manage the core business of higher education institutions, + * such as universities, faculties, institutes and professional schools. + * 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) + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * A copy of this license - GNU General Public License - is available + * at the root of the source code of this program. If not, + * see http://www.gnu.org/licenses/. +{% endcomment %} + +{% has_perm 'admission.change_admission_project' as can_change_admission_project %} +{% if can_change_admission_project %} + {% url view.base_namespace|add:':update:training-choice' uuid=view.kwargs.uuid as edit_choix_formation_url %} + {% url view.base_namespace|add:':update:project' uuid=view.kwargs.uuid as edit_project_url %} +{% endif %} + +{% panel _("Course choice") edit_link_button=edit_choix_formation_url %} + {% field_data _("Admission type") admission.type_admission|enum_display:'ChoixTypeAdmission' %} + {% if admission.justification %} + {% field_data _("Brief justification") admission.justification|linebreaks %} + {% endif %} + {% field_data _("Sector") admission.intitule_secteur_formation %} + {% display admission.doctorat.intitule " (" admission.doctorat.campus ")" as doctorate_title %} + {% field_data _("PhD") doctorate_title %} + {% if admission.commission_proximite %} + {% field_data _("Proximity commission / Subdomain") admission.commission_proximite|enum_display:'ChoixCommissionProximiteCDEouCLSM'|enum_display:'ChoixCommissionProximiteCDSS'|enum_display:'ChoixSousDomaineSciences' %} + {% endif %} +{% endpanel %} + +{% panel _("Funding") edit_link_button=edit_project_url %} + {% if admission.type_financement %} + {% field_data _("Funding type") admission.type_financement|enum_display:'ChoixTypeFinancement' %} + {% if admission.type_financement == "WORK_CONTRACT" %} + {% field_data _("Work contract") admission.type_contrat_travail|enum_display:'ChoixTypeContratTravail' %} + {% field_data fte_label admission.eft|default_if_none:'' %} + {% elif admission.type_financement == "SEARCH_SCHOLARSHIP" %} + {% if admission.bourse_recherche %} + {% display admission.bourse_recherche.nom_court '-' admission.bourse_recherche.nom_long as nom_bourse %} + {% else %} + {% display admission.autre_bourse_recherche as nom_bourse %} + {% endif %} + {% field_data _("Research scholarship") nom_bourse %} + {% field_data _("Scholarship start date") admission.bourse_date_debut %} + {% field_data _("Scholarship end date") admission.bourse_date_fin %} + {% field_data _("Proof of scholarship") admission.bourse_preuve %} + {% endif %} + {% field_data _("Estimated time to complete the PhD (in months)") admission.duree_prevue|default_if_none:'' %} + {% field_data allocated_time_label admission.temps_consacre|default_if_none:'' %} + {% field_data _("Is your admission request linked with a FNRS, FRIA, FRESH or CSC application?") admission.est_lie_fnrs_fria_fresh_csc %} + {% field_data _("Comment") admission.commentaire_financement|linebreaks %} + {% endif %} +{% endpanel %} + +{% panel _("PhD research project") edit_link_button=edit_project_url %} + {% field_data _("Project title") admission.titre_projet %} + {% field_data _("Project resume") admission.resume_projet|linebreaks %} + {% field_data _("Thesis language") admission.langue_redaction_these|osis_language_name %} + {% if admission.institut_these %} + {% display admission.nom_institut_these ' ' '(' admission.sigle_institut_these ')' as institut_these %} + {% endif %} + {% field_data _("Research institute") institut_these|default_if_none:'' %} + {% field_data _("Thesis location") admission.lieu_these %} + + {% field_data _("PhD research project") admission.documents_projet %} + {% field_data _("PhD proposal") admission.proposition_programme_doctoral %} + {% field_data _("Complementary training proposition") admission.projet_formation_complementaire %} + {% field_data _("Gantt chart") admission.graphe_gantt %} + {% field_data _("Letters of recommendation") admission.lettres_recommandation %} +{% endpanel %} + +{% panel _("PhD research experience") edit_link_button=edit_project_url %} + {% field_data _("Has your PhD project already started?") admission.projet_doctoral_deja_commence %} + {% if admission.projet_doctoral_deja_commence %} + {% field_data _("Institution") admission.projet_doctoral_institution %} + {% field_data _("Work start date") admission.projet_doctoral_date_debut %} + {% endif %} + {% field_data _("Have you previously enrolled for a PhD?") admission.doctorat_deja_realise|enum_display:'ChoixDoctoratDejaRealise' %} + {% if admission.doctorat_deja_realise != "NO" %} + {% field_data _("Institution") admission.institution %} + {% field_data _("Thesis field") admission.domaine_these %} + {% if admission.date_soutenance %} + {% field_data _("Defence date") admission.date_soutenance %} + {% elif admission.raison_non_soutenue %} + {% field_data _("No defense reason") admission.raison_non_soutenue|linebreaks %} + {% endif %} + {% endif %} +{% endpanel %} + +{% has_perm 'admission.change_admission_cotutelle' as can_change_admission_cotutelle %} +{% if can_change_admission_cotutelle %} + {% url view.base_namespace|add:':update:cotutelle' uuid=view.kwargs.uuid as edit_cotutelle_url %} +{% endif %} + +{% panel _("Cotutelle") edit_link_button=edit_cotutelle_url %} + {% if cotutelle.cotutelle is None %} + {% trans "Choice of joint supervision is not yet defined" %} + {% elif cotutelle.cotutelle %} + {% field_data _("Is it a Wallonia-Brussels Federation institution?") cotutelle.institution_fwb %} + {% if cotutelle.institution %} + {% field_data _("Partner institution") cotutelle.institution|superior_institute_name %} + {% elif cotutelle.autre_institution %} + {% field_data _("Institute name") cotutelle.autre_institution_nom %} + {% field_data _("Institute address") cotutelle.autre_institution_adresse %} + {% endif %} + {% field_data _("Motivation for joint supervision") cotutelle.motivation|linebreaks %} + {% field_data _("Joint supervision request") cotutelle.demande_ouverture %} + {% field_data _("Joint supervision agreement") cotutelle.convention %} + {% field_data _("Other documents relating to joint supervision") cotutelle.autres_documents %} + {% else %} + {% trans "No joint supervision" %} + {% endif %} +{% endpanel %} + +{% has_perm 'admission.add_supervision_member' as can_add_supervision_member %} +{% if can_add_supervision_member %} + {% url view.base_namespace|add:':update:supervision' uuid=view.kwargs.uuid as edit_supervision_url %} +{% endif %} + +{% panel _("Promoters") edit_link_button=edit_supervision_url %} + {% for signature in groupe_supervision.signatures_promoteurs %} + {% include "admission/doctorate/details/includes/supervision_member_entry.html" with type='PROMOTER' member=signature.promoteur supervision=groupe_supervision hide_actions=True %} + {% empty %} + {% trans "No one invited" %} + {% endfor %} +{% endpanel %} + +{% panel _("CA members") edit_link_button=edit_supervision_url %} + {% for signature in groupe_supervision.signatures_membres_CA %} + {% include "admission/doctorate/details/includes/supervision_member_entry.html" with type='CA_MEMBER' member=signature.membre_CA hide_actions=True %} + {% empty %} + {% trans "No one invited" %} + {% endfor %} +{% endpanel %} diff --git a/views/doctorate/details/checklist/base.py b/views/doctorate/details/checklist/base.py index 28af3b2bf..1c9fe7b48 100644 --- a/views/doctorate/details/checklist/base.py +++ b/views/doctorate/details/checklist/base.py @@ -39,7 +39,10 @@ from admission.contrib.models.epc_injection import EPCInjectionStatus, EPCInjectionType from admission.ddd.admission.commands import GetStatutTicketPersonneQuery, RechercherParcoursAnterieurQuery -from admission.ddd.admission.doctorat.preparation.commands import RecupererResumeEtEmplacementsDocumentsPropositionQuery +from admission.ddd.admission.doctorat.preparation.commands import ( + RecupererResumeEtEmplacementsDocumentsPropositionQuery, + GetGroupeDeSupervisionCommand, +) from admission.ddd.admission.doctorat.preparation.domain.model.enums.checklist import OngletsChecklist from admission.ddd.admission.doctorat.preparation.dtos import PropositionGestionnaireDTO from admission.ddd.admission.dtos.question_specifique import QuestionSpecifiqueDTO @@ -53,6 +56,8 @@ DocumentsAssimilation, DocumentsEtudesSecondaires, OngletsDemande, + DocumentsProjetRecherche, + DocumentsCotutelle, ) from admission.ddd.admission.utils import initialiser_checklist_experience from admission.exports.admission_recap.section import get_dynamic_questions_by_tab @@ -172,6 +177,10 @@ def checklist_documents_by_tab(cls, specific_questions: List[QuestionSpecifiqueD 'CURRICULUM', }, OngletsChecklist.choix_formation.name: {}, + OngletsChecklist.projet_recherche.name: { + *DocumentsProjetRecherche.keys(), + *DocumentsCotutelle.keys(), + }, OngletsChecklist.parcours_anterieur.name: { 'ATTESTATION_ABSENCE_DETTE_ETABLISSEMENT', 'DIPLOME_EQUIVALENCE', @@ -345,6 +354,18 @@ def get_context_data(self, **kwargs): # Financabilité context['financabilite'] = self._get_financabilite() + # Projet de recherche + context['cotutelle'] = self.cotutelle + context['groupe_supervision'] = message_bus_instance.invoke( + GetGroupeDeSupervisionCommand(uuid_proposition=self.admission_uuid) + ) + # There is a bug with translated strings with percent signs + # https://docs.djangoproject.com/en/3.2/topics/i18n/translation/#troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs + # xgettext:no-python-format + context['fte_label'] = _("Full-time equivalent (as %)") + # xgettext:no-python-format + context['allocated_time_label'] = _("Time allocated for thesis (in %)") + # Authentication forms (one by experience) context['authentication_forms'] = {}