Merge pull request #23714 from edx/aj/add-ss-retry-to-settings

Adds settings for celery task auto discovery
This commit is contained in:
Awais Jibran
2020-04-23 15:55:55 +05:00
committed by GitHub
6 changed files with 61 additions and 15 deletions

View File

@@ -18,3 +18,4 @@ class VerifyStudentConfig(AppConfig):
Connect signal handlers.
"""
from . import signals # pylint: disable=unused-variable
from . import tasks # pylint: disable=unused-variable

View File

@@ -44,7 +44,7 @@ from lms.djangoapps.verify_student.ssencrypt import (
from openedx.core.djangoapps.signals.signals import LEARNER_NOW_VERIFIED
from openedx.core.storage import get_storage
from .utils import auto_verify_for_testing_enabled, earliest_allowed_verification_date
from .utils import auto_verify_for_testing_enabled, earliest_allowed_verification_date, submit_request_to_ss
log = logging.getLogger(__name__)
@@ -741,7 +741,7 @@ class SoftwareSecurePhotoVerification(PhotoVerification):
def submit(self, copy_id_photo_from=None):
"""
Submit our verification attempt to Software Secure for validation. This
will set our status to "submitted" if the post is successful, and
will set our status to "submitted", if the post is successful or will set to
"must_retry" if the post fails.
Keyword Arguments:
@@ -749,7 +749,6 @@ class SoftwareSecurePhotoVerification(PhotoVerification):
data from this attempt. This is used for re-verification, in which new face photos
are sent with previously-submitted ID photos.
"""
from .tasks import send_request_to_ss_for_user
if auto_verify_for_testing_enabled():
self.mark_submit()
fake_response = requests.Response()
@@ -764,9 +763,9 @@ class SoftwareSecurePhotoVerification(PhotoVerification):
self.receipt_id,
copy_id_photo_from.receipt_id,
)
transaction.on_commit(
lambda:
send_request_to_ss_for_user.delay(user_verification_id=self.id, copy_id_photo_from=copy_id_photo_from)
lambda: submit_request_to_ss(user_verification=self, copy_id_photo_from=copy_id_photo_from)
)
def parsed_error_msg(self):

View File

@@ -11,8 +11,8 @@ from celery import Task, task
from celery.states import FAILURE
from django.conf import settings
from django.core.mail import EmailMessage
from edxmako.shortcuts import render_to_string
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
ACE_ROUTING_KEY = getattr(settings, 'ACE_ROUTING_KEY', None)
@@ -41,8 +41,9 @@ class BaseSoftwareSecureTask(Task):
'response_ok': boolean, indicating if the response was ok
'response_text': string, indicating the response text in case of failure.
"""
user_verification_id = kwargs['user_verification_id']
user_verification = SoftwareSecurePhotoVerification.objects.get(id=user_verification_id)
from .models import SoftwareSecurePhotoVerification
user_verification = SoftwareSecurePhotoVerification.objects.get(id=kwargs['user_verification_id'])
if retval['response_ok']:
user_verification.mark_submit()
log.info(
@@ -60,6 +61,8 @@ class BaseSoftwareSecureTask(Task):
with "must_retry" so that it can be retried latter.
"""
if self.max_retries == self.request.retries and status == FAILURE:
from .models import SoftwareSecurePhotoVerification
user_verification_id = kwargs['user_verification_id']
user_verification = SoftwareSecurePhotoVerification.objects.get(id=user_verification_id)
user_verification.mark_must_retry()
@@ -110,6 +113,8 @@ def send_request_to_ss_for_user(self, user_verification_id, copy_id_photo_from):
Returns:
request.Response
"""
from .models import SoftwareSecurePhotoVerification
user_verification = SoftwareSecurePhotoVerification.objects.get(id=user_verification_id)
log.info('=>New Verification Task Received %r', user_verification.user.username)
try:

View File

@@ -8,13 +8,18 @@ import unittest
from datetime import timedelta
import ddt
import mock
from django.conf import settings
from django.utils import timezone
from mock import patch
from pytest import mark
from lms.djangoapps.verify_student.models import ManualVerification, SoftwareSecurePhotoVerification, SSOVerification
from lms.djangoapps.verify_student.utils import most_recent_verification, verification_for_datetime
from lms.djangoapps.verify_student.utils import (
most_recent_verification,
submit_request_to_ss,
verification_for_datetime
)
from student.tests.factories import UserFactory
FAKE_SETTINGS = {
@@ -143,3 +148,21 @@ class TestVerifyStudentUtils(unittest.TestCase):
self.assertEqual(most_recent, sso_verification)
else:
self.assertEqual(most_recent, manual_verification)
@mock.patch('lms.djangoapps.verify_student.utils.log')
@mock.patch(
'lms.djangoapps.verify_student.tasks.send_request_to_ss_for_user.delay', mock.Mock(side_effect=Exception('error'))
)
def test_submit_request_to_ss(self, mock_log):
"""Tests that we log appropriate information when celery task creation fails."""
user = UserFactory.create()
attempt = SoftwareSecurePhotoVerification.objects.create(user=user)
attempt.mark_ready()
submit_request_to_ss(user_verification=attempt, copy_id_photo_from=None)
mock_log.error.assert_called_with(
"Software Secure submit request %r failed, result: %s",
user.username,
'error'
)
self.assertTrue(attempt.status, SoftwareSecurePhotoVerification.STATUS.must_retry)

View File

@@ -1749,7 +1749,7 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase, TestVerification
mock.Mock(side_effect=mocked_has_valid_signature)
)
@patch('lms.djangoapps.verify_student.views.log.error')
@patch('lms.djangoapps.verify_student.utils.SailthruClient.send')
@patch('sailthru.sailthru_client.SailthruClient.send')
def test_passed_status_template(self, mock_sailthru_send, mock_log_error):
"""
Test for verification passed.
@@ -1791,7 +1791,7 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase, TestVerification
mock.Mock(side_effect=mocked_has_valid_signature)
)
@patch('lms.djangoapps.verify_student.views.log.error')
@patch('lms.djangoapps.verify_student.utils.SailthruClient.send')
@patch('sailthru.sailthru_client.SailthruClient.send')
def test_first_time_verification(self, mock_sailthru_send, mock_log_error): # pylint: disable=unused-argument
"""
Test for verification passed if the learner does not have any previous verification

View File

@@ -3,24 +3,42 @@
Common Utilities for the verify_student application.
"""
import datetime
import logging
from django.conf import settings
from django.utils.timezone import now
from sailthru import SailthruClient
from six import text_type
from lms.djangoapps.verify_student.tasks import send_request_to_ss_for_user
log = logging.getLogger(__name__)
def submit_request_to_ss(user_verification, copy_id_photo_from):
"""
Submit our verification attempt to Software Secure for validation.
Submits the task to software secure and If the task creation fails,
set the verification status to "must_retry".
"""
try:
send_request_to_ss_for_user.delay(
user_verification_id=user_verification.id, copy_id_photo_from=copy_id_photo_from
)
except Exception as error:
log.error(
"Software Secure submit request %r failed, result: %s", user_verification.user.username, text_type(error)
)
user_verification.mark_must_retry()
def is_verification_expiring_soon(expiration_datetime):
"""
Returns True if verification is expiring within EXPIRING_SOON_WINDOW.
"""
if expiration_datetime:
if (expiration_datetime - now()).days <= settings.VERIFY_STUDENT.get(
"EXPIRING_SOON_WINDOW"):
if (expiration_datetime - now()).days <= settings.VERIFY_STUDENT.get("EXPIRING_SOON_WINDOW"):
return True
return False