diff --git a/CHANGELOG.md b/CHANGELOG.md index 852da905..62c41496 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ ### Changed -- nothing changed +- Set a default max length to 1024 for URLFields ### Removed diff --git a/concrete_datastore/concrete/models.py b/concrete_datastore/concrete/models.py index 0e587948..26274170 100644 --- a/concrete_datastore/concrete/models.py +++ b/concrete_datastore/concrete/models.py @@ -984,6 +984,8 @@ class Meta: args['null'] = False args.setdefault('blank', True) args.setdefault('default', "") + elif field.f_type == 'URLField': + args.setdefault('max_length', settings.URL_FIELD_MAX_LENGTH) elif field.f_type in ('IntegerField', 'BigIntegerField'): args['null'] = False args.setdefault('blank', True) diff --git a/concrete_datastore/settings/base.py b/concrete_datastore/settings/base.py index 9aebbf52..b5998e6c 100644 --- a/concrete_datastore/settings/base.py +++ b/concrete_datastore/settings/base.py @@ -656,3 +656,5 @@ #: The TOTP issuer used for the QR-Code. Leave to None to use the same value #: as PLATFORM_NAME OTP_TOTP_ISSUER = None + +URL_FIELD_MAX_LENGTH = 1024 diff --git a/tests/datamodel/unittest-datamodel.yaml b/tests/datamodel/unittest-datamodel.yaml index 10a73c25..5fa1cb8d 100644 --- a/tests/datamodel/unittest-datamodel.yaml +++ b/tests/datamodel/unittest-datamodel.yaml @@ -204,6 +204,11 @@ manifest: datatype: file attributes: {} description: Photo of the project + - name: storage_url + datatype: url + attributes: + allow_empty: true + description: Url of the project storgae uid: 7158d6af-8c79-4613-82cb-c1b0b20400ab - name: Category description: Category diff --git a/tests/migrations/0013_project_storage_url.py b/tests/migrations/0013_project_storage_url.py new file mode 100644 index 00000000..b6312205 --- /dev/null +++ b/tests/migrations/0013_project_storage_url.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.19 on 2023-06-19 13:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('concrete', '0012_auto_20221115_0644'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='storage_url', + field=models.URLField(blank=True, max_length=1024, null=True), + ), + ] diff --git a/tests/test_fields_validation.py b/tests/test_fields_validation.py new file mode 100644 index 00000000..610e35c6 --- /dev/null +++ b/tests/test_fields_validation.py @@ -0,0 +1,23 @@ +from django.test import TestCase +from concrete_datastore.concrete.models import Project +from django.db import DataError + + +class UrlValidationTestCase(TestCase): + #: URL length validator is 1024 + def test_nominal_case(self): + url = "http://domain.ext/" + "a/" * 491 + self.assertEqual(len(url), 1000) + # 1000 < 1024 + self.assertEqual(Project.objects.count(), 0) + project = Project.objects.create(storage_url=url) + self.assertEqual(Project.objects.count(), 1) + self.assertEqual(len(project.storage_url), 1000) + + def test_validation_error(self): + url = "http://domain.ext/" + "a/" * 991 + self.assertEqual(len(url), 2000) + # 2000 > 1024 + self.assertEqual(Project.objects.count(), 0) + with self.assertRaises(DataError): + Project.objects.create(storage_url=url)