Merge pull request #19259 from edx/bmedx/speed_up_lms_misc

PLAT-2371 - speed up the LMS_MISC retirement step
This commit is contained in:
Brian Mesick
2018-11-14 10:54:31 -05:00
committed by GitHub
3 changed files with 12 additions and 9 deletions

View File

@@ -2168,7 +2168,7 @@ class ManualEnrollmentAudit(models.Model):
@classmethod
def get_manual_enrollment(cls, enrollment):
"""
if matches returns the most recent entry in the table filtered by enrollment else returns None,
Returns the most recent entry for the given enrollment, or None if there are no matches
"""
try:
manual_enrollment = cls.objects.filter(enrollment=enrollment).latest('time_stamp')
@@ -2177,12 +2177,17 @@ class ManualEnrollmentAudit(models.Model):
return manual_enrollment
@classmethod
def retire_manual_enrollments(cls, enrollments, retired_email):
def retire_manual_enrollments(cls, user, retired_email):
"""
Removes PII (enrolled_email and reason) from any rows corresponding to
the enrollment passed in. Bubbles up any exceptions.
Removes PII (enrolled_email and reason) associated with the User passed in. Bubbles up any exceptions.
"""
return cls.objects.filter(enrollment__in=enrollments).update(reason="", enrolled_email=retired_email)
# This bit of ugliness is to fix a perfmance issue with Django using a slow
# sub-select that caused the original query to take several seconds (PLAT-2371).
# It is possible that this could also be bad if a user has thousands of manual
# enrollments, but currently that number tends to be very low.
manual_enrollment_ids = list(cls.objects.filter(enrollment__user=user).values_list('id', flat=True))
return cls.objects.filter(id__in=manual_enrollment_ids).update(reason="", enrolled_email=retired_email)
class CourseEnrollmentAllowed(DeletableByUserValue, models.Model):

View File

@@ -375,8 +375,7 @@ class TestManualEnrollmentAudit(SharedModuleStoreTestCase):
)
self.assertTrue(ManualEnrollmentAudit.objects.filter(enrollment=enrollment).exists())
# retire the ManualEnrollmentAudit objects associated with the above enrollments
enrollments = CourseEnrollment.objects.filter(user=self.user)
ManualEnrollmentAudit.retire_manual_enrollments(enrollments=enrollments, retired_email="xxx")
ManualEnrollmentAudit.retire_manual_enrollments(user=self.user, retired_email="xxx")
self.assertTrue(ManualEnrollmentAudit.objects.filter(enrollment=enrollment).exists())
self.assertFalse(ManualEnrollmentAudit.objects.filter(enrollment=enrollment).exclude(
enrolled_email="xxx"

View File

@@ -866,8 +866,7 @@ class LMSAccountRetirementView(ViewSet):
ArticleRevision.retire_user(retirement.user)
PendingNameChange.delete_by_user_value(retirement.user, field='user')
PasswordHistory.retire_user(retirement.user.id)
course_enrollments = CourseEnrollment.objects.filter(user=retirement.user)
ManualEnrollmentAudit.retire_manual_enrollments(course_enrollments, retirement.retired_email)
ManualEnrollmentAudit.retire_manual_enrollments(retirement.user, retirement.retired_email)
CreditRequest.retire_user(retirement)
ApiAccessRequest.retire_user(retirement.user)