Skip to content
Snippets Groups Projects
Commit a26ee99e authored by Bermudez, Jaime's avatar Bermudez, Jaime
Browse files

Modify logic for picking a default username value when lis_person_sourcedid...

Modify logic for picking a default username value when lis_person_sourcedid parameter is not present.  It's believed that this should only be the case when user is added directly in Canvas UI and when admins switch to "Student View" mode.  Use custom_canvas_user_id (or user_id) with a class-level defined prefix in order to have a shorter field to get past a bug where the Test Student username was longer than 30 characters.
parent aa884feb
No related branches found
No related tags found
No related merge requests found
......@@ -15,6 +15,7 @@ oauth_creds = settings.LTI_OAUTH_CREDENTIALS
class LTIAuthBackend(ModelBackend):
"""
By default, the ``authenticate`` method creates ``User`` objects for
usernames that don't already exist in the database. Subclasses can disable
......@@ -24,6 +25,8 @@ class LTIAuthBackend(ModelBackend):
# Create a User object if not already in the database?
create_unknown_user = True
# Username prefix for users without an sis source id
unknown_user_prefix = "cuid:"
def authenticate(self, request):
......@@ -80,16 +83,14 @@ class LTIAuthBackend(ModelBackend):
user = None
if request.POST.get('lis_person_sourcedid'):
username = self.clean_username(request.POST.get('lis_person_sourcedid'))
elif request.POST.get('custom_canvas_user_login_id'):
username = self.clean_username(request.POST.get('custom_canvas_user_login_id'))
else:
username = self.clean_username(request.POST.get('user_id'))
# Retrieve username from LTI parameter or default to an overridable function return value
username = tool_provider.lis_person_sourcedid or self.get_default_username(
tool_provider, prefix=self.unknown_user_prefix)
username = self.clean_username(username) # Clean it
email = request.POST.get('lis_person_contact_email_primary')
first_name = request.POST.get('lis_person_name_given')
last_name = request.POST.get('lis_person_name_family')
email = tool_provider.lis_person_contact_email_primary
first_name = tool_provider.lis_person_name_given
last_name = tool_provider.lis_person_name_family
logger.info("We have a valid username: %s" % username)
......@@ -109,7 +110,8 @@ class LTIAuthBackend(ModelBackend):
logger.debug('authenticate found an existing user for %s' % username)
else:
logger.debug('automatic new user creation is turned OFF! just try to find and existing record')
logger.debug(
'automatic new user creation is turned OFF! just try to find and existing record')
try:
user = UserModel.objects.get_by_natural_key(username)
except UserModel.DoesNotExist:
......@@ -131,3 +133,12 @@ class LTIAuthBackend(ModelBackend):
def clean_username(self, username):
return username
def get_default_username(self, tool_provider, prefix=''):
"""
Return a default username value from tool_provider in case offical
LTI param lis_person_sourcedid was not present.
"""
# Default back to user_id lti param
uname = tool_provider.get_custom_param('canvas_user_id') or tool_provider.user_id
return prefix + uname
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment