def send_notifications(self, certs, grades, delay=0, page_size=0): """ Run actual handler commands for the provided certs and grades. """ # First, do certs for i, cert in paged_query(certs, delay, page_size): log.info( "Handling credential changes %d for certificate %s", i, certstr(cert), ) signal_args = { 'sender': None, 'user': cert.user, 'course_key': cert.course_id, 'mode': cert.mode, 'status': cert.status, } handle_course_cert_changed(**signal_args) handle_cert_change(**signal_args) # Then do grades for i, grade in paged_query(grades, delay, page_size): log.info( "Handling grade changes %d for grade %s", i, gradestr(grade), ) user = User.objects.get(id=grade.user_id) send_grade_if_interesting(user, grade.course_id, None, None, grade.letter_grade, grade.percent_grade)
def test_send_grade_if_in_a_program(self, in_program, mock_is_course_run_in_a_program, mock_send_grade_to_credentials): mock_is_course_run_in_a_program.return_value = in_program send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', 'A', 1.0) self.assertIs(mock_send_grade_to_credentials.delay.called, in_program)
def send_notifications(self, certs, grades, delay=0, page_size=0): """ Run actual handler commands for the provided certs and grades. """ # First, do certs for i, cert in paged_query(certs, delay, page_size): log.info( "Handling credential changes %d for certificate %s", i, certstr(cert), ) signal_args = { 'sender': None, 'user': cert.user, 'course_key': cert.course_id, 'mode': cert.mode, 'status': cert.status, } handle_course_cert_changed(**signal_args) handle_cert_change(**signal_args) # Then do grades for i, grade in paged_query(grades, delay, page_size): log.info( "Handling grade changes %d for grade %s", i, gradestr(grade), ) user = User.objects.get(id=grade.user_id) send_grade_if_interesting(user, grade.course_id, None, None, grade.letter_grade, grade.percent_grade)
def test_send_grade_without_grade(self, mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): mock_is_course_run_in_a_program.return_value = True send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) self.assertFalse(mock_send_grade_to_credentials.delay.called)
def test_send_grade_if_in_a_program(self, in_program, mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): mock_is_course_run_in_a_program.return_value = in_program send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', 'A', 1.0) assert mock_send_grade_to_credentials.delay.called is in_program
def test_send_grade_queries_grade(self, mock_is_course_run_in_a_program, mock_send_grade_to_credentials): mock_is_course_run_in_a_program.return_value = True with mock_passing_grade('B', 0.81): send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) self.assertTrue(mock_send_grade_to_credentials.delay.called) self.assertEqual(mock_send_grade_to_credentials.delay.call_args[0], (self.user.username, str(self.key), True, 'B', 0.81)) mock_send_grade_to_credentials.delay.reset_mock()
def test_send_grade_records_disabled_globally( self, _mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): assert is_learner_records_enabled() with override_settings(FEATURES={"ENABLE_LEARNER_RECORDS": False}): assert not is_learner_records_enabled() send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) assert not mock_send_grade_to_credentials.delay.called
def test_send_grade_queries_grade(self, mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): mock_is_course_run_in_a_program.return_value = True with mock_passing_grade('B', 0.81): send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) self.assertTrue(mock_send_grade_to_credentials.delay.called) self.assertEqual(mock_send_grade_to_credentials.delay.call_args[0], (self.user.username, str(self.key), True, 'B', 0.81)) mock_send_grade_to_credentials.delay.reset_mock()
def test_send_grade_records_enabled(self, _mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): site_config = SiteConfigurationFactory.create( values={'course_org_filter': [self.key.org]}, ) # Correctly sent send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) self.assertTrue(mock_send_grade_to_credentials.delay.called) mock_send_grade_to_credentials.delay.reset_mock() # Correctly not sent site_config.values['ENABLE_LEARNER_RECORDS'] = False site_config.save() send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) self.assertFalse(mock_send_grade_to_credentials.delay.called)
def test_send_grade_records_enabled(self, _mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): site_config = SiteConfigurationFactory.create( site_values={'course_org_filter': [self.key.org]}, values={'course_org_filter': [self.key.org]}, ) # Correctly sent send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) self.assertTrue(mock_send_grade_to_credentials.delay.called) mock_send_grade_to_credentials.delay.reset_mock() # Correctly not sent site_config.values['ENABLE_LEARNER_RECORDS'] = False site_config.save() send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) self.assertFalse(mock_send_grade_to_credentials.delay.called)
def test_send_grade_if_right_cert(self, called, mode, status, mock_is_course_run_in_a_program, mock_send_grade_to_credentials): mock_is_course_run_in_a_program.return_value = True # Test direct send send_grade_if_interesting(self.user, self.key, mode, status, 'A', 1.0) self.assertIs(mock_send_grade_to_credentials.delay.called, called) mock_send_grade_to_credentials.delay.reset_mock() # Test query GeneratedCertificateFactory(user=self.user, course_id=self.key, status=status, mode=mode) send_grade_if_interesting(self.user, self.key, None, None, 'A', 1.0) self.assertIs(mock_send_grade_to_credentials.delay.called, called)
def test_send_grade_if_right_cert(self, called, mode, status, mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): mock_is_course_run_in_a_program.return_value = True # Test direct send send_grade_if_interesting(self.user, self.key, mode, status, 'A', 1.0) self.assertIs(mock_send_grade_to_credentials.delay.called, called) mock_send_grade_to_credentials.delay.reset_mock() # Test query GeneratedCertificateFactory( user=self.user, course_id=self.key, status=status, mode=mode ) send_grade_if_interesting(self.user, self.key, None, None, 'A', 1.0) self.assertIs(mock_send_grade_to_credentials.delay.called, called)
def test_send_grade_if_in_a_program(self, in_program, mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): mock_is_course_run_in_a_program.return_value = in_program send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', 'A', 1.0) self.assertIs(mock_send_grade_to_credentials.delay.called, in_program)
def send_notifications(self, certs, grades, site_config=None, delay=0, page_size=0, verbose=False, notify_programs=False): """ Run actual handler commands for the provided certs and grades. """ course_cert_info = {} # First, do certs for i, cert in paged_query(certs, delay, page_size): if site_config and not site_config.has_org(cert.course_id.org): log.info(u"Skipping credential changes %d for certificate %s", i, certstr(cert)) continue log.info( u"Handling credential changes %d for certificate %s", i, certstr(cert), ) signal_args = { 'sender': None, 'user': cert.user, 'course_key': cert.course_id, 'mode': cert.mode, 'status': cert.status, 'verbose': verbose, } data = {'mode': cert.mode, 'status': cert.status} course_cert_info[(cert.user.id, str(cert.course_id))] = data handle_course_cert_changed(**signal_args) if notify_programs and CertificateStatuses.is_passing_status( cert.status): handle_course_cert_awarded(**signal_args) # Then do grades for i, grade in paged_query(grades, delay, page_size): if site_config and not site_config.has_org(grade.course_id.org): log.info(u"Skipping grade changes %d for grade %s", i, gradestr(grade)) continue log.info( u"Handling grade changes %d for grade %s", i, gradestr(grade), ) user = User.objects.get(id=grade.user_id) # Grab mode/status from cert call key = (user.id, str(grade.course_id)) cert_info = course_cert_info.get(key, {}) mode = cert_info.get('mode', None) status = cert_info.get('status', None) send_grade_if_interesting(user, grade.course_id, mode, status, grade.letter_grade, grade.percent_grade, verbose=verbose)
def test_send_grade_missing_cert(self, _, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): send_grade_if_interesting(self.user, self.key, None, None, 'A', 1.0) self.assertFalse(mock_send_grade_to_credentials.delay.called)
def test_send_grade_missing_cert(self, _, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): send_grade_if_interesting(self.user, self.key, None, None, 'A', 1.0) self.assertFalse(mock_send_grade_to_credentials.delay.called)
def test_send_grade_without_grade(self, mock_is_course_run_in_a_program, mock_send_grade_to_credentials, _mock_is_learner_issuance_enabled): mock_is_course_run_in_a_program.return_value = True send_grade_if_interesting(self.user, self.key, 'verified', 'downloadable', None, None) self.assertFalse(mock_send_grade_to_credentials.delay.called)