ENT-945 Using SSOVerifications in ID Verification flow

This reworks what was done #17930, since it had to be reverted from the IDVerificationAggregate migration.
We decided to abandon that model and directly read from both id verification models.
This commit is contained in:
Brittney Exline
2018-04-26 14:44:29 -04:00
parent 2be587d32d
commit 91e63ed8e0
23 changed files with 406 additions and 316 deletions

View File

@@ -5,7 +5,7 @@ from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification, SSOVerification
from .models import UserPreference
@@ -94,9 +94,9 @@ class CountryTimeZoneSerializer(serializers.Serializer): # pylint: disable=abst
description = serializers.CharField()
class SoftwareSecurePhotoVerificationSerializer(serializers.ModelSerializer):
class IDVerificationSerializer(serializers.ModelSerializer):
"""
Serializer that generates a representation of a user's photo verification status.
Serializer that generates a representation of a user's ID verification status.
"""
is_verified = serializers.SerializerMethodField()
@@ -106,6 +106,16 @@ class SoftwareSecurePhotoVerificationSerializer(serializers.ModelSerializer):
"""
return obj.status == 'approved' and obj.expiration_datetime > now()
class SoftwareSecurePhotoVerificationSerializer(IDVerificationSerializer):
class Meta(object):
fields = ('status', 'expiration_datetime', 'is_verified')
model = SoftwareSecurePhotoVerification
class SSOVerificationSerializer(IDVerificationSerializer):
class Meta(object):
fields = ('status', 'expiration_datetime', 'is_verified')
model = SSOVerification

View File

@@ -14,7 +14,7 @@ from .accounts.views import (
DeactivateLogoutView
)
from .preferences.views import PreferencesDetailView, PreferencesView
from .verification_api.views import PhotoVerificationStatusView
from .verification_api.views import IDVerificationStatusView
from .validation.views import RegistrationValidationView
ME = AccountViewSet.as_view({
@@ -81,7 +81,7 @@ urlpatterns = [
),
url(
r'^v1/accounts/{}/verification_status/$'.format(settings.USERNAME_PATTERN),
PhotoVerificationStatusView.as_view(),
IDVerificationStatusView.as_view(),
name='verification_status'
),
url(

View File

@@ -5,23 +5,38 @@ from rest_framework.authentication import SessionAuthentication
from rest_framework.generics import RetrieveAPIView
from rest_framework_oauth.authentication import OAuth2Authentication
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification
from openedx.core.djangoapps.user_api.serializers import SoftwareSecurePhotoVerificationSerializer
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification, SSOVerification
from lms.djangoapps.verify_student.utils import most_recent_verification
from openedx.core.djangoapps.user_api.serializers import (
SoftwareSecurePhotoVerificationSerializer, SSOVerificationSerializer,
)
from openedx.core.lib.api.permissions import IsStaffOrOwner
class PhotoVerificationStatusView(RetrieveAPIView):
""" PhotoVerificationStatus detail endpoint. """
class IDVerificationStatusView(RetrieveAPIView):
""" IDVerificationStatus detail endpoint. """
authentication_classes = (JwtAuthentication, OAuth2Authentication, SessionAuthentication,)
permission_classes = (IsStaffOrOwner,)
serializer_class = SoftwareSecurePhotoVerificationSerializer
def get_serializer(self, *args, **kwargs):
"""
Overrides default get_serializer in order to choose the correct serializer for the instance.
"""
instance = args[0]
kwargs['context'] = self.get_serializer_context()
if isinstance(instance, SoftwareSecurePhotoVerification):
return SoftwareSecurePhotoVerificationSerializer(*args, **kwargs)
else:
return SSOVerificationSerializer(*args, **kwargs)
def get_object(self):
username = self.kwargs['username']
verifications = SoftwareSecurePhotoVerification.objects.filter(user__username=username).order_by('-updated_at')
photo_verifications = SoftwareSecurePhotoVerification.objects.filter(
user__username=username).order_by('-updated_at')
sso_verifications = SSOVerification.objects.filter(user__username=username).order_by('-updated_at')
if len(verifications) > 0:
verification = verifications[0]
if photo_verifications or sso_verifications:
verification = most_recent_verification(photo_verifications, sso_verifications, 'updated_at')
self.check_object_permissions(self.request, verification)
return verification