Skip to content
Snippets Groups Projects
Commit c76f3705 authored by Brian Wilson's avatar Brian Wilson
Browse files

introduce form to template

parent 4abd9cd3
No related branches found
No related tags found
No related merge requests found
...@@ -39,7 +39,6 @@ from certificates.models import CertificateStatuses, certificate_status_for_stud ...@@ -39,7 +39,6 @@ from certificates.models import CertificateStatuses, certificate_status_for_stud
from xmodule.course_module import CourseDescriptor from xmodule.course_module import CourseDescriptor
from xmodule.modulestore.exceptions import ItemNotFoundError from xmodule.modulestore.exceptions import ItemNotFoundError
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from xmodule.modulestore.exceptions import ItemNotFoundError
#from datetime import date #from datetime import date
from collections import namedtuple from collections import namedtuple
...@@ -209,14 +208,6 @@ def _cert_info(user, course, cert_status): ...@@ -209,14 +208,6 @@ def _cert_info(user, course, cert_status):
def dashboard(request): def dashboard(request):
user = request.user user = request.user
enrollments = CourseEnrollment.objects.filter(user=user) enrollments = CourseEnrollment.objects.filter(user=user)
# we want to populate the registration page with the relevant information,
# if it already exists. Create an empty object otherwise.
# try:
# testcenteruser = TestCenterUser.objects.get(user=user)
# except TestCenterUser.DoesNotExist:
# testcenteruser = TestCenterUser()
# testcenteruser.user = user
# Build our courses list for the user, but ignore any courses that no longer # Build our courses list for the user, but ignore any courses that no longer
# exist (because the course IDs have changed). Still, we don't delete those # exist (because the course IDs have changed). Still, we don't delete those
...@@ -603,9 +594,27 @@ def create_account(request, post_override=None): ...@@ -603,9 +594,27 @@ def create_account(request, post_override=None):
@login_required @login_required
@ensure_csrf_cookie @ensure_csrf_cookie
def begin_test_registration(request, course_id): def begin_test_registration(request, course_id, form=None, message=''):
user = request.user user = request.user
try:
course = (course_from_id(course_id))
except ItemNotFoundError:
log.error("User {0} enrolled in non-existent course {1}"
.format(user.username, course_id))
# get the exam to be registered for:
# (For now, we just assume there is one at most.)
exam_info = course.testcenter_info
# figure out if the user is already registered for this exam:
# (Again, for now we assume that any registration that exists is for this exam.)
registrations = get_testcenter_registrations_for_user_and_course(user, course_id)
if len(registrations) > 0:
registration = registrations[0]
else:
registration = None
# we want to populate the registration page with the relevant information, # we want to populate the registration page with the relevant information,
# if it already exists. Create an empty object otherwise. # if it already exists. Create an empty object otherwise.
try: try:
...@@ -613,31 +622,31 @@ def begin_test_registration(request, course_id): ...@@ -613,31 +622,31 @@ def begin_test_registration(request, course_id):
except TestCenterUser.DoesNotExist: except TestCenterUser.DoesNotExist:
testcenteruser = TestCenterUser() testcenteruser = TestCenterUser()
testcenteruser.user = user testcenteruser.user = user
try:
course = (course_from_id(course_id))
except ItemNotFoundError:
log.error("User {0} enrolled in non-existent course {1}"
.format(user.username, course_id))
message = "" if form is None:
form = TestCenterUserForm(instance=testcenteruser)
context = {'course': course, context = {'course': course,
'user': user, 'user': user,
'message': message, 'message': message,
'testcenteruser': testcenteruser, 'testcenteruser': testcenteruser,
'registration': registration,
'form': form,
'exam_info': exam_info,
} }
return render_to_response('test_center_register.html', context) return render_to_response('test_center_register.html', context)
@ensure_csrf_cookie
def create_test_registration(request, post_override=None):
'''
JSON call to create test registration.
Used by form in test_center_register.html, which is called from
into dashboard.html
'''
# js = {'success': False}
def _do_create_or_update_test_center_user(post_vars): post_vars = post_override if post_override else request.POST
"""
Given cleaned post variables, create the TestCenterUser and UserProfile objects, as well as the
registration for this user.
Returns a tuple (User, UserProfile, TestCenterUser).
"""
# first determine if we need to create a new TestCenterUser, or if we are making any update # first determine if we need to create a new TestCenterUser, or if we are making any update
# to an existing TestCenterUser. # to an existing TestCenterUser.
...@@ -646,46 +655,43 @@ def _do_create_or_update_test_center_user(post_vars): ...@@ -646,46 +655,43 @@ def _do_create_or_update_test_center_user(post_vars):
course_id = post_vars['course_id'] course_id = post_vars['course_id']
course = (course_from_id(course_id)) # assume it will be found.... course = (course_from_id(course_id)) # assume it will be found....
needs_saving = False # needs_saving = False
try: try:
testcenter_user = TestCenterUser.objects.get(user=user) testcenter_user = TestCenterUser.objects.get(user=user)
# found a TestCenterUser, so check to see if it has changed
# needs_updating = any([testcenter_user.__getattribute__(fieldname) != post_vars[fieldname]
# for fieldname in TestCenterUser.user_provided_fields()])
needs_updating = testcenter_user.needs_update(post_vars)
if needs_updating:
# # leave user and client_candidate_id as before
# testcenter_user.user_updated_at = datetime.datetime.now()
# for fieldname in TestCenterUser.user_provided_fields():
# testcenter_user.__setattr__(fieldname, post_vars[fieldname])
testcenter_user.update(post_vars)
needs_saving = True
except TestCenterUser.DoesNotExist: except TestCenterUser.DoesNotExist:
testcenter_user = TestCenterUser(user=user)
needs_updating = testcenter_user.needs_update(post_vars)
# if needs_updating:
# testcenter_user.update(post_vars)
# needs_saving = True
# except TestCenterUser.DoesNotExist:
# did not find the TestCenterUser, so create a new one # did not find the TestCenterUser, so create a new one
testcenter_user = TestCenterUser.create(user, post_vars) # testcenter_user = TestCenterUser.create(user, post_vars)
# testcenter_user = TestCenterUser(user=user) # needs_saving = True
# testcenter_user.update(post_vars)
## for fieldname in TestCenterUser.user_provided_fields():
## testcenter_user.__setattr__(fieldname, post_vars[fieldname])
# # testcenter_user.candidate_id remains unset
# testcenter_user.client_candidate_id = 'edx' + '123456' # some unique value
## testcenter_user.user_updated_at = datetime.datetime.now()
needs_saving = True
if needs_saving: # perform validation:
if needs_updating:
try: try:
# first perform validation on the user information # first perform validation on the user information
# using a Django Form. # using a Django Form.
form = TestCenterUserForm(testcenter_user) form = TestCenterUserForm(instance=testcenter_user, data=post_vars)
if not form.is_valid(): if not form.is_valid():
response_data = {'success': False} return begin_test_registration(request, course_id, form, 'failed to validate')
# return a list of errors... # response_data = {'success': False}
response_data['field_errors'] = form.errors # # return a list of errors...
response_data['non_field_errors'] = form.non_field_errors() # response_data['field_errors'] = form.errors
return HttpResponse(json.dumps(response_data)) # response_data['non_field_errors'] = form.non_field_errors()
# return HttpResponse(json.dumps(response_data))
new_user = form.save(commit=False)
# create additional values here:
new_user.user_updated_at = datetime.datetime.now()
# TODO: create client value....
new_user.save()
testcenter_user.save() # testcenter_user.save()
except IntegrityError, ie: except IntegrityError, ie:
js = {'success': False} js = {'success': False}
error_msg = unicode(ie); error_msg = unicode(ie);
...@@ -715,7 +721,7 @@ def _do_create_or_update_test_center_user(post_vars): ...@@ -715,7 +721,7 @@ def _do_create_or_update_test_center_user(post_vars):
else: else:
registration = TestCenterRegistration(testcenter_user = testcenter_user) registration = TestCenterRegistration(testcenter_user = testcenter_user)
registration.course_id = post_vars['course_id'] registration.course_id = post_vars['course_id']
registration.accommodation_request = post_vars['accommodations'] registration.accommodation_request = post_vars.get('accommodations','')
exam_info = course.testcenter_info exam_info = course.testcenter_info
registration.exam_series_code = exam_info.get('Exam_Series_Code') registration.exam_series_code = exam_info.get('Exam_Series_Code')
registration.eligibility_appointment_date_first = exam_info.get('First_Eligible_Appointment_Date') registration.eligibility_appointment_date_first = exam_info.get('First_Eligible_Appointment_Date')
...@@ -734,18 +740,8 @@ def _do_create_or_update_test_center_user(post_vars): ...@@ -734,18 +740,8 @@ def _do_create_or_update_test_center_user(post_vars):
except IntegrityError, ie: except IntegrityError, ie:
raise raise
return (user, testcenter_user, registration) # return (user, testcenter_user, registration)
@ensure_csrf_cookie
def create_test_registration(request, post_override=None):
'''
JSON call to create test registration.
Used by form in test_center_register.html, which is called from
into dashboard.html
'''
js = {'success': False}
post_vars = post_override if post_override else request.POST
# Confirm we have a properly formed request # Confirm we have a properly formed request
# for a in ['first_name', 'last_name', 'address_1', 'city', 'country']: # for a in ['first_name', 'last_name', 'address_1', 'city', 'country']:
...@@ -768,13 +764,12 @@ def create_test_registration(request, post_override=None): ...@@ -768,13 +764,12 @@ def create_test_registration(request, post_override=None):
# return HttpResponse(json.dumps(js)) # return HttpResponse(json.dumps(js))
# Once the test_center_user information has been validated, create the entries: # Once the test_center_user information has been validated, create the entries:
ret = _do_create_or_update_test_center_user(post_vars) # ret = _do_create_or_update_test_center_user(post_vars)
if isinstance(ret,HttpResponse): # if there was an error then return that # if isinstance(ret,HttpResponse): # if there was an error then return that
return ret # return ret
#
#
(user, testcenter_user, testcenter_registration) = ret # (user, testcenter_user, testcenter_registration) = ret
# only do the following if there is accommodation text to send, # only do the following if there is accommodation text to send,
# and a destination to which to send it: # and a destination to which to send it:
...@@ -800,8 +795,9 @@ def create_test_registration(request, post_override=None): ...@@ -800,8 +795,9 @@ def create_test_registration(request, post_override=None):
# TODO: enable appropriate stat # TODO: enable appropriate stat
# statsd.increment("common.student.account_created") # statsd.increment("common.student.account_created")
js = {'success': True} # js = {'success': True}
return HttpResponse(json.dumps(js), mimetype="application/json") # return HttpResponse(json.dumps(js), mimetype="application/json")
return HttpResponseRedirect(reverse('dashboard'))
def get_random_post_override(): def get_random_post_override():
......
...@@ -10,18 +10,18 @@ ...@@ -10,18 +10,18 @@
<%namespace name='static' file='static_content.html'/> <%namespace name='static' file='static_content.html'/>
<%block name="title"><title>Pearson VUE Test Center Proctoring - Sign Up</title></%block> <%block name="title"><title>Pearson VUE Test Center Proctoring - Sign Up</title></%block>
<%doc>
<%block name="js_extra"> <%block name="js_extra">
<script type="text/javascript"> <script type="text/javascript">
(function() { (function() {
$(document).on('ajax:success', '#test_register_form', function(data, json, xhr) { $(document).on('ajax:success', '#testcenter_register_form', function(data, json, xhr) {
if(json.success) { if(json.success) {
location.href="${reverse('dashboard')}"; location.href="${reverse('dashboard')}";
} else { } else {
$(".field.error").removeClass('error'); $(".field.error").removeClass('error');
$('#register_error').html(json.value).stop().css("display", "block"); $('#register_error').html(json.value).stop().css("display", "block");
$("[data-field='"+json.field+"']").addClass('field-error') $("[data-field='"+json.field+"']").addClass('error')
} }
}); });
...@@ -34,98 +34,17 @@ ...@@ -34,98 +34,17 @@
})(this) })(this)
</script> </script>
</%block> </%block>
</%doc>
<%
exam_info = course.testcenter_info
%>
<section class="testcenter-register container"> <section class="testcenter-register container">
<!-- display stuff about the exam and the course for which the user is registering.
If the user has already registered in the past for a test center, then also display
their ID. -->
<!-- check to see if the user has already registering, or
is registering for the first time -->
<%
registrations = get_testcenter_registrations_for_user_and_course(user, course.id)
%>
<section class="output-raw">
<hgroup>
<p class="date-block">
% if course.has_ended():
Course Completed - ${course.end_date_text}
% elif course.has_started():
Course Started - ${course.start_date_text}
% else: # hasn't started yet
Course Starts - ${course.start_date_text}
% endif
</p>
<h2 class="university">${get_course_about_section(course, 'university')}</h2>
<h3>${course.number} ${course.title}</h3>
</hgroup>
<!-- TODO: need to add logic to select which of the following to display. Like certs? -->
% if exam_info is not None:
<p>Exam Series Code: ${exam_info.get('Exam_Series_Code')}</p>
<p>First Eligible Appointment Date: ${exam_info.get('First_Eligible_Appointment_Date')}</p>
<p>Last Eligible Appointment Date: ${exam_info.get('Last_Eligible_Appointment_Date')}</p>
% endif
% if len(registrations) > 0:
<%
registration = registrations[0]
%>
<section><div>Already Registered</div>
<p>Here is the current state of your registration, for debugging purposes:</p>
<l>
<li>id: ${registration.id}</li>
<li>testcenter_user_id: ${registration.testcenter_user_id}</li>
<li>course_id: ${registration.course_id}</li>
<li>accommodation codes: ${registration.accommodation_code}</li>
<li>accommodation request: ${registration.accommodation_request}</li>
<li>created_at: ${registration.created_at}</li>
<li>updated_at: ${registration.updated_at}</li>
<li>user_updated_at: ${registration.user_updated_at}</li>
<li>upload_status: ${registration.upload_status}</li>
<li>upload_error_message: ${registration.upload_error_message}</li>
</l>
<!-- determine status of registration
doing here for now, but will move into model or view -->
<%
regstatus = "registration pending acknowledgement by Pearson"
if registration.upload_status == 'Accepted':
regstatus = "registration approved by Pearson"
elif registration.upload_status == 'Error':
regstatus = "registration rejected by Pearson: %s" % registration.upload_error_message
elif len(registration.accommodation_request) > 0 and registration.accommodation_code == '':
regstatus = "pending approval of accommodation request"
%>
<p>Current status: ${regstatus}</p>
<p>The demographic information provided below was used to register
for the exam listed above. Changes to this information
may be submitted below.</p>
</section>
% else:
<p>The demographic information must be provided below in order to register
for the exam listed above.</p>
% endif
</section>
<section class="introduction"> <section class="introduction">
<header> <header>
<hgroup> <hgroup>
<h2>${get_course_about_section(course, 'university')} ${course.number} ${course.title}</h2> <h2>${get_course_about_section(course, 'university')} ${course.number} ${course.title}</h2>
% if len(registrations) > 0: % if registration:
<h1>Your Pearson VUE Proctored Exam Registration</h1> <h1>Your Pearson VUE Proctored Exam Registration</h1>
% else: % else:
<h1>Register for a Pearson VUE Proctored Exam</h1> <h1>Register for a Pearson VUE Proctored Exam</h1>
...@@ -136,8 +55,9 @@ exam_info = course.testcenter_info ...@@ -136,8 +55,9 @@ exam_info = course.testcenter_info
<section class="status"> <section class="status">
<!-- NOTE: BT - registration data updated confirmation message - in case upon successful submit we're directing folks back to this view --> <!-- NOTE: BT - registration data updated confirmation message - in case upon successful submit we're directing
<div class="message message-status submission-saved is-shown"> folks back to this view. To display, add "is-shown" class to div -->
<div class="message message-status submission-saved">
<p class="message-copy">Your registration data has been updated and saved.</p> <p class="message-copy">Your registration data has been updated and saved.</p>
</div> </div>
...@@ -148,10 +68,12 @@ exam_info = course.testcenter_info ...@@ -148,10 +68,12 @@ exam_info = course.testcenter_info
</div> </div>
% endif % endif
<!-- NOTE: BT - Sample markup for error message --> <!-- NOTE: BT - Sample markup for error message. To display, add "is-shown" class to div -->
% if form.errors and len(form.errors) > 0:
<div class="message message-status submission-error is-shown"> <div class="message message-status submission-error is-shown">
<p class="message-copy">We're Sorry, but there was an error with the information you provided below:</p> <p class="message-copy">We're Sorry, but there was an error with the information you provided below:</p>
</div> </div>
% endif
</section> </section>
<section class="content"> <section class="content">
...@@ -160,7 +82,7 @@ exam_info = course.testcenter_info ...@@ -160,7 +82,7 @@ exam_info = course.testcenter_info
</header> </header>
<form id="testcenter-register-form" method="post" data-remote="true" action="/create_test_registration"> <form id="testcenter-register-form" method="post" data-remote="true" action="/create_test_registration">
% if len(registrations) > 0: % if registration:
<p class="instructions"> <p class="instructions">
Please complete the following form to update your demographic information used in your Pearson VUE Proctored Exam. Required fields are noted by <strong>bold text and an asterisk (*)</strong>. Please complete the following form to update your demographic information used in your Pearson VUE Proctored Exam. Required fields are noted by <strong>bold text and an asterisk (*)</strong>.
</p> </p>
...@@ -181,15 +103,23 @@ exam_info = course.testcenter_info ...@@ -181,15 +103,23 @@ exam_info = course.testcenter_info
<ol class="list-input"> <ol class="list-input">
<li class="field"> <li class="field">
<label for="id-salutation">Salutation:</label>
${form['salutation']}
</li>
<li class="field required">
<label for="id-first_name">First Name:</label>
${form['first_name']}
</li>
<!-- <li class="field">
<label for="salutation">Salutation</label> <label for="salutation">Salutation</label>
<input class="short" id="salutation" type="text" name="salutation" value="${testcenteruser.salutation}" placeholder="e.g. Mr., Ms., Mrs., Dr." /> <input class="short" id="salutation" type="text" name="salutation" value="${testcenteruser.salutation}" placeholder="e.g. Mr., Ms., Mrs., Dr." />
</li> </li>
<!-- NOTE: BT - to inform a user of what field the error occured on, add a class of .error to the .field element --> --> <!-- NOTE: BT - to inform a user of what field the error occurred on, add a class of .error to the .field element -->
<li class="field required"> <!-- <li class="field required">
<label for="name-first">First Name </label> <label for="name-first">First Name </label>
<input id="name-first" type="text" name="first_name" value="${testcenteruser.first_name}" placeholder="e.g. Albert" /> <input id="name-first" type="text" name="first_name" value="${testcenteruser.first_name}" placeholder="e.g. Albert" />
</li> </li>
<li class="field"> --> <li class="field">
<label for="name-middle">Middle Name</label> <label for="name-middle">Middle Name</label>
<input id="name-middle" type="text" name="middle_name" value="${testcenteruser.middle_name}" placeholder="" /> <input id="name-middle" type="text" name="middle_name" value="${testcenteruser.middle_name}" placeholder="" />
</li> </li>
...@@ -281,7 +211,7 @@ exam_info = course.testcenter_info ...@@ -281,7 +211,7 @@ exam_info = course.testcenter_info
<div class="form-fields-secondary"> <div class="form-fields-secondary">
<!-- NOTE: BT - Assuming accomodations cannot be edited after a user originally submits registration, I've disabled the field and provided different text. Correct if this is not the case. --> <!-- NOTE: BT - Assuming accomodations cannot be edited after a user originally submits registration, I've disabled the field and provided different text. Correct if this is not the case. -->
% if len(registrations) > 0: % if registration:
<p class="instructions">Fields below this point are not part of the demographics, and are not editable currently.</p> <p class="instructions">Fields below this point are not part of the demographics, and are not editable currently.</p>
% else: % else:
<p class="instructions">Fields below this point are not part of the demographics, and cannot be changed once submitted.</p> <p class="instructions">Fields below this point are not part of the demographics, and cannot be changed once submitted.</p>
...@@ -291,7 +221,7 @@ exam_info = course.testcenter_info ...@@ -291,7 +221,7 @@ exam_info = course.testcenter_info
<legend class="is-hidden">Optional Information</legend> <legend class="is-hidden">Optional Information</legend>
<ol class="list-input"> <ol class="list-input">
% if len(registrations) > 0: % if registration:
<li class="field disabled"> <li class="field disabled">
<label for="accommodations">Accommodations Requested</label> <label for="accommodations">Accommodations Requested</label>
<textarea class="long" id="accommodations"value="" placeholder="" disabled="disabled"></textarea> <textarea class="long" id="accommodations"value="" placeholder="" disabled="disabled"></textarea>
...@@ -307,7 +237,7 @@ exam_info = course.testcenter_info ...@@ -307,7 +237,7 @@ exam_info = course.testcenter_info
</div> </div>
<div class="form-actions"> <div class="form-actions">
% if len(registrations) > 0: % if registration:
<button type="submit" id="submit" class="action action-primary action-update">Update Demographics</button> <button type="submit" id="submit" class="action action-primary action-update">Update Demographics</button>
% else: % else:
<button type="submit" id="submit" class="action action-primary action-register">Register for Pearson VUE Test</button> <button type="submit" id="submit" class="action action-primary action-register">Register for Pearson VUE Test</button>
...@@ -317,12 +247,10 @@ exam_info = course.testcenter_info ...@@ -317,12 +247,10 @@ exam_info = course.testcenter_info
</section> </section>
<aside> <aside>
% if len(registrations) > 0: % if registration:
<h3 class="is-hidden">Registration Details</h3> <h3 class="is-hidden">Registration Details</h3>
<% <%
registration = registrations[0]
if registration.upload_status == 'Accepted': if registration.upload_status == 'Accepted':
regstatus = "Registration approved by Pearson" regstatus = "Registration approved by Pearson"
elif registration.upload_status == 'Error': elif registration.upload_status == 'Error':
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment