Merge pull request #17912 from edx/LEARNER-1487/send_successfull_verification_email
Send verification email status
This commit is contained in:
@@ -1783,6 +1783,7 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase):
|
||||
attempt = SoftwareSecurePhotoVerification.objects.get(receipt_id=self.receipt_id)
|
||||
self.assertEqual(attempt.status, u'approved')
|
||||
self.assertEquals(response.content, 'OK!')
|
||||
self.assertEqual(len(mail.outbox), 1)
|
||||
|
||||
@mock.patch(
|
||||
'lms.djangoapps.verify_student.ssencrypt.has_valid_signature',
|
||||
@@ -1862,6 +1863,29 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase):
|
||||
)
|
||||
self.assertIn('Result Unknown not understood', response.content)
|
||||
|
||||
@mock.patch(
|
||||
'lms.djangoapps.verify_student.utils.send_mail',
|
||||
mock.Mock(side_effect=Exception())
|
||||
)
|
||||
def test_verification_status_email_not_sent(self):
|
||||
"""
|
||||
Test email is not sent in case of exception
|
||||
"""
|
||||
data = {
|
||||
"EdX-ID": self.receipt_id,
|
||||
"Result": "PASS",
|
||||
"Reason": "",
|
||||
"MessageType": "You have been verified."
|
||||
}
|
||||
json_data = json.dumps(data)
|
||||
self.client.post(
|
||||
reverse('verify_student_results_callback'), data=json_data,
|
||||
content_type='application/json',
|
||||
HTTP_AUTHORIZATION='test BBBBBBBBBBBBBBBBBBBB:testing',
|
||||
HTTP_DATE='testdate'
|
||||
)
|
||||
self.assertEqual(len(mail.outbox), 0)
|
||||
|
||||
|
||||
@attr(shard=2)
|
||||
class TestReverifyView(TestCase):
|
||||
|
||||
@@ -8,6 +8,11 @@ import logging
|
||||
import pytz
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.mail import send_mail
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
from edxmako.shortcuts import render_to_string
|
||||
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -68,3 +73,25 @@ def verification_for_datetime(deadline, candidates):
|
||||
for verification in candidates:
|
||||
if verification.active_at_datetime(deadline):
|
||||
return verification
|
||||
|
||||
|
||||
def send_verification_status_email(context):
|
||||
"""
|
||||
Send an email to inform learners about their verification status
|
||||
"""
|
||||
subject = context['subject']
|
||||
message = render_to_string(context['message'], context['email_template_context'])
|
||||
from_address = configuration_helpers.get_value('email_from_address', settings.DEFAULT_FROM_EMAIL)
|
||||
to_address = context['email']
|
||||
|
||||
try:
|
||||
send_mail(subject, message, from_address, [to_address], fail_silently=False)
|
||||
except: # pylint: disable=bare-except
|
||||
# We catch all exceptions and log them.
|
||||
# It would be much, much worse to roll back the transaction due to an uncaught
|
||||
# exception than to skip sending the notification email.
|
||||
log.exception(
|
||||
_("Could not send verification status email having subject: {subject} and email of user: {email}").format(
|
||||
subject=context['subject'],
|
||||
email=context['email']
|
||||
))
|
||||
|
||||
@@ -37,7 +37,7 @@ from lms.djangoapps.verify_student.image import InvalidImageData, decode_image_d
|
||||
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification, VerificationDeadline
|
||||
from lms.djangoapps.verify_student.services import IDVerificationService
|
||||
from lms.djangoapps.verify_student.ssencrypt import has_valid_signature
|
||||
from lms.djangoapps.verify_student.utils import is_verification_expiring_soon
|
||||
from lms.djangoapps.verify_student.utils import is_verification_expiring_soon, send_verification_status_email
|
||||
from openedx.core.djangoapps.commerce.utils import ecommerce_api_client
|
||||
from openedx.core.djangoapps.embargo import api as embargo_api
|
||||
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
||||
@@ -1154,10 +1154,26 @@ def results_callback(request):
|
||||
except SoftwareSecurePhotoVerification.DoesNotExist:
|
||||
log.error("Software Secure posted back for receipt_id %s, but not found", receipt_id)
|
||||
return HttpResponseBadRequest("edX ID {} not found".format(receipt_id))
|
||||
user = attempt.user
|
||||
context = {
|
||||
'email': user.email
|
||||
}
|
||||
email_template_context = {'platform_name': settings.PLATFORM_NAME}
|
||||
if result == "PASS":
|
||||
log.debug("Approving verification for %s", receipt_id)
|
||||
attempt.approve()
|
||||
status = "approved"
|
||||
expiry_date = datetime.date.today() + datetime.timedelta(
|
||||
days=settings.VERIFY_STUDENT["DAYS_GOOD_FOR"]
|
||||
)
|
||||
email_template_context['full_name'] = user.profile.name
|
||||
email_template_context['expiry_date'] = expiry_date.strftime("%m/%d/%Y")
|
||||
context['email_template_context'] = email_template_context
|
||||
context['subject'] = _("Your {platform_name} ID Verification Approved").format(
|
||||
platform_name=settings.PLATFORM_NAME
|
||||
)
|
||||
context['message'] = 'emails/successfull_verification_email.txt'
|
||||
send_verification_status_email(context)
|
||||
|
||||
elif result == "FAIL":
|
||||
log.debug("Denying verification for %s", receipt_id)
|
||||
|
||||
11
lms/templates/emails/successfull_verification_email.txt
Normal file
11
lms/templates/emails/successfull_verification_email.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
<%! from django.utils.translation import ugettext as _ %>
|
||||
|
||||
${_("Hi {full_name},").format(full_name=full_name)}
|
||||
|
||||
${_("Congratulations! Your ID verification process was successful.")}
|
||||
|
||||
${_("Your verification is effective for one year. It will expire on {expiry_date}").format(expiry_date=expiry_date)}
|
||||
|
||||
${_("Thank you,")}
|
||||
|
||||
${_("The {platform_name} team").format(platform_name=platform_name)}
|
||||
Reference in New Issue
Block a user