version 1.767, 2020/05/08 13:49:02
|
version 1.772, 2020/08/29 16:39:00
|
Line 1589 INNERJS
|
Line 1589 INNERJS
|
if (document.getSelection) txt = document.getSelection(); |
if (document.getSelection) txt = document.getSelection(); |
else if (document.selection) txt = document.selection.createRange().text; |
else if (document.selection) txt = document.selection.createRange().text; |
else return; |
else return; |
|
if (typeof(txt) != 'string') { |
|
txt = String(txt); |
|
} |
var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); |
var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); |
if (cleantxt=="") { |
if (cleantxt=="") { |
alert("$js_lt{'plse'}"); |
alert("$js_lt{'plse'}"); |
Line 4198 sub editgrades {
|
Line 4201 sub editgrades {
|
|
|
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
my $title='<h2>'.&mt('Current Grade Status').'</h2>'; |
my $title='<h2>'.&mt('Current Grade Status').'</h2>'; |
$title.='<h4>'.&mt('<b>Section: </b>[_1]',$section_display).'</h4>'."\n"; |
$title.='<h4><b>'.&mt('Section:').'</b> '.$section_display.'</h4>'."\n"; |
|
|
my $result= &Apache::loncommon::start_data_table(). |
my $result= &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
Line 4641 ENDUPFORM
|
Line 4644 ENDUPFORM
|
|
|
|
|
sub csvuploadmap { |
sub csvuploadmap { |
my ($request,$symb)= @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
|
|
my $datatoken; |
my $datatoken; |
Line 5310 sub displaySubByDates {
|
Line 5313 sub displaySubByDates {
|
} |
} |
my @matchKey; |
my @matchKey; |
if ($isTask) { |
if ($isTask) { |
@matchKey = sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys); |
@matchKey = sort(grep(/^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys)); |
} elsif ($is_tool) { |
} elsif ($is_tool) { |
@matchKey = sort(grep /^resource\.\Q$partid\E\.awarded$/,@versionKeys); |
@matchKey = sort(grep(/^resource\.\Q$partid\E\.awarded$/,@versionKeys)); |
} else { |
} else { |
@matchKey = sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys); |
@matchKey = sort(grep(/^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys)); |
} |
} |
# next if ($$record{"$version:resource.$partid.solved"} eq ''); |
# next if ($$record{"$version:resource.$partid.solved"} eq ''); |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
Line 5897 sub scantron_selectphase {
|
Line 5900 sub scantron_selectphase {
|
|
|
$ssi_error = 0; |
$ssi_error = 0; |
|
|
if (&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || |
if (&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || $perm{'usc'}) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'})) { |
|
|
|
# Chunk of form to prompt for a scantron file upload. |
# Chunk of form to prompt for a scantron file upload. |
|
|
Line 5906 sub scantron_selectphase {
|
Line 5908 sub scantron_selectphase {
|
<br />'); |
<br />'); |
my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $csec= $env{'request.course.sec'}; |
my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); |
my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); |
&js_escape(\$alertmsg); |
&js_escape(\$alertmsg); |
my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($cdom); |
my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($cdom); |
Line 5921 sub scantron_selectphase {
|
Line 5924 sub scantron_selectphase {
|
<form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> |
<form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> |
'.$default_form_data.' |
'.$default_form_data.' |
<input name="courseid" type="hidden" value="'.$cnum.'" /> |
<input name="courseid" type="hidden" value="'.$cnum.'" /> |
|
<input name="coursesec" type="hidden" value="'.$csec.'" /> |
<input name="domainid" type="hidden" value="'.$cdom.'" /> |
<input name="domainid" type="hidden" value="'.$cdom.'" /> |
<input name="command" value="scantronupload_save" type="hidden" /> |
<input name="command" value="scantronupload_save" type="hidden" /> |
'.&Apache::loncommon::start_data_table('LC_scantron_action').' |
'.&Apache::loncommon::start_data_table('LC_scantron_action').' |
Line 6001 sub scantron_selectphase {
|
Line 6005 sub scantron_selectphase {
|
|
|
$r->print($result); |
$r->print($result); |
|
|
|
|
|
|
# Chunk of the form that prompts to view a scoring office file, |
# Chunk of the form that prompts to view a scoring office file, |
# corrected file, skipped records in a file. |
# corrected file, skipped records in a file. |
|
|
Line 6980 sub scantron_warning_screen {
|
Line 6982 sub scantron_warning_screen {
|
'<tr><td><b>'.&mt('Hand-graded items: points from last bubble in row').'</b></td><td><tt>'. |
'<tr><td><b>'.&mt('Hand-graded items: points from last bubble in row').'</b></td><td><tt>'. |
$env{'form.scantron_lastbubblepoints'}.'</tt></td></tr>'; |
$env{'form.scantron_lastbubblepoints'}.'</tt></td></tr>'; |
} |
} |
return (' |
return ' |
<p> |
<p> |
<span class="LC_warning"> |
<span class="LC_warning"> |
'.&mt("Please double check the information below before clicking on '[_1]'",&mt($button_text)).'</span> |
'.&mt("Please double check the information below before clicking on '[_1]'",&mt($button_text)).'</span> |
Line 6992 sub scantron_warning_screen {
|
Line 6994 sub scantron_warning_screen {
|
</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> |
|
'; |
<br /> |
|
'); |
|
} |
} |
|
|
=pod |
=pod |
Line 7020 sub scantron_do_warning {
|
Line 7020 sub scantron_do_warning {
|
} |
} |
if ( $env{'form.scantron_selectfile'} eq '') { |
if ( $env{'form.scantron_selectfile'} eq '') { |
$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',$symb); |
my $warning=&scantron_warning_screen('Grading: Validate Records',$symb); |
|
my ($checksec,@possibles) = &gradable_sections(); |
|
my $gradesections; |
|
if ($checksec) { |
|
my $file=$env{'form.scantron_selectfile'}; |
|
if (&valid_file($file)) { |
|
my %bysec = &scantron_get_sections(); |
|
my $table; |
|
if ((keys(%bysec) > 1) || ((keys(%bysec) == 1) && ((keys(%bysec))[0] ne $checksec))) { |
|
$gradesections = &mt('Your current role is for section [_1].','<i>'.$checksec.'</i>').'<br />'; |
|
$table = &Apache::loncommon::start_data_table()."\n". |
|
&Apache::loncommon::start_data_table_header_row(). |
|
'<th>'.&mt('Section').'</th><th>'.&mt('Number of records').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row()."\n"; |
|
if ($bysec{'none'}) { |
|
$table .= &Apache::loncommon::start_data_table_row(). |
|
'<td>'.&mt('None').'</td><td>'.$bysec{'none'}.'</td>'. |
|
&Apache::loncommon::end_data_table_row()."\n"; |
|
} |
|
foreach my $sec (sort { $a <=> $b } keys(%bysec)) { |
|
next if ($sec eq 'none'); |
|
$table .= &Apache::loncommon::start_data_table_row(). |
|
'<td>'.$sec.'</td><td>'.$bysec{$sec}.'</td>'. |
|
&Apache::loncommon::end_data_table_row()."\n"; |
|
} |
|
$table .= &Apache::loncommon::end_data_table()."\n"; |
|
$gradesections .= &mt('Sections represented in the bubblesheet data file (based on bubbled student IDs) are as follows:'). |
|
'<p>'.$table.'</p>'; |
|
if (@possibles) { |
|
$gradesections .= '<p>'. |
|
&mt('You have role(s) in [quant,_1,other section,other sections] with privileges to manage grades.', |
|
scalar(@possibles)).'<br />'. |
|
&mt('Check which of those section(s), in addition to section [_1], you wish to grade using this bubblesheet file:', |
|
'<i>'.$checksec.'</i>').' '; |
|
foreach my $sec (sort {$a <=> $b } @possibles) { |
|
$gradesections .= '<label><input type="checkbox" name="scantron_othersections" value="'.$sec.'" />'.$sec.'</label>'.(' 'x2); |
|
} |
|
$gradesections .= '</p>'; |
|
} |
|
} |
|
} else { |
|
$gradesections = '<p class="LC_error">'.&mt('The selected file is unavailable').'</p>'; |
|
} |
|
} |
my $bubbledbyhand=&hand_bubble_option(); |
my $bubbledbyhand=&hand_bubble_option(); |
$r->print(' |
$r->print(' |
'.$warning.$bubbledbyhand.' |
'.$warning.$gradesections.$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 7115 sub scantron_validate_file {
|
Line 7158 sub scantron_validate_file {
|
if ($env{'form.scantron_corrections'}) { |
if ($env{'form.scantron_corrections'}) { |
&scantron_process_corrections($r); |
&scantron_process_corrections($r); |
} |
} |
$r->print('<p>'.&mt('Gathering necessary information.').'</p>');$r->rflush(); |
|
|
$r->print('<p>'.&mt('Gathering necessary information.').'</p>'); |
|
my ($checksec,@gradable); |
|
if ($env{'request.course.sec'}) { |
|
($checksec,my @possibles) = &gradable_sections(); |
|
if ($checksec) { |
|
if (@possibles) { |
|
my @chosensecs = &Apache::loncommon::get_env_multiple('form.scantron_othersections'); |
|
if (@chosensecs) { |
|
foreach my $sec (@chosensecs) { |
|
if (grep(/^\Q$sec\E$/,@possibles)) { |
|
unless (grep(/^\Q$sec\E$/,@gradable)) { |
|
push(@gradable,$sec); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
$r->print('<p><table>'); |
|
if (@gradable) { |
|
my @showsections = sort { $a <=> $b } (@gradable,$checksec); |
|
$r->print( |
|
'<tr><td><b>'.&mt('Sections to be Graded:').'</b></td><td>'.join(', ',@showsections).'</td></tr>'); |
|
} else { |
|
$r->print( |
|
'<tr><td><b>'.&mt('Section to be Graded:').'</b></td><td>'.$checksec.'</td></tr>'); |
|
} |
|
$r->print('</table></p>'); |
|
} |
|
} |
|
$r->rflush(); |
|
|
#get the student pick code ready |
#get the student pick code ready |
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
my $nav_error; |
my $nav_error; |
Line 7140 sub scantron_validate_file {
|
Line 7214 sub scantron_validate_file {
|
$env{'form.validatepass'} = 0; |
$env{'form.validatepass'} = 0; |
} |
} |
my $currentphase=$env{'form.validatepass'}; |
my $currentphase=$env{'form.validatepass'}; |
|
my %skipbysec=(); |
|
|
my $stop=0; |
my $stop=0; |
while (!$stop && $currentphase < scalar(@validate_phases)) { |
while (!$stop && $currentphase < scalar(@validate_phases)) { |
Line 7150 sub scantron_validate_file {
|
Line 7224 sub scantron_validate_file {
|
my $which="scantron_validate_".$validate_phases[$currentphase]; |
my $which="scantron_validate_".$validate_phases[$currentphase]; |
{ |
{ |
no strict 'refs'; |
no strict 'refs'; |
($stop,$currentphase)=&$which($r,$currentphase); |
my @extras=(); |
|
if ($validate_phases[$currentphase] eq 'ID') { |
|
@extras = (\%skipbysec,$checksec,@gradable); |
|
} |
|
($stop,$currentphase)=&$which($r,$currentphase,@extras); |
} |
} |
} |
} |
if (!$stop) { |
if (!$stop) { |
my $warning=&scantron_warning_screen('Start Grading',$symb); |
my $warning=&scantron_warning_screen('Start Grading',$symb); |
|
my $secinfo; |
|
if (keys(%skipbysec) > 0) { |
|
my $seclist = '<ul>'; |
|
foreach my $sec (sort { $a <=> $b } keys(%skipbysec)) { |
|
$seclist .= '<li>'.&mt('section [_1]: [_2]',$sec,$skipbysec{$sec}).'</li>'; |
|
} |
|
$seclist .= '</ul>'; |
|
$secinfo = '<p class="LC_info">'. |
|
&mt('Numbers of records for students in sections not being graded [_1]', |
|
$seclist). |
|
'</p>'; |
|
} |
$r->print(&mt('Validation process complete.').'<br />'. |
$r->print(&mt('Validation process complete.').'<br />'. |
$warning. |
$secinfo.$warning. |
&mt('Perform verification for each student after storage of submissions?'). |
&mt('Perform verification for each student after storage of submissions?'). |
' <span class="LC_nobreak"><label>'. |
' <span class="LC_nobreak"><label>'. |
'<input type="radio" name="verifyrecord" value="1" />'.&mt('Yes').'</label>'. |
'<input type="radio" name="verifyrecord" value="1" />'.&mt('Yes').'</label>'. |
Line 7572 sub scantron_validate_sequence {
|
Line 7662 sub scantron_validate_sequence {
|
|
|
|
|
sub scantron_validate_ID { |
sub scantron_validate_ID { |
my ($r,$currentphase) = @_; |
my ($r,$currentphase,$skipbysec,$checksec,@gradable) = @_; |
|
|
#get student info |
#get student info |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my %idmap=&username_to_idmap($classlist); |
my %idmap=&username_to_idmap($classlist); |
|
my $secidx = &Apache::loncoursedata::CL_SECTION(); |
|
|
#get scantron line setup |
#get scantron line setup |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
Line 7590 sub scantron_validate_ID {
|
Line 7681 sub scantron_validate_ID {
|
} |
} |
|
|
my %found=('ids'=>{},'usernames'=>{}); |
my %found=('ids'=>{},'usernames'=>{}); |
|
my $unsavedskips = 0; |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
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; } |
Line 7602 sub scantron_validate_ID {
|
Line 7694 sub scantron_validate_ID {
|
} |
} |
if ($found) { |
if ($found) { |
my $username=$idmap{$found}; |
my $username=$idmap{$found}; |
|
if ($checksec) { |
|
if (ref($classlist->{$username}) eq 'ARRAY') { |
|
my $stusec = $classlist->{$username}->[$secidx]; |
|
if ($stusec ne $checksec) { |
|
unless ((@gradable > 0) && (grep(/^\Q$stusec\E$/,@gradable))) { |
|
my $skip=1; |
|
&scantron_put_line($scanlines,$scan_data,$i,$line,$skip); |
|
if (ref($skipbysec) eq 'HASH') { |
|
if ($stusec eq '') { |
|
$skipbysec->{'none'} ++; |
|
} else { |
|
$skipbysec->{$stusec} ++; |
|
} |
|
} |
|
$unsavedskips ++; |
|
next; |
|
} |
|
} |
|
} |
|
} |
if ($found{'ids'}{$found}) { |
if ($found{'ids'}{$found}) { |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
$line,'duplicateID',$found); |
$line,'duplicateID',$found); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} elsif ($found{'usernames'}{$username}) { |
} elsif ($found{'usernames'}{$username}) { |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
$line,'duplicateID',$username); |
$line,'duplicateID',$username); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
#FIXME store away line we previously saw the ID on to use above |
#FIXME store away line we previously saw the ID on to use above |
Line 7617 sub scantron_validate_ID {
|
Line 7737 sub scantron_validate_ID {
|
} else { |
} else { |
if ($id =~ /^\s*$/) { |
if ($id =~ /^\s*$/) { |
my $username=&scan_data($scan_data,"$i.user"); |
my $username=&scan_data($scan_data,"$i.user"); |
if (defined($username) && $found{'usernames'}{$username}) { |
if (($checksec && $username ne '')) { |
|
if (ref($classlist->{$username}) eq 'ARRAY') { |
|
my $stusec = $classlist->{$username}->[$secidx]; |
|
if ($stusec ne $checksec) { |
|
unless ((@gradable > 0) && (grep(/^\Q$stusec\E$/,@gradable))) { |
|
my $skip=1; |
|
&scantron_put_line($scanlines,$scan_data,$i,$line,$skip); |
|
if (ref($skipbysec) eq 'HASH') { |
|
if ($stusec eq '') { |
|
$skipbysec->{'none'} ++; |
|
} else { |
|
$skipbysec->{$stusec} ++; |
|
} |
|
} |
|
$unsavedskips ++; |
|
next; |
|
} |
|
} |
|
} |
|
} elsif (defined($username) && $found{'usernames'}{$username}) { |
&scantron_get_correction($r,$i,$scan_record, |
&scantron_get_correction($r,$i,$scan_record, |
\%scantron_config, |
\%scantron_config, |
$line,'duplicateID',$username); |
$line,'duplicateID',$username); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} elsif (!defined($username)) { |
} elsif (!defined($username)) { |
&scantron_get_correction($r,$i,$scan_record, |
&scantron_get_correction($r,$i,$scan_record, |
\%scantron_config, |
\%scantron_config, |
$line,'incorrectID'); |
$line,'incorrectID'); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
$found{'usernames'}{$username}++; |
$found{'usernames'}{$username}++; |
} else { |
} else { |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
&scantron_get_correction($r,$i,$scan_record,\%scantron_config, |
$line,'incorrectID'); |
$line,'incorrectID'); |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
} |
} |
} |
} |
|
if ($unsavedskips) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
$unsavedskips = 0; |
|
} |
return (0,$currentphase+1); |
return (0,$currentphase+1); |
} |
} |
|
|
|
sub scantron_get_sections { |
|
my %bysec; |
|
if ($env{'form.scantron_format'} ne '') { |
|
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
|
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
my $classlist=&Apache::loncoursedata::get_classlist(); |
|
my %idmap=&username_to_idmap($classlist); |
|
foreach my $key (keys(%idmap)) { |
|
my $lckey = lc($key); |
|
$idmap{$lckey} = $idmap{$key}; |
|
} |
|
my $secidx = &Apache::loncoursedata::CL_SECTION(); |
|
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
|
my $line=&scantron_get_line($scanlines,$scan_data,$i); |
|
if ($line=~/^[\s\cz]*$/) { next; } |
|
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
|
$scan_data); |
|
my $id=lc($$scan_record{'scantron.ID'}); |
|
if (exists($idmap{$id})) { |
|
if (ref($classlist->{$idmap{$id}}) eq 'ARRAY') { |
|
my $stusec = $classlist->{$idmap{$id}}->[$secidx]; |
|
if ($stusec eq '') { |
|
$bysec{'none'} ++; |
|
} else { |
|
$bysec{$stusec} ++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return %bysec; |
|
} |
|
|
sub scantron_get_correction { |
sub scantron_get_correction { |
my ($r,$i,$scan_record,$scan_config,$line,$error,$arg, |
my ($r,$i,$scan_record,$scan_config,$line,$error,$arg, |
Line 8657 sub scantron_process_students {
|
Line 8843 sub scantron_process_students {
|
SCANTRONFORM |
SCANTRONFORM |
$r->print($result); |
$r->print($result); |
|
|
|
my ($checksec,@possibles)=&gradable_sections(); |
my @delayqueue; |
my @delayqueue; |
my (%completedstudents,%scandata); |
my (%completedstudents,%scandata); |
|
|
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,$count); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count); |
Line 8719 SCANTRONFORM
|
Line 8906 SCANTRONFORM
|
next; |
next; |
} |
} |
my $usec = $classlist->{$uname}->[&Apache::loncoursedata::CL_SECTION]; |
my $usec = $classlist->{$uname}->[&Apache::loncoursedata::CL_SECTION]; |
|
if (($checksec ne '') && ($checksec ne $usec)) { |
|
unless (grep(/^\Q$usec\E$/,@possibles)) { |
|
&scantron_add_delay(\@delayqueue,$line, |
|
"No role with manage grades privilege in student's section ($usec)",3); |
|
next; |
|
} |
|
} |
my $user = $uname.':'.$usec; |
my $user = $uname.':'.$usec; |
($uname,$udom)=split(/:/,$uname); |
($uname,$udom)=split(/:/,$uname); |
|
|
Line 9174 sub scantron_upload_scantron_data_save {
|
Line 9368 sub scantron_upload_scantron_data_save {
|
'</form>'."\n"; |
'</form>'."\n"; |
if (!&Apache::lonnet::allowed('usc',$env{'form.domainid'}) && |
if (!&Apache::lonnet::allowed('usc',$env{'form.domainid'}) && |
!&Apache::lonnet::allowed('usc', |
!&Apache::lonnet::allowed('usc', |
$env{'form.domainid'}.'_'.$env{'form.courseid'})) { |
$env{'form.domainid'}.'_'.$env{'form.courseid'}) && |
|
!&Apache::lonnet::allowed('usc', |
|
$env{'form.domainid'}.'_'.$env{'form.courseid'}.'/'.$env{'form.coursesec'})) { |
$r->print(&mt("You are not allowed to upload bubblesheet data to the requested course.")."<br />"); |
$r->print(&mt("You are not allowed to upload bubblesheet data to the requested course.")."<br />"); |
unless ($symb) { |
unless ($symb) { |
$r->print($doanotherupload); |
$r->print($doanotherupload); |
Line 9230 sub scantron_upload_scantron_data_save {
|
Line 9426 sub scantron_upload_scantron_data_save {
|
(length($env{'form.upfile'})-1), |
(length($env{'form.upfile'})-1), |
'<span class="LC_filename">'.$result.'</span>')); |
'<span class="LC_filename">'.$result.'</span>')); |
($uploadedfile) = ($result =~ m{/([^/]+)$}); |
($uploadedfile) = ($result =~ m{/([^/]+)$}); |
|
if ($uploadedfile =~ /^scantron_orig_/) { |
|
my $logname = $uploadedfile; |
|
$logname =~ s/^scantron_orig_//; |
|
if ($logname ne '') { |
|
my $now = time; |
|
my %info = ($logname => { $now => $env{'user.name'}.':'.$env{'user.domain'} }); |
|
&Apache::lonnet::put('scantronupload',\%info,$env{'form.domainid'},$env{'form.courseid'}); |
|
} |
|
} |
$r->print(&validate_uploaded_scantron_file($env{'form.domainid'}, |
$r->print(&validate_uploaded_scantron_file($env{'form.domainid'}, |
$env{'form.courseid'},$uploadedfile)); |
$env{'form.courseid'},$symb,$uploadedfile)); |
} else { |
} else { |
$r->print( |
$r->print( |
&Apache::lonhtmlcommon::confirm_success(&mt('Upload failed'),1).'<br />'. |
&Apache::lonhtmlcommon::confirm_success(&mt('Upload failed'),1).'<br />'. |
Line 9249 sub scantron_upload_scantron_data_save {
|
Line 9454 sub scantron_upload_scantron_data_save {
|
} |
} |
|
|
sub validate_uploaded_scantron_file { |
sub validate_uploaded_scantron_file { |
my ($cdom,$cname,$fname) = @_; |
my ($cdom,$cname,$symb,$fname,$context,$countsref) = @_; |
|
|
my $scanlines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.$fname); |
my $scanlines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.$fname); |
my @lines; |
my @lines; |
if ($scanlines ne '-1') { |
if ($scanlines ne '-1') { |
@lines=split("\n",$scanlines,-1); |
@lines=split("\n",$scanlines,-1); |
} |
} |
my $output; |
my ($output,$secidx,$checksec,$priv,%crsroleshash,@possibles); |
|
$secidx = &Apache::loncoursedata::CL_SECTION(); |
|
if ($context eq 'download') { |
|
$priv = 'mgr'; |
|
} else { |
|
$priv = 'usc'; |
|
} |
|
unless ((&Apache::lonnet::allowed($priv,$env{'request.role.domain'})) || |
|
(($env{'request.course.id'}) && |
|
(&Apache::lonnet::allowed($priv,$env{'request.course.id'})))) { |
|
if ($env{'request.course.sec'} ne '') { |
|
unless (&Apache::lonnet::allowed($priv, |
|
"$env{'request.course.id'}/$env{'request.course.sec'}")) { |
|
unless ($context eq 'download') { |
|
$output = '<p class="LC_warning">'.&mt('You do not have permission to upload bubblesheet data').'</p>'; |
|
} |
|
return $output; |
|
} |
|
($checksec,@possibles)=&gradable_sections(); |
|
} |
|
} |
if (@lines) { |
if (@lines) { |
my (%counts,$max_match_format); |
my (%counts,$max_match_format); |
my ($found_match_count,$max_match_count,$max_match_pct) = (0,0,0); |
my ($found_match_count,$max_match_count,$max_match_pct) = (0,0,0); |
Line 9285 sub validate_uploaded_scantron_file {
|
Line 9511 sub validate_uploaded_scantron_file {
|
%{$counts{$key}} = ( |
%{$counts{$key}} = ( |
'found' => 0, |
'found' => 0, |
'total' => 0, |
'total' => 0, |
|
'totalanysec' => 0, |
|
'othersec' => 0, |
); |
); |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
next if ($line =~ /^#/); |
next if ($line =~ /^#/); |
Line 9292 sub validate_uploaded_scantron_file {
|
Line 9520 sub validate_uploaded_scantron_file {
|
my $id = substr($line,$idstart-1,$idlength); |
my $id = substr($line,$idstart-1,$idlength); |
$id = lc($id); |
$id = lc($id); |
if (exists($idmap{$id})) { |
if (exists($idmap{$id})) { |
|
if ($checksec ne '') { |
|
$counts{$key}{'totalanysec'} ++; |
|
if (ref($classlist->{$idmap{$id}}) eq 'ARRAY') { |
|
my $stusec = $classlist->{$idmap{$id}}->[$secidx]; |
|
if ($stusec ne $checksec) { |
|
if (@possibles) { |
|
unless (grep(/^\Q$stusec\E$/,@possibles)) { |
|
$counts{$key}{'othersec'} ++; |
|
next; |
|
} |
|
} else { |
|
$counts{$key}{'othersec'} ++; |
|
next; |
|
} |
|
} |
|
} |
|
} |
$counts{$key}{'found'} ++; |
$counts{$key}{'found'} ++; |
} |
} |
$counts{$key}{'total'} ++; |
$counts{$key}{'total'} ++; |
Line 9306 sub validate_uploaded_scantron_file {
|
Line 9551 sub validate_uploaded_scantron_file {
|
} |
} |
} |
} |
} |
} |
if (ref($unique_formats{$max_match_format}) eq 'ARRAY') { |
if ((ref($unique_formats{$max_match_format}) eq 'ARRAY') && ($context ne 'download')) { |
my $format_descs; |
my $format_descs; |
my $numwithformat = @{$unique_formats{$max_match_format}}; |
my $numwithformat = @{$unique_formats{$max_match_format}}; |
for (my $i=0; $i<$numwithformat; $i++) { |
for (my $i=0; $i<$numwithformat; $i++) { |
Line 9351 sub validate_uploaded_scantron_file {
|
Line 9596 sub validate_uploaded_scantron_file {
|
'<li>'.&mt('The course roster is not up to date.').'</li>'. |
'<li>'.&mt('The course roster is not up to date.').'</li>'. |
'</ul>'; |
'</ul>'; |
} |
} |
|
if (($checksec ne '') && (ref($counts{$max_match_format}) eq 'HASH')) { |
|
if ($counts{$max_match_format}{'othersec'}) { |
|
my $percent_nongrade = (100*$counts{$max_match_format}{'othersec'})/($counts{$max_match_format}{'totalanysec'}); |
|
my $showpct = sprintf("%.0f",$percent_nongrade).'%'; |
|
my $confirmdel = &mt('Are you sure you want to permanently delete this file?'); |
|
&js_escape(\$confirmdel); |
|
$output .= '<p class="LC_warning">'. |
|
&mt('Comparison of student IDs in the uploaded file with the course roster found [_1][quant,_2,match,matches][_3] for students in section(s) for which none of your role(s) have privileges to modify grades', |
|
'<b>',$counts{$max_match_format}{'othersec'},'</b>'). |
|
'<br />'. |
|
&mt('Unless you are assigned role(s) which allow modification of grades in additional sections, [_1] of the records in this file will be automatically excluded when you perform bubblesheet grading.','<b>'.$showpct.'</b>'). |
|
'</p><p>'. |
|
&mt('If you prefer to delete the file now, use: [_1]'). |
|
'<form method="post" name="delupload" action="/adm/grades">'. |
|
'<input type="hidden" name="symb" value="'.$symb.'" />'. |
|
'<input type="hidden" name="domainid" value="'.$cdom.'" />'. |
|
'<input type="hidden" name="courseid" value="'.$cname.'" />'. |
|
'<input type="hidden" name="coursesec" value="'.$env{'request.course.sec'}.'" />'. |
|
'<input type="hidden" name="uploadedfile" value="'.$fname.'" />'. |
|
'<input type="hidden" name="command" value="scantronupload_delete" />'. |
|
'<input type="button" name="delbutton" value="'.&mt('Delete Uploaded File').'" onclick="javascript:if (confirm('."'$confirmdel'".')) { document.delupload.submit(); }" />'. |
|
'</form></p>'; |
|
} |
|
} |
} |
} |
} else { |
if (($context eq 'download') && ($checksec ne '')) { |
|
if ((ref($countsref) eq 'HASH') && (ref($counts{$max_match_format}) eq 'HASH')) { |
|
$countsref->{'totalanysec'} = $counts{$max_match_format}{'totalanysec'}; |
|
$countsref->{'othersec'} = $counts{$max_match_format}{'othersec'}; |
|
} |
|
} |
|
} elsif ($context ne 'download') { |
$output = '<p class="LC_warning">'.&mt('Uploaded file contained no data').'</p>'; |
$output = '<p class="LC_warning">'.&mt('Uploaded file contained no data').'</p>'; |
} |
} |
return $output; |
return $output; |
} |
} |
|
|
|
sub gradable_sections { |
|
my $checksec = $env{'request.course.sec'}; |
|
my @oksecs; |
|
if ($checksec) { |
|
my %availablesecs = §ions_grade_privs(); |
|
if (ref($availablesecs{'mgr'}) eq 'ARRAY') { |
|
foreach my $sec (@{$availablesecs{'mgr'}}) { |
|
unless (grep(/^\Q$sec\E$/,@oksecs)) { |
|
push(@oksecs,$sec); |
|
} |
|
} |
|
if (grep(/^all$/,@oksecs)) { |
|
undef($checksec); |
|
} |
|
} |
|
} |
|
return($checksec,@oksecs); |
|
} |
|
|
|
sub sections_grade_privs { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my %availablesecs = ( |
|
mgr => [], |
|
vgr => [], |
|
usc => [], |
|
); |
|
my $ccrole = 'cc'; |
|
if ($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Community') { |
|
$ccrole = 'co'; |
|
} |
|
my %crsroleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'}, |
|
'userroles',['active'], |
|
[$ccrole,'in','cr'],$cdom,1); |
|
my $crsid = $cnum.':'.$cdom; |
|
foreach my $item (keys(%crsroleshash)) { |
|
next unless ($item =~ /^$crsid\:/); |
|
my ($crsnum,$crsdom,$role,$sec) = split(/\:/,$item); |
|
my $suffix = "/$cdom/$cnum./$cdom/$cnum"; |
|
if ($sec ne '') { |
|
$suffix = "/$cdom/$cnum/$sec./$cdom/$cnum/$sec"; |
|
} |
|
if (($role eq $ccrole) || ($role eq 'in')) { |
|
foreach my $priv ('mgr','vgr','usc') { |
|
unless (grep(/^all$/,@{$availablesecs{$priv}})) { |
|
if ($sec eq '') { |
|
$availablesecs{$priv} = ['all']; |
|
} elsif ($sec ne $env{'request.course.sec'}) { |
|
unless (grep(/^\Q$sec\E$/,@{$availablesecs{$priv}})) { |
|
push(@{$availablesecs{$priv}},$sec); |
|
} |
|
} |
|
} |
|
} |
|
} elsif ($role =~ m{^cr/}) { |
|
foreach my $priv ('mgr','vgr','usc') { |
|
unless (grep(/^all$/,@{$availablesecs{$priv}})) { |
|
if ($env{"user.priv.$role.$suffix"} =~ /:$priv&/) { |
|
if ($sec eq '') { |
|
$availablesecs{$priv} = ['all']; |
|
} elsif ($sec ne $env{'request.course.sec'}) { |
|
unless (grep(/^\Q$sec\E$/,@{$availablesecs{$priv}})) { |
|
push(@{$availablesecs{$priv}},$sec); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return %availablesecs; |
|
} |
|
|
|
sub scantron_upload_delete { |
|
my ($r,$symb) = @_; |
|
my $filename = $env{'form.uploadedfile'}; |
|
if ($filename =~ /^scantron_orig_/) { |
|
if (&Apache::lonnet::allowed('usc',$env{'form.domainid'}) || |
|
&Apache::lonnet::allowed('usc', |
|
$env{'form.domainid'}.'_'.$env{'form.courseid'}) || |
|
&Apache::lonnet::allowed('usc', |
|
$env{'form.domainid'}.'_'.$env{'form.courseid'}.'/'.$env{'form.coursesec'})) { |
|
my $uploadurl = '/uploaded/'.$env{'form.domainid'}.'/'.$env{'form.courseid'}.'/'.$env{'form.uploadedfile'}; |
|
my $retrieval = &Apache::lonnet::getfile($uploadurl); |
|
if ($retrieval eq '-1') { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('File requested for deletion not found.')); |
|
} else { |
|
$filename =~ s/^scantron_orig_//; |
|
if ($filename ne '') { |
|
my ($is_valid,$numleft); |
|
my %info = &Apache::lonnet::get('scantronupload',[$filename],$env{'form.domainid'},$env{'form.courseid'}); |
|
if (keys(%info)) { |
|
if (ref($info{$filename}) eq 'HASH') { |
|
foreach my $timestamp (sort(keys(%{$info{$filename}}))) { |
|
if ($info{$filename}{$timestamp} eq $env{'user.name'}.':'.$env{'user.domain'}) { |
|
$is_valid = 1; |
|
delete($info{$filename}{$timestamp}); |
|
} |
|
} |
|
$numleft = scalar(keys(%{$info{$filename}})); |
|
} |
|
} |
|
if ($is_valid) { |
|
my $result = &Apache::lonnet::removeuploadedurl($uploadurl); |
|
if ($result eq 'ok') { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion successful')).'<br />'); |
|
if ($numleft) { |
|
&Apache::lonnet::put('scantronupload',\%info,$env{'form.domainid'},$env{'form.courseid'}); |
|
} else { |
|
&Apache::lonnet::del('scantronupload',[$filename],$env{'form.domainid'},$env{'form.courseid'}); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('Result was [_1]',$result)); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('File requested for deletion was uploaded by a different user.')); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('Filename of bubblesheet data file requested for deletion is invalid.')); |
|
} |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('You are not permitted to delete bubblesheet data files from the requested course.')); |
|
} |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::confirm_success(&mt('File deletion failed'),1).'<br />'. |
|
&mt('Filename of bubblesheet data file requested for deletion is invalid.')); |
|
} |
|
return; |
|
} |
|
|
sub valid_file { |
sub valid_file { |
my ($requested_file)=@_; |
my ($requested_file)=@_; |
foreach my $filename (sort(&scantron_filenames())) { |
foreach my $filename (sort(&scantron_filenames())) { |
Line 9380 sub scantron_download_scantron_data {
|
Line 9791 sub scantron_download_scantron_data {
|
'); |
'); |
return; |
return; |
} |
} |
|
my (%uploader,$is_owner,%counts,$percent); |
|
my %uploader = &Apache::lonnet::get('scantronupload',[$file],$cdom,$cname); |
|
if (ref($uploader{$file}) eq 'HASH') { |
|
foreach my $timestamp (sort { $a <=> $b } keys(%{$uploader{$file}})) { |
|
if ($uploader{$file}{$timestamp} eq $env{'user.name'}.':'.$env{'user.domain'}) { |
|
$is_owner = 1; |
|
last; |
|
} |
|
} |
|
} |
|
unless ($is_owner) { |
|
&validate_uploaded_scantron_file($cdom,$cname,$symb,'scantron_orig_'.$file,'download',\%counts); |
|
if ($counts{'totalanysec'}) { |
|
my $percent_othersec = (100*$counts{'othersec'})/($counts{'totalanysec'}); |
|
if ($percent_othersec >= 10) { |
|
my $showpct = sprintf("%.0f",$percent_othersec).'%'; |
|
$r->print('<p class="LC_warning">'. |
|
&mt('The original uploaded file includes [_1] or more of records for students for which none of your roles have rights to modify grades, so files are unavailable for download.',$showpct). |
|
'</p>'); |
|
return; |
|
} |
|
} |
|
} |
my $orig='/uploaded/'.$cdom.'/'.$cname.'/scantron_orig_'.$file; |
my $orig='/uploaded/'.$cdom.'/'.$cname.'/scantron_orig_'.$file; |
my $corrected='/uploaded/'.$cdom.'/'.$cname.'/scantron_corrected_'.$file; |
my $corrected='/uploaded/'.$cdom.'/'.$cname.'/scantron_corrected_'.$file; |
my $skipped='/uploaded/'.$cdom.'/'.$cname.'/scantron_skipped_'.$file; |
my $skipped='/uploaded/'.$cdom.'/'.$cname.'/scantron_skipped_'.$file; |
Line 9416 sub checkscantron_results {
|
Line 9850 sub checkscantron_results {
|
my %scantron_config = |
my %scantron_config = |
&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my %idmap=&Apache::grades::username_to_idmap($classlist); |
my %idmap=&Apache::grades::username_to_idmap($classlist); |
my $navmap=Apache::lonnavmaps::navmap->new(); |
my $navmap=Apache::lonnavmaps::navmap->new(); |
Line 9738 sub verify_scantron_grading {
|
Line 10172 sub verify_scantron_grading {
|
return ($counter,$record); |
return ($counter,$record); |
} |
} |
|
|
|
|
#-------- end of section for handling grading scantron forms ------- |
#-------- end of section for handling grading scantron forms ------- |
# |
# |
#------------------------------------------------------------------- |
#------------------------------------------------------------------- |
Line 9859 sub grading_menu {
|
Line 10292 sub grading_menu {
|
return $Str; |
return $Str; |
} |
} |
|
|
|
|
sub ungraded { |
sub ungraded { |
my ($request)=@_; |
my ($request)=@_; |
&submit_options($request); |
&submit_options($request); |
Line 10021 sub reset_perm {
|
Line 10453 sub reset_perm {
|
|
|
sub init_perm { |
sub init_perm { |
&reset_perm(); |
&reset_perm(); |
foreach my $test_perm ('vgr','mgr','opa') { |
foreach my $test_perm ('vgr','mgr','opa','usc') { |
|
|
my $scope = $env{'request.course.id'}; |
my $scope = $env{'request.course.id'}; |
if (!($perm{$test_perm}=&Apache::lonnet::allowed($test_perm,$scope))) { |
if (!($perm{$test_perm}=&Apache::lonnet::allowed($test_perm,$scope))) { |
Line 10716 sub startpage {
|
Line 11148 sub startpage {
|
sub select_problem { |
sub select_problem { |
my ($r)=@_; |
my ($r)=@_; |
$r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">'); |
$r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">'); |
$r->print(&Apache::lonstathelpers::problem_selector('.',undef,1,undef,undef,undef,undef,1)); |
$r->print(&Apache::lonstathelpers::problem_selector('.',undef,1,undef,undef,1,1)); |
$r->print('<input type="hidden" name="command" value="gradingmenu" />'); |
$r->print('<input type="hidden" name="command" value="gradingmenu" />'); |
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
} |
} |
Line 10902 sub handler {
|
Line 11334 sub handler {
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
$request->print(&scantron_process_students($request,$symb)); |
$request->print(&scantron_process_students($request,$symb)); |
} elsif ($command eq 'scantronupload' && |
} elsif ($command eq 'scantronupload' && |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'})|| |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || $perm{'usc'})) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'}))) { |
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1, |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1, |
undef,undef,undef,undef,'toggleScantab(document.rules);'); |
undef,undef,undef,undef,'toggleScantab(document.rules);'); |
$request->print(&scantron_upload_scantron_data($request,$symb)); |
$request->print(&scantron_upload_scantron_data($request,$symb)); |
} elsif ($command eq 'scantronupload_save' && |
} elsif ($command eq 'scantronupload_save' && |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'})|| |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || $perm{'usc'})) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'}))) { |
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
$request->print(&scantron_upload_scantron_data_save($request,$symb)); |
$request->print(&scantron_upload_scantron_data_save($request,$symb)); |
} elsif ($command eq 'scantron_download' && |
} elsif ($command eq 'scantron_download' && ($perm{'usc'} || $perm{'mgr'})) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'})) { |
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
$request->print(&scantron_download_scantron_data($request,$symb)); |
$request->print(&scantron_download_scantron_data($request,$symb)); |
|
} elsif ($command eq 'scantronupload_delete' && |
|
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) || $perm{'usc'})) { |
|
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
|
&scantron_upload_delete($request,$symb); |
} elsif ($command eq 'checksubmissions' && $perm{'vgr'}) { |
} elsif ($command eq 'checksubmissions' && $perm{'vgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
$request->print(&checkscantron_results($request,$symb)); |
$request->print(&checkscantron_results($request,$symb)); |
Line 11175 Side Effects: None.
|
Line 11608 Side Effects: None.
|
=item scantron_upload_scantron_data_save() : |
=item scantron_upload_scantron_data_save() : |
|
|
Adds a provided bubble information data file to the course if user |
Adds a provided bubble information data file to the course if user |
has the correct privileges to do so. |
has the correct privileges to do so. |
|
|
|
= item scantron_upload_delete() : |
|
|
|
Deletes a previously uploaded bubble information data file, if user |
|
was the one who uploaded the file, and has the privileges to do so. |
|
|
=item valid_file() : |
=item valid_file() : |
|
|