From 79030ecab2be4ad83a5a60834fc11b0b4e164b99 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 1 Aug 2023 15:42:47 -0400 Subject: [PATCH] #12589: Move username validation from form to NetBoxUser --- netbox/users/forms/model_forms.py | 19 ------------------- netbox/users/models.py | 9 +++++++++ 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/netbox/users/forms/model_forms.py b/netbox/users/forms/model_forms.py index 1cc94b9441..74a44051ff 100644 --- a/netbox/users/forms/model_forms.py +++ b/netbox/users/forms/model_forms.py @@ -229,25 +229,6 @@ def clean(self): if self.cleaned_data['password'] and self.cleaned_data['password'] != self.cleaned_data['confirm_password']: raise forms.ValidationError(_("Passwords do not match! Please check your input and try again.")) - # TODO: Move this logic to the NetBoxUser class - def clean_username(self): - """Reject usernames that differ only in case.""" - instance = getattr(self, 'instance', None) - if instance: - qs = self._meta.model.objects.exclude(pk=instance.pk) - else: - qs = self._meta.model.objects.all() - - username = self.cleaned_data.get("username") - if ( - username and qs.filter(username__iexact=username).exists() - ): - raise forms.ValidationError( - _("user with this username already exists") - ) - - return username - class GroupForm(BootstrapMixin, forms.ModelForm): users = DynamicModelMultipleChoiceField( diff --git a/netbox/users/models.py b/netbox/users/models.py index 2b408a8af7..9c4024f1cb 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -5,6 +5,7 @@ from django.contrib.auth.models import Group, GroupManager, User, UserManager from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.fields import ArrayField +from django.core.exceptions import ValidationError from django.core.validators import MinLengthValidator from django.db import models from django.db.models.signals import post_save @@ -55,6 +56,14 @@ class Meta: def get_absolute_url(self): return reverse('users:netboxuser', args=[self.pk]) + def clean(self): + super().clean() + + # Check for any existing Users with names that differ only in case + model = self._meta.model + if model.objects.exclude(pk=self.pk).filter(username__iexact=self.username).exists(): + raise ValidationError(_("A user with this username already exists.")) + class NetBoxGroup(Group): """