From bd4ea4896a079676bd263eda2be6af04b922721e Mon Sep 17 00:00:00 2001 From: David Wallace Date: Tue, 18 Feb 2025 15:35:01 +0100 Subject: [PATCH 1/3] feat(core,serializer): add max length validator to translation mixin Signed-off-by: David Wallace --- rdmo/core/serializers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rdmo/core/serializers.py b/rdmo/core/serializers.py index 95abe722a5..f51901f633 100644 --- a/rdmo/core/serializers.py +++ b/rdmo/core/serializers.py @@ -2,6 +2,7 @@ from django.contrib.auth.models import Group from django.contrib.sites.models import Site +from django.core.validators import MaxLengthValidator from django.db.models import Max from rest_framework import serializers @@ -62,7 +63,9 @@ def __init__(self, *args, **kwargs): source=field_name, required=not model_field.blank, allow_null=model_field.null, - allow_blank=model_field.blank) + allow_blank=model_field.blank, + validators=[MaxLengthValidator(model_field.max_length)] + ) class ThroughModelSerializerMixin: From 85e74f047ccc706abf55962ac1a40bfaf0701b16 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Tue, 18 Feb 2025 15:51:29 +0100 Subject: [PATCH 2/3] tests(questions): add tests for short title field validation Signed-off-by: David Wallace --- rdmo/questions/tests/test_viewset_page.py | 16 ++++++++++++++++ rdmo/questions/tests/test_viewset_section.py | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/rdmo/questions/tests/test_viewset_page.py b/rdmo/questions/tests/test_viewset_page.py index e0147bb0b5..d71af65cad 100644 --- a/rdmo/questions/tests/test_viewset_page.py +++ b/rdmo/questions/tests/test_viewset_page.py @@ -347,3 +347,19 @@ def test_detail_export_full(db, client): assert 'http://example.com/terms/domain/conditions' in uris assert 'http://example.com/terms/options/one_two_three' in uris assert 'http://example.com/terms/options/one_two_three/one' in uris + +def test_update_page_field_validation_short_title(db, client): + username = password = 'editor' + client.login(username=username, password=password) + instance = Page.objects.first() + very_long_title = 'short_title, ' * 10 + + url = reverse(urlnames['detail'], args=[instance.pk]) + data = { + 'uri_prefix': instance.uri_prefix, + 'uri_path': instance.uri_path, + 'short_title_en': very_long_title, + } + response = client.put(url, data, content_type='application/json') + assert response.status_code == 400 + assert response.json() == {'short_title_en': ['Ensure this value has at most 32 characters (it has 129).']} diff --git a/rdmo/questions/tests/test_viewset_section.py b/rdmo/questions/tests/test_viewset_section.py index efd64e07da..1a22eb1d7a 100644 --- a/rdmo/questions/tests/test_viewset_section.py +++ b/rdmo/questions/tests/test_viewset_section.py @@ -292,3 +292,20 @@ def test_detail_export_full(db, client): assert 'http://example.com/terms/domain/conditions' in uris assert 'http://example.com/terms/options/one_two_three' in uris assert 'http://example.com/terms/options/one_two_three/one' in uris + + +def test_update_section_field_validation_short_title(db: object, client: object) -> None: + username = password = 'editor' + client.login(username=username, password=password) + instance = Section.objects.first() + very_long_title = 'short_title, ' * 10 + + url = reverse(urlnames['detail'], args=[instance.pk]) + data = { + 'uri_prefix': instance.uri_prefix, + 'uri_path': instance.uri_path, + 'short_title_de': very_long_title, + } + response = client.put(url, data, content_type='application/json') + assert response.status_code == 400 + assert response.json() == {'short_title_de': ['Ensure this value has at most 32 characters (it has 129).']} From 46e4c05b984f0ba0c09875f2030791b14dd9c5fa Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 19 Feb 2025 12:13:10 +0100 Subject: [PATCH 3/3] fix(core,serializer): add check for max length to validators Signed-off-by: David Wallace --- rdmo/core/serializers.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rdmo/core/serializers.py b/rdmo/core/serializers.py index f51901f633..406659ec88 100644 --- a/rdmo/core/serializers.py +++ b/rdmo/core/serializers.py @@ -59,12 +59,16 @@ def __init__(self, *args, **kwargs): field_name = f'{field}_{lang_field}' model_field = meta.model._meta.get_field(field_name) + validators = [] + if hasattr(model_field, 'max_length') and model_field.max_length is not None: + validators.append(MaxLengthValidator(model_field.max_length)) + self.fields[f'{field}_{lang_code}'] = serializers.CharField( source=field_name, required=not model_field.blank, allow_null=model_field.null, allow_blank=model_field.blank, - validators=[MaxLengthValidator(model_field.max_length)] + validators=validators )