Merge pull request #29321 from edx/ashultz0/simple_most_recent

fix: simplify most recent verification function
This commit is contained in:
Andrew Shultz
2021-11-16 09:51:10 -05:00
committed by GitHub
3 changed files with 20 additions and 37 deletions

View File

@@ -116,18 +116,11 @@ class IDVerificationService:
'status__in': statuses,
}
sort_by = 'updated_at'
photo_id_verifications = SoftwareSecurePhotoVerification.objects.filter(**filter_kwargs)
sso_id_verifications = SSOVerification.objects.filter(**filter_kwargs)
manual_id_verifications = ManualVerification.objects.filter(**filter_kwargs)
photo_id_verifications = SoftwareSecurePhotoVerification.objects.filter(**filter_kwargs).order_by('-' + sort_by)
sso_id_verifications = SSOVerification.objects.filter(**filter_kwargs).order_by('-' + sort_by)
manual_id_verifications = ManualVerification.objects.filter(**filter_kwargs).order_by('-' + sort_by)
attempt = most_recent_verification(
photo_id_verifications,
sso_id_verifications,
manual_id_verifications,
sort_by
)
attempt = most_recent_verification((photo_id_verifications, sso_id_verifications, manual_id_verifications))
return attempt and attempt.expiration_datetime
@classmethod

View File

@@ -129,14 +129,16 @@ class TestVerifyStudentUtils(unittest.TestCase):
sso_verification = SSOVerification.objects.create(user=user)
photo_verification = SoftwareSecurePhotoVerification.objects.create(user=user)
else:
#last first = manual expected = photo case adds some duplicates for complexity
ManualVerification.objects.create(user=user)
SoftwareSecurePhotoVerification.objects.create(user=user)
manual_verification = ManualVerification.objects.create(user=user)
photo_verification = SoftwareSecurePhotoVerification.objects.create(user=user)
most_recent = most_recent_verification(
SoftwareSecurePhotoVerification.objects.all(),
SSOVerification.objects.all(),
ManualVerification.objects.all(),
'created_at'
(SoftwareSecurePhotoVerification.objects.all(),
SSOVerification.objects.all(),
ManualVerification.objects.all())
)
if not expected_verification:

View File

@@ -105,35 +105,23 @@ def verification_for_datetime(deadline, candidates):
return None
def most_recent_verification(photo_id_verifications, sso_id_verifications, manual_id_verifications, most_recent_key):
def most_recent_verification(verification_sets):
"""
Return the most recent verification given querysets for photo, sso and manual verifications.
This function creates a map of the latest verification of all types and then returns the earliest
verification using the max of the map values.
Return the most recent verification (by updated date) given querysets for multiple types of verifications.
Photo, sso and manual are the current use.
Arguments:
photo_id_verifications: Queryset containing photo verifications
sso_id_verifications: Queryset containing sso verifications
manual_id_verifications: Queryset containing manual verifications
most_recent_key: Either 'updated_at' or 'created_at'
tuple or other iterable of verification sets
Returns:
The most recent verification.
"""
photo_id_verification = photo_id_verifications and photo_id_verifications.first()
sso_id_verification = sso_id_verifications and sso_id_verifications.first()
manual_id_verification = manual_id_verifications and manual_id_verifications.first()
verifications = [photo_id_verification, sso_id_verification, manual_id_verification]
verifications_map = {
verification: getattr(verification, most_recent_key)
for verification in verifications
if getattr(verification, most_recent_key, False)
}
return max(verifications_map, key=lambda k: verifications_map[k]) if verifications_map else None
most_recent = None
for s in verification_sets:
for v in s:
if not most_recent or v.updated_at > most_recent.updated_at:
most_recent = v
return most_recent
def auto_verify_for_testing_enabled(override=None):