diff --git a/migrations/0017_add_user_ci_index.py b/migrations/0017_add_user_ci_index.py new file mode 100644 index 0000000..c5de95b --- /dev/null +++ b/migrations/0017_add_user_ci_index.py @@ -0,0 +1,16 @@ +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ifc_validation_models', '0016_alter_validationrequest_channel'), + ] + + operations = [ + # '__iexact=' typically translates to UPPER(...) = UPPER(...) in SQL + migrations.RunSQL( + sql="CREATE INDEX IF NOT EXISTS auth_user_username_ci_idx ON auth_user (upper(username));", + reverse_sql="DROP INDEX IF EXISTS auth_user_username_ci_idx;", + ) + ] \ No newline at end of file diff --git a/models.py b/models.py index f85ce3d..ff02cc1 100644 --- a/models.py +++ b/models.py @@ -3,6 +3,7 @@ from django.db import models from django.db.models import Q +from django.db.models.functions import Lower from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.utils import timezone @@ -318,6 +319,9 @@ def find_company_by_email_pattern(self): return None + def find_user_by_username(username): + + return User.objects.filter(username__iexact=username).first() class AuthoringTool(TimestampedBaseModel): """ diff --git a/tests.py b/tests.py index 9fe7a67..b18ba99 100644 --- a/tests.py +++ b/tests.py @@ -447,4 +447,32 @@ def test_find_company_by_email_pattern_should_return_none(self): # assert self.assertIsNone(company1) - self.assertIsNone(company2) \ No newline at end of file + self.assertIsNone(company2) + + def test_find_user_by_username_should_succeed(self): + + # arrange + ValidationModelsTestCase.set_user_context() + user = User.objects.create(id=2, username='JohnDoe', email='jdoe@acme.com', is_active=True) + + # act + result = UserAdditionalInfo.find_user_by_username('johndoe') # notice: all lower case + result2 = UserAdditionalInfo.find_user_by_username('JOHNDOE') # notice: all upper case + + # assert + self.assertIsNotNone(result) + self.assertIsNotNone(result2) + self.assertEqual(user, result) + self.assertEqual(user, result2) + + def test_find_user_by_username_should_return_none(self): + + # arrange + ValidationModelsTestCase.set_user_context() + user = User.objects.create(id=2, username='JohnDoe', email='jdoe@acme.com', is_active=True) + + # act + result = UserAdditionalInfo.find_user_by_username('jane') + + # assert + self.assertIsNone(result) \ No newline at end of file