PLAT-2371 - speed up the LMS_MISC retirement step

This commit is contained in:
bmedx
2018-11-09 13:00:36 -05:00
parent 7a80e91af0
commit 1716b97cfc
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)