Commit d5bd2313 by Brian Wilson

fix migrations, removing one field and making another nullable. Update…

fix migrations, removing one field and making another nullable.  Update registration page to allow for editing only demographics.
parent ee990806
...@@ -13,8 +13,8 @@ class Migration(SchemaMigration): ...@@ -13,8 +13,8 @@ class Migration(SchemaMigration):
self.gf('django.db.models.fields.CharField')(default='', max_length=20, blank=True), self.gf('django.db.models.fields.CharField')(default='', max_length=20, blank=True),
keep_default=False) keep_default=False)
# Adding field 'TestCenterUser.confirmed_at' # Adding field 'TestCenterUser.uploaded_at'
db.add_column('student_testcenteruser', 'confirmed_at', db.add_column('student_testcenteruser', 'uploaded_at',
self.gf('django.db.models.fields.DateTimeField')(null=True, db_index=True), self.gf('django.db.models.fields.DateTimeField')(null=True, db_index=True),
keep_default=False) keep_default=False)
...@@ -31,14 +31,13 @@ class Migration(SchemaMigration): ...@@ -31,14 +31,13 @@ class Migration(SchemaMigration):
('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, db_index=True, blank=True)), ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, db_index=True, blank=True)),
('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, db_index=True, blank=True)), ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, db_index=True, blank=True)),
('user_updated_at', self.gf('django.db.models.fields.DateTimeField')(db_index=True)), ('user_updated_at', self.gf('django.db.models.fields.DateTimeField')(db_index=True)),
('client_authorization_id', self.gf('django.db.models.fields.CharField')(unique=True, max_length=20, db_index=True)),
('exam_series_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)), ('exam_series_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
('eligibility_appointment_date_first', self.gf('django.db.models.fields.DateField')(db_index=True)), ('eligibility_appointment_date_first', self.gf('django.db.models.fields.DateField')(db_index=True)),
('eligibility_appointment_date_last', self.gf('django.db.models.fields.DateField')(db_index=True)), ('eligibility_appointment_date_last', self.gf('django.db.models.fields.DateField')(db_index=True)),
('accommodation_code', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)), ('accommodation_code', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)),
('accommodation_request', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), ('accommodation_request', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
('upload_status', self.gf('django.db.models.fields.CharField')(max_length=20, blank=True)), ('upload_status', self.gf('django.db.models.fields.CharField')(max_length=20, blank=True)),
('confirmed_at', self.gf('django.db.models.fields.DateTimeField')(db_index=True)), ('uploaded_at', self.gf('django.db.models.fields.DateTimeField')(null=True, db_index=True)),
('upload_error_message', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), ('upload_error_message', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)),
)) ))
db.send_create_signal('student', ['TestCenterRegistration']) db.send_create_signal('student', ['TestCenterRegistration'])
...@@ -51,8 +50,8 @@ class Migration(SchemaMigration): ...@@ -51,8 +50,8 @@ class Migration(SchemaMigration):
# Deleting field 'TestCenterUser.upload_status' # Deleting field 'TestCenterUser.upload_status'
db.delete_column('student_testcenteruser', 'upload_status') db.delete_column('student_testcenteruser', 'upload_status')
# Deleting field 'TestCenterUser.confirmed_at' # Deleting field 'TestCenterUser.uploaded_at'
db.delete_column('student_testcenteruser', 'confirmed_at') db.delete_column('student_testcenteruser', 'uploaded_at')
# Deleting field 'TestCenterUser.upload_error_message' # Deleting field 'TestCenterUser.upload_error_message'
db.delete_column('student_testcenteruser', 'upload_error_message') db.delete_column('student_testcenteruser', 'upload_error_message')
...@@ -127,7 +126,7 @@ class Migration(SchemaMigration): ...@@ -127,7 +126,7 @@ class Migration(SchemaMigration):
'accommodation_code': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), 'accommodation_code': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
'accommodation_request': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), 'accommodation_request': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
'client_authorization_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}), 'client_authorization_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
'confirmed_at': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
'course_id': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), 'course_id': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
'eligibility_appointment_date_first': ('django.db.models.fields.DateField', [], {'db_index': 'True'}), 'eligibility_appointment_date_first': ('django.db.models.fields.DateField', [], {'db_index': 'True'}),
...@@ -149,7 +148,7 @@ class Migration(SchemaMigration): ...@@ -149,7 +148,7 @@ class Migration(SchemaMigration):
'city': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), 'city': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}),
'client_candidate_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), 'client_candidate_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
'company_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
'confirmed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_index': 'True'}), 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'db_index': 'True'}),
'country': ('django.db.models.fields.CharField', [], {'max_length': '3', 'db_index': 'True'}), 'country': ('django.db.models.fields.CharField', [], {'max_length': '3', 'db_index': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
'extension': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '8', 'blank': 'True'}), 'extension': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '8', 'blank': 'True'}),
......
...@@ -194,7 +194,7 @@ class TestCenterUser(models.Model): ...@@ -194,7 +194,7 @@ class TestCenterUser(models.Model):
# Confirmation # Confirmation
upload_status = models.CharField(max_length=20, blank=True) # 'Error' or 'Accepted' upload_status = models.CharField(max_length=20, blank=True) # 'Error' or 'Accepted'
confirmed_at = models.DateTimeField(null=True, db_index=True) uploaded_at = models.DateTimeField(null=True, db_index=True)
upload_error_message = models.CharField(max_length=512, blank=True) upload_error_message = models.CharField(max_length=512, blank=True)
@staticmethod @staticmethod
...@@ -236,7 +236,7 @@ class TestCenterRegistration(models.Model): ...@@ -236,7 +236,7 @@ class TestCenterRegistration(models.Model):
user_updated_at = models.DateTimeField(db_index=True) user_updated_at = models.DateTimeField(db_index=True)
# "client_authorization_id" is the client's unique identifier for the authorization. # "client_authorization_id" is the client's unique identifier for the authorization.
# This must be present for an update or delete to be sent to Pearson. # This must be present for an update or delete to be sent to Pearson.
client_authorization_id = models.CharField(max_length=20, unique=True, db_index=True) # client_authorization_id = models.CharField(max_length=20, unique=True, db_index=True)
# information about the test, from the course policy: # information about the test, from the course policy:
exam_series_code = models.CharField(max_length=15, db_index=True) exam_series_code = models.CharField(max_length=15, db_index=True)
...@@ -250,7 +250,7 @@ class TestCenterRegistration(models.Model): ...@@ -250,7 +250,7 @@ class TestCenterRegistration(models.Model):
# Confirmation # Confirmation
upload_status = models.CharField(max_length=20, blank=True) # 'Error' or 'Accepted' upload_status = models.CharField(max_length=20, blank=True) # 'Error' or 'Accepted'
confirmed_at = models.DateTimeField(db_index=True) uploaded_at = models.DateTimeField(null=True, db_index=True)
upload_error_message = models.CharField(max_length=512, blank=True) upload_error_message = models.CharField(max_length=512, blank=True)
@property @property
...@@ -261,12 +261,15 @@ class TestCenterRegistration(models.Model): ...@@ -261,12 +261,15 @@ class TestCenterRegistration(models.Model):
def client_candidate_id(self): def client_candidate_id(self):
return self.testcenter_user.client_candidate_id return self.testcenter_user.client_candidate_id
@property
def client_authorization_id(self):
# TODO: make this explicitly into a string object:
return self.id
def get_testcenter_registrations_for_user_and_course(user, course_id): def get_testcenter_registrations_for_user_and_course(user, course_id):
try: try:
tcu = TestCenterUser.objects.get(user=user) tcu = TestCenterUser.objects.get(user=user)
except User.DoesNotExist: except TestCenterUser.DoesNotExist:
return [] return []
return TestCenterRegistration.objects.filter(testcenter_user=tcu, course_id=course_id) return TestCenterRegistration.objects.filter(testcenter_user=tcu, course_id=course_id)
......
...@@ -10,6 +10,7 @@ import sys ...@@ -10,6 +10,7 @@ import sys
import urllib import urllib
import uuid import uuid
from django.conf import settings from django.conf import settings
from django.contrib.auth import logout, authenticate, login from django.contrib.auth import logout, authenticate, login
from django.contrib.auth.forms import PasswordResetForm from django.contrib.auth.forms import PasswordResetForm
...@@ -17,6 +18,7 @@ from django.contrib.auth.models import User ...@@ -17,6 +18,7 @@ from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.context_processors import csrf from django.core.context_processors import csrf
from django.core.mail import send_mail from django.core.mail import send_mail
from django.core.urlresolvers import reverse
from django.core.validators import validate_email, validate_slug, ValidationError from django.core.validators import validate_email, validate_slug, ValidationError
from django.db import IntegrityError from django.db import IntegrityError
from django.http import HttpResponse, HttpResponseForbidden, Http404,\ from django.http import HttpResponse, HttpResponseForbidden, Http404,\
...@@ -29,7 +31,8 @@ from django.core.cache import cache ...@@ -29,7 +31,8 @@ from django.core.cache import cache
from django_future.csrf import ensure_csrf_cookie, csrf_exempt from django_future.csrf import ensure_csrf_cookie, csrf_exempt
from student.models import (Registration, UserProfile, TestCenterUser, TestCenterRegistration, from student.models import (Registration, UserProfile, TestCenterUser, TestCenterRegistration,
PendingNameChange, PendingEmailChange, PendingNameChange, PendingEmailChange,
CourseEnrollment, unique_id_for_user) CourseEnrollment, unique_id_for_user,
get_testcenter_registrations_for_user_and_course)
from certificates.models import CertificateStatuses, certificate_status_for_student from certificates.models import CertificateStatuses, certificate_status_for_student
...@@ -617,11 +620,7 @@ def begin_test_registration(request, course_id): ...@@ -617,11 +620,7 @@ def begin_test_registration(request, course_id):
log.error("User {0} enrolled in non-existent course {1}" log.error("User {0} enrolled in non-existent course {1}"
.format(user.username, course_id)) .format(user.username, course_id))
# TODO: placeholder for possible messages...
message = "" message = ""
if not user.is_active:
message = render_to_string('registration/activate_account_notice.html', {'email': user.email})
context = {'course': course, context = {'course': course,
'user': user, 'user': user,
'message': message, 'message': message,
...@@ -676,7 +675,7 @@ def _do_create_or_update_test_center_user(post_vars): ...@@ -676,7 +675,7 @@ def _do_create_or_update_test_center_user(post_vars):
try: try:
testcenter_user.save() testcenter_user.save()
except IntegrityError, ie: except IntegrityError, ie:
message = ie message = "%s" % ie
context = {'course': course, context = {'course': course,
'user': user, 'user': user,
'message': message, 'message': message,
...@@ -685,31 +684,45 @@ def _do_create_or_update_test_center_user(post_vars): ...@@ -685,31 +684,45 @@ def _do_create_or_update_test_center_user(post_vars):
return render_to_response('test_center_register.html', context) return render_to_response('test_center_register.html', context)
# create and save the registration: # create and save the registration:
registration = TestCenterRegistration(testcenter_user = testcenter_user) needs_saving = False
registration.course_id = post_vars['course_id'] registrations = get_testcenter_registrations_for_user_and_course(user, course.id)
registration.accommodation_request = post_vars['accommodations'] # In future, this should check the exam series code of the registrations, if there
exam_info = course.testcenter_info # were multiple.
registration.exam_series_code = exam_info.get('Exam_Series_Code') if len(registrations) > 0:
registration.eligibility_appointment_date_first = exam_info.get('First_Eligible_Appointment_Date') registration = registrations[0]
registration.eligibility_appointment_date_last = exam_info.get('Last_Eligible_Appointment_Date') # check to see if registration changed. Should check appointment dates too...
# accommodation_code remains blank for now, along with Pearson confirmation # And later should check changes in accommodation_code.
registration.user_updated_at = datetime.datetime.now() # But at the moment, we don't expect anything to cause this to change
# right now.
else:
registration = TestCenterRegistration(testcenter_user = testcenter_user)
registration.course_id = post_vars['course_id']
registration.accommodation_request = post_vars['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')
registration.eligibility_appointment_date_last = exam_info.get('Last_Eligible_Appointment_Date')
# accommodation_code remains blank for now, along with Pearson confirmation
registration.user_updated_at = datetime.datetime.now()
needs_saving = True
# "client_authorization_id" is the client's unique identifier for the authorization. # "client_authorization_id" is the client's unique identifier for the authorization.
# This must be present for an update or delete to be sent to Pearson. # This must be present for an update or delete to be sent to Pearson.
registration.client_authorization_id = "1" # Can we just use the id field of the registration? Lets...
try:
registration.save() if needs_saving:
except IntegrityError, ie: try:
message = ie registration.save()
context = {'course': course, except IntegrityError, ie:
'user': user, message = "%s" % ie
'message': message, context = {'course': course,
'testcenteruser': testcenter_user, 'user': user,
} 'message': message,
return render_to_response('test_center_register.html', context) 'testcenteruser': testcenter_user,
}
return render_to_response('test_center_register.html', context)
return (user, testcenter_user, registration) return (user, testcenter_user, registration)
@ensure_csrf_cookie @ensure_csrf_cookie
...@@ -778,7 +791,7 @@ def create_test_registration(request, post_override=None): ...@@ -778,7 +791,7 @@ def create_test_registration(request, post_override=None):
# js = {'success': True} # js = {'success': True}
# return HttpResponse(json.dumps(js), mimetype="application/json") # return HttpResponse(json.dumps(js), mimetype="application/json")
return HttpResponseRedirect('/dashboard') return HttpResponseRedirect(reverse('dashboard'))
def get_random_post_override(): def get_random_post_override():
""" """
......
...@@ -234,8 +234,7 @@ ...@@ -234,8 +234,7 @@
%> %>
% if len(registrations) == 0: % if len(registrations) == 0:
<div class="message message-status is-shown exam-register"> <div class="message message-status is-shown exam-register">
<!-- <a href="#testcenter-register-modal" rel="leanModal" class="exam-button" data-course-id="${course.id}" data-course-number="${course.number}" id="exam_register_button">Register for Pearson exam</a> <a href="${testcenter_register_target}" class="exam-button" id="exam_register_button">Register for Pearson exam</a>
--> <a href="${testcenter_register_target}" class="exam-button" id="exam_register_button">Register for Pearson exam</a>
<p class="message-copy">Registration for the Pearson exam is now open.</p> <p class="message-copy">Registration for the Pearson exam is now open.</p>
</div> </div>
% else: % else:
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
from courseware.courses import course_image_url, get_course_about_section from courseware.courses import course_image_url, get_course_about_section
from courseware.access import has_access from courseware.access import has_access
from certificates.models import CertificateStatuses from certificates.models import CertificateStatuses
from student.models import get_testcenter_registrations_for_user_and_course
%> %>
<%inherit file="main.html" /> <%inherit file="main.html" />
...@@ -34,14 +35,7 @@ ...@@ -34,14 +35,7 @@
</script> </script>
</%block> </%block>
<section id="testcenter-register" class=""> <section id="testcenter-register" class="">
%if message:
<section class="dashboard-banner">
${message}
</section>
%endif
<div class="inner-wrapper"> <div class="inner-wrapper">
<div id="register"> <div id="register">
...@@ -81,7 +75,63 @@ ...@@ -81,7 +75,63 @@
</section> </section>
<!-- 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)
%>
% 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
<!-- provide mechanism for error messages to appear -->
% if message:
<section class="">
<p>${message}</p>
</section>
% endif
<form id="test_register_form" class="test_register_form" method="post" data-remote="true" action="/create_test_registration"> <form id="test_register_form" class="test_register_form" method="post" data-remote="true" action="/create_test_registration">
<div class="notice"></div> <div class="notice"></div>
<!-- TODO: why are both of these here? --> <!-- TODO: why are both of these here? -->
...@@ -91,7 +141,6 @@ ...@@ -91,7 +141,6 @@
<!-- include these as pass-throughs --> <!-- include these as pass-throughs -->
<input id="id_email" type="hidden" name="email" maxlength="75" value="${user.email}" /> <input id="id_email" type="hidden" name="email" maxlength="75" value="${user.email}" />
<input id="id_username" type="hidden" name="username" maxlength="75" value="${user.username}" /> <input id="id_username" type="hidden" name="username" maxlength="75" value="${user.username}" />
<!-- TODO: add the course somehow... -->
<input id="id_course_id" type="hidden" name="course_id" maxlength="75" value="${course.id}" /> <input id="id_course_id" type="hidden" name="course_id" maxlength="75" value="${course.id}" />
<div class="input-group"> <div class="input-group">
...@@ -150,15 +199,24 @@ ...@@ -150,15 +199,24 @@
<label data-field="company_name">Company</label> <label data-field="company_name">Company</label>
<input name="company_name" type="text" value="${testcenteruser.company_name}" placeholder="Acme Corporation"> <input name="company_name" type="text" value="${testcenteruser.company_name}" placeholder="Acme Corporation">
</div> </div>
<div><p>The following is included here just so it can be input within the form. But it
is not part of the demographics, and it is not something that can be changed once input.</p>
</div>
<div class="input-group"> <div class="input-group">
<label data-field="accommodations">Accommodations Requested</label> <label data-field="accommodations">Accommodations Requested</label>
<textarea name="accommodations"></textarea> <textarea name="accommodations"></textarea>
</div> </div>
% if len(registrations) > 0:
<div class="submit">
<input name="submit" type="submit" value="Update demographics">
</div>
% else:
<div class="submit"> <div class="submit">
<input name="submit" type="submit" value="Register for Test"> <input name="submit" type="submit" value="Register for Test">
</div> </div>
% endif
</form> </form>
</div> </div>
......
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