feat: update management command to manually create verified names (#35619)

* feat: update management command to manually create verified names

* fix: update function name
This commit is contained in:
Alison Langston
2024-10-09 11:16:02 -04:00
committed by GitHub
parent f1a9286f73
commit 243b1b4e2e
2 changed files with 93 additions and 0 deletions

View File

@@ -10,9 +10,11 @@ from pprint import pformat
from django.core.management.base import BaseCommand, CommandError
from common.djangoapps.student.models_api import get_name, get_pending_name_change
from lms.djangoapps.verify_student.api import send_approval_email
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification
from lms.djangoapps.verify_student.utils import earliest_allowed_verification_date
from openedx.features.name_affirmation_api.utils import get_name_affirmation_service
log = logging.getLogger(__name__)
@@ -149,5 +151,37 @@ class Command(BaseCommand):
for verification in existing_id_verifications:
verification.approve(service='idv_verifications command')
send_approval_email(verification)
self._approve_verified_name_for_software_secure_verification(verification)
return list(failed_user_ids)
def _approve_verified_name_for_software_secure_verification(self, verification):
"""
This method manually creates a verified name given a SoftwareSecurePhotoVerification object.
"""
name_affirmation_service = get_name_affirmation_service()
if name_affirmation_service:
from edx_name_affirmation.exceptions import VerifiedNameDoesNotExist # pylint: disable=import-error
pending_name_change = get_pending_name_change(verification.user)
if pending_name_change:
full_name = pending_name_change.new_name
else:
full_name = get_name(verification.user.id)
try:
name_affirmation_service.update_verified_name_status(
verification.user,
'approved',
verification_attempt_id=verification.id
)
except VerifiedNameDoesNotExist:
name_affirmation_service.create_verified_name(
verification.user,
verification.name,
full_name,
verification_attempt_id=verification.id,
status='approved',
)

View File

@@ -6,6 +6,8 @@ import ddt
import logging
import os
import tempfile
from unittest import skipUnless
from unittest.mock import MagicMock, patch
import pytest
from django.core import mail
@@ -15,9 +17,12 @@ from testfixtures import LogCapture
from common.djangoapps.student.tests.factories import UserFactory, UserProfileFactory
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification
from openedx.features.name_affirmation_api.utils import get_name_affirmation_service
LOGGER_NAME = 'lms.djangoapps.verify_student.management.commands.approve_id_verifications'
name_affirmation_service = get_name_affirmation_service()
@ddt.ddt
class TestApproveIDVerificationsCommand(TestCase):
@@ -158,3 +163,57 @@ class TestApproveIDVerificationsCommand(TestCase):
"""
with pytest.raises(CommandError):
call_command('approve_id_verifications', 'invalid/user_id/file/path')
@skipUnless(name_affirmation_service is not None, 'Requires Name Affirmation')
@patch('lms.djangoapps.verify_student.management.commands.approve_id_verifications.get_name_affirmation_service')
def test_create_verified_names(self, mock_get_service):
mock_service = MagicMock()
mock_get_service.return_value = mock_service
verification = SoftwareSecurePhotoVerification.objects.create(
user=self.user1_profile.user,
name=self.user1_profile.name,
status='submitted',
)
call_command('approve_id_verifications', self.tmp_file_path)
mock_service.update_verified_name_status.assert_called_with(
self.user1_profile.user,
'approved',
verification_attempt_id=verification.id,
)
@skipUnless(name_affirmation_service is not None, 'Requires Name Affirmation')
@patch('lms.djangoapps.verify_student.management.commands.approve_id_verifications.get_name')
@patch('lms.djangoapps.verify_student.management.commands.approve_id_verifications.get_pending_name_change')
@patch('lms.djangoapps.verify_student.management.commands.approve_id_verifications.get_name_affirmation_service')
@ddt.data(
'',
MagicMock(new_name='test')
)
def test_create_update_verified_names(self, pending_name, mock_get_service, mock_get_pending, mock_get_name):
from edx_name_affirmation.exceptions import VerifiedNameDoesNotExist # pylint: disable=import-error
mock_service = MagicMock()
mock_get_service.return_value = mock_service
mock_service.update_verified_name_status.side_effect = VerifiedNameDoesNotExist()
mock_get_pending.return_value = pending_name
mock_get_name.return_value = self.user1_profile.name
verification = SoftwareSecurePhotoVerification.objects.create(
user=self.user1_profile.user,
name=self.user1_profile.name,
status='submitted',
)
expected_name = 'test' if pending_name else self.user1_profile.name
call_command('approve_id_verifications', self.tmp_file_path)
mock_service.create_verified_name.assert_called_with(
verification.user,
verification.name,
expected_name,
verification_attempt_id=verification.id,
status='approved',
)