version 1.662, 2011/10/17 12:41:34
|
version 1.667, 2011/12/21 21:25:36
|
Line 6226 sub scantron_warning_screen {
|
Line 6226 sub scantron_warning_screen {
|
'<tr><td><b>'.&mt('List of CODES to validate against:').'</b></td><td><tt>'. |
'<tr><td><b>'.&mt('List of CODES to validate against:').'</b></td><td><tt>'. |
$env{'form.scantron_CODElist'}.'</tt></td></tr>'; |
$env{'form.scantron_CODElist'}.'</tt></td></tr>'; |
} |
} |
|
my $lastbubblepoints; |
|
if ($env{'form.scantron_lastbubblepoints'} ne '') { |
|
$lastbubblepoints = |
|
'<tr><td><b>'.&mt('Hand-graded items: points from last bubble in row').'</b></td><td><tt>'. |
|
$env{'form.scantron_lastbubblepoints'}.'</tt></td></tr>'; |
|
} |
return (' |
return (' |
<p> |
<p> |
<span class="LC_warning"> |
<span class="LC_warning"> |
Line 6234 sub scantron_warning_screen {
|
Line 6240 sub scantron_warning_screen {
|
<table> |
<table> |
<tr><td><b>'.&mt('Sequence to be Graded:').'</b></td><td>'.$title.'</td></tr> |
<tr><td><b>'.&mt('Sequence to be Graded:').'</b></td><td>'.$title.'</td></tr> |
<tr><td><b>'.&mt('Data File that will be used:').'</b></td><td><tt>'.$env{'form.scantron_selectfile'}.'</tt></td></tr> |
<tr><td><b>'.&mt('Data File that will be used:').'</b></td><td><tt>'.$env{'form.scantron_selectfile'}.'</tt></td></tr> |
'.$CODElist.' |
'.$CODElist.$lastbubblepoints.' |
</table> |
</table> |
<p> '.&mt('If this information is correct, please click on \'[_1]\'.',&mt($button_text)).'<br /> |
<p> '.&mt('If this information is correct, please click on \'[_1]\'.',&mt($button_text)).'<br /> |
'.&mt('If something is incorrect, please return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','<a href="/adm/grades?symb='.$symb.'&command=scantron_selectphase" class="LC_info">','</a>').'</p> |
'.&mt('If something is incorrect, please return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','<a href="/adm/grades?symb='.$symb.'&command=scantron_selectphase" class="LC_info">','</a>').'</p> |
Line 6272 sub scantron_do_warning {
|
Line 6278 sub scantron_do_warning {
|
} |
} |
} else { |
} else { |
my $warning=&scantron_warning_screen('Grading: Validate Records',$symb); |
my $warning=&scantron_warning_screen('Grading: Validate Records',$symb); |
|
my $bubbledbyhand=&hand_bubble_option(); |
$r->print(' |
$r->print(' |
'.$warning.' |
'.$warning.$bubbledbyhand.' |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
'); |
'); |
Line 6369 sub scantron_validate_file {
|
Line 6376 sub scantron_validate_file {
|
return ''; |
return ''; |
} |
} |
my $result=&scantron_form_start($max_bubble).$default_form_data; |
my $result=&scantron_form_start($max_bubble).$default_form_data; |
|
if ($env{'form.scantron_lastbubblepoints'} ne '') { |
|
$result .= '<input type="hidden" name="scantron_lastbubblepoints" value="'.$env{'form.scantron_lastbubblepoints'}.'" />'; |
|
} |
$r->print($result); |
$r->print($result); |
|
|
my @validate_phases=( 'sequence', |
my @validate_phases=( 'sequence', |
Line 6899 sub scantron_get_correction {
|
Line 6909 sub scantron_get_correction {
|
.&mt('The ID on the form is [_1]', |
.&mt('The ID on the form is [_1]', |
"<tt>$$scan_record{'scantron.ID'}</tt>") |
"<tt>$$scan_record{'scantron.ID'}</tt>") |
.'<br />' |
.'<br />' |
.&mt('The name on the paper is [_2], [_3]', |
.&mt('The name on the paper is [_1], [_2]', |
$$scan_record{'scantron.LastName'}, |
$$scan_record{'scantron.LastName'}, |
$$scan_record{'scantron.FirstName'}) |
$$scan_record{'scantron.FirstName'}) |
.'</p>'; |
.'</p>'; |
Line 7641 sub scantron_validate_missingbubbles {
|
Line 7651 sub scantron_validate_missingbubbles {
|
return (0,$currentphase+1); |
return (0,$currentphase+1); |
} |
} |
|
|
|
sub hand_bubble_option { |
|
my (undef, undef, $sequence) = |
|
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
|
return if ($sequence eq ''); |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
unless (ref($navmap)) { |
|
return; |
|
} |
|
my $needs_hand_bubbles; |
|
my $map=$navmap->getResourceByUrl($sequence); |
|
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
|
foreach my $res (@resources) { |
|
if (ref($res)) { |
|
if ($res->is_problem()) { |
|
my $partlist = $res->parts(); |
|
foreach my $part (@{ $partlist }) { |
|
my @types = $res->responseType($part); |
|
if (grep(/^(chem|essay|image|formula|math|string|functionplot)$/,@types)) { |
|
$needs_hand_bubbles = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($needs_hand_bubbles) { |
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
|
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
|
return &mt('The sequence to be graded contains response types which are handgraded.').'<p>'. |
|
&mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?','<br />'). |
|
'<label><input type="radio" name="scantron_lastbubblepoints" value="'.$bubbles_per_row.'" checked="checked" />'.&mt('[quant,_1,point]',$bubbles_per_row).'</label> '.&mt('or').' '. |
|
'<label><input type="radio" name="scantron_lastbubblepoints" value="0"/>0 points</label></p>'; |
|
} |
|
return; |
|
} |
|
|
sub scantron_process_students { |
sub scantron_process_students { |
my ($r,$symb) = @_; |
my ($r,$symb) = @_; |
Line 7705 SCANTRONFORM
|
Line 7750 SCANTRONFORM
|
|
|
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $count=&get_todo_count($scanlines,$scan_data); |
my $count=&get_todo_count($scanlines,$scan_data); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Bubblesheet Status', |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count); |
'Bubblesheet Progress',$count, |
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,'Processing first student'); |
'inline',undef,'scantronupload'); |
|
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
|
'Processing first student'); |
|
$r->print('<br />'); |
$r->print('<br />'); |
my $start=&Time::HiRes::time(); |
my $start=&Time::HiRes::time(); |
my $i=-1; |
my $i=-1; |
Line 7741 SCANTRONFORM
|
Line 7783 SCANTRONFORM
|
my $line=&scantron_get_line($scanlines,$scan_data,$i); |
my $line=&scantron_get_line($scanlines,$scan_data,$i); |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($started) { |
if ($started) { |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); |
'last student'); |
|
} |
} |
$started=1; |
$started=1; |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
Line 7932 sub grade_student_bubbles {
|
Line 7973 sub grade_student_bubbles {
|
if ($bubbles_per_row ne '') { |
if ($bubbles_per_row ne '') { |
$form{'bubbles_per_row'} = $bubbles_per_row; |
$form{'bubbles_per_row'} = $bubbles_per_row; |
} |
} |
|
if ($env{'form.scantron_lastbubblepoints'} ne '') { |
|
$form{'scantron_lastbubblepoints'} = $env{'form.scantron_lastbubblepoints'}; |
|
} |
if (ref($parts) eq 'HASH') { |
if (ref($parts) eq 'HASH') { |
if (ref($parts->{$ressymb}) eq 'ARRAY') { |
if (ref($parts->{$ressymb}) eq 'ARRAY') { |
foreach my $part (@{$parts->{$ressymb}}) { |
foreach my $part (@{$parts->{$ressymb}}) { |
Line 8230 sub checkscantron_results {
|
Line 8274 sub checkscantron_results {
|
my %completedstudents; |
my %completedstudents; |
|
|
my $count=&Apache::grades::get_todo_count($scanlines,$scan_data); |
my $count=&Apache::grades::get_todo_count($scanlines,$scan_data); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Bubblesheet/Submissions Comparison Status', |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count); |
'Progress of Bubblesheet Data/Submission Records Comparison',$count, |
|
'inline',undef,'checkscantron'); |
|
my ($username,$domain,$started); |
my ($username,$domain,$started); |
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. |
Line 8241 sub checkscantron_results {
|
Line 8283 sub checkscantron_results {
|
return ''; |
return ''; |
} |
} |
|
|
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,'Processing first student'); |
'Processing first student'); |
|
my $start=&Time::HiRes::time(); |
my $start=&Time::HiRes::time(); |
my $i=-1; |
my $i=-1; |
|
|
Line 8252 sub checkscantron_results {
|
Line 8293 sub checkscantron_results {
|
my $line=&Apache::grades::scantron_get_line($scanlines,$scan_data,$i); |
my $line=&Apache::grades::scantron_get_line($scanlines,$scan_data,$i); |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($started) { |
if ($started) { |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); |
'last student'); |
|
} |
} |
$started=1; |
$started=1; |
my $scan_record= |
my $scan_record= |
Line 8865 sub process_clicker {
|
Line 8905 sub process_clicker {
|
my $pincorrect=&mt("Percentage points for incorrect solution"); |
my $pincorrect=&mt("Percentage points for incorrect solution"); |
my $selectform=&Apache::loncommon::select_form($env{'form.upfiletype'},'upfiletype', |
my $selectform=&Apache::loncommon::select_form($env{'form.upfiletype'},'upfiletype', |
{'iclicker' => 'i>clicker', |
{'iclicker' => 'i>clicker', |
'interwrite' => 'interwrite PRS'}); |
'interwrite' => 'interwrite PRS', |
|
'turning' => 'Turning Technologies'}); |
$symb = &Apache::lonenc::check_encrypt($symb); |
$symb = &Apache::lonenc::check_encrypt($symb); |
$result.= &Apache::lonhtmlcommon::scripttag(<<ENDUPFORM); |
$result.= &Apache::lonhtmlcommon::scripttag(<<ENDUPFORM); |
function sanitycheck() { |
function sanitycheck() { |
Line 9039 ENDHEADER
|
Line 9080 ENDHEADER
|
if ($env{'form.upfiletype'} eq 'interwrite') { |
if ($env{'form.upfiletype'} eq 'interwrite') { |
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses); |
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses); |
} |
} |
|
if ($env{'form.upfiletype'} eq 'turning') { |
|
($errormsg,$number)=&turning_eval(\@questiontitles,\%responses); |
|
} |
$result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'. |
$result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'. |
'<input type="hidden" name="number" value="'.$number.'" />'. |
'<input type="hidden" name="number" value="'.$number.'" />'. |
&mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses', |
&mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses', |
Line 9175 sub interwrite_eval {
|
Line 9219 sub interwrite_eval {
|
return ($errormsg,$number); |
return ($errormsg,$number); |
} |
} |
|
|
|
sub turning_eval { |
|
my ($questiontitles,$responses)=@_; |
|
my $number=0; |
|
my $errormsg=''; |
|
foreach my $line (split(/[\n\r]/,$env{'form.upfile'})) { |
|
my %components=&Apache::loncommon::record_sep($line); |
|
my @entries=map {$components{$_}} (sort(keys(%components))); |
|
if ($#entries>$number) { $number=$#entries; } |
|
my $id=$entries[0]; |
|
my @idresponses; |
|
$id=~s/^[\#0]+//; |
|
unless ($id) { next; } |
|
for (my $idx=1;$idx<=$#entries;$idx++) { |
|
$entries[$idx]=~s/\,/\;/g; |
|
$entries[$idx]=~s/[^a-zA-Z0-9\.\*\-\+\;]+//g; |
|
push(@idresponses,$entries[$idx]); |
|
} |
|
$$responses{$id}=join(',',@idresponses); |
|
} |
|
for (my $i=1; $i<=$number; $i++) { |
|
$$questiontitles[$i]=&mt('Question [_1]',$i); |
|
} |
|
return ($errormsg,$number); |
|
} |
|
|
|
|
sub assign_clicker_grades { |
sub assign_clicker_grades { |
my ($r,$symb)=@_; |
my ($r,$symb)=@_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
Line 9340 sub handler {
|
Line 9410 sub handler {
|
} |
} |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); |
|
|
|
# see what command we need to execute |
|
|
|
my @commands=&Apache::loncommon::get_env_multiple('form.command'); |
|
my $command=$commands[0]; |
|
|
&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'); |
} |
} |
&Apache::loncommon::content_type($request,'text/html'); |
&Apache::loncommon::content_type($request,'text/html'); |
$request->send_http_header; |
$request->send_http_header; |
|
|
|
|
# see what command we need to execute |
|
|
|
my @commands=&Apache::loncommon::get_env_multiple('form.command'); |
|
my $command=$commands[0]; |
|
|
|
if ($#commands > 0) { |
if ($#commands > 0) { |
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands)); |
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands)); |
} |
} |