Skip to content

Commit

Permalink
[OS-595] Doctorate checklist > add the training choice tab
Browse files Browse the repository at this point in the history
  • Loading branch information
jcougnaud committed Sep 17, 2024
1 parent 4d4fd3a commit e019b5d
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 45 deletions.
3 changes: 3 additions & 0 deletions auth/roles/central_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ def rule_set(cls):
'admission.checklist_select_access_title': is_entity_manager
& (general.in_sic_status | doctorate.in_sic_status)
& ~is_sent_to_epc,
'admission.checklist_change_training_choice': is_entity_manager
& doctorate.in_sic_status
& ~is_sent_to_epc,
'admission.checklist_change_sic_comment': is_entity_manager
& (general.is_submitted | doctorate.is_submitted)
& ~is_sent_to_epc,
Expand Down
3 changes: 3 additions & 0 deletions auth/roles/program_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ def rule_set(cls):
& continuing.is_continuing
& continuing.is_submitted
& ~is_sent_to_epc,
'admission.checklist_change_training_choice': is_part_of_education_group
& doctorate.in_fac_status
& ~is_sent_to_epc,
'admission.checklist_change_faculty_decision': is_part_of_education_group
& (general.in_fac_status | doctorate.in_fac_status)
& ~is_sent_to_epc,
Expand Down
8 changes: 0 additions & 8 deletions templates/admission/doctorate/checklist.html
Original file line number Diff line number Diff line change
Expand Up @@ -217,14 +217,6 @@

<div class="info-part">
{% field_data _("Proposition submission") admission.soumise_le %}
{% if admission.est_inscription_tardive %}<p>{% trans "Late enrollment" %}</p>{% endif %}

{% if admission.est_reorientation_inscription_externe %}
{% field_data _("External reorientation/modification") _("Course change asked by the candidate") %}
{% elif admission.est_modification_inscription_externe %}
{% field_data _("External reorientation/modification") _("Modification asked by the candidate") %}
{% endif %}

{% include 'admission/doctorate/includes/checklist/vip_profile.html' with url=training_choice_url|add:next_url hide_if_empty=True %}
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,13 @@
* see http://www.gnu.org/licenses/.
{% endcomment %}

{% has_perm 'admission.change_checklist' as can_change_checklist %}
{% if can_change_checklist %}
{% if view.is_doctorate %}
{% has_perm 'admission.checklist_change_training_choice' as can_change_checklist_training_choice %}
{% else %}
{% has_perm 'admission.change_checklist' as can_change_checklist %}
{% endif %}

{% if can_change_checklist_training_choice or can_change_checklist %}
{% url view.base_namespace|add:':choix-formation-update' uuid=view.kwargs.uuid as edit_choix_formation_url %}
{% endif %}

Expand Down
98 changes: 69 additions & 29 deletions tests/views/doctorate/checklist/test_choix_formation.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,11 @@
from admission.contrib.models import DoctorateAdmission
from admission.ddd.admission.doctorat.preparation.domain.model.doctorat import ENTITY_CDE
from admission.ddd.admission.doctorat.preparation.domain.model.enums import ChoixStatutPropositionDoctorale
from admission.ddd.admission.enums.type_demande import TypeDemande
from admission.tests.factories import DoctorateAdmissionFactory
from admission.tests.factories.doctorate import DoctorateFactory
from admission.tests.factories.person import CompletePersonFactory
from admission.tests.factories.roles import SicManagementRoleFactory
from admission.tests.factories.roles import SicManagementRoleFactory, ProgramManagerRoleFactory
from base.tests.factories.academic_year import AcademicYearFactory
from base.tests.factories.entity import EntityWithVersionFactory

Expand All @@ -54,39 +55,55 @@ def setUpTestData(cls):
management_entity=cls.first_doctoral_commission,
academic_year=cls.academic_years[0],
)
cls.admission: DoctorateAdmission = DoctorateAdmissionFactory(
training=cls.training,
candidate=CompletePersonFactory(language=settings.LANGUAGE_CODE_FR),
submitted=True,
)

cls.sic_manager_user = SicManagementRoleFactory(entity=cls.first_doctoral_commission).person.user

cls.program_manager_user = ProgramManagerRoleFactory(
education_group=cls.training.education_group,
).person.user

cls.default_headers = {'HTTP_HX-Request': 'true'}

def test_get_htmx(self):
self.client.force_login(user=self.sic_manager_user)
def setUp(self):
self.admission: DoctorateAdmission = DoctorateAdmissionFactory(
training=self.training,
candidate=CompletePersonFactory(language=settings.LANGUAGE_CODE_FR),
submitted=True,
)

url = resolve_url(
self.url = resolve_url(
'admission:doctorate:choix-formation-detail',
uuid=self.admission.uuid,
)
response = self.client.get(url, **self.default_headers)

def test_get_htmx(self):
self.client.force_login(user=self.sic_manager_user)

response = self.client.get(self.url, **self.default_headers)

self.assertEqual(response.status_code, 200)
self.assertIn('admission', response.context)

def test_get_without_htmx(self):
self.client.force_login(user=self.sic_manager_user)

url = resolve_url(
'admission:doctorate:choix-formation-detail',
uuid=self.admission.uuid,
)
response = self.client.get(url)
response = self.client.get(self.url)

self.assertEqual(response.status_code, 302)

def test_get_with_program_manager(self):
self.client.force_login(user=self.program_manager_user)

response = self.client.get(self.url, **self.default_headers)

self.assertEqual(response.status_code, 403)

self.admission.status = ChoixStatutPropositionDoctorale.TRAITEMENT_FAC.name
self.admission.save(update_fields=['status'])

response = self.client.get(self.url, **self.default_headers)

self.assertEqual(response.status_code, 200)


@freezegun.freeze_time('2023-01-01')
class ChoixFormationFormViewTestCase(TestCase):
Expand All @@ -105,14 +122,13 @@ def setUpTestData(cls):
management_entity=cls.first_doctoral_commission,
academic_year=cls.academic_years[1],
)
cls.admission: DoctorateAdmission = DoctorateAdmissionFactory(
training=cls.training,
candidate=CompletePersonFactory(language=settings.LANGUAGE_CODE_FR),
status=ChoixStatutPropositionDoctorale.CONFIRMEE.name,
)

cls.sic_manager_user = SicManagementRoleFactory(entity=cls.first_doctoral_commission).person.user

cls.program_manager_user = ProgramManagerRoleFactory(
education_group=cls.training.education_group,
).person.user

cls.data = {
'type_demande': 'INSCRIPTION',
'annee_academique': cls.other_training.academic_year.year,
Expand All @@ -123,7 +139,14 @@ def setUpTestData(cls):
cls.default_headers = {'HTTP_HX-Request': 'true'}

cls.url_namespace = 'admission:doctorate:choix-formation-update'
cls.url = resolve_url(cls.url_namespace, uuid=cls.admission.uuid)

def setUp(self):
self.admission: DoctorateAdmission = DoctorateAdmissionFactory(
training=self.training,
candidate=CompletePersonFactory(language=settings.LANGUAGE_CODE_FR),
status=ChoixStatutPropositionDoctorale.CONFIRMEE.name,
)
self.url = resolve_url(self.url_namespace, uuid=self.admission.uuid)

def test_get_htmx(self):
self.client.force_login(user=self.sic_manager_user)
Expand All @@ -133,7 +156,7 @@ def test_get_htmx(self):
self.assertEqual(response.status_code, 200)
self.assertIn('form', response.context)

def test_post_htmx_with_bachelor(self):
def test_post_htmx(self):
self.client.force_login(user=self.sic_manager_user)

response = self.client.post(self.url, data=self.data, **self.default_headers)
Expand All @@ -142,20 +165,37 @@ def test_post_htmx_with_bachelor(self):
self.assertEqual(response.headers['HX-Refresh'], 'true')

self.admission.refresh_from_db()

self.assertEqual(self.admission.last_update_author, self.sic_manager_user.person)
self.assertEqual(self.admission.modified_at, datetime.datetime.today())
self.assertEqual(self.admission.training, self.other_training)
self.assertEqual(self.admission.type_demande, TypeDemande.INSCRIPTION.name)

def test_get_without_htmx(self):
self.client.force_login(user=self.sic_manager_user)
def test_post_with_program_manager(self):
self.client.force_login(user=self.program_manager_user)

response = self.client.get(self.url)
self.assertEqual(response.status_code, 302)
response = self.client.post(self.url, data=self.data, **self.default_headers)

def test_post_without_htmx_with_bachelor(self):
self.assertEqual(response.status_code, 403)

self.admission.status = ChoixStatutPropositionDoctorale.TRAITEMENT_FAC.name
self.admission.save(update_fields=['status'])

response = self.client.post(self.url, data=self.data, **self.default_headers)

self.assertEqual(response.status_code, 200)
self.assertEqual(response.headers['HX-Refresh'], 'true')

self.admission.refresh_from_db()
self.assertEqual(self.admission.last_update_author, self.program_manager_user.person)
self.assertEqual(self.admission.modified_at, datetime.datetime.today())
self.assertEqual(self.admission.training, self.other_training)
self.assertEqual(self.admission.type_demande, TypeDemande.INSCRIPTION.name)

def test_get_without_htmx(self):
self.client.force_login(user=self.sic_manager_user)

response = self.client.post(self.url, self.data)
response = self.client.get(self.url)
self.assertEqual(response.status_code, 302)

def test_post_unknown_training(self):
Expand Down
5 changes: 1 addition & 4 deletions views/doctorate/details/checklist/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,10 +171,7 @@ def checklist_documents_by_tab(cls, specific_questions: List[QuestionSpecifiqueD
'DIPLOME_ETRANGER_TRADUCTION_CERTIFICAT_INSCRIPTION',
'CURRICULUM',
},
OngletsChecklist.choix_formation.name: {
'ATTESTATION_INSCRIPTION_REGULIERE',
'FORMULAIRE_MODIFICATION_INSCRIPTION',
},
OngletsChecklist.choix_formation.name: {},
OngletsChecklist.parcours_anterieur.name: {
'ATTESTATION_ABSENCE_DETTE_ETABLISSEMENT',
'DIPLOME_EQUIVALENCE',
Expand Down
4 changes: 2 additions & 2 deletions views/doctorate/details/checklist/training_choice.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@

class ChoixFormationFormView(LoadDossierViewMixin, FormView):
urlpatterns = 'choix-formation-update'
permission_required = 'admission.change_checklist'
permission_required = 'admission.checklist_change_training_choice'
template_name = 'admission/general_education/includes/checklist/choix_formation_form.html'
form_class = ChoixFormationForm

Expand Down Expand Up @@ -99,7 +99,7 @@ def form_valid(self, form):

class ChoixFormationDetailView(LoadDossierViewMixin, TemplateView):
urlpatterns = 'choix-formation-detail'
permission_required = 'admission.change_checklist'
permission_required = 'admission.checklist_change_training_choice'
template_name = 'admission/general_education/includes/checklist/choix_formation_detail.html'

def dispatch(self, request, *args, **kwargs):
Expand Down

0 comments on commit e019b5d

Please sign in to comment.