From b9a2646e4d6dd61e38571e6f2925ab74eb8f7983 Mon Sep 17 00:00:00 2001 From: Zachary Hancock Date: Wed, 28 Aug 2019 11:39:24 -0400 Subject: [PATCH] log all social auth creation failures (#21470) logging on social auth creation failures --- lms/djangoapps/program_enrollments/signals.py | 30 ++++++++++++++----- .../program_enrollments/tests/test_signals.py | 24 +++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/lms/djangoapps/program_enrollments/signals.py b/lms/djangoapps/program_enrollments/signals.py index 907fae47c6..82ed3f8985 100644 --- a/lms/djangoapps/program_enrollments/signals.py +++ b/lms/djangoapps/program_enrollments/signals.py @@ -26,20 +26,34 @@ def _listen_for_lms_retire(sender, **kwargs): # pylint: disable=unused-argument @receiver(post_save, sender=UserSocialAuth) -def matriculate_learner(sender, instance, created, **kwargs): # pylint: disable=unused-argument +def listen_for_social_auth_creation(sender, instance, created, **kwargs): # pylint: disable=unused-argument """ - Post-save signal to update any waiting program enrollments with a user, - and enroll the user in any waiting course enrollments. - - In most cases this will just short-circuit. Enrollments will only be updated - for a SAML provider with a linked organization. + Post-save signal that will attempt to link a social auth entry with waiting enrollments """ if not created: return try: - user = instance.user - provider_slug, external_user_key = instance.uid.split(':') + matriculate_learner(instance.user, instance.uid) + except Exception as e: + logger.warning( + u'Unable to link waiting enrollments for user %s, social auth creation failed: %s', + instance.user.id, + e, + ) + raise + + +def matriculate_learner(user, uid): + """ + Update any waiting program enrollments with a user, + and enroll the user in any waiting course enrollments. + + In most cases this will just short-circuit. Enrollments will only be updated + for a SAML provider with a linked organization. + """ + try: + provider_slug, external_user_key = uid.split(':') authorizing_org = SAMLProviderConfig.objects.current_set().get(slug=provider_slug).organization if not authorizing_org: diff --git a/lms/djangoapps/program_enrollments/tests/test_signals.py b/lms/djangoapps/program_enrollments/tests/test_signals.py index 4dbe3af320..e4fb1f6cdb 100644 --- a/lms/djangoapps/program_enrollments/tests/test_signals.py +++ b/lms/djangoapps/program_enrollments/tests/test_signals.py @@ -358,3 +358,27 @@ class SocialAuthEnrollmentCompletionSignalTest(CacheIsolationTestCase): error_tmpl.format(self.user.id, program_course_enrollments[0].id, 'something has gone wrong') ) ) + + def test_log_on_unexpected_exception(self): + """ + unexpected errors as part of the account linking process should be logged and re-raised + """ + program_enrollment = self._create_waiting_program_enrollment() + self._create_waiting_course_enrollments(program_enrollment) + + with mock.patch('lms.djangoapps.program_enrollments.models.ProgramCourseEnrollment.enroll') as enrollMock: + enrollMock.side_effect = Exception('unexpected error') + with LogCapture(logger.name) as log: + with self.assertRaisesRegex(Exception, 'unexpected error'): + UserSocialAuth.objects.create( + user=self.user, + uid='{0}:{1}'.format(self.provider_slug, self.external_id), + ) + error_tmpl = u'Unable to link waiting enrollments for user {}, social auth creation failed: {}' + log.check_present( + ( + logger.name, + 'WARNING', + error_tmpl.format(self.user.id, 'unexpected error') + ) + )