Commit e50ef39b by Julia Hansbrough

Midcourse reverification: Events

parent 63a22ad0
...@@ -20,6 +20,8 @@ from django.conf import settings ...@@ -20,6 +20,8 @@ from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from mock import sentinel
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
...@@ -130,11 +132,33 @@ class TestMidCourseReverifyView(TestCase): ...@@ -130,11 +132,33 @@ class TestMidCourseReverifyView(TestCase):
self.course_id = 'Robot/999/Test_Course' self.course_id = 'Robot/999/Test_Course'
CourseFactory.create(org='Robot', number='999', display_name='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) @patch('verify_student.views.render_to_response', render_mock)
def test_midcourse_reverify_get(self): def test_midcourse_reverify_get(self):
url = reverse('verify_student_midcourse_reverify', url = reverse('verify_student_midcourse_reverify',
kwargs={"course_id": self.course_id}) kwargs={"course_id": self.course_id})
response = self.client.get(url) 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) self.assertEquals(response.status_code, 200)
((_template, context), _kwargs) = render_mock.call_args ((_template, context), _kwargs) = render_mock.call_args
self.assertFalse(context['error']) self.assertFalse(context['error'])
...@@ -143,7 +167,21 @@ class TestMidCourseReverifyView(TestCase): ...@@ -143,7 +167,21 @@ class TestMidCourseReverifyView(TestCase):
def test_midcourse_reverify_post_success(self): def test_midcourse_reverify_post_success(self):
window = MidcourseReverificationWindowFactory(course_id=self.course_id) window = MidcourseReverificationWindowFactory(course_id=self.course_id)
url = reverse('verify_student_midcourse_reverify', kwargs={'course_id': self.course_id}) url = reverse('verify_student_midcourse_reverify', kwargs={'course_id': self.course_id})
response = self.client.post(url, {'face_image': ','}) 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) self.assertEquals(response.status_code, 302)
try: try:
verification_attempt = SoftwareSecurePhotoVerification.objects.get(user=self.user, window=window) verification_attempt = SoftwareSecurePhotoVerification.objects.get(user=self.user, window=window)
......
...@@ -6,6 +6,8 @@ import json ...@@ -6,6 +6,8 @@ import json
import logging import logging
import decimal import decimal
import datetime import datetime
import crum
from track.views import server_track
from pytz import UTC from pytz import UTC
from edxmako.shortcuts import render_to_response from edxmako.shortcuts import render_to_response
...@@ -39,6 +41,10 @@ from .exceptions import WindowExpiredException ...@@ -39,6 +41,10 @@ from .exceptions import WindowExpiredException
log = logging.getLogger(__name__) 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): class VerifyView(View):
@method_decorator(login_required) @method_decorator(login_required)
...@@ -251,6 +257,13 @@ def results_callback(request): ...@@ -251,6 +257,13 @@ def results_callback(request):
"Result {} not understood. Known results: PASS, FAIL, SYSTEM FAIL".format(result) "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!") return HttpResponse("OK!")
...@@ -345,6 +358,9 @@ class MidCourseReverifyView(View): ...@@ -345,6 +358,9 @@ class MidCourseReverifyView(View):
display this view display this view
""" """
course = course_from_id(course_id) 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 = { context = {
"user_full_name": request.user.profile.name, "user_full_name": request.user.profile.name,
"error": False, "error": False,
...@@ -353,8 +369,8 @@ class MidCourseReverifyView(View): ...@@ -353,8 +369,8 @@ class MidCourseReverifyView(View):
"course_org": course.display_org_with_default, "course_org": course.display_org_with_default,
"course_num": course.display_number_with_default, "course_num": course.display_number_with_default,
"reverify": True, "reverify": True,
} }
return render_to_response("verify_student/midcourse_photo_reverification.html", context) return render_to_response("verify_student/midcourse_photo_reverification.html", context)
@method_decorator(login_required) @method_decorator(login_required)
...@@ -376,6 +392,9 @@ class MidCourseReverifyView(View): ...@@ -376,6 +392,9 @@ class MidCourseReverifyView(View):
attempt.save() attempt.save()
attempt.submit() 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')) return HttpResponseRedirect(reverse('verify_student_midcourse_reverification_confirmation'))
except WindowExpiredException: except WindowExpiredException:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment