diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 47992554f2ecbfe9f3d7250d1d3753cb9c089e30..202bfefac5ee9cad5d16740180296c23e83bf740 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -39,7 +39,6 @@ from certificates.models import CertificateStatuses, certificate_status_for_stud from xmodule.course_module import CourseDescriptor from xmodule.modulestore.exceptions import ItemNotFoundError from xmodule.modulestore.django import modulestore -from xmodule.modulestore.exceptions import ItemNotFoundError #from datetime import date from collections import namedtuple @@ -209,14 +208,6 @@ def _cert_info(user, course, cert_status): def dashboard(request): user = request.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 # exist (because the course IDs have changed). Still, we don't delete those @@ -603,9 +594,27 @@ def create_account(request, post_override=None): @login_required @ensure_csrf_cookie -def begin_test_registration(request, course_id): - user = request.user - +def begin_test_registration(request, course_id, form=None, message=''): + 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, # if it already exists. Create an empty object otherwise. try: @@ -613,31 +622,31 @@ def begin_test_registration(request, course_id): except TestCenterUser.DoesNotExist: testcenteruser = TestCenterUser() 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, 'user': user, 'message': message, 'testcenteruser': testcenteruser, + 'registration': registration, + 'form': form, + 'exam_info': exam_info, } 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): - """ - Given cleaned post variables, create the TestCenterUser and UserProfile objects, as well as the - registration for this user. - - Returns a tuple (User, UserProfile, TestCenterUser). - - """ + post_vars = post_override if post_override else request.POST # first determine if we need to create a new TestCenterUser, or if we are making any update # to an existing TestCenterUser. @@ -646,46 +655,43 @@ def _do_create_or_update_test_center_user(post_vars): course_id = post_vars['course_id'] course = (course_from_id(course_id)) # assume it will be found.... - needs_saving = False +# needs_saving = False try: 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: + 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 - testcenter_user = TestCenterUser.create(user, post_vars) -# testcenter_user = TestCenterUser(user=user) -# 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 +# testcenter_user = TestCenterUser.create(user, post_vars) +# needs_saving = True - if needs_saving: + # perform validation: + if needs_updating: try: # first perform validation on the user information # using a Django Form. - form = TestCenterUserForm(testcenter_user) + form = TestCenterUserForm(instance=testcenter_user, data=post_vars) if not form.is_valid(): - response_data = {'success': False} - # return a list of errors... - response_data['field_errors'] = form.errors - response_data['non_field_errors'] = form.non_field_errors() - return HttpResponse(json.dumps(response_data)) + return begin_test_registration(request, course_id, form, 'failed to validate') +# response_data = {'success': False} +# # return a list of errors... +# response_data['field_errors'] = form.errors +# 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: js = {'success': False} error_msg = unicode(ie); @@ -715,7 +721,7 @@ def _do_create_or_update_test_center_user(post_vars): else: registration = TestCenterRegistration(testcenter_user = testcenter_user) 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 registration.exam_series_code = exam_info.get('Exam_Series_Code') 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): except IntegrityError, ie: raise - 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} +# return (user, testcenter_user, registration) - post_vars = post_override if post_override else request.POST # Confirm we have a properly formed request # for a in ['first_name', 'last_name', 'address_1', 'city', 'country']: @@ -768,13 +764,12 @@ def create_test_registration(request, post_override=None): # return HttpResponse(json.dumps(js)) # Once the test_center_user information has been validated, create the entries: - ret = _do_create_or_update_test_center_user(post_vars) - if isinstance(ret,HttpResponse): # if there was an error then return that - return ret - - - (user, testcenter_user, testcenter_registration) = ret - +# ret = _do_create_or_update_test_center_user(post_vars) +# if isinstance(ret,HttpResponse): # if there was an error then return that +# return ret +# +# +# (user, testcenter_user, testcenter_registration) = ret # only do the following if there is accommodation text to send, # and a destination to which to send it: @@ -800,8 +795,9 @@ def create_test_registration(request, post_override=None): # TODO: enable appropriate stat # statsd.increment("common.student.account_created") - js = {'success': True} - return HttpResponse(json.dumps(js), mimetype="application/json") +# js = {'success': True} +# return HttpResponse(json.dumps(js), mimetype="application/json") + return HttpResponseRedirect(reverse('dashboard')) def get_random_post_override(): diff --git a/lms/templates/test_center_register.html b/lms/templates/test_center_register.html index d6a38e1bb406bf6f6c3524a1ae5d6e1446b4e2a0..fe175b11e48bc56c4e9121ba67980f567763e2c8 100644 --- a/lms/templates/test_center_register.html +++ b/lms/templates/test_center_register.html @@ -10,18 +10,18 @@ <%namespace name='static' file='static_content.html'/> <%block name="title"><title>Pearson VUE Test Center Proctoring - Sign Up</title></%block> - +<%doc> <%block name="js_extra"> <script type="text/javascript"> (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) { location.href="${reverse('dashboard')}"; } else { $(".field.error").removeClass('error'); $('#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 @@ })(this) </script> </%block> +</%doc> -<% -exam_info = course.testcenter_info -%> <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"> <header> <hgroup> <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> % else: <h1>Register for a Pearson VUE Proctored Exam</h1> @@ -136,8 +55,9 @@ exam_info = course.testcenter_info <section class="status"> - <!-- NOTE: BT - registration data updated confirmation message - in case upon successful submit we're directing folks back to this view --> - <div class="message message-status submission-saved is-shown"> + <!-- NOTE: BT - registration data updated confirmation message - in case upon successful submit we're directing + 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> </div> @@ -148,10 +68,12 @@ exam_info = course.testcenter_info </div> % 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"> <p class="message-copy">We're Sorry, but there was an error with the information you provided below:</p> </div> + % endif </section> <section class="content"> @@ -160,7 +82,7 @@ exam_info = course.testcenter_info </header> <form id="testcenter-register-form" method="post" data-remote="true" action="/create_test_registration"> - % if len(registrations) > 0: + % if registration: <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>. </p> @@ -181,15 +103,23 @@ exam_info = course.testcenter_info <ol class="list-input"> <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> <input class="short" id="salutation" type="text" name="salutation" value="${testcenteruser.salutation}" placeholder="e.g. Mr., Ms., Mrs., Dr." /> </li> - <!-- NOTE: BT - to inform a user of what field the error occured on, add a class of .error to the .field element --> - <li class="field required"> + --> <!-- 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"> <label for="name-first">First Name </label> <input id="name-first" type="text" name="first_name" value="${testcenteruser.first_name}" placeholder="e.g. Albert" /> </li> - <li class="field"> + --> <li class="field"> <label for="name-middle">Middle Name</label> <input id="name-middle" type="text" name="middle_name" value="${testcenteruser.middle_name}" placeholder="" /> </li> @@ -281,7 +211,7 @@ exam_info = course.testcenter_info <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. --> - % 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> % else: <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 <legend class="is-hidden">Optional Information</legend> <ol class="list-input"> - % if len(registrations) > 0: + % if registration: <li class="field disabled"> <label for="accommodations">Accommodations Requested</label> <textarea class="long" id="accommodations"value="" placeholder="" disabled="disabled"></textarea> @@ -307,7 +237,7 @@ exam_info = course.testcenter_info </div> <div class="form-actions"> - % if len(registrations) > 0: + % if registration: <button type="submit" id="submit" class="action action-primary action-update">Update Demographics</button> % else: <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 </section> <aside> - % if len(registrations) > 0: + % if registration: <h3 class="is-hidden">Registration Details</h3> - <% - registration = registrations[0] - + <% if registration.upload_status == 'Accepted': regstatus = "Registration approved by Pearson" elif registration.upload_status == 'Error':