diff --git a/lms/djangoapps/shoppingcart/models.py b/lms/djangoapps/shoppingcart/models.py index 432bd80a85..a35f4c720f 100644 --- a/lms/djangoapps/shoppingcart/models.py +++ b/lms/djangoapps/shoppingcart/models.py @@ -1751,7 +1751,7 @@ class CertificateItem(OrderItem): if is_enrollment_mode_verified: domain = microsite.get_value('SITE_NAME', settings.SITE_NAME) - path = reverse('verify_student_verify_later', kwargs={'course_id': unicode(self.course_id)}) + path = reverse('verify_student_verify_now', kwargs={'course_id': unicode(self.course_id)}) verification_url = "http://{domain}{path}".format(domain=domain, path=path) verification_reminder = _( diff --git a/lms/djangoapps/verify_student/tests/test_views.py b/lms/djangoapps/verify_student/tests/test_views.py index 887a7a37ad..477198d8f8 100644 --- a/lms/djangoapps/verify_student/tests/test_views.py +++ b/lms/djangoapps/verify_student/tests/test_views.py @@ -275,20 +275,18 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase): @ddt.data( "verify_student_verify_now", - "verify_student_verify_later", "verify_student_payment_confirmation" ) - def test_verify_now_or_later_not_enrolled(self, page_name): + def test_verify_now_not_enrolled(self, page_name): course = self._create_course("verified") response = self._get_page(page_name, course.id, expected_status_code=302) self._assert_redirects_to_start_flow(response, course.id) @ddt.data( "verify_student_verify_now", - "verify_student_verify_later", "verify_student_payment_confirmation" ) - def test_verify_now_or_later_unenrolled(self, page_name): + def test_verify_now_unenrolled(self, page_name): course = self._create_course("verified") self._enroll(course.id, "verified") self._unenroll(course.id) @@ -297,46 +295,21 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase): @ddt.data( "verify_student_verify_now", - "verify_student_verify_later", "verify_student_payment_confirmation" ) - def test_verify_now_or_later_not_paid(self, page_name): + def test_verify_now_not_paid(self, page_name): course = self._create_course("verified") self._enroll(course.id, "honor") response = self._get_page(page_name, course.id, expected_status_code=302) self._assert_redirects_to_upgrade(response, course.id) def test_verify_later(self): + """ The deprecated verify-later page should redirect to the verification start page. """ course = self._create_course("verified") - self._enroll(course.id, "verified") - response = self._get_page("verify_student_verify_later", course.id) - - self._assert_messaging(response, PayAndVerifyView.VERIFY_LATER_MSG) - - # Expect that the payment steps are NOT displayed - self._assert_steps_displayed( - response, - [PayAndVerifyView.INTRO_STEP] + PayAndVerifyView.VERIFICATION_STEPS, - PayAndVerifyView.INTRO_STEP - ) - self._assert_requirements_displayed(response, [ - PayAndVerifyView.PHOTO_ID_REQ, - PayAndVerifyView.WEBCAM_REQ, - ]) - - def test_verify_later_already_verified(self): - course = self._create_course("verified") - self._enroll(course.id, "verified") - self._set_verification_status("submitted") - - # Already verified, so if we somehow end up here, - # redirect immediately to the dashboard - response = self._get_page( - 'verify_student_verify_later', - course.id, - expected_status_code=302 - ) - self._assert_redirects_to_dashboard(response) + course_key = course.id + self._enroll(course_key, "verified") + response = self._get_page("verify_student_verify_later", course_key, expected_status_code=301) + self._assert_redirects_to_verify_start(response, course_key, 301) def test_payment_confirmation(self): course = self._create_course("verified") @@ -489,7 +462,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase): course.id, expected_status_code=302 ) - self._assert_redirects_to_verify_later(response, course.id) + self._assert_redirects_to_verify_start(response, course.id) def test_upgrade_already_verified_and_paid(self): course = self._create_course("verified") @@ -531,7 +504,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase): pages = [ 'verify_student_start_flow', 'verify_student_verify_now', - 'verify_student_verify_later', 'verify_student_upgrade_and_verify', ] @@ -553,7 +525,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase): @ddt.data( "verify_student_start_flow", "verify_student_verify_now", - "verify_student_verify_later", "verify_student_upgrade_and_verify", ) def test_require_login(self, url_name): @@ -571,7 +542,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase): @ddt.data( "verify_student_start_flow", "verify_student_verify_now", - "verify_student_verify_later", "verify_student_upgrade_and_verify", ) def test_no_such_course(self, url_name): @@ -654,7 +624,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase): # The course mode has expired, so expect an explanation # to the student that the deadline has passed - response = self._get_page("verify_student_verify_later", course.id) + response = self._get_page("verify_student_verify_now", course.id) self.assertContains(response, "verification deadline") self.assertContains(response, "Jan 02, 1999 at 00:00 UTC") @@ -821,10 +791,10 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase): url = reverse('verify_student_start_flow', kwargs={'course_id': unicode(course_id)}) self.assertRedirects(response, url) - def _assert_redirects_to_verify_later(self, response, course_id): + def _assert_redirects_to_verify_start(self, response, course_id, status_code=302): """Check that the page redirects to the "verify later" part of the flow. """ - url = reverse('verify_student_verify_later', kwargs={'course_id': unicode(course_id)}) - self.assertRedirects(response, url) + url = reverse('verify_student_verify_now', kwargs={'course_id': unicode(course_id)}) + self.assertRedirects(response, url, status_code) def _assert_redirects_to_upgrade(self, response, course_id): """Check that the page redirects to the "upgrade" part of the flow. """ @@ -1765,8 +1735,7 @@ class TestInCourseReverifyView(ModuleStoreTestCase): self._create_checkpoint() response = self.client.get(self._get_url(self.course_key, self.MIDTERM)) - url = reverse('verify_student_verify_later', - kwargs={"course_id": unicode(self.course_key)}) + url = reverse('verify_student_verify_now', kwargs={"course_id": unicode(self.course_key)}) self.assertRedirects(response, url) @override_settings(SEGMENT_IO_LMS_KEY="foobar") @@ -1810,8 +1779,7 @@ class TestInCourseReverifyView(ModuleStoreTestCase): self._create_checkpoint() response = self.client.post(self._get_url(self.course_key, self.MIDTERM)) - url = reverse('verify_student_verify_later', - kwargs={"course_id": unicode(self.course_key)}) + url = reverse('verify_student_verify_now', kwargs={"course_id": unicode(self.course_key)}) self.assertRedirects(response, url) diff --git a/lms/djangoapps/verify_student/urls.py b/lms/djangoapps/verify_student/urls.py index 0010b6d451..701bd71ff5 100644 --- a/lms/djangoapps/verify_student/urls.py +++ b/lms/djangoapps/verify_student/urls.py @@ -1,9 +1,9 @@ +""" URL definitions for the verify_student app. """ + +from django.conf import settings from django.conf.urls import patterns, url from verify_student import views -from verify_student.views import PayAndVerifyView - -from django.conf import settings urlpatterns = patterns( @@ -19,7 +19,7 @@ urlpatterns = patterns( views.PayAndVerifyView.as_view(), # pylint: disable=no-value-for-parameter name="verify_student_start_flow", kwargs={ - 'message': PayAndVerifyView.FIRST_TIME_VERIFY_MSG + 'message': views.PayAndVerifyView.FIRST_TIME_VERIFY_MSG } ), @@ -31,7 +31,7 @@ urlpatterns = patterns( views.PayAndVerifyView.as_view(), # pylint: disable=no-value-for-parameter name="verify_student_upgrade_and_verify", kwargs={ - 'message': PayAndVerifyView.UPGRADE_MSG + 'message': views.PayAndVerifyView.UPGRADE_MSG } ), @@ -47,8 +47,8 @@ urlpatterns = patterns( name="verify_student_verify_now", kwargs={ 'always_show_payment': True, - 'current_step': PayAndVerifyView.FACE_PHOTO_STEP, - 'message': PayAndVerifyView.VERIFY_NOW_MSG + 'current_step': views.PayAndVerifyView.FACE_PHOTO_STEP, + 'message': views.PayAndVerifyView.VERIFY_NOW_MSG } ), @@ -59,11 +59,8 @@ urlpatterns = patterns( # (since the user already paid). url( r'^verify-later/{course}/$'.format(course=settings.COURSE_ID_PATTERN), - views.PayAndVerifyView.as_view(), # pylint: disable=no-value-for-parameter - name="verify_student_verify_later", - kwargs={ - 'message': PayAndVerifyView.VERIFY_LATER_MSG - } + views.VerifyLaterView.as_view(), # pylint: disable=no-value-for-parameter + name="verify_student_verify_later" ), # The user is returning to the flow after paying. @@ -75,8 +72,8 @@ urlpatterns = patterns( name="verify_student_payment_confirmation", kwargs={ 'always_show_payment': True, - 'current_step': PayAndVerifyView.PAYMENT_CONFIRMATION_STEP, - 'message': PayAndVerifyView.PAYMENT_CONFIRMATION_MSG + 'current_step': views.PayAndVerifyView.PAYMENT_CONFIRMATION_STEP, + 'message': views.PayAndVerifyView.PAYMENT_CONFIRMATION_MSG } ), diff --git a/lms/djangoapps/verify_student/views.py b/lms/djangoapps/verify_student/views.py index d8f7ab5ed9..8f5dec9f15 100644 --- a/lms/djangoapps/verify_student/views.py +++ b/lms/djangoapps/verify_student/views.py @@ -20,7 +20,7 @@ from django.http import ( from django.shortcuts import redirect from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST -from django.views.generic.base import View +from django.views.generic.base import View, RedirectView from django.utils.decorators import method_decorator from django.utils.translation import ugettext as _, ugettext_lazy from django.contrib.auth.decorators import login_required @@ -473,10 +473,9 @@ class PayAndVerifyView(View): url = reverse('verify_student_start_flow', kwargs=course_kwargs) elif message == self.UPGRADE_MSG: if is_enrolled: - # If upgrading and we've paid but haven't verified, - # then the "verify later" messaging makes more sense. if already_paid: - url = reverse('verify_student_verify_later', kwargs=course_kwargs) + # If the student has paid, but not verified, redirect to the verification flow. + url = reverse('verify_student_verify_now', kwargs=course_kwargs) else: url = reverse('verify_student_start_flow', kwargs=course_kwargs) @@ -1205,7 +1204,7 @@ class InCourseReverifyView(View): Returns: HttpResponse with status_code 400 if photo is missing or any error - or redirect to verify_student_verify_later url if initial verification doesn't exist otherwise + or redirect to the verification flow if initial verification doesn't exist otherwise HttpsResponse with status code 200 """ # Check the in-course re-verification is enabled or not @@ -1330,4 +1329,12 @@ class InCourseReverifyView(View): u"for the course %s.", user.id, course_key ) - return redirect(reverse('verify_student_verify_later', kwargs={'course_id': unicode(course_key)})) + return redirect(reverse('verify_student_verify_now', kwargs={'course_id': unicode(course_key)})) + + +class VerifyLaterView(RedirectView): + """ This view has been deprecated and should redirect to the unified verification flow. """ + permanent = True + + def get_redirect_url(self, course_id, **kwargs): # pylint: disable=unused-argument + return reverse('verify_student_verify_now', kwargs={'course_id': unicode(course_id)}) diff --git a/lms/templates/dashboard/_dashboard_course_listing.html b/lms/templates/dashboard/_dashboard_course_listing.html index ad86503417..682dda56b2 100644 --- a/lms/templates/dashboard/_dashboard_course_listing.html +++ b/lms/templates/dashboard/_dashboard_course_listing.html @@ -292,7 +292,7 @@ from student.helpers import ( % endif
% elif verification_status['status'] == VERIFY_STATUS_SUBMITTED: