registration: handle MultipleObjectsReturned when checking uniqueness (fixes #22141)
This commit is contained in:
parent
22a885edfd
commit
c6832aba74
|
@ -68,11 +68,16 @@ class RegistrationCompletionFormNoPassword(forms.BaseUserForm):
|
|||
username_is_unique |= ou.username_is_unique
|
||||
if username_is_unique:
|
||||
User = get_user_model()
|
||||
exist = False
|
||||
try:
|
||||
User.objects.get(username=username)
|
||||
except User.DoesNotExist:
|
||||
pass
|
||||
except User.MultipleObjectsReturned:
|
||||
exist = True
|
||||
else:
|
||||
exist = True
|
||||
if exist:
|
||||
raise ValidationError(_('This username is already in '
|
||||
'use. Please supply a different username.'))
|
||||
return username
|
||||
|
@ -82,11 +87,16 @@ class RegistrationCompletionFormNoPassword(forms.BaseUserForm):
|
|||
email = self.cleaned_data['email']
|
||||
if app_settings.A2_REGISTRATION_EMAIL_IS_UNIQUE:
|
||||
User = get_user_model()
|
||||
exist = False
|
||||
try:
|
||||
User.objects.get(email__iexact=email)
|
||||
except User.DoesNotExist:
|
||||
pass
|
||||
except User.MultipleObjectsReturned:
|
||||
exist = True
|
||||
else:
|
||||
exist = True
|
||||
if exist:
|
||||
raise ValidationError(_('This email address is already in '
|
||||
'use. Please supply a different email address.'))
|
||||
return BaseUserManager.normalize_email(email)
|
||||
|
|
|
@ -442,3 +442,53 @@ def test_revalidate_email(app, rf, db, settings, mailoutbox):
|
|||
response = response.follow()
|
||||
assert 'johndoe@example.com' in response.content
|
||||
assert len(mailoutbox) == 1
|
||||
|
||||
|
||||
def test_email_is_unique_multiple_objects_returned(app, db, settings, mailoutbox, rf):
|
||||
settings.LANGUAGE_CODE = 'en-us'
|
||||
settings.A2_VALIDATE_EMAIL_DOMAIN = can_resolve_dns()
|
||||
settings.A2_REGISTRATION_EMAIL_IS_UNIQUE = True
|
||||
|
||||
# Create two user objects
|
||||
User = get_user_model()
|
||||
User.objects.create(email='testbot@entrouvert.com')
|
||||
User.objects.create(email='testbot@entrouvert.com')
|
||||
|
||||
url = utils.build_activation_url(
|
||||
rf.get('/'),
|
||||
'testbot@entrouvert.com',
|
||||
first_name='Test',
|
||||
last_name='Bot',
|
||||
password='ABcd12345',
|
||||
next_url=None,
|
||||
valid_email=False,
|
||||
franceconnect=True)
|
||||
|
||||
response = app.get(url)
|
||||
assert 'This email address is already in use.' in response.content
|
||||
|
||||
|
||||
def test_username_is_unique_multiple_objects_returned(app, db, settings, mailoutbox, rf):
|
||||
settings.LANGUAGE_CODE = 'en-us'
|
||||
settings.A2_VALIDATE_EMAIL_DOMAIN = can_resolve_dns()
|
||||
settings.A2_REGISTRATION_USERNAME_IS_UNIQUE = True
|
||||
settings.A2_REQUIRED_FIELDS = ['username', 'first_name', 'last_name']
|
||||
|
||||
# Create two user objects
|
||||
User = get_user_model()
|
||||
User.objects.create(username='testbot', email='testbot1@entrouvert.com')
|
||||
User.objects.create(username='testbot', email='testbot2@entrouvert.com')
|
||||
|
||||
url = utils.build_activation_url(
|
||||
rf.get('/'),
|
||||
'testbot@entrouvert.com',
|
||||
username='testbot',
|
||||
first_name='Test',
|
||||
last_name='Bot',
|
||||
password='ABcd12345',
|
||||
next_url=None,
|
||||
valid_email=False,
|
||||
franceconnect=True)
|
||||
|
||||
response = app.get(url)
|
||||
assert 'This username is already in use.' in response.content
|
||||
|
|
Loading…
Reference in New Issue