AUDIT_LOG.warning("cand {} on exam {} for course {}: test already over at {}".format(client_candidate_id,exam_series_code,course_id,timelimit_module.ending_at))
AUDIT_LOG.info("Logged in user '{}' for test of cand {} on exam {} for course {}: URL = {}".format(testcenteruser.user.username,client_candidate_id,exam_series_code,course_id,location))
log.info("Updated registration information for user's test center exam registration: username \"{}\" course \"{}\", examcode \"{}\"".format(registration.testcenter_user.user.username,registration.course_id,registration.exam_series_code))
log.info("User {0} enrolled in course {1} {2}updating demographic info for exam registration".format(user.username,course_id,""ifneeds_updatingelse"not "))
exceptTestCenterUser.DoesNotExist:
# do additional initialization here:
testcenter_user=TestCenterUser.create(user)
needs_updating=True
log.info("User {0} enrolled in course {1} creating demographic info for exam registration".format(user.username,course_id))
# perform validation:
ifneeds_updating:
# first perform validation on the user information
@@ -19,7 +19,7 @@ All of our tables will be described below, first in summary form with field type
.. list-table::
:widths: 10 80
:header-rows: 1
* - Value
- Meaning
* - `int`
...
...
@@ -36,13 +36,13 @@ All of our tables will be described below, first in summary form with field type
- Date
* - `datetime`
- Datetime in UTC, precision in seconds.
`Null`
.. list-table::
:widths: 10 80
:header-rows: 1
* - Value
- Meaning
* - `YES`
...
...
@@ -57,7 +57,7 @@ All of our tables will be described below, first in summary form with field type
.. list-table::
:widths: 10 80
:header-rows: 1
* - Value
- Meaning
* - `PRI`
...
...
@@ -252,19 +252,19 @@ There is an important split in demographic data gathered for the students who si
`old_names`
A list of the previous names this user had, and the timestamps at which they submitted a request to change those names. These name change request submissions used to require a staff member to approve it before the name change took effect. This is no longer the case, though we still record their previous names.
Note that the value stored for each entry is the name they had, not the name they requested to get changed to. People often changed their names as the time for certificate generation approached, to replace nicknames with their actual names or correct spelling/punctuation errors.
The timestamps are UTC, like all datetimes stored in our system.
`old_emails`
A list of previous emails this user had, with timestamps of when they changed them, in a format similar to `old_names`. There was never an approval process for this.
The timestamps are UTC, like all datetimes stored in our system.
`6002x_exit_response`
Answers to a survey that was sent to students after the prototype 6.002x course in the Spring of 2012. The questions and number of questions were randomly selected to measure how much survey length affected response rate. Only students from this course have this field.
`courseware`
------------
...
...
@@ -277,7 +277,7 @@ There is an important split in demographic data gathered for the students who si
.. list-table::
:widths: 10 80
:header-rows: 1
* - Value
- Meaning
* - `NULL`
...
...
@@ -306,10 +306,10 @@ There is an important split in demographic data gathered for the students who si
.. list-table::
:widths: 10 80
:header-rows: 1
* - Value
- Meaning
* - `NULL`
* - `NULL`
- This student signed up before this information was collected
* - `''` (blank)
- User did not specify level of education.
...
...
@@ -335,7 +335,7 @@ There is an important split in demographic data gathered for the students who si
- None
* - `'other'`
- Other
`goals`
-------
Text field collected during student signup in response to the prompt, "Goals in signing up for edX". We only started collecting this information after the transition from MITx to edX, so prototype course students will have `NULL` for this field. Students who elected not to enter anything will have a blank string.
...
...
@@ -382,7 +382,7 @@ Any piece of content in the courseware can store state and score in the `coursew
.. warning::
**Modules might not be what you expect!**
It's important to understand what "modules" are in the context of our system, as the terminology can be confusing. For the conventions of this table and many parts of our code, a "module" is a content piece that appears in the courseware. This can be nearly anything that appears when users are in the courseware tab: a video, a piece of HTML, a problem, etc. Modules can also be collections of other modules, such as sequences, verticals (modules stacked together on the same page), weeks, chapters, etc. In fact, the course itself is a top level module that contains all the other contents of the course as children. You can imagine the entire course as a tree with modules at every node.
Modules can store state, but whether and how they do so is up to the implemenation for that particular kind of module. When a user loads page, we look up all the modules they need to render in order to display it, and then we ask the database to look up state for those modules for that user. If there is corresponding entry for that user for a given module, we create a new row and set the state to an empty JSON dictionary.
...
...
@@ -420,7 +420,7 @@ The `courseware_studentmodule` table holds all courseware state for a given user
.. list-table::
:widths: 10 80
:header-rows: 0
* - `chapter`
- The top level categories for a course. Each of these is usually labeled as a Week in the courseware, but this is just convention.
* - `combinedopenended`
...
...
@@ -437,8 +437,6 @@ The `courseware_studentmodule` table holds all courseware state for a given user
- Self assessment problems. An early test of the open ended grading system that is not in widespread use yet. Recently deprecated in favor of `combinedopenended`.
* - `sequential`
- A collection of videos, problems, and other materials, rendered as a horizontal icon bar in the courseware.
* - `timelimit`
- A special module that records the time you start working on a piece of courseware and enforces time limits, used for Pearson exams. This hasn't been completely generalized yet, so is not available for widespread use.
* - `videosequence`
- A collection of videos, exercise problems, and other materials, rendered as a horizontal icon bar in the courseware. Use is inconsistent, and some courses use a `sequential` instead.
...
...
@@ -451,20 +449,20 @@ The `courseware_studentmodule` table holds all courseware state for a given user
.. list-table:: Breakdown of example `module_id`: `i4x://MITx/3.091x/problemset/Sample_Problems`
:widths: 10 20 70
:header-rows: 1
* - Part
- Example
- Definition
* - `i4x://`
-
-
- Just a convention we ran with. We had plans for the domain `i4x.org` at one point.
* - `org`
- `MITx`
- The organization part of the ID, indicating what organization created this piece of content.
* - `course_num`
* - `course_num`
- `3.091x`
- The course number this content was created for. Note that there is no run information here, so you can't know what runs of the course this content is being used for from the `module_id` alone; you have to look at the `courseware_studentmodule.course_id` field.
* - `module_type`
* - `module_type`
- `problemset`
- The module type, same value as what's in the `courseware_studentmodule.module_type` field.
* - `module_name`
...
...
@@ -501,33 +499,6 @@ The `courseware_studentmodule` table holds all courseware state for a given user
`selfassessment`
TODO: More details to come.
`timelimit`
This very uncommon type was only used in one Pearson exam for one course, and the format may change significantly in the future. It is currently a JSON dictionary with fields:
.. list-table::
:widths: 10 20 70
:header-rows: 1
* - JSON field
- Example
- Definition
* - `beginning_at`
- `1360590255.488154`
- UTC time as measured in seconds since UNIX epoch representing when the exam was started.
* - `ending_at`
- `1360596632.559758`
- UTC time as measured in seconds since UNIX epoch representing the time the exam will close.
* - `accomodation_codes`
- `DOUBLE`
- (optional) Sometimes students are given more time for accessibility reasons. Possible values are:
* `NONE`: no time accommodation
* `ADDHALFTIME`: 1.5X normal time allowance
* `ADD30MIN`: normal time allowance + 30 minutes
* `DOUBLE`: 2X normal time allowance
* `TESTING`: extra long period (for testing/debugging)
`grade`
-------
Floating point value indicating the total unweighted grade for this problem that the student has scored. Basically how many responses they got right within the problem.
...
...
@@ -608,13 +579,13 @@ The generatedcertificate table tracks certificate state for students who have be
* `notpassing`
* `restricted`
* `error`
After a course has been graded and certificates have been issued status will be one of:
* `downloadable`
* `notpassing`
* `restricted`
If the status is `downloadable` then the student passed the course and there will be a certificate available for download.
<h3class="message-title">${_('Registration for this Pearson exam is closed')}</h3>
<pclass="message-copy">${_('Your previous information is available below, however you may not edit any of the information.')}
</div>
% endif
% if registration:
<pclass="instructions">
${_('Please use the following form if you need to update your demographic information used in your Pearson VUE Proctored Exam. Required fields are noted by <strongclass="indicator">bold text and an asterisk (*)')}</strong>.
</p>
% else:
<pclass="instructions">
${_('Please provide the following demographic information to register for a Pearson VUE Proctored Exam. Required fields are noted by <strongclass="indicator">bold text and an asterisk (*)')}</strong>.
<inputid="company_name"type="text"name="company_name"value="${testcenteruser.company_name}"placeholder="${_('e.g. American Association of University Professors')}"/>
</li>
</ol>
</fieldset>
</div>
% if registration:
% if registration.accommodation_request and len(registration.accommodation_request) > 0:
% if registration.accommodation_request and len(registration.accommodation_request) > 0:
<pclass="note">${_('<spanclass="title">Note</span>: Your previous accommodation request below needs to be reviewed in detail <strong>and will add a significant delay to your registration process</strong>.')}</p>
% endif
% else:
<pclass="note">${_('<spanclass="title">Note</span>: Accommodation requests are not part of your demographic information, <strong>and cannot be changed once submitted</strong>. Accommodation requests, which are reviewed on a case-by-case basis, <strong>will add significant delay to the registration process</strong>.')}</p>
<pclass="details">${_('The demographic information you most recently provided is pending. You may edit this information at any point before exam registration closes on <strong>{end_date}</strong>').format(end_date=exam_info.registration_end_date_text)}</p>
</li>
% endif
% if registration.demographics_is_accepted:
<liclass="item status status-processed status-demographics">
<pclass="details">${_('The demographic information you most recently provided has been processed. You may edit this information at any point before exam registration closes on <strong>{end_date}</strong>').format(end_date=exam_info.registration_end_date_text)}</p>
</li>
% endif
% if registration.demographics_is_rejected:
<liclass="item status status-rejected status-demographics">
<pclass="details">${_('The demographic information you most recently provided has been rejected by Pearson. You can correct and submit it again before the exam registration closes on <strong>{end_date}</strong>. The error message is:').format(end_date=exam_info.registration_end_date_text)}</p>
<pclass="action">${_('If the error is not correctable by revising your demographic information, please {contact_link_start}contact edX at exam-help@edx.org{contact_link_end}.').format(contact_link_start='<aclass="contact-link"href="{}"'.format(exam_help_href),contact_link_end='</a>')}</p>
</li>
% endif
<!-- then provide status of accommodations, if any -->
% if registration.accommodation_is_pending:
<liclass="item status status-pending status-accommodations">
<pclass="details">${_('Your requested accommodations are pending. Within a few days, you should see confirmation here of granted accommodations.')}</p>
</li>
% endif
% if registration.accommodation_is_accepted:
<liclass="item status status-processed status-accommodations">
<pclass="details">${_('Your exam registration is pending. Once your information is processed, it will be forwarded to Pearson and you will be able to schedule an exam.')}</p>
</li>
% endif
% if registration.registration_is_accepted:
<liclass="item status status-processed status-registration">
<pclass="details">${_('Your exam registration has been processed and has been forwarded to Pearson. <strong>You are now able to {exam_link_start}schedule a Pearson exam{exam_link_end}</strong>.').format(exam_link_start='<ahref="{}"class="exam-link">'.format(registration.registration_signup_url), exam_link_end='</a>')}</p>
</li>
% endif
% if registration.registration_is_rejected:
<liclass="item status status-rejected status-registration">
<pclass="details">${_('Your exam registration has been rejected by Pearson. <strong>You currently cannot schedule an exam</strong>. The errors found include:')}</p>
<pclass="action">${_('Please {contact_link_start}contact edX at exam-help@edx.org{contact_link_end}.').format(contact_link_start='<aclass="contact-link"href="{}"'.format(exam_help_href),contact_link_end='</a>')}</p>
<p>${_('If you have a specific question pertaining to your registration, you may {contact_link_start}contact edX at exam-help@edx.org{contact_link_end}.').format(contact_link_start='<aclass="contact-link"href="{}"'.format(exam_help_href),contact_link_end='</a>')}</p>
{% trans "Click each revision to see a list of edited lines. Click the Preview button to see how the article looked at this stage. At the bottom of this page, you can change to a particular revision or merge an old revision with the current one." %}
<pclass="lead"><spanclass="icon-info-sign"></span> {% trans "When you merge a revision with the current, all data will be retained from both versions and merged at its approximate location from each revision." %} <strong>{% trans "After this, it's important to do a manual review." %}</strong></p>
<buttonclass="close-modal">✕<spanclass="sr">{% trans 'Close Modal' %}</span></button>
<header>
<h2id="merge-title">{% trans "Merge Revision" %}<spanclass="sr">, {% trans "modal open" %}</span></h2>
<hr/>
</header>
<divclass="modal-header">
<h1>{% trans "Merge with current" %}</h1>
<pclass="lead"><spanclass="icon-info-sign"></span> {% trans "When you merge a revision with the current, all data will be retained from both versions and merged at its approximate location from each revision." %} <strong>{% trans "After this, it's important to do a manual review." %}</strong></p>