diff --git a/lms/djangoapps/verify_student/tests/test_views.py b/lms/djangoapps/verify_student/tests/test_views.py index 3e3f1ae0bf..4ddef86f18 100644 --- a/lms/djangoapps/verify_student/tests/test_views.py +++ b/lms/djangoapps/verify_student/tests/test_views.py @@ -20,6 +20,8 @@ from django.conf import settings from django.core.urlresolvers import reverse from django.core.exceptions import ObjectDoesNotExist +from mock import sentinel + from xmodule.modulestore.tests.factories import CourseFactory from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE from student.tests.factories import UserFactory @@ -130,11 +132,33 @@ class TestMidCourseReverifyView(TestCase): self.course_id = 'Robot/999/Test_Course' CourseFactory.create(org='Robot', number='999', display_name='Test Course') + patcher = patch('student.models.server_track') + self.mock_server_track = patcher.start() + self.addCleanup(patcher.stop) + + crum_patcher = patch('student.models.crum.get_current_request') + self.mock_get_current_request = crum_patcher.start() + self.addCleanup(crum_patcher.stop) + self.mock_get_current_request.return_value = sentinel.request + @patch('verify_student.views.render_to_response', render_mock) def test_midcourse_reverify_get(self): url = reverse('verify_student_midcourse_reverify', kwargs={"course_id": self.course_id}) response = self.client.get(url) + + # Check that user entering the reverify flow was logged + self.mock_server_track.assert_called_once_with( + sentinel.request, + 'edx.course.enrollment.reverify.started', + { + 'user_id': self.user.id, + 'course_id': self.course_id, + 'mode': "verified", + } + ) + self.mock_server_track.reset_mock() + self.assertEquals(response.status_code, 200) ((_template, context), _kwargs) = render_mock.call_args self.assertFalse(context['error']) @@ -143,7 +167,21 @@ class TestMidCourseReverifyView(TestCase): def test_midcourse_reverify_post_success(self): window = MidcourseReverificationWindowFactory(course_id=self.course_id) url = reverse('verify_student_midcourse_reverify', kwargs={'course_id': self.course_id}) + response = self.client.post(url, {'face_image': ','}) + + # Check that submission event was logged + self.mock_server_track.assert_called_once_with( + sentinel.request, + 'edx.course.enrollment.reverify.submitted', + { + 'user_id': self.user.id, + 'course_id': self.course_id, + 'mode': "verified", + } + ) + self.mock_server_track.reset_mock() + self.assertEquals(response.status_code, 302) try: verification_attempt = SoftwareSecurePhotoVerification.objects.get(user=self.user, window=window) diff --git a/lms/djangoapps/verify_student/views.py b/lms/djangoapps/verify_student/views.py index 9b2d7b2381..2375f2d305 100644 --- a/lms/djangoapps/verify_student/views.py +++ b/lms/djangoapps/verify_student/views.py @@ -6,6 +6,8 @@ import json import logging import decimal import datetime +import crum +from track.views import server_track from pytz import UTC from edxmako.shortcuts import render_to_response @@ -39,6 +41,10 @@ from .exceptions import WindowExpiredException log = logging.getLogger(__name__) +EVENT_NAME_USER_ENTERED_MIDCOURSE_REVERIFY_VIEW = 'edx.course.enrollment.reverify.started' +EVENT_NAME_USER_SUBMITTED_MIDCOURSE_REVERIFY = 'edx.course.enrollment.reverify.submitted' +EVENT_NAME_USER_REVERIFICATION_REVIEWED_BY_SOFTWARESECURE = 'edx.course.enrollment.reverify.reviewed' + class VerifyView(View): @method_decorator(login_required) @@ -251,6 +257,13 @@ def results_callback(request): "Result {} not understood. Known results: PASS, FAIL, SYSTEM FAIL".format(result) ) + # If this is a reverification, log an event + if attempt.window: + course_id = window.course_id + course = course_from_id(course_id) + course_enrollment = CourseEnrollment.get_or_create_enrollment(attempt.user, course_id) + course_enrollment.emit_event(EVENT_NAME_USER_REVERIFICATION_REVIEWED_BY_SOFTWARESECURE) + return HttpResponse("OK!") @@ -345,6 +358,9 @@ class MidCourseReverifyView(View): display this view """ course = course_from_id(course_id) + course_enrollment = CourseEnrollment.get_or_create_enrollment(request.user, course_id) + course_enrollment.update_enrollment(mode="verified") + course_enrollment.emit_event(EVENT_NAME_USER_ENTERED_MIDCOURSE_REVERIFY_VIEW) context = { "user_full_name": request.user.profile.name, "error": False, @@ -353,8 +369,8 @@ class MidCourseReverifyView(View): "course_org": course.display_org_with_default, "course_num": course.display_number_with_default, "reverify": True, - } + return render_to_response("verify_student/midcourse_photo_reverification.html", context) @method_decorator(login_required) @@ -376,6 +392,9 @@ class MidCourseReverifyView(View): attempt.save() attempt.submit() + course_enrollment = CourseEnrollment.get_or_create_enrollment(request.user, course_id) + course_enrollment.update_enrollment(mode="verified") + course_enrollment.emit_event(EVENT_NAME_USER_SUBMITTED_MIDCOURSE_REVERIFY) return HttpResponseRedirect(reverse('verify_student_midcourse_reverification_confirmation')) except WindowExpiredException: