Optimizing notify_credentials management command
** This removes some of the extra celery calls to credential service for updating grade when a certificate is updated. ** This removes extra db calls by reusing existing queryset values. PROD-1363
This commit is contained in:
@@ -212,6 +212,7 @@ class Command(BaseCommand):
|
||||
def send_notifications(self, certs, grades, site_config=None, delay=0, page_size=0, verbose=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):
|
||||
@@ -231,8 +232,14 @@ class Command(BaseCommand):
|
||||
'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)
|
||||
handle_cert_change(**signal_args)
|
||||
|
||||
# Then do grades
|
||||
for i, grade in paged_query(grades, delay, page_size):
|
||||
@@ -246,14 +253,21 @@ class Command(BaseCommand):
|
||||
)
|
||||
|
||||
user = User.objects.get(id=grade.user_id)
|
||||
|
||||
# Grab mode/status from cert call
|
||||
if course_cert_info:
|
||||
key = (user.id, str(grade.course_id))
|
||||
mode = course_cert_info[key].get('mode', None)
|
||||
status = course_cert_info[key].get('status', None)
|
||||
|
||||
send_grade_if_interesting(
|
||||
user,
|
||||
grade.course_id,
|
||||
None,
|
||||
None,
|
||||
mode,
|
||||
status,
|
||||
grade.letter_grade,
|
||||
grade.percent_grade,
|
||||
verbose=verbose
|
||||
verbose=verbose,
|
||||
)
|
||||
|
||||
def get_course_keys(self, courses=None):
|
||||
|
||||
@@ -127,7 +127,6 @@ class TestNotifyCredentials(TestCase):
|
||||
call_command(Command(), '--start-date', '2017-02-01')
|
||||
self.assertEqual(mock_grade_cert_change.call_count, 2)
|
||||
self.assertEqual(mock_grade_interesting.call_count, 2)
|
||||
self.assertEqual(mock_program_changed.call_count, 2)
|
||||
|
||||
@mock.patch(COMMAND_MODULE + '.time')
|
||||
def test_delay(self, mock_time):
|
||||
@@ -154,15 +153,13 @@ class TestNotifyCredentials(TestCase):
|
||||
self.assertEqual(len(connection.queries), baseline + 2) # one extra page query each for certs & grades
|
||||
|
||||
@mock.patch(COMMAND_MODULE + '.send_grade_if_interesting')
|
||||
@mock.patch(COMMAND_MODULE + '.handle_cert_change')
|
||||
def test_site(self, mock_grade_interesting, mock_cert_change):
|
||||
def test_site(self, mock_grade_interesting):
|
||||
site_config = SiteConfigurationFactory.create(
|
||||
site_values={'course_org_filter': ['testX']}
|
||||
)
|
||||
|
||||
call_command(Command(), '--site', site_config.site.domain, '--start-date', '2017-01-01')
|
||||
self.assertEqual(mock_grade_interesting.call_count, 1)
|
||||
self.assertEqual(mock_cert_change.call_count, 1)
|
||||
|
||||
@mock.patch(COMMAND_MODULE + '.Command.send_notifications')
|
||||
def test_args_from_database(self, mock_send):
|
||||
|
||||
Reference in New Issue
Block a user