diff --git a/src/core/locale/de/LC_MESSAGES/django.po b/src/core/locale/de/LC_MESSAGES/django.po index de11241f08bc95add6e9475847bb76ff6d9c95cf..ff3f6a27a6010a4cc95a0d6b0f8b348b37ce88c8 100644 --- a/src/core/locale/de/LC_MESSAGES/django.po +++ b/src/core/locale/de/LC_MESSAGES/django.po @@ -2556,6 +2556,9 @@ msgstr "Das Bild muss die Abmessungen von minimal %(min_width)spx/%(min_height)s msgid "Validation__error_image_square" msgstr "Das Bild muss quadratisch sein." +msgid "Validation__error_lowercase" +msgstr "Das Feld darf nur Kleinbuchstaben enthalten." + msgid "Registration" msgstr "Registrieren" diff --git a/src/core/locale/en/LC_MESSAGES/django.po b/src/core/locale/en/LC_MESSAGES/django.po index bf783a463c514c21bdf23d792eb2c9488b5359fb..14cfc2fcf2063fdbcd5cddd68ff2d4495486f321 100644 --- a/src/core/locale/en/LC_MESSAGES/django.po +++ b/src/core/locale/en/LC_MESSAGES/django.po @@ -2538,6 +2538,9 @@ msgstr "The image must have the dimensions of minimal %(min_width)spx/%(min_heig msgid "Validation__error_image_square" msgstr "The image must be square" +msgid "Validation__error_lowercase" +msgstr "The field may only contain lowercase letters" + msgid "Registration" msgstr "Sign Up" diff --git a/src/core/migrations/0170_alter_assembly_slug.py b/src/core/migrations/0170_alter_assembly_slug.py new file mode 100644 index 0000000000000000000000000000000000000000..ea803500a158bf4f1776b57a56fcde1d72f23522 --- /dev/null +++ b/src/core/migrations/0170_alter_assembly_slug.py @@ -0,0 +1,32 @@ +# Generated by Django 5.1.3 on 2024-12-23 01:30 + +import core.validators +import django.core.validators +import re +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0169_team_teammember"), + ] + + operations = [ + migrations.AlterField( + model_name="assembly", + name="slug", + field=models.SlugField( + help_text="Assembly__slug__help", + validators=[ + django.core.validators.RegexValidator( + re.compile("^[-a-zA-Z0-9_]+\\Z"), + "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.", + "invalid", + ), + core.validators.validate_lower_case, + ], + verbose_name="Assembly__slug", + ), + ), + ] diff --git a/src/core/models/assemblies.py b/src/core/models/assemblies.py index c3497ff6e3e1404f2523368483c376ee960a82c7..2f2a97badeb4ffd271ae4bed5040523d7f76dbe5 100644 --- a/src/core/models/assemblies.py +++ b/src/core/models/assemblies.py @@ -10,6 +10,7 @@ from django.conf import settings from django.contrib.contenttypes.fields import GenericRelation from django.contrib.gis.db import models as gis_models from django.core.exceptions import ValidationError +from django.core.validators import validate_slug from django.db import models from django.db.models import Q, QuerySet from django.template.loader import render_to_string @@ -33,7 +34,7 @@ from core.models.tags import TaggedItemMixin, TagItem from core.models.users import PlatformUser from core.predicates import has_perms from core.utils import render_markdown_as_text -from core.validators import FileSizeValidator, ImageDimensionValidator +from core.validators import FileSizeValidator, ImageDimensionValidator, validate_lower_case @rules.predicate @@ -110,7 +111,7 @@ class Assembly(TaggedItemMixin, ActivityLogMixin, RulesModel): id = models.UUIDField(default=uuid4, primary_key=True, editable=False) conference = ConferenceReference(related_name='assemblies') - slug = models.SlugField(help_text=_('Assembly__slug__help'), verbose_name=_('Assembly__slug')) + slug = models.SlugField(help_text=_('Assembly__slug__help'), verbose_name=_('Assembly__slug'), validators=[validate_slug, validate_lower_case]) name = models.CharField(max_length=200, help_text=_('Assembly__name__help'), verbose_name=_('Assembly__name')) is_official = models.BooleanField(default=False, help_text=_('Assembly__is_official__help'), verbose_name=_('Assembly__is_official')) diff --git a/src/core/validators.py b/src/core/validators.py index d288ef9c886111569de90f3bb1a3970dfe1b33e8..cf62f4ea1b10c12d639a48e0103ab4a91a34f166 100644 --- a/src/core/validators.py +++ b/src/core/validators.py @@ -130,3 +130,17 @@ class ImageDimensionValidator: other.max_size, other.square, ) + + +def validate_lower_case(value: str) -> None: + """ + A validator function that will check if a string is lowercase + + Raises: + ValidationError: Raises a validation error if the string is not lowercase. + + Args: + value (str): The string to check + """ + if value != value.lower(): + raise ValidationError(_('Validation__error_lowercase'), code='lowercase')