Add finished setup flag

This commit is contained in:
zandercymatics 2024-05-09 12:09:23 -06:00
parent d268ef54b1
commit dda620ee4d
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
4 changed files with 14 additions and 15 deletions

View file

@ -21,13 +21,11 @@ class OpenIdConnectBackend(ModelBackend):
""" """
def authenticate(self, request, **kwargs): def authenticate(self, request, **kwargs):
"""Returns a tuple of (User, is_new_user)"""
logger.debug("kwargs %s" % kwargs) logger.debug("kwargs %s" % kwargs)
user = None user = None
is_new_user = True request.session["is_new_user"] = True
if not kwargs or "sub" not in kwargs.keys(): if not kwargs or "sub" not in kwargs.keys():
return user, is_new_user return user
UserModel = get_user_model() UserModel = get_user_model()
username = self.clean_username(kwargs["sub"]) username = self.clean_username(kwargs["sub"])
@ -51,7 +49,7 @@ class OpenIdConnectBackend(ModelBackend):
} }
user, created = UserModel.objects.get_or_create(**args) user, created = UserModel.objects.get_or_create(**args)
is_new_user = created request.session["is_new_user"] = created
if not created: if not created:
# If user exists, update existing user # If user exists, update existing user
@ -63,10 +61,10 @@ class OpenIdConnectBackend(ModelBackend):
try: try:
user = UserModel.objects.get_by_natural_key(username) user = UserModel.objects.get_by_natural_key(username)
except UserModel.DoesNotExist: except UserModel.DoesNotExist:
return None, is_new_user return None
# run this callback for a each login # run this callback for a each login
user.on_each_login() user.on_each_login()
return user, is_new_user return user
def update_existing_user(self, user, kwargs): def update_existing_user(self, user, kwargs):
""" """

View file

@ -21,7 +21,7 @@ class OpenIdConnectBackendTestCase(TestCase):
"""Test that authenticate creates a new user if it does not find """Test that authenticate creates a new user if it does not find
existing user""" existing user"""
# Ensure that the authenticate method creates a new user # Ensure that the authenticate method creates a new user
user, _ = self.backend.authenticate(request=None, **self.kwargs) user = self.backend.authenticate(request=None, **self.kwargs)
self.assertIsNotNone(user) self.assertIsNotNone(user)
self.assertIsInstance(user, User) self.assertIsInstance(user, User)
self.assertEqual(user.username, "test_user") self.assertEqual(user.username, "test_user")
@ -39,7 +39,7 @@ class OpenIdConnectBackendTestCase(TestCase):
existing_user = User.objects.create_user(username="test_user") existing_user = User.objects.create_user(username="test_user")
# Ensure that the authenticate method updates the existing user # Ensure that the authenticate method updates the existing user
user, _ = self.backend.authenticate(request=None, **self.kwargs) user = self.backend.authenticate(request=None, **self.kwargs)
self.assertIsNotNone(user) self.assertIsNotNone(user)
self.assertIsInstance(user, User) self.assertIsInstance(user, User)
self.assertEqual(user, existing_user) # The same user instance should be returned self.assertEqual(user, existing_user) # The same user instance should be returned
@ -68,7 +68,7 @@ class OpenIdConnectBackendTestCase(TestCase):
# Ensure that the authenticate method updates the existing user # Ensure that the authenticate method updates the existing user
# and preserves existing first and last names # and preserves existing first and last names
user, _ = self.backend.authenticate(request=None, **self.kwargs) user = self.backend.authenticate(request=None, **self.kwargs)
self.assertIsNotNone(user) self.assertIsNotNone(user)
self.assertIsInstance(user, User) self.assertIsInstance(user, User)
self.assertEqual(user, existing_user) # The same user instance should be returned self.assertEqual(user, existing_user) # The same user instance should be returned
@ -89,7 +89,7 @@ class OpenIdConnectBackendTestCase(TestCase):
# Ensure that the authenticate method updates the existing user # Ensure that the authenticate method updates the existing user
# and preserves existing first and last names # and preserves existing first and last names
user, _ = self.backend.authenticate(request=None, **self.kwargs) user = self.backend.authenticate(request=None, **self.kwargs)
self.assertIsNotNone(user) self.assertIsNotNone(user)
self.assertIsInstance(user, User) self.assertIsInstance(user, User)
self.assertEqual(user, existing_user) # The same user instance should be returned self.assertEqual(user, existing_user) # The same user instance should be returned
@ -103,5 +103,5 @@ class OpenIdConnectBackendTestCase(TestCase):
def test_authenticate_with_unknown_user(self): def test_authenticate_with_unknown_user(self):
"""Test that authenticate returns None when no kwargs are supplied""" """Test that authenticate returns None when no kwargs are supplied"""
# Ensure that the authenticate method handles the case when the user is not found # Ensure that the authenticate method handles the case when the user is not found
user, _ = self.backend.authenticate(request=None, **{}) user = self.backend.authenticate(request=None, **{})
self.assertIsNone(user) self.assertIsNone(user)

View file

@ -98,7 +98,8 @@ def login_callback(request):
# add acr_value to request.session # add acr_value to request.session
request.session["acr_value"] = CLIENT.get_step_up_acr_value() request.session["acr_value"] = CLIENT.get_step_up_acr_value()
return CLIENT.create_authn_request(request.session) return CLIENT.create_authn_request(request.session)
user, is_new_user = authenticate(request=request, **userinfo) user = authenticate(request=request, **userinfo)
is_new_user = request.session["is_new_user"]
if user: if user:
should_update_user = False should_update_user = False
# Fixture users kind of exist in a superposition of verification types, # Fixture users kind of exist in a superposition of verification types,

View file

@ -539,7 +539,7 @@ class MyUserAdmin(BaseUserAdmin):
fieldsets = ( fieldsets = (
( (
None, None,
{"fields": ("username", "password", "status", "verification_type")}, {"fields": ("username", "password", "status", "finished_setup", "verification_type")},
), ),
("Personal Info", {"fields": ("first_name", "last_name", "email")}), ("Personal Info", {"fields": ("first_name", "last_name", "email")}),
( (
@ -557,7 +557,7 @@ class MyUserAdmin(BaseUserAdmin):
("Important dates", {"fields": ("last_login", "date_joined")}), ("Important dates", {"fields": ("last_login", "date_joined")}),
) )
readonly_fields = ("verification_type",) readonly_fields = ("verification_type", "finished_setup")
# Hide Username (uuid), Groups and Permissions # Hide Username (uuid), Groups and Permissions
# Q: Now that we're using Groups and Permissions, # Q: Now that we're using Groups and Permissions,