diff --git a/common/djangoapps/course_modes/urls.py b/common/djangoapps/course_modes/urls.py index 80ce7d4bda8efbcd344443a1a731665ac0618c2e..47e7f04c40e53757b6afd1d015e803f85083408e 100644 --- a/common/djangoapps/course_modes/urls.py +++ b/common/djangoapps/course_modes/urls.py @@ -5,5 +5,5 @@ from course_modes import views urlpatterns = patterns( '', - url(r'^choose', views.ChooseModeView.as_view(), name="course_modes_choose"), + url(r'^choose/(?P<course_id>[^/]+/[^/]+/[^/]+)$', views.ChooseModeView.as_view(), name="course_modes_choose"), ) diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py index d55943f3542860d57b5fb1956127e1c95ca7bdca..2b4d77544ad9f477be66677f8a9149c4914b7a35 100644 --- a/common/djangoapps/course_modes/views.py +++ b/common/djangoapps/course_modes/views.py @@ -21,8 +21,7 @@ from verify_student.models import SoftwareSecurePhotoVerification class ChooseModeView(View): @method_decorator(login_required) - def get(self, request, error=None): - course_id = request.GET.get("course_id") + def get(self, request, course_id, error=None): modes = CourseMode.modes_for_course_dict(course_id) context = { "course_id": course_id, @@ -38,8 +37,7 @@ class ChooseModeView(View): return render_to_response("course_modes/choose.html", context) - def post(self, request): - course_id = request.GET.get("course_id") + def post(self, request, course_id): user = request.user # This is a bit redundant with logic in student.views.change_enrollement, @@ -47,7 +45,7 @@ class ChooseModeView(View): course = course_from_id(course_id) if not has_access(user, course, 'enroll'): error_msg = _("Enrollment is closed") - return self.get(request, error=error_msg) + return self.get(request, course_id, error=error_msg) requested_mode = self.get_requested_mode(request.POST.get("mode")) if requested_mode == "verified" and request.POST.get("honor-code"): @@ -72,29 +70,25 @@ class ChooseModeView(View): amount_value = decimal.Decimal(amount).quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN) except decimal.InvalidOperation: error_msg = _("Invalid amount selected.") - return self.get(request, error=error_msg) + return self.get(request, course_id, error=error_msg) # Check for minimum pricing if amount_value < mode_info.min_price: error_msg = _("No selected price or selected price is too low.") - return self.get(request, error=error_msg) + return self.get(request, course_id, error=error_msg) donation_for_course = request.session.get("donation_for_course", {}) donation_for_course[course_id] = amount_value request.session["donation_for_course"] = donation_for_course if SoftwareSecurePhotoVerification.user_has_valid_or_pending(request.user): return redirect( - "{}?{}".format( - reverse('verify_student_verified'), - urlencode(dict(course_id=course_id)) - ) + reverse('verify_student_verified', + kwargs={'course_id': course_id}) ) return redirect( - "{}?{}".format( - reverse('verify_student_show_requirements'), - urlencode(dict(course_id=course_id)) - ) + reverse('verify_student_show_requirements', + kwargs={'course_id': course_id}), ) def get_requested_mode(self, user_choice): diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 4ee8f61358165dad46e23705babd60435abaf9f9..9173eb8224ee3a2e943d8a4adb9219635ace29aa 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -375,10 +375,7 @@ def change_enrollment(request): available_modes = CourseMode.modes_for_course(course_id) if len(available_modes) > 1: return HttpResponse( - "{}?{}".format( - reverse("course_modes_choose"), - urlencode(dict(course_id=course_id)) - ) + reverse("course_modes_choose", kwargs={'course_id': course_id}) ) org, course_num, run = course_id.split("/") diff --git a/lms/djangoapps/verify_student/tests/test_views.py b/lms/djangoapps/verify_student/tests/test_views.py index 0d37aa0efd62343b2dfa8ad035263e690068f309..71d94735ffd4dfd2518caa1b45f2e88156c54234 100644 --- a/lms/djangoapps/verify_student/tests/test_views.py +++ b/lms/djangoapps/verify_student/tests/test_views.py @@ -21,7 +21,7 @@ from student.tests.factories import UserFactory class StartView(TestCase): def start_url(course_id=""): - return "/verify_student/start?course_id={0}".format(urllib.quote(course_id)) + return "/verify_student/{0}".format(urllib.quote(course_id)) def test_start_new_verification(self): """ diff --git a/lms/djangoapps/verify_student/urls.py b/lms/djangoapps/verify_student/urls.py index 83c2812f91f60a4878a507bd7bc79e3be8c2ce78..606d96a785cef1385d35e05e6a59624c61779ab2 100644 --- a/lms/djangoapps/verify_student/urls.py +++ b/lms/djangoapps/verify_student/urls.py @@ -24,19 +24,19 @@ urlpatterns = patterns( # The above are what we did for the design mockups, but what we're really # looking at now is: url( - r'^show_requirements', + r'^show_requirements/(?P<course_id>[^/]+/[^/]+/[^/]+)$', views.show_requirements, name="verify_student_show_requirements" ), url( - r'^verify', + r'^verify/(?P<course_id>[^/]+/[^/]+/[^/]+)$', views.VerifyView.as_view(), name="verify_student_verify" ), url( - r'^verified', + r'^verified/(?P<course_id>[^/]+/[^/]+/[^/]+)$', views.VerifiedView.as_view(), name="verify_student_verified" ), @@ -48,7 +48,7 @@ urlpatterns = patterns( ), url( - r'^show_verification_page', + r'^show_verification_page/(?P<course_id>[^/]+/[^/]+/[^/]+)$', views.show_verification_page, name="verify_student/show_verification_page" ), diff --git a/lms/djangoapps/verify_student/views.py b/lms/djangoapps/verify_student/views.py index 7e68c112511172ccbeadc1de3ce2c4fe9b6ff5eb..a0feeafd5014893a721894ca8cd449371473a0d2 100644 --- a/lms/djangoapps/verify_student/views.py +++ b/lms/djangoapps/verify_student/views.py @@ -10,11 +10,12 @@ from mitxmako.shortcuts import render_to_response from django.conf import settings from django.core.urlresolvers import reverse -from django.http import HttpResponse, HttpResponseBadRequest +from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseRedirect from django.shortcuts import redirect from django.views.generic.base import View from django.utils.translation import ugettext as _ from django.utils.http import urlencode +from django.contrib.auth.decorators import login_required from course_modes.models import CourseMode from student.models import CourseEnrollment @@ -29,19 +30,15 @@ log = logging.getLogger(__name__) class VerifyView(View): - def get(self, request): + def get(self, request, course_id): """ """ - course_id = request.GET['course_id'] # If the user has already been verified within the given time period, # redirect straight to the payment -- no need to verify again. if SoftwareSecurePhotoVerification.user_has_valid_or_pending(request.user): return redirect( - "{}?{}".format( - reverse('verify_student_verified'), - urlencode(dict(course_id=course_id)) - ) - ) + reverse('verify_student_verified', + kwargs={'course_id': course_id})) else: # If they haven't completed a verification attempt, we have to # restart with a new one. We can't reuse an older one because we @@ -76,11 +73,10 @@ class VerifiedView(View): View that gets shown once the user has already gone through the verification flow """ - def get(self, request): + def get(self, request, course_id): """ Handle the case where we have a get request """ - course_id = request.GET['course_id'] verify_mode = CourseMode.mode_for_course(course_id, "verified") if course_id in request.session.get("donation_for_course", {}): chosen_price = request.session["donation_for_course"][course_id] @@ -131,10 +127,12 @@ def create_order(request): return HttpResponse(json.dumps(params), content_type="text/json") - -def show_requirements(request): - """This might just be a plain template without a view.""" - context = { "course_id": request.GET.get("course_id") } +@login_required +def show_requirements(request, course_id): + """ + Show the requirements necessary for + """ + context = { "course_id": course_id } return render_to_response("verify_student/show_requirements.html", context) def face_upload(request): @@ -175,7 +173,7 @@ def enroll(user, course_id, mode_slug): # to a page that lets them choose which mode they want. if len(available_modes) > 1: return HttpResponseRedirect( - reverse('choose_enroll_mode', course_id=course_id) + reverse('choose_enroll_mode', kwargs={'course_id': course_id}) ) # Otherwise, we use the only mode that's supported... else: @@ -188,11 +186,11 @@ def enroll(user, course_id, mode_slug): return HttpResponseRedirect(reverse('dashboard')) if mode_slug == "verify": - if SoftwareSecureVerification.has_submitted_recent_request(user): + if SoftwareSecurePhotoVerification.has_submitted_recent_request(user): # Capture payment info # Create an order # Create a VerifiedCertificate order item - return HttpResponse.Redirect(reverse('payment')) + return HttpResponse.Redirect(reverse('verified')) # There's always at least one mode available (default is "honor"). If they diff --git a/lms/templates/verify_student/photo_verification.html b/lms/templates/verify_student/photo_verification.html index affa287b22145f62482ff8284eb67b4e653f029b..2853d2bc55a6963f8200d571cfd3333dd8284a89 100644 --- a/lms/templates/verify_student/photo_verification.html +++ b/lms/templates/verify_student/photo_verification.html @@ -518,7 +518,7 @@ <li class="help-item"> <h3 class="title">Change your mind?</h3> <div class="copy"> - <p>You can always <a href="${reverse('course_modes_choose') + '?course_id=' + course_id }">Audit the course for free</a> without verifying.</p> + <p>You can always <a href="${reverse('course_modes_choose', kwargs={'course_id': course_id})}">Audit the course for free</a> without verifying.</p> </div> </li> </ul> diff --git a/lms/templates/verify_student/show_requirements.html b/lms/templates/verify_student/show_requirements.html index 7fa217917f614fabfba2f3df9da9d5a690cf4248..73a560b7ecdf6e4fb1176a2588d3083c644dc57f 100644 --- a/lms/templates/verify_student/show_requirements.html +++ b/lms/templates/verify_student/show_requirements.html @@ -124,7 +124,7 @@ <ol class="wizard-steps"> <li class="wizard-step"> - <a class="next action-primary" id="face_next_button" href="${reverse('verify_student_verify') + '?course_id=' + course_id}">Go to Step 1: Take my Photo</a> + <a class="next action-primary" id="face_next_button" href="${reverse('verify_student_verify', kwargs={'course_id': course_id})}">Go to Step 1: Take my Photo</a> </li> </ol> </nav>