version 1.596.2.4, 2011/10/09 23:24:27
|
version 1.596.2.13, 2012/08/09 23:25:48
|
Line 52 use POSIX qw(floor);
|
Line 52 use POSIX qw(floor);
|
|
|
|
|
my %perm=(); |
my %perm=(); |
|
my %old_essays=(); |
|
|
# These variables are used to recover from ssi errors |
# These variables are used to recover from ssi errors |
|
|
Line 260 sub showResourceInfo {
|
Line 261 sub showResourceInfo {
|
sub reset_caches { |
sub reset_caches { |
&reset_analyze_cache(); |
&reset_analyze_cache(); |
&reset_perm(); |
&reset_perm(); |
|
&reset_old_essays(); |
} |
} |
|
|
{ |
{ |
Line 416 sub cleanRecord {
|
Line 418 sub cleanRecord {
|
'<tr valign="top"><td>'.$grayFont.&mt('Item ID').'</span></td>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Item ID').'</span></td>'. |
$middlerow.'</tr>'. |
$middlerow.'</tr>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. |
$bottomrow.'</tr>'.'</table></blockquote>'; |
$bottomrow.'</tr></table></blockquote>'; |
} elsif ($response eq 'radiobutton') { |
} elsif ($response eq 'radiobutton') { |
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
my ($toprow,$bottomrow); |
my ($toprow,$bottomrow); |
Line 738 sub compute_points {
|
Line 740 sub compute_points {
|
# |
# |
|
|
sub most_similar { |
sub most_similar { |
my ($uname,$udom,$uessay,$old_essays)=@_; |
my ($uname,$udom,$symb,$uessay)=@_; |
|
|
|
unless ($symb) { return ''; } |
|
|
|
unless (ref($old_essays{$symb}) eq 'HASH') { return ''; } |
|
|
# ignore spaces and punctuation |
# ignore spaces and punctuation |
|
|
Line 755 sub most_similar {
|
Line 761 sub most_similar {
|
my $scrsid=''; |
my $scrsid=''; |
my $sessay=''; |
my $sessay=''; |
# go through all essays ... |
# go through all essays ... |
foreach my $tkey (keys(%$old_essays)) { |
foreach my $tkey (keys(%{$old_essays{$symb}})) { |
my ($tname,$tdom,$tcrsid)=map {&unescape($_)} (split(/\./,$tkey)); |
my ($tname,$tdom,$tcrsid)=map {&unescape($_)} (split(/\./,$tkey)); |
# ... except the same student |
# ... except the same student |
next if (($tname eq $uname) && ($tdom eq $udom)); |
next if (($tname eq $uname) && ($tdom eq $udom)); |
my $tessay=$old_essays->{$tkey}; |
my $tessay=$old_essays{$symb}{$tkey}; |
$tessay=~s/\W+/ /gs; |
$tessay=~s/\W+/ /gs; |
# String similarity gives up if not even limit |
# String similarity gives up if not even limit |
my $tsimilar=&String::Similarity::similarity($uessay,$tessay,$limit); |
my $tsimilar=&String::Similarity::similarity($uessay,$tessay,$limit); |
Line 769 sub most_similar {
|
Line 775 sub most_similar {
|
$sname=$tname; |
$sname=$tname; |
$sdom=$tdom; |
$sdom=$tdom; |
$scrsid=$tcrsid; |
$scrsid=$tcrsid; |
$sessay=$old_essays->{$tkey}; |
$sessay=$old_essays{$symb}{$tkey}; |
} |
} |
} |
} |
if ($limit>0.6) { |
if ($limit>0.6) { |
Line 2009 sub submission {
|
Line 2015 sub submission {
|
'" src="'.$request->dir_config('lonIconsURL'). |
'" src="'.$request->dir_config('lonIconsURL'). |
'/check.gif" height="16" border="0" />'; |
'/check.gif" height="16" border="0" />'; |
|
|
my %old_essays; |
|
# header info |
# header info |
if ($counter == 0) { |
if ($counter == 0) { |
&sub_page_js($request); |
&sub_page_js($request); |
Line 2106 sub submission {
|
Line 2111 sub submission {
|
keyw => 'Keyword Options', |
keyw => 'Keyword Options', |
list => 'List', |
list => 'List', |
past => 'Paste Selection to List', |
past => 'Paste Selection to List', |
high => 'Hightlight Attribute', |
high => 'Highlight Attribute', |
); |
); |
# |
# |
# Print out the keyword options line |
# Print out the keyword options line |
Line 2125 KEYWORDS
|
Line 2130 KEYWORDS
|
my ($adom,$aname,$apath)=($essayurl=~/^($LONCAPA::domain_re)\/($LONCAPA::username_re)\/(.*)$/); |
my ($adom,$aname,$apath)=($essayurl=~/^($LONCAPA::domain_re)\/($LONCAPA::username_re)\/(.*)$/); |
$apath=&escape($apath); |
$apath=&escape($apath); |
$apath=~s/\W/\_/gs; |
$apath=~s/\W/\_/gs; |
%old_essays=&Apache::lonnet::dump('nohist_essay_'.$apath,$adom,$aname); |
&init_old_essays($symb,$apath,$adom,$aname); |
} |
} |
} |
} |
|
|
Line 2262 KEYWORDS
|
Line 2267 KEYWORDS
|
} |
} |
if($env{'form.checkPlag'}){ |
if($env{'form.checkPlag'}){ |
my ($oname,$odom,$ocrsid,$oessay,$osim)= |
my ($oname,$odom,$ocrsid,$oessay,$osim)= |
&most_similar($uname,$udom,$subval,\%old_essays); |
&most_similar($uname,$udom,$symb,$subval); |
if ($osim) { |
if ($osim) { |
$osim=int($osim*100.0); |
$osim=int($osim*100.0); |
my %old_course_desc = |
my %old_course_desc = |
Line 2468 sub check_collaborators {
|
Line 2473 sub check_collaborators {
|
(split(/[,;\s]+/,$record->{'resource.'.$part.'.collaborators'})) { |
(split(/[,;\s]+/,$record->{'resource.'.$part.'.collaborators'})) { |
$possible_collaborator =~ s/[\$\^\(\)]//g; |
$possible_collaborator =~ s/[\$\^\(\)]//g; |
next if ($possible_collaborator eq ''); |
next if ($possible_collaborator eq ''); |
my ($co_name,$co_dom) = split(/\@|:/,$possible_collaborator); |
my ($co_name,$co_dom) = split(/:/,$possible_collaborator); |
$co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i); |
$co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i); |
next if ($co_name eq $uname && $co_dom eq $udom); |
next if ($co_name eq $uname && $co_dom eq $udom); |
# Doing this grep allows 'fuzzy' specification |
# Doing this grep allows 'fuzzy' specification |
Line 2481 sub check_collaborators {
|
Line 2486 sub check_collaborators {
|
} |
} |
} |
} |
if (scalar(@good_collaborators) != 0) { |
if (scalar(@good_collaborators) != 0) { |
$result.='<br />'.&mt('Collaborators: ').'<ol>'; |
$result.='<br />'.&mt('Collaborators:').'<ol>'; |
foreach my $name (@good_collaborators) { |
foreach my $name (@good_collaborators) { |
my ($lastname,$givenn) = split(/,/,$$fullname{$name}); |
my ($lastname,$givenn) = split(/,/,$$fullname{$name}); |
push(@col_fullnames, $givenn.' '.$lastname); |
push(@col_fullnames, $givenn.' '.$lastname); |
Line 4993 sub updateGradeByPage {
|
Line 4998 sub updateGradeByPage {
|
from the file that we are parsing that represents one entire sheet |
from the file that we are parsing that represents one entire sheet |
|
|
'bubble line' refers to the data |
'bubble line' refers to the data |
representing the line of bubbles that are on the physical bubble sheet |
representing the line of bubbles that are on the physical bubblesheet |
|
|
|
|
The overall process is that a scanned in bubble sheet data is uploaded |
The overall process is that a scanned in bubblesheet data is uploaded |
into a course. When a user wants to grade, they select a |
into a course. When a user wants to grade, they select a |
sequence/folder of resources, a file of bubble sheet info, and pick |
sequence/folder of resources, a file of bubblesheet info, and pick |
one of the predefined configurations for what each scanline looks |
one of the predefined configurations for what each scanline looks |
like. |
like. |
|
|
Line 5014 username:domain.
|
Line 5019 username:domain.
|
|
|
During the validation phase the instructor can choose to skip scanlines. |
During the validation phase the instructor can choose to skip scanlines. |
|
|
After the validation phase, there are now 3 bubble sheet files |
After the validation phase, there are now 3 bubblesheet files |
|
|
scantron_original_filename (unmodified original file) |
scantron_original_filename (unmodified original file) |
scantron_corrected_filename (file where the corrected information has replaced the original information) |
scantron_corrected_filename (file where the corrected information has replaced the original information) |
scantron_skipped_filename (contains the exact text of scanlines that where skipped) |
scantron_skipped_filename (contains the exact text of scanlines that where skipped) |
|
|
Also there is a separate hash nohist_scantrondata that contains extra |
Also there is a separate hash nohist_scantrondata that contains extra |
correction information that isn't representable in the bubble sheet |
correction information that isn't representable in the bubblesheet |
file (see &scantron_getfile() for more information) |
file (see &scantron_getfile() for more information) |
|
|
After all scanlines are either valid, marked as valid or skipped, then |
After all scanlines are either valid, marked as valid or skipped, then |
Line 5318 sub scantron_CODEunique {
|
Line 5323 sub scantron_CODEunique {
|
|
|
=item scantron_selectphase |
=item scantron_selectphase |
|
|
Generates the initial screen to start the bubble sheet process. |
Generates the initial screen to start the bubblesheet process. |
Allows for - starting a grading run. |
Allows for - starting a grading run. |
- downloading existing scan data (original, corrected |
- downloading existing scan data (original, corrected |
or skipped info) |
or skipped info) |
Line 6341 sub remember_current_skipped {
|
Line 6346 sub remember_current_skipped {
|
=item check_for_error |
=item check_for_error |
|
|
Checks if there was an error when attempting to remove a specific |
Checks if there was an error when attempting to remove a specific |
scantron_.. bubble sheet data file. Prints out an error if |
scantron_.. bubblesheet data file. Prints out an error if |
something went wrong. |
something went wrong. |
|
|
=cut |
=cut |
Line 6420 sub scantron_do_warning {
|
Line 6425 sub scantron_do_warning {
|
$r->print('<p><span class="LC_error">'.&mt("You have not selected a file that contains the student's response data.").'</span></p>'); |
$r->print('<p><span class="LC_error">'.&mt("You have not selected a file that contains the student's response data.").'</span></p>'); |
} |
} |
if ( $env{'form.scantron_format'} eq '') { |
if ( $env{'form.scantron_format'} eq '') { |
$r->print('<p><span class="LC_error">'.&mt(:You have not selected the format of the student's response data.").'</span></p>'); |
$r->print('<p><span class="LC_error">'.&mt("You have not selected the format of the student's response data.").'</span></p>'); |
} |
} |
} else { |
} else { |
my $warning=&scantron_warning_screen('Grading: Validate Records'); |
my $warning=&scantron_warning_screen('Grading: Validate Records'); |
Line 6477 SCANTRONFORM
|
Line 6482 SCANTRONFORM
|
|
|
=item scantron_validate_file |
=item scantron_validate_file |
|
|
Dispatch routine for doing validation of a bubble sheet data file. |
Dispatch routine for doing validation of a bubblesheet data file. |
|
|
Also processes any necessary information resets that need to |
Also processes any necessary information resets that need to |
occur before validation begins (ignore previous corrections, |
occur before validation begins (ignore previous corrections, |
Line 6588 sub scantron_validate_file {
|
Line 6593 sub scantron_validate_file {
|
|
|
=item scantron_remove_file |
=item scantron_remove_file |
|
|
Removes the requested bubble sheet data file, makes sure that |
Removes the requested bubblesheet data file, makes sure that |
scantron_original_<filename> is never removed |
scantron_original_<filename> is never removed |
|
|
|
|
Line 6613 sub scantron_remove_file {
|
Line 6618 sub scantron_remove_file {
|
|
|
=item scantron_remove_scan_data |
=item scantron_remove_scan_data |
|
|
Removes all scan_data correction for the requested bubble sheet |
Removes all scan_data correction for the requested bubblesheet |
data file. (In the case that both the are doing skipped records we need |
data file. (In the case that both the are doing skipped records we need |
to remember the old skipped lines for the time being so that element |
to remember the old skipped lines for the time being so that element |
persists for a while.) |
persists for a while.) |
Line 6650 sub scantron_remove_scan_data {
|
Line 6655 sub scantron_remove_scan_data {
|
|
|
=item scantron_getfile |
=item scantron_getfile |
|
|
Fetches the requested bubble sheet data file (all 3 versions), and |
Fetches the requested bubblesheet data file (all 3 versions), and |
the scan_data hash |
the scan_data hash |
|
|
Arguments: |
Arguments: |
Line 6750 sub lonnet_putfile {
|
Line 6755 sub lonnet_putfile {
|
|
|
=item scantron_putfile |
=item scantron_putfile |
|
|
Stores the current version of the bubble sheet data files, and the |
Stores the current version of the bubblesheet data files, and the |
scan_data hash. (Does not modify the original version only the |
scan_data hash. (Does not modify the original version only the |
corrected and skipped versions. |
corrected and skipped versions. |
|
|
Line 6844 sub get_todo_count {
|
Line 6849 sub get_todo_count {
|
|
|
=item scantron_put_line |
=item scantron_put_line |
|
|
Updates the 'corrected' or 'skipped' versions of the bubble sheet |
Updates the 'corrected' or 'skipped' versions of the bubblesheet |
data file. |
data file. |
|
|
Arguments: |
Arguments: |
Line 7033 sub scantron_get_correction {
|
Line 7038 sub scantron_get_correction {
|
#the previous one or the current one |
#the previous one or the current one |
|
|
if ( $$scan_record{'scantron.PaperID'} =~ /\S/) { |
if ( $$scan_record{'scantron.PaperID'} =~ /\S/) { |
$r->print("<p>".&mt("<b>An error was detected ($error)</b>". |
$r->print( |
" for PaperID <tt>[_1]</tt>", |
'<p class="LC_warning">' |
$$scan_record{'scantron.PaperID'})."</p> \n"); |
.&mt('An error was detected ([_1]) for PaperID [_2]', |
|
"<b>$error</b>", |
|
'<tt>'.$$scan_record{'scantron.PaperID'}.'</tt>') |
|
."</p> \n"); |
} else { |
} else { |
$r->print("<p>".&mt("<b>An error was detected ($error)</b>". |
$r->print( |
" in scanline [_1] <pre>[_2]</pre>", |
'<p class="LC_warning">' |
$i,$line)."</p> \n"); |
.&mt('An error was detected ([_1]) in scanline [_2] [_3]', |
} |
"<b>$error</b>", $i, "<pre>$line</pre>") |
my $message="<p>".&mt("The ID on the form is <tt>[_1]</tt><br />". |
."</p> \n"); |
"The name on the paper is [_2],[_3]", |
} |
$$scan_record{'scantron.ID'}, |
my $message = |
$$scan_record{'scantron.LastName'}, |
'<p>' |
$$scan_record{'scantron.FirstName'})."</p>"; |
.&mt('The ID on the form is [_1]', |
|
"<tt>$$scan_record{'scantron.ID'}</tt>") |
|
.'<br />' |
|
.&mt('The name on the paper is [_1], [_2]', |
|
$$scan_record{'scantron.LastName'}, |
|
$$scan_record{'scantron.FirstName'}) |
|
.'</p>'; |
|
|
$r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n"); |
$r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n"); |
$r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n"); |
$r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n"); |
Line 7055 sub scantron_get_correction {
|
Line 7069 sub scantron_get_correction {
|
|
|
if ($error =~ /ID$/) { |
if ($error =~ /ID$/) { |
if ($error eq 'incorrectID') { |
if ($error eq 'incorrectID') { |
$r->print("<p>".&mt("The encoded ID is not in the classlist"). |
$r->print('<p class="LC_warning">'.&mt("The encoded ID is not in the classlist"). |
"</p>\n"); |
"</p>\n"); |
} elsif ($error eq 'duplicateID') { |
} elsif ($error eq 'duplicateID') { |
$r->print("<p>".&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."</p>\n"); |
} |
} |
$r->print($message); |
$r->print($message); |
$r->print("<p>".&mt("How should I handle this?")." <br /> \n"); |
$r->print("<p>".&mt("How should I handle this?")." <br /> \n"); |
Line 7074 sub scantron_get_correction {
|
Line 7088 sub scantron_get_correction {
|
$r->print('</li>'); |
$r->print('</li>'); |
} elsif ($error =~ /CODE$/) { |
} elsif ($error =~ /CODE$/) { |
if ($error eq 'incorrectCODE') { |
if ($error eq 'incorrectCODE') { |
$r->print("<p>".&mt("The encoded CODE is not in the list of possible CODEs.")."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("The encoded CODE is not in the list of possible CODEs.")."</p>\n"); |
} elsif ($error eq 'duplicateCODE') { |
} elsif ($error eq 'duplicateCODE') { |
$r->print("<p>".&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."</p>\n"); |
} |
} |
$r->print("<p>".&mt("The CODE on the form is <tt>'[_1]'</tt>", |
$r->print("<p>".&mt('The CODE on the form is [_1]', |
$$scan_record{'scantron.CODE'})."<br />\n"); |
"<tt>'$$scan_record{'scantron.CODE'}'</tt>") |
|
."</p>\n"); |
$r->print($message); |
$r->print($message); |
$r->print("<p>".&mt("How should I handle this?")." <br /> \n"); |
$r->print("<p>".&mt("How should I handle this?")."</p>\n"); |
$r->print("\n<br /> "); |
$r->print("\n<br /> "); |
my $i=0; |
my $i=0; |
if ($error eq 'incorrectCODE' |
if ($error eq 'incorrectCODE' |
Line 7108 sub scantron_get_correction {
|
Line 7123 sub scantron_get_correction {
|
$r->print(" |
$r->print(" |
<label> |
<label> |
<input type='radio' name='scantron_CODE_resolution' value='use_unfound'$checked /> |
<input type='radio' name='scantron_CODE_resolution' value='use_unfound'$checked /> |
".&mt("Use the CODE [_1] that is was on the paper, ignoring the error.", |
".&mt("Use the CODE [_1] that was on the paper, ignoring the error.", |
"<b><tt>".$$scan_record{'scantron.CODE'}."</tt></b>")." |
"<b><tt>".$$scan_record{'scantron.CODE'}."</tt></b>")." |
</label>"); |
</label>"); |
$r->print("\n<br />"); |
$r->print("\n<br />"); |
Line 7148 ENDSCRIPT
|
Line 7163 ENDSCRIPT
|
"</label><input type='text' size='8' name='scantron_CODE_newvalue' onfocus=\"javascript:change_radio('use_typed')\" onkeypress=\"javascript:change_radio('use_typed')\" />")); |
"</label><input type='text' size='8' name='scantron_CODE_newvalue' onfocus=\"javascript:change_radio('use_typed')\" onkeypress=\"javascript:change_radio('use_typed')\" />")); |
$r->print("\n<br /><br />"); |
$r->print("\n<br /><br />"); |
} elsif ($error eq 'doublebubble') { |
} elsif ($error eq 'doublebubble') { |
$r->print("<p>".&mt("There have been multiple bubbles scanned for some question(s)")."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("There have been multiple bubbles scanned for some question(s)")."</p>\n"); |
|
|
# The form field scantron_questions is acutally a list of line numbers. |
# The form field scantron_questions is acutally a list of line numbers. |
# represented by this form so: |
# represented by this form so: |
Line 7166 ENDSCRIPT
|
Line 7181 ENDSCRIPT
|
} |
} |
$r->print(&verify_bubbles_checked(@lines_to_correct)); |
$r->print(&verify_bubbles_checked(@lines_to_correct)); |
} elsif ($error eq 'missingbubble') { |
} elsif ($error eq 'missingbubble') { |
$r->print("<p>".&mt("There have been <b>no</b> bubbles scanned for some question(s)")."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("There have been [_1]no[_2] bubbles scanned for some question(s)",'<b>','</b>')."</p>\n"); |
$r->print($message); |
$r->print($message); |
$r->print("<p>".&mt("Please indicate which bubble should be used for grading.")."</p>"); |
$r->print("<p>".&mt("Please indicate which bubble should be used for grading.")."</p>"); |
$r->print(&mt("Some questions have no scanned bubbles.")."\n"); |
$r->print(&mt("Some questions have no scanned bubbles.")."\n"); |
Line 7969 SCANTRONFORM
|
Line 7984 SCANTRONFORM
|
$studentrecord .= $recording; |
$studentrecord .= $recording; |
} |
} |
if ($studentrecord ne $studentdata) { |
if ($studentrecord ne $studentdata) { |
$r->print('<p><span class="LC_error">'); |
$r->print('<p><span class="LC_warning">'); |
if ($scancode eq '') { |
if ($scancode eq '') { |
$r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2].', |
$r->print(&mt('Mismatch grading bubblesheet for user: [_1] with ID: [_2].', |
$uname.':'.$udom,$scan_record->{'scantron.ID'})); |
$uname.':'.$udom,$scan_record->{'scantron.ID'})); |
} else { |
} else { |
$r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2] and CODE: [_3].', |
$r->print(&mt('Mismatch grading bubblesheet for user: [_1] with ID: [_2] and CODE: [_3].', |
$uname.':'.$udom,$scan_record->{'scantron.ID'},$scancode)); |
$uname.':'.$udom,$scan_record->{'scantron.ID'},$scancode)); |
} |
} |
$r->print('</span><br />'.&Apache::loncommon::start_data_table()."\n". |
$r->print('</span><br />'.&Apache::loncommon::start_data_table()."\n". |
Line 7982 SCANTRONFORM
|
Line 7997 SCANTRONFORM
|
'<th>'.&mt('Source').'</th><th>'.&mt('Bubbled responses').'</th>'. |
'<th>'.&mt('Source').'</th><th>'.&mt('Bubbled responses').'</th>'. |
&Apache::loncommon::end_data_table_header_row()."\n". |
&Apache::loncommon::end_data_table_header_row()."\n". |
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td>'.&mt('Bubble Sheet').'</td>'. |
'<td>'.&mt('Bubblesheet').'</td>'. |
'<td><span class="LC_nobreak">'.$studentdata.'</span></td>'. |
'<td><span class="LC_nobreak">'.$studentdata.'</span></td>'. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td>Stored submissions</td>'. |
'<td>'.&mt('Stored submissions').'</td>'. |
'<td><span class="LC_nobreak">'.$studentrecord.'</span></td>'."\n". |
'<td><span class="LC_nobreak">'.$studentrecord.'</span></td>'."\n". |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table().'</p>'); |
&Apache::loncommon::end_data_table().'</p>'); |
Line 8454 sub checkscantron_results {
|
Line 8469 sub checkscantron_results {
|
} |
} |
} |
} |
$r->print('<p>'. |
$r->print('<p>'. |
&mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for [_1][quant,_2,student][_3] ([_4] bubblesheet lines/student).', |
&mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for [_1][quant,_2,student][_3] ([quant,_4,bubblesheet line] per student).', |
'<b>', |
'<b>', |
$numstudents, |
$numstudents, |
'</b>', |
'</b>', |
Line 8954 sub init_perm {
|
Line 8969 sub init_perm {
|
} |
} |
} |
} |
|
|
|
sub init_old_essays { |
|
my ($symb,$apath,$adom,$aname) = @_; |
|
if ($symb ne '') { |
|
my %essays = &Apache::lonnet::dump('nohist_essay_'.$apath,$adom,$aname); |
|
if (keys(%essays) > 0) { |
|
$old_essays{$symb} = \%essays; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub reset_old_essays { |
|
undef(%old_essays); |
|
} |
|
|
sub gather_clicker_ids { |
sub gather_clicker_ids { |
my %clicker_ids; |
my %clicker_ids; |
|
|
Line 9372 sub assign_clicker_grades {
|
Line 9402 sub assign_clicker_grades {
|
# FIXME: This should probably look for the first handgradeable part |
# FIXME: This should probably look for the first handgradeable part |
my $part=$$partlist[0]; |
my $part=$$partlist[0]; |
# Start screen output |
# Start screen output |
my ($result) = &showResourceInfo($symb,$env{'form.probTitle'}).'<br />'; |
my ($result) = &showResourceInfo($symb,$env{'form.probTitle'}); |
|
|
$result .= &Apache::loncommon::start_data_table(). |
$result .= '<br />'. |
|
&Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
'<th>'.&mt('Assigning grades based on clicker file').'</th>'. |
'<th>'.&mt('Assigning grades based on clicker file').'</th>'. |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::end_data_table_header_row(). |
Line 9520 sub handler {
|
Line 9551 sub handler {
|
$ssi_error = 0; |
$ssi_error = 0; |
my $brcrum = [{href=>"/adm/grades",text=>"Grading"}]; |
my $brcrum = [{href=>"/adm/grades",text=>"Grading"}]; |
my $start_page = &Apache::loncommon::start_page('Grading',undef, |
my $start_page = &Apache::loncommon::start_page('Grading',undef, |
{'bread_crumbs' => $brcrum})); |
{'bread_crumbs' => $brcrum}); |
if ($symb eq '' && $command eq '') { |
if ($symb eq '' && $command eq '') { |
if ($env{'user.adv'}) { |
if ($env{'user.adv'}) { |
&Apache::loncommon::content_type($request,'text/html'); |
&Apache::loncommon::content_type($request,'text/html'); |
Line 9562 sub handler {
|
Line 9593 sub handler {
|
} else { |
} else { |
&init_perm(); |
&init_perm(); |
if (!$env{'request.course.id'}) { |
if (!$env{'request.course.id'}) { |
# Not in a course. |
unless ((&Apache::lonnet::allowed('usc',$env{'request.role.domain'})) && |
$env{'user.error.msg'}="/adm/grades::vgr:0:0:Cannot display grades page outside course context"; |
($command =~ /^scantronupload/)) { |
return HTTP_NOT_ACCEPTABLE; |
# Not in a course. |
|
$env{'user.error.msg'}="/adm/grades::vgr:0:0:Cannot display grades page outside course context"; |
|
return HTTP_NOT_ACCEPTABLE; |
|
} |
} elsif (!%perm) { |
} elsif (!%perm) { |
$request->internal_redirect('/adm/quickgrades'); |
$request->internal_redirect('/adm/quickgrades'); |
} |
} |
Line 9775 ssi_with_retries()
|
Line 9809 ssi_with_retries()
|
|
|
=item scantron_process_students() : |
=item scantron_process_students() : |
|
|
Routine that does the actual grading of the bubble sheet information. |
Routine that does the actual grading of the bubblesheet information. |
|
|
The parsed scanline hash is added to %env |
The parsed scanline hash is added to %env |
|
|
Line 9795 ssi_with_retries()
|
Line 9829 ssi_with_retries()
|
|
|
=item scantron_upload_scantron_data() : |
=item scantron_upload_scantron_data() : |
|
|
Creates the screen for adding a new bubble sheet data file to a course. |
Creates the screen for adding a new bubblesheet data file to a course. |
|
|
=item scantron_upload_scantron_data_save() : |
=item scantron_upload_scantron_data_save() : |
|
|
Line 9809 ssi_with_retries()
|
Line 9843 ssi_with_retries()
|
=item scantron_download_scantron_data() : |
=item scantron_download_scantron_data() : |
|
|
Shows a list of the three internal files (original, corrected, |
Shows a list of the three internal files (original, corrected, |
skipped) for a specific bubble sheet data file that exists in the |
skipped) for a specific bubblesheet data file that exists in the |
course. |
course. |
|
|
=item scantron_validate_ID() : |
=item scantron_validate_ID() : |