Commit 4471079f by Diana Huang

Clean up validation of price selection. Add error messaging.

parent 7af4accc
...@@ -19,14 +19,15 @@ from student.views import course_from_id ...@@ -19,14 +19,15 @@ from student.views import course_from_id
class ChooseModeView(View): class ChooseModeView(View):
@method_decorator(login_required) @method_decorator(login_required)
def get(self, request): def get(self, request, error=None):
course_id = request.GET.get("course_id") course_id = request.GET.get("course_id")
modes = CourseMode.modes_for_course_dict(course_id) modes = CourseMode.modes_for_course_dict(course_id)
context = { context = {
"course_id": course_id, "course_id": course_id,
"modes": modes, "modes": modes,
"course_name": course_from_id(course_id).display_name, "course_name": course_from_id(course_id).display_name,
"chosen_price" : None, "chosen_price": None,
"error": error,
} }
if "verified" in modes: if "verified" in modes:
context["suggested_prices"] = modes["verified"].suggested_prices.split(",") context["suggested_prices"] = modes["verified"].suggested_prices.split(",")
...@@ -43,7 +44,8 @@ class ChooseModeView(View): ...@@ -43,7 +44,8 @@ class ChooseModeView(View):
# but I don't really have the time to refactor it more nicely and test. # but I don't really have the time to refactor it more nicely and test.
course = course_from_id(course_id) course = course_from_id(course_id)
if not has_access(user, course, 'enroll'): if not has_access(user, course, 'enroll'):
return HttpResponseBadRequest(_("Enrollment is closed")) error_msg = _("Enrollment is closed")
return self.get(request, error=error_msg)
requested_mode = self.get_requested_mode(request.POST.get("mode")) requested_mode = self.get_requested_mode(request.POST.get("mode"))
...@@ -55,16 +57,20 @@ class ChooseModeView(View): ...@@ -55,16 +57,20 @@ class ChooseModeView(View):
CourseEnrollment.enroll(user, course_id) CourseEnrollment.enroll(user, course_id)
return redirect('dashboard') return redirect('dashboard')
mode_info = allowed_modes[requested_mode]
if requested_mode == "verified": if requested_mode == "verified":
amount = request.POST.get("contribution") or \ amount = request.POST.get("contribution") or \
request.POST.get("contribution-other-amt") or \ request.POST.get("contribution-other-amt") or 0
requested_mode.min_price.format("{:g}")
donation_for_course = request.session.get("donation_for_course", {}) donation_for_course = request.session.get("donation_for_course", {})
donation_for_course[course_id] = amount donation_for_course[course_id] = amount
request.session["donation_for_course"] = donation_for_course request.session["donation_for_course"] = donation_for_course
# TODO: Check here for minimum pricing # Check for minimum pricing
if int(amount) < mode_info.min_price:
error_msg = _("No selected price or selected price is too low.")
return self.get(request, error=error_msg)
return redirect( return redirect(
"{}?{}".format( "{}?{}".format(
...@@ -75,7 +81,7 @@ class ChooseModeView(View): ...@@ -75,7 +81,7 @@ class ChooseModeView(View):
def get_requested_mode(self, user_choice): def get_requested_mode(self, user_choice):
choices = { choices = {
"Select Audit" : "audit", "Select Audit": "audit",
"Select Certificate" : "verified" "Select Certificate": "verified"
} }
return choices.get(user_choice) return choices.get(user_choice)
...@@ -25,6 +25,11 @@ ...@@ -25,6 +25,11 @@
<header class="page-header header-white"> <header class="page-header header-white">
<h2 class="title header-white-title">You are registering for ${course_name} (ID Verified)</h2> <h2 class="title header-white-title">You are registering for ${course_name} (ID Verified)</h2>
</header> </header>
%if error:
<div class="error">
${error}
</div>
%endif
<h3 class="title">Select your track:</h3> <h3 class="title">Select your track:</h3>
<form method="post" name="enrollment_mode_form" id="enrollment_mode_form"> <form method="post" name="enrollment_mode_form" id="enrollment_mode_form">
......
...@@ -104,7 +104,7 @@ def render_purchase_form_html(cart): ...@@ -104,7 +104,7 @@ def render_purchase_form_html(cart):
""" """
return render_to_string('shoppingcart/cybersource_form.html', { return render_to_string('shoppingcart/cybersource_form.html', {
'action': get_purchase_endpoint(), 'action': get_purchase_endpoint(),
'params': get_signed_purchase_params(params), 'params': get_signed_purchase_params(cart),
}) })
def get_signed_purchase_params(cart): def get_signed_purchase_params(cart):
......
...@@ -9,9 +9,10 @@ from mitxmako.shortcuts import render_to_response ...@@ -9,9 +9,10 @@ from mitxmako.shortcuts import render_to_response
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import HttpResponse from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import redirect from django.shortcuts import redirect
from django.views.generic.base import View from django.views.generic.base import View
from django.utils.translation import ugettext as _
from course_modes.models import CourseMode from course_modes.models import CourseMode
from student.models import CourseEnrollment from student.models import CourseEnrollment
...@@ -47,14 +48,14 @@ class VerifyView(View): ...@@ -47,14 +48,14 @@ class VerifyView(View):
else: else:
chosen_price = verify_mode.min_price.format("{:g}") chosen_price = verify_mode.min_price.format("{:g}")
context = { context = {
"progress_state" : progress_state, "progress_state": progress_state,
"user_full_name" : request.user.profile.name, "user_full_name": request.user.profile.name,
"course_id" : course_id, "course_id": course_id,
"course_name" : course_from_id(course_id).display_name, "course_name": course_from_id(course_id).display_name,
"purchase_endpoint" : get_purchase_endpoint(), "purchase_endpoint": get_purchase_endpoint(),
"suggested_prices" : verify_mode.suggested_prices.split(","), "suggested_prices": verify_mode.suggested_prices.split(","),
"currency" : verify_mode.currency.upper(), "currency": verify_mode.currency.upper(),
"chosen_price" : chosen_price, "chosen_price": chosen_price,
} }
return render_to_response('verify_student/photo_verification.html', context) return render_to_response('verify_student/photo_verification.html', context)
...@@ -66,17 +67,20 @@ def create_order(request): ...@@ -66,17 +67,20 @@ def create_order(request):
attempt.save() attempt.save()
course_id = request.POST['course_id'] course_id = request.POST['course_id']
donation_for_course = request.session.get("donation_for_course", {}) contribution = request.POST.get("contribution", 0)
# FIXME: When this isn't available we do...? verified_mode = CourseMode.modes_for_course_dict(course_id).get('verified', None)
verified_mode = CourseMode.modes_for_course_dict(course_id)["verified"] # make sure this course has a verified mode
amount = donation_for_course.get(course_id, verified_mode.min_price) if not verified_mode:
return HttpResponseBadRequest(_("This course doesn't support verified certificates"))
if contribution < verified_mode.min_price:
return HttpResponseBadRequest(_("No selected price or selected price is below minimum."))
# I know, we should check this is valid. All kinds of stuff missing here # I know, we should check this is valid. All kinds of stuff missing here
# enrollment = CourseEnrollment.create_enrollment(request.user, course_id)
cart = Order.get_cart_for_user(request.user) cart = Order.get_cart_for_user(request.user)
cart.clear() cart.clear()
CertificateItem.add_to_order(cart, course_id, amount, 'verified') CertificateItem.add_to_order(cart, course_id, contribution, 'verified')
params = get_signed_purchase_params(cart) params = get_signed_purchase_params(cart)
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
.done(function(data) { .done(function(data) {
$("#pay_form").submit(); $("#pay_form").submit();
}) })
.fail(function() { alert("error"); }); .fail(function(jqXhr,text_status, error_thrown) { alert(jqXhr.responseText); });
} }
function initSnapshotHandler(names) { function initSnapshotHandler(names) {
......
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