fix: simplify most recent verification function

current use is much less complicated than old code
This commit is contained in:
Andy Shultz
2021-11-15 14:29:48 -05:00
parent 537ae9fcea
commit f70b3cff77
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):