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
9 changes: 5 additions & 4 deletions contrib/forms/cotutelle.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-2024 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2025 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 @@ -28,7 +28,8 @@
from django.utils.translation import gettext_lazy as _

from admission.constants import FIELD_REQUIRED_MESSAGE
from admission.contrib.forms import AdmissionFileUploadField as FileUploadField, get_superior_institute_initial_choices
from admission.contrib.forms import AdmissionFileUploadField as FileUploadField
from admission.contrib.forms import get_superior_institute_initial_choices


class DoctorateAdmissionCotutelleForm(forms.Form):
Expand All @@ -48,7 +49,7 @@ class DoctorateAdmissionCotutelleForm(forms.Form):
label=_("Motivation for joint supervision"),
required=False,
widget=forms.Textarea(attrs={'rows': 2}),
max_length=255,
max_length=1024,
)

institution_fwb = forms.NullBooleanField(
Expand Down Expand Up @@ -120,7 +121,7 @@ def clean(self):
cleaned_data = super().clean()

if cleaned_data.get("cotutelle") == "YES":
for field in ['motivation', 'demande_ouverture']:
for field in ['motivation']:
if not cleaned_data.get(field):
self.add_error(field, FIELD_REQUIRED_MESSAGE)
if cleaned_data.get('institution_fwb') is None:
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
git+https://github.com/uclouvain/[email protected].14
git+https://github.com/uclouvain/[email protected].16
4 changes: 2 additions & 2 deletions templates/admission/doctorate/forms/cotutelle.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,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-2025 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 @@ -49,7 +49,7 @@
</div>
</div>
{% bootstrap_field form.motivation form_group_class="form-group required_field" placeholder="" %}
{% bootstrap_field_with_tooltip form.demande_ouverture classes="required_field" %}
{% bootstrap_field_with_tooltip form.demande_ouverture %}
{% bootstrap_field form.convention %}
{% bootstrap_field form.autres_documents %}
</div>
Expand Down
52 changes: 33 additions & 19 deletions tests/views/curriculum/mixin.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-2024 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2025 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 @@ -26,57 +26,71 @@

import datetime
import uuid
from unittest.mock import ANY, patch, MagicMock
from unittest.mock import ANY, MagicMock, patch

from django.http import Http404
from django.test import TestCase, override_settings

from django.test import override_settings
from osis_admission_sdk.model.action_link import ActionLink
from osis_admission_sdk.model.continuing_education_proposition_dto import ContinuingEducationPropositionDTO
from osis_admission_sdk.model.continuing_education_proposition_dto_links import ContinuingEducationPropositionDTOLinks
from osis_admission_sdk.model.continuing_education_proposition_dto import (
ContinuingEducationPropositionDTO,
)
from osis_admission_sdk.model.continuing_education_proposition_dto_links import (
ContinuingEducationPropositionDTOLinks,
)
from osis_admission_sdk.model.doctorat_dto import DoctoratDTO
from osis_admission_sdk.model.doctorate_proposition_dto import DoctoratePropositionDTO
from osis_admission_sdk.model.doctorate_proposition_dto_links import DoctoratePropositionDTOLinks
from osis_admission_sdk.model.doctorate_proposition_dto_links import (
DoctoratePropositionDTOLinks,
)
from osis_admission_sdk.model.educational_experience import EducationalExperience
from osis_admission_sdk.model.educational_experience_year import EducationalExperienceYear
from osis_admission_sdk.model.educational_experience_year import (
EducationalExperienceYear,
)
from osis_admission_sdk.model.formation_continue_dto import FormationContinueDTO
from osis_admission_sdk.model.formation_generale_dto import FormationGeneraleDTO
from osis_admission_sdk.model.general_education_proposition_dto import GeneralEducationPropositionDTO
from osis_admission_sdk.model.general_education_proposition_dto import (
GeneralEducationPropositionDTO,
)
from osis_admission_sdk.model.general_education_proposition_dto_links import (
GeneralEducationPropositionDTOLinks,
)
from osis_admission_sdk.model.professional_experience import ProfessionalExperience
from osis_admission_sdk.model.result_enum import ResultEnum
from osis_admission_sdk.model.sector_enum import SectorEnum
from osis_admission_sdk.model.study_system_enum import StudySystemEnum
from osis_admission_sdk.model.type_enum import TypeEnum
from osis_reference_sdk.model.academic_year import AcademicYear
from osis_reference_sdk.model.country import Country
from osis_reference_sdk.model.diploma import Diploma
from osis_reference_sdk.model.language import Language
from osis_reference_sdk.model.paginated_country import PaginatedCountry
from osis_reference_sdk.model.paginated_diploma import PaginatedDiploma
from osis_reference_sdk.model.paginated_language import PaginatedLanguage
from osis_reference_sdk.model.paginated_superior_non_university import PaginatedSuperiorNonUniversity
from osis_reference_sdk.model.paginated_superior_non_university import (
PaginatedSuperiorNonUniversity,
)
from osis_reference_sdk.model.paginated_university import PaginatedUniversity
from osis_reference_sdk.model.superior_non_university import SuperiorNonUniversity
from osis_reference_sdk.model.university import University

from admission.contrib.enums.admission_type import AdmissionType
from admission.contrib.enums.projet import (
ChoixStatutPropositionContinue,
ChoixStatutPropositionDoctorale,
ChoixStatutPropositionGenerale,
ChoixStatutPropositionContinue,
)
from admission.contrib.enums.state_iufc import StateIUFC
from admission.contrib.enums.training_choice import TrainingType
from admission.contrib.forms import PDF_MIME_TYPE
from admission.tests import get_paginated_years
from base.tests.factories.person import PersonFactory
from osis_admission_sdk.model.general_education_proposition_dto_links import GeneralEducationPropositionDTOLinks
from osis_admission_sdk.model.professional_experience import ProfessionalExperience
from osis_admission_sdk.model.result_enum import ResultEnum
from osis_admission_sdk.model.sector_enum import SectorEnum
from osis_admission_sdk.model.study_system_enum import StudySystemEnum
from osis_admission_sdk.model.type_enum import TypeEnum

from base.tests.test_case import OsisPortalTestCase


@override_settings(OSIS_DOCUMENT_BASE_URL='http://dummyurl')
class MixinTestCase(OsisPortalTestCase):
current_date = datetime.date(2023, 1, 1)

@classmethod
def setUpTestData(cls):
cls.person = PersonFactory()
Expand Down Expand Up @@ -441,7 +455,7 @@ def mock_academic_years_api(self):
academic_years_api_patcher = patch("osis_reference_sdk.api.academic_years_api.AcademicYearsApi")
self.mock_academic_years_api = academic_years_api_patcher.start()

current_year = datetime.date.today().year
current_year = self.current_date.year

self.mock_academic_years_api.return_value.get_academic_years.return_value = get_paginated_years(
current_year - 7,
Expand Down
35 changes: 17 additions & 18 deletions tests/views/curriculum/test_academic_experience.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@
from admission.tests.views.curriculum.mixin import MixinTestCase


@freezegun.freeze_time('2023-01-01')
class CurriculumAcademicExperienceReadTestCase(MixinTestCase):
def test_with_admission_on_reading_experience_is_loaded(self):
response = self.client.get(
Expand Down Expand Up @@ -149,7 +148,6 @@ def test_with_admission_on_reading_experience_without_year_is_loaded(self):


@override_settings(SERVER_NAME=None)
@freezegun.freeze_time('2023-01-01')
class CurriculumAcademicExperienceDeleteTestCase(MixinTestCase):
def test_with_admission_on_delete_experience_post_form(self):
response = self.client.post(
Expand All @@ -167,7 +165,7 @@ def test_with_admission_on_delete_experience_post_form(self):
self.assertRedirects(
response=response,
expected_url=resolve_url('admission:doctorate:update:curriculum', pk=self.proposition.uuid)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -206,7 +204,6 @@ def test_with_admission_on_delete_epc_experience_is_forbidden(self):
self.assertEqual(response.status_code, 403)


@freezegun.freeze_time('2023-01-01')
class CurriculumAcademicExperienceFormTestCase(MixinTestCase):
@classmethod
def setUpTestData(cls):
Expand Down Expand Up @@ -282,6 +279,7 @@ def setUp(self):
self.mockapi = self.mock_person_api.return_value

# On update
@freezegun.freeze_time(MixinTestCase.current_date)
def test_with_admission_on_update_experience_form_is_initialized(self):
response = self.client.get(self.admission_update_url)

Expand Down Expand Up @@ -348,16 +346,16 @@ def test_with_admission_on_update_experience_form_is_initialized(self):
)
self.assertEqual(
base_form.fields['country'].widget.choices,
[*EMPTY_CHOICE, (self.be_country.iso_code, self.be_country.name)]
[*EMPTY_CHOICE, (self.be_country.iso_code, self.be_country.name)],
)
self.assertTrue(base_form.fields['country'].is_ue_country)
self.assertEqual(
base_form.fields['linguistic_regime'].widget.choices,
[*EMPTY_CHOICE, (self.language_without_translation.code, self.language_without_translation.name)]
[*EMPTY_CHOICE, (self.language_without_translation.code, self.language_without_translation.name)],
)
self.assertEqual(
base_form.fields['program'].widget.choices,
[*EMPTY_CHOICE, (self.first_diploma.uuid, self.first_diploma.title)]
[*EMPTY_CHOICE, (self.first_diploma.uuid, self.first_diploma.title)],
)
self.assertEqual(
base_form.fields['institute'].widget.choices,
Expand All @@ -367,8 +365,8 @@ def test_with_admission_on_update_experience_form_is_initialized(self):
self.institute.uuid,
f'{self.institute.name}'
f' <span class="school-address">Boulevard de l\'Université 1, 1348 Louvain-la-Neuve</span>',
)
]
),
],
)

# Check that no field is hidden or disabled
Expand Down Expand Up @@ -801,6 +799,7 @@ def test_with_admission_on_update_experience_post_form_for_foreign_country_missi
self.assertFormError(response.context['base_form'], 'education_name', FIELD_REQUIRED_MESSAGE)
self.assertFormError(response.context['base_form'], 'linguistic_regime', FIELD_REQUIRED_MESSAGE)

@freezegun.freeze_time(MixinTestCase.current_date)
def test_with_admission_on_update_experience_post_form_for_foreign_country_missing_fields_for_enrolled_year(self):
response = self.client.post(
self.admission_update_url,
Expand Down Expand Up @@ -953,7 +952,7 @@ def test_with_admission_on_update_experience_post_form_for_be_country(self):
self.assertRedirects(
response=response,
expected_url=resolve_url('admission:doctorate:update:curriculum', pk=self.proposition.uuid)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -1015,7 +1014,7 @@ def test_with_admission_on_update_experience_post_form_for_be_country_general_ed
self.assertRedirects(
response=response,
expected_url=resolve_url('admission:general-education:update:curriculum', pk=self.general_proposition.uuid)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -1080,7 +1079,7 @@ def test_with_admission_on_update_experience_post_form_for_be_country_continuing
'admission:continuing-education:update:curriculum',
pk=self.continuing_proposition.uuid,
)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -1422,7 +1421,7 @@ def test_with_admission_on_update_experience_post_form_for_be_country_known_prog
self.assertRedirects(
response=response,
expected_url=resolve_url('admission:doctorate:update:curriculum', pk=self.proposition.uuid)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -1493,7 +1492,7 @@ def test_with_admission_on_update_experience_post_form_for_foreign_country_with_
self.assertRedirects(
response=response,
expected_url=resolve_url('admission:doctorate:update:curriculum', pk=self.proposition.uuid)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -1565,7 +1564,7 @@ def test_with_admission_on_update_experience_post_form_for_foreign_country_witho
self.assertRedirects(
response=response,
expected_url=resolve_url('admission:doctorate:update:curriculum', pk=self.proposition.uuid)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -1630,7 +1629,7 @@ def test_with_admission_on_update_experience_post_form_for_foreign_country_gradu
self.assertRedirects(
response=response,
expected_url=resolve_url('admission:doctorate:update:curriculum', pk=self.proposition.uuid)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -1696,7 +1695,7 @@ def test_with_admission_on_create_experience_post_form_for_be_country(self):
self.assertRedirects(
response=response,
expected_url=resolve_url('admission:doctorate:update:curriculum', pk=self.proposition.uuid)
+ '#curriculum-header',
+ '#curriculum-header',
)

# Check that the API calls are done
Expand Down Expand Up @@ -1729,5 +1728,5 @@ def test_with_admission_on_create_experience_post_form_for_be_country_and_redire
pk=self.proposition.uuid,
experience_id=self.educational_experience.uuid,
)
+ '#curriculum-header',
+ '#curriculum-header',
)
14 changes: 6 additions & 8 deletions tests/views/curriculum/test_global.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-2024 Université catholique de Louvain (http://www.uclouvain.be)
# Copyright (C) 2015-2025 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 @@ -25,17 +25,18 @@
# ##############################################################################
import datetime

import freezegun
from django.shortcuts import resolve_url
from django.utils.translation import gettext as _
from osis_admission_sdk.model.result_enum import ResultEnum

from admission.contrib.enums.training_choice import TrainingType, VETERINARY_BACHELOR_CODE
from admission.contrib.enums.training_choice import (
VETERINARY_BACHELOR_CODE,
TrainingType,
)
from admission.contrib.forms.curriculum import REQUIRED_FIELD_CLASS
from admission.tests.views.curriculum.mixin import MixinTestCase
from osis_admission_sdk.model.result_enum import ResultEnum


@freezegun.freeze_time('2023-01-01')
class CreateGlobalCurriculumTestCase(MixinTestCase):
def setUp(self):
super().setUp()
Expand All @@ -57,7 +58,6 @@ def test_on_create_curriculum_is_loaded(self):
)


@freezegun.freeze_time('2023-01-01')
class DoctorateGlobalCurriculumTestCase(MixinTestCase):
def setUp(self):
super().setUp()
Expand Down Expand Up @@ -160,7 +160,6 @@ def test_with_admission_on_update_post_curriculum_file(self):
)


@freezegun.freeze_time('2023-01-01')
class GeneralEducationGlobalCurriculumTestCase(MixinTestCase):
def setUp(self):
super().setUp()
Expand Down Expand Up @@ -654,7 +653,6 @@ def test_with_admission_post_curriculum_is_loaded_with_capes_and_be_and_foreign_
)


@freezegun.freeze_time('2023-01-01')
class ContinuingEducationGlobalCurriculumTestCase(MixinTestCase):
def setUp(self):
super().setUp()
Expand Down
Loading