diff --git a/renovate.json b/renovate.json index bc23229bdf..6d5cd969b3 100644 --- a/renovate.json +++ b/renovate.json @@ -16,17 +16,6 @@ "django-storages" ] }, - { - "groupName": "allowed django versions", - "matchManagers": [ - "setup-cfg", - "pep621" - ], - "matchPackageNames": [ - "Django" - ], - "allowedVersions": "<5" - }, { "enabled": false, "groupName": "ignored js dependencies", diff --git a/src/backend/joanie/badges/models.py b/src/backend/joanie/badges/models.py index cd9850bc5e..cd4994fe71 100644 --- a/src/backend/joanie/badges/models.py +++ b/src/backend/joanie/badges/models.py @@ -1,6 +1,7 @@ """ Declare and configure the models for the badges part """ +# pylint: disable=too-many-function-args from functools import lru_cache diff --git a/src/backend/joanie/core/admin.py b/src/backend/joanie/core/admin.py index 165c2c12b8..d1e87386f2 100644 --- a/src/backend/joanie/core/admin.py +++ b/src/backend/joanie/core/admin.py @@ -274,7 +274,7 @@ class CourseAdmin(DjangoObjectActions, TranslatableAdmin): change_form_template = "joanie/admin/translatable_change_form_with_actions.html" list_display = ("code", "title", "state") readonly_fields = ("course_runs",) - filter_horizontal = ("products",) + # filter_horizontal = ("products",) inlines = (CourseCourseRunsInline, CourseProductRelationInline) fieldsets = ( ( diff --git a/src/backend/joanie/core/migrations/0053_alter_certificate_options_and_more.py b/src/backend/joanie/core/migrations/0053_alter_certificate_options_and_more.py new file mode 100644 index 0000000000..7a5f19a1ae --- /dev/null +++ b/src/backend/joanie/core/migrations/0053_alter_certificate_options_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.18 on 2025-01-30 16:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0052_alter_unique_constraint_order_when_canceled_or_refund'), + ] + + operations = [ + migrations.AlterModelOptions( + name='certificate', + options={'ordering': ['-issued_on'], 'verbose_name': 'Certificate', 'verbose_name_plural': 'Certificates'}, + ), + migrations.AlterField( + model_name='certificatedefinition', + name='template', + field=models.CharField(blank=True, choices=[('certificate', 'Certificate'), ('degree', 'Degree'), ('unicamp-degree', 'Unicamp degree')], db_index=True, max_length=255, null=True, verbose_name='template to generate pdf'), + ), + ] diff --git a/src/backend/joanie/core/migrations/0054_alter_contract_order.py b/src/backend/joanie/core/migrations/0054_alter_contract_order.py new file mode 100644 index 0000000000..2133b11c0b --- /dev/null +++ b/src/backend/joanie/core/migrations/0054_alter_contract_order.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.18 on 2025-01-30 16:22 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0053_alter_certificate_options_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='contract', + name='order', + field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.PROTECT, related_name='contract', to='core.order', verbose_name='order'), + ), + ] diff --git a/src/backend/joanie/core/models/contracts.py b/src/backend/joanie/core/models/contracts.py index f421181350..3a136c6921 100644 --- a/src/backend/joanie/core/models/contracts.py +++ b/src/backend/joanie/core/models/contracts.py @@ -91,6 +91,7 @@ class Contract(BaseModel): order = models.OneToOneField( "core.order", verbose_name=_("order"), + related_name="contract", on_delete=models.PROTECT, editable=False, ) diff --git a/src/backend/joanie/core/models/courses.py b/src/backend/joanie/core/models/courses.py index b2c2e09e74..1421c510f7 100644 --- a/src/backend/joanie/core/models/courses.py +++ b/src/backend/joanie/core/models/courses.py @@ -910,7 +910,7 @@ def get_equivalent_serialized_course_runs_for_related_products( """ products = self.course.products.model.objects.filter( models.Q(target_course_relations__course_runs__isnull=True) - | models.Q(target_course_relations__course_runs=self), + | models.Q(target_course_relations__course_runs__id=self.id), target_course_relations__course=self.course, ) diff --git a/src/backend/joanie/tests/swagger/admin-swagger.json b/src/backend/joanie/tests/swagger/admin-swagger.json index e208c31b41..cc3810229e 100644 --- a/src/backend/joanie/tests/swagger/admin-swagger.json +++ b/src/backend/joanie/tests/swagger/admin-swagger.json @@ -7904,6 +7904,7 @@ "tr", "tt", "udm", + "ug", "uk", "ur", "uz", @@ -7912,7 +7913,7 @@ "zh-hant" ], "type": "string", - "description": "* `af` - Afrikaans\n* `ar` - Arabic\n* `ar-dz` - Algerian Arabic\n* `ast` - Asturian\n* `az` - Azerbaijani\n* `bg` - Bulgarian\n* `be` - Belarusian\n* `bn` - Bengali\n* `br` - Breton\n* `bs` - Bosnian\n* `ca` - Catalan\n* `ckb` - Central Kurdish (Sorani)\n* `cs` - Czech\n* `cy` - Welsh\n* `da` - Danish\n* `de` - German\n* `dsb` - Lower Sorbian\n* `el` - Greek\n* `en` - English\n* `en-au` - Australian English\n* `en-gb` - British English\n* `eo` - Esperanto\n* `es` - Spanish\n* `es-ar` - Argentinian Spanish\n* `es-co` - Colombian Spanish\n* `es-mx` - Mexican Spanish\n* `es-ni` - Nicaraguan Spanish\n* `es-ve` - Venezuelan Spanish\n* `et` - Estonian\n* `eu` - Basque\n* `fa` - Persian\n* `fi` - Finnish\n* `fr` - French\n* `fy` - Frisian\n* `ga` - Irish\n* `gd` - Scottish Gaelic\n* `gl` - Galician\n* `he` - Hebrew\n* `hi` - Hindi\n* `hr` - Croatian\n* `hsb` - Upper Sorbian\n* `hu` - Hungarian\n* `hy` - Armenian\n* `ia` - Interlingua\n* `id` - Indonesian\n* `ig` - Igbo\n* `io` - Ido\n* `is` - Icelandic\n* `it` - Italian\n* `ja` - Japanese\n* `ka` - Georgian\n* `kab` - Kabyle\n* `kk` - Kazakh\n* `km` - Khmer\n* `kn` - Kannada\n* `ko` - Korean\n* `ky` - Kyrgyz\n* `lb` - Luxembourgish\n* `lt` - Lithuanian\n* `lv` - Latvian\n* `mk` - Macedonian\n* `ml` - Malayalam\n* `mn` - Mongolian\n* `mr` - Marathi\n* `ms` - Malay\n* `my` - Burmese\n* `nb` - Norwegian Bokmål\n* `ne` - Nepali\n* `nl` - Dutch\n* `nn` - Norwegian Nynorsk\n* `os` - Ossetic\n* `pa` - Punjabi\n* `pl` - Polish\n* `pt` - Portuguese\n* `pt-br` - Brazilian Portuguese\n* `ro` - Romanian\n* `ru` - Russian\n* `sk` - Slovak\n* `sl` - Slovenian\n* `sq` - Albanian\n* `sr` - Serbian\n* `sr-latn` - Serbian Latin\n* `sv` - Swedish\n* `sw` - Swahili\n* `ta` - Tamil\n* `te` - Telugu\n* `tg` - Tajik\n* `th` - Thai\n* `tk` - Turkmen\n* `tr` - Turkish\n* `tt` - Tatar\n* `udm` - Udmurt\n* `uk` - Ukrainian\n* `ur` - Urdu\n* `uz` - Uzbek\n* `vi` - Vietnamese\n* `zh-hans` - Simplified Chinese\n* `zh-hant` - Traditional Chinese" + "description": "* `af` - Afrikaans\n* `ar` - Arabic\n* `ar-dz` - Algerian Arabic\n* `ast` - Asturian\n* `az` - Azerbaijani\n* `bg` - Bulgarian\n* `be` - Belarusian\n* `bn` - Bengali\n* `br` - Breton\n* `bs` - Bosnian\n* `ca` - Catalan\n* `ckb` - Central Kurdish (Sorani)\n* `cs` - Czech\n* `cy` - Welsh\n* `da` - Danish\n* `de` - German\n* `dsb` - Lower Sorbian\n* `el` - Greek\n* `en` - English\n* `en-au` - Australian English\n* `en-gb` - British English\n* `eo` - Esperanto\n* `es` - Spanish\n* `es-ar` - Argentinian Spanish\n* `es-co` - Colombian Spanish\n* `es-mx` - Mexican Spanish\n* `es-ni` - Nicaraguan Spanish\n* `es-ve` - Venezuelan Spanish\n* `et` - Estonian\n* `eu` - Basque\n* `fa` - Persian\n* `fi` - Finnish\n* `fr` - French\n* `fy` - Frisian\n* `ga` - Irish\n* `gd` - Scottish Gaelic\n* `gl` - Galician\n* `he` - Hebrew\n* `hi` - Hindi\n* `hr` - Croatian\n* `hsb` - Upper Sorbian\n* `hu` - Hungarian\n* `hy` - Armenian\n* `ia` - Interlingua\n* `id` - Indonesian\n* `ig` - Igbo\n* `io` - Ido\n* `is` - Icelandic\n* `it` - Italian\n* `ja` - Japanese\n* `ka` - Georgian\n* `kab` - Kabyle\n* `kk` - Kazakh\n* `km` - Khmer\n* `kn` - Kannada\n* `ko` - Korean\n* `ky` - Kyrgyz\n* `lb` - Luxembourgish\n* `lt` - Lithuanian\n* `lv` - Latvian\n* `mk` - Macedonian\n* `ml` - Malayalam\n* `mn` - Mongolian\n* `mr` - Marathi\n* `ms` - Malay\n* `my` - Burmese\n* `nb` - Norwegian Bokmål\n* `ne` - Nepali\n* `nl` - Dutch\n* `nn` - Norwegian Nynorsk\n* `os` - Ossetic\n* `pa` - Punjabi\n* `pl` - Polish\n* `pt` - Portuguese\n* `pt-br` - Brazilian Portuguese\n* `ro` - Romanian\n* `ru` - Russian\n* `sk` - Slovak\n* `sl` - Slovenian\n* `sq` - Albanian\n* `sr` - Serbian\n* `sr-latn` - Serbian Latin\n* `sv` - Swedish\n* `sw` - Swahili\n* `ta` - Tamil\n* `te` - Telugu\n* `tg` - Tajik\n* `th` - Thai\n* `tk` - Turkmen\n* `tr` - Turkish\n* `tt` - Tatar\n* `udm` - Udmurt\n* `ug` - Uyghur\n* `uk` - Ukrainian\n* `ur` - Urdu\n* `uz` - Uzbek\n* `vi` - Vietnamese\n* `zh-hans` - Simplified Chinese\n* `zh-hant` - Traditional Chinese" }, "NameEnum": { "enum": [ diff --git a/src/backend/joanie/tests/swagger/swagger.json b/src/backend/joanie/tests/swagger/swagger.json index bd41433306..c991c0227c 100644 --- a/src/backend/joanie/tests/swagger/swagger.json +++ b/src/backend/joanie/tests/swagger/swagger.json @@ -5438,7 +5438,7 @@ } ], "readOnly": true, - "description": "The list of languages in which the course content is available.\n\n* `af` - Afrikaans\n* `ar` - Arabic\n* `ar-dz` - Algerian Arabic\n* `ast` - Asturian\n* `az` - Azerbaijani\n* `bg` - Bulgarian\n* `be` - Belarusian\n* `bn` - Bengali\n* `br` - Breton\n* `bs` - Bosnian\n* `ca` - Catalan\n* `ckb` - Central Kurdish (Sorani)\n* `cs` - Czech\n* `cy` - Welsh\n* `da` - Danish\n* `de` - German\n* `dsb` - Lower Sorbian\n* `el` - Greek\n* `en` - English\n* `en-au` - Australian English\n* `en-gb` - British English\n* `eo` - Esperanto\n* `es` - Spanish\n* `es-ar` - Argentinian Spanish\n* `es-co` - Colombian Spanish\n* `es-mx` - Mexican Spanish\n* `es-ni` - Nicaraguan Spanish\n* `es-ve` - Venezuelan Spanish\n* `et` - Estonian\n* `eu` - Basque\n* `fa` - Persian\n* `fi` - Finnish\n* `fr` - French\n* `fy` - Frisian\n* `ga` - Irish\n* `gd` - Scottish Gaelic\n* `gl` - Galician\n* `he` - Hebrew\n* `hi` - Hindi\n* `hr` - Croatian\n* `hsb` - Upper Sorbian\n* `hu` - Hungarian\n* `hy` - Armenian\n* `ia` - Interlingua\n* `id` - Indonesian\n* `ig` - Igbo\n* `io` - Ido\n* `is` - Icelandic\n* `it` - Italian\n* `ja` - Japanese\n* `ka` - Georgian\n* `kab` - Kabyle\n* `kk` - Kazakh\n* `km` - Khmer\n* `kn` - Kannada\n* `ko` - Korean\n* `ky` - Kyrgyz\n* `lb` - Luxembourgish\n* `lt` - Lithuanian\n* `lv` - Latvian\n* `mk` - Macedonian\n* `ml` - Malayalam\n* `mn` - Mongolian\n* `mr` - Marathi\n* `ms` - Malay\n* `my` - Burmese\n* `nb` - Norwegian Bokmål\n* `ne` - Nepali\n* `nl` - Dutch\n* `nn` - Norwegian Nynorsk\n* `os` - Ossetic\n* `pa` - Punjabi\n* `pl` - Polish\n* `pt` - Portuguese\n* `pt-br` - Brazilian Portuguese\n* `ro` - Romanian\n* `ru` - Russian\n* `sk` - Slovak\n* `sl` - Slovenian\n* `sq` - Albanian\n* `sr` - Serbian\n* `sr-latn` - Serbian Latin\n* `sv` - Swedish\n* `sw` - Swahili\n* `ta` - Tamil\n* `te` - Telugu\n* `tg` - Tajik\n* `th` - Thai\n* `tk` - Turkmen\n* `tr` - Turkish\n* `tt` - Tatar\n* `udm` - Udmurt\n* `uk` - Ukrainian\n* `ur` - Urdu\n* `uz` - Uzbek\n* `vi` - Vietnamese\n* `zh-hans` - Simplified Chinese\n* `zh-hant` - Traditional Chinese" + "description": "The list of languages in which the course content is available.\n\n* `af` - Afrikaans\n* `ar` - Arabic\n* `ar-dz` - Algerian Arabic\n* `ast` - Asturian\n* `az` - Azerbaijani\n* `bg` - Bulgarian\n* `be` - Belarusian\n* `bn` - Bengali\n* `br` - Breton\n* `bs` - Bosnian\n* `ca` - Catalan\n* `ckb` - Central Kurdish (Sorani)\n* `cs` - Czech\n* `cy` - Welsh\n* `da` - Danish\n* `de` - German\n* `dsb` - Lower Sorbian\n* `el` - Greek\n* `en` - English\n* `en-au` - Australian English\n* `en-gb` - British English\n* `eo` - Esperanto\n* `es` - Spanish\n* `es-ar` - Argentinian Spanish\n* `es-co` - Colombian Spanish\n* `es-mx` - Mexican Spanish\n* `es-ni` - Nicaraguan Spanish\n* `es-ve` - Venezuelan Spanish\n* `et` - Estonian\n* `eu` - Basque\n* `fa` - Persian\n* `fi` - Finnish\n* `fr` - French\n* `fy` - Frisian\n* `ga` - Irish\n* `gd` - Scottish Gaelic\n* `gl` - Galician\n* `he` - Hebrew\n* `hi` - Hindi\n* `hr` - Croatian\n* `hsb` - Upper Sorbian\n* `hu` - Hungarian\n* `hy` - Armenian\n* `ia` - Interlingua\n* `id` - Indonesian\n* `ig` - Igbo\n* `io` - Ido\n* `is` - Icelandic\n* `it` - Italian\n* `ja` - Japanese\n* `ka` - Georgian\n* `kab` - Kabyle\n* `kk` - Kazakh\n* `km` - Khmer\n* `kn` - Kannada\n* `ko` - Korean\n* `ky` - Kyrgyz\n* `lb` - Luxembourgish\n* `lt` - Lithuanian\n* `lv` - Latvian\n* `mk` - Macedonian\n* `ml` - Malayalam\n* `mn` - Mongolian\n* `mr` - Marathi\n* `ms` - Malay\n* `my` - Burmese\n* `nb` - Norwegian Bokmål\n* `ne` - Nepali\n* `nl` - Dutch\n* `nn` - Norwegian Nynorsk\n* `os` - Ossetic\n* `pa` - Punjabi\n* `pl` - Polish\n* `pt` - Portuguese\n* `pt-br` - Brazilian Portuguese\n* `ro` - Romanian\n* `ru` - Russian\n* `sk` - Slovak\n* `sl` - Slovenian\n* `sq` - Albanian\n* `sr` - Serbian\n* `sr-latn` - Serbian Latin\n* `sv` - Swedish\n* `sw` - Swahili\n* `ta` - Tamil\n* `te` - Telugu\n* `tg` - Tajik\n* `th` - Thai\n* `tk` - Turkmen\n* `tr` - Turkish\n* `tt` - Tatar\n* `udm` - Udmurt\n* `ug` - Uyghur\n* `uk` - Ukrainian\n* `ur` - Urdu\n* `uz` - Uzbek\n* `vi` - Vietnamese\n* `zh-hans` - Simplified Chinese\n* `zh-hant` - Traditional Chinese" }, "resource_link": { "type": "string", @@ -5858,6 +5858,7 @@ "tr", "tt", "udm", + "ug", "uk", "ur", "uz", @@ -5866,7 +5867,7 @@ "zh-hant" ], "type": "string", - "description": "* `af` - Afrikaans\n* `ar` - Arabic\n* `ar-dz` - Algerian Arabic\n* `ast` - Asturian\n* `az` - Azerbaijani\n* `bg` - Bulgarian\n* `be` - Belarusian\n* `bn` - Bengali\n* `br` - Breton\n* `bs` - Bosnian\n* `ca` - Catalan\n* `ckb` - Central Kurdish (Sorani)\n* `cs` - Czech\n* `cy` - Welsh\n* `da` - Danish\n* `de` - German\n* `dsb` - Lower Sorbian\n* `el` - Greek\n* `en` - English\n* `en-au` - Australian English\n* `en-gb` - British English\n* `eo` - Esperanto\n* `es` - Spanish\n* `es-ar` - Argentinian Spanish\n* `es-co` - Colombian Spanish\n* `es-mx` - Mexican Spanish\n* `es-ni` - Nicaraguan Spanish\n* `es-ve` - Venezuelan Spanish\n* `et` - Estonian\n* `eu` - Basque\n* `fa` - Persian\n* `fi` - Finnish\n* `fr` - French\n* `fy` - Frisian\n* `ga` - Irish\n* `gd` - Scottish Gaelic\n* `gl` - Galician\n* `he` - Hebrew\n* `hi` - Hindi\n* `hr` - Croatian\n* `hsb` - Upper Sorbian\n* `hu` - Hungarian\n* `hy` - Armenian\n* `ia` - Interlingua\n* `id` - Indonesian\n* `ig` - Igbo\n* `io` - Ido\n* `is` - Icelandic\n* `it` - Italian\n* `ja` - Japanese\n* `ka` - Georgian\n* `kab` - Kabyle\n* `kk` - Kazakh\n* `km` - Khmer\n* `kn` - Kannada\n* `ko` - Korean\n* `ky` - Kyrgyz\n* `lb` - Luxembourgish\n* `lt` - Lithuanian\n* `lv` - Latvian\n* `mk` - Macedonian\n* `ml` - Malayalam\n* `mn` - Mongolian\n* `mr` - Marathi\n* `ms` - Malay\n* `my` - Burmese\n* `nb` - Norwegian Bokmål\n* `ne` - Nepali\n* `nl` - Dutch\n* `nn` - Norwegian Nynorsk\n* `os` - Ossetic\n* `pa` - Punjabi\n* `pl` - Polish\n* `pt` - Portuguese\n* `pt-br` - Brazilian Portuguese\n* `ro` - Romanian\n* `ru` - Russian\n* `sk` - Slovak\n* `sl` - Slovenian\n* `sq` - Albanian\n* `sr` - Serbian\n* `sr-latn` - Serbian Latin\n* `sv` - Swedish\n* `sw` - Swahili\n* `ta` - Tamil\n* `te` - Telugu\n* `tg` - Tajik\n* `th` - Thai\n* `tk` - Turkmen\n* `tr` - Turkish\n* `tt` - Tatar\n* `udm` - Udmurt\n* `uk` - Ukrainian\n* `ur` - Urdu\n* `uz` - Uzbek\n* `vi` - Vietnamese\n* `zh-hans` - Simplified Chinese\n* `zh-hant` - Traditional Chinese" + "description": "* `af` - Afrikaans\n* `ar` - Arabic\n* `ar-dz` - Algerian Arabic\n* `ast` - Asturian\n* `az` - Azerbaijani\n* `bg` - Bulgarian\n* `be` - Belarusian\n* `bn` - Bengali\n* `br` - Breton\n* `bs` - Bosnian\n* `ca` - Catalan\n* `ckb` - Central Kurdish (Sorani)\n* `cs` - Czech\n* `cy` - Welsh\n* `da` - Danish\n* `de` - German\n* `dsb` - Lower Sorbian\n* `el` - Greek\n* `en` - English\n* `en-au` - Australian English\n* `en-gb` - British English\n* `eo` - Esperanto\n* `es` - Spanish\n* `es-ar` - Argentinian Spanish\n* `es-co` - Colombian Spanish\n* `es-mx` - Mexican Spanish\n* `es-ni` - Nicaraguan Spanish\n* `es-ve` - Venezuelan Spanish\n* `et` - Estonian\n* `eu` - Basque\n* `fa` - Persian\n* `fi` - Finnish\n* `fr` - French\n* `fy` - Frisian\n* `ga` - Irish\n* `gd` - Scottish Gaelic\n* `gl` - Galician\n* `he` - Hebrew\n* `hi` - Hindi\n* `hr` - Croatian\n* `hsb` - Upper Sorbian\n* `hu` - Hungarian\n* `hy` - Armenian\n* `ia` - Interlingua\n* `id` - Indonesian\n* `ig` - Igbo\n* `io` - Ido\n* `is` - Icelandic\n* `it` - Italian\n* `ja` - Japanese\n* `ka` - Georgian\n* `kab` - Kabyle\n* `kk` - Kazakh\n* `km` - Khmer\n* `kn` - Kannada\n* `ko` - Korean\n* `ky` - Kyrgyz\n* `lb` - Luxembourgish\n* `lt` - Lithuanian\n* `lv` - Latvian\n* `mk` - Macedonian\n* `ml` - Malayalam\n* `mn` - Mongolian\n* `mr` - Marathi\n* `ms` - Malay\n* `my` - Burmese\n* `nb` - Norwegian Bokmål\n* `ne` - Nepali\n* `nl` - Dutch\n* `nn` - Norwegian Nynorsk\n* `os` - Ossetic\n* `pa` - Punjabi\n* `pl` - Polish\n* `pt` - Portuguese\n* `pt-br` - Brazilian Portuguese\n* `ro` - Romanian\n* `ru` - Russian\n* `sk` - Slovak\n* `sl` - Slovenian\n* `sq` - Albanian\n* `sr` - Serbian\n* `sr-latn` - Serbian Latin\n* `sv` - Swedish\n* `sw` - Swahili\n* `ta` - Tamil\n* `te` - Telugu\n* `tg` - Tajik\n* `th` - Thai\n* `tk` - Turkmen\n* `tr` - Turkish\n* `tt` - Tatar\n* `udm` - Udmurt\n* `ug` - Uyghur\n* `uk` - Ukrainian\n* `ur` - Urdu\n* `uz` - Uzbek\n* `vi` - Vietnamese\n* `zh-hans` - Simplified Chinese\n* `zh-hant` - Traditional Chinese" }, "LevelEnum": { "enum": [ diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 9cb877fc87..6ba128517c 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -43,7 +43,7 @@ dependencies = [ "django-redis==5.4.0", "django-storages==1.14.3", "django-viewflow==2.2.9", - "Django<5", + "Django==5.0.3", "djangorestframework-simplejwt==5.4.0", "djangorestframework==3.15.2", "drf_spectacular==0.28.0",