version 1.621, 2010/04/17 16:38:38
|
version 1.651, 2011/09/22 23:03:09
|
Line 40 use Apache::lonhomework;
|
Line 40 use Apache::lonhomework;
|
use Apache::lonpickcode; |
use Apache::lonpickcode; |
use Apache::loncoursedata; |
use Apache::loncoursedata; |
use Apache::lonmsg(); |
use Apache::lonmsg(); |
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common :http); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonenc; |
use Apache::lonenc; |
|
use Apache::lonstathelpers; |
|
use Apache::lonquickgrades; |
use String::Similarity; |
use String::Similarity; |
use LONCAPA; |
use LONCAPA; |
|
|
Line 137 sub nameUserString {
|
Line 139 sub nameUserString {
|
|
|
#--- Get the partlist and the response type for a given problem. --- |
#--- Get the partlist and the response type for a given problem. --- |
#--- Indicate if a response type is coded handgraded or not. --- |
#--- Indicate if a response type is coded handgraded or not. --- |
|
#--- Sets response_error pointer to "1" if navmaps object broken --- |
sub response_type { |
sub response_type { |
my ($symb,$response_error) = @_; |
my ($symb,$response_error) = @_; |
|
|
Line 210 sub reset_caches {
|
Line 213 sub reset_caches {
|
} |
} |
|
|
sub get_analyze { |
sub get_analyze { |
my ($symb,$uname,$udom,$no_increment,$add_to_hash)=@_; |
my ($symb,$uname,$udom,$no_increment,$add_to_hash,$type,$trial,$rndseed,$bubbles_per_row)=@_; |
my $key = "$symb\0$uname\0$udom"; |
my $key = "$symb\0$uname\0$udom"; |
|
if ($type eq 'randomizetry') { |
|
if ($trial ne '') { |
|
$key .= "\0".$trial; |
|
} |
|
} |
if (exists($analyze_cache{$key})) { |
if (exists($analyze_cache{$key})) { |
my $getupdate = 0; |
my $getupdate = 0; |
if (ref($add_to_hash) eq 'HASH') { |
if (ref($add_to_hash) eq 'HASH') { |
Line 239 sub reset_caches {
|
Line 247 sub reset_caches {
|
'grade_courseid' => $env{'request.course.id'}, |
'grade_courseid' => $env{'request.course.id'}, |
'grade_username' => $uname, |
'grade_username' => $uname, |
'grade_noincrement' => $no_increment); |
'grade_noincrement' => $no_increment); |
|
if ($bubbles_per_row ne '') { |
|
$form{'bubbles_per_row'} = $bubbles_per_row; |
|
} |
|
if ($type eq 'randomizetry') { |
|
$form{'grade_questiontype'} = $type; |
|
if ($rndseed ne '') { |
|
$form{'grade_rndseed'} = $rndseed; |
|
} |
|
} |
if (ref($add_to_hash)) { |
if (ref($add_to_hash)) { |
%form = (%form,%{$add_to_hash}); |
%form = (%form,%{$add_to_hash}); |
} |
} |
my $subresult=&ssi_with_retries($url, $ssi_retries,%form); |
my $subresult=&ssi_with_retries($url, $ssi_retries,%form); |
(undef,$subresult)=split(/_HASH_REF__/,$subresult,2); |
(undef,$subresult)=split(/_HASH_REF__/,$subresult,2); |
my %analyze=&Apache::lonnet::str2hash($subresult); |
my %analyze=&Apache::lonnet::str2hash($subresult); |
Line 254 sub reset_caches {
|
Line 271 sub reset_caches {
|
} |
} |
|
|
sub get_order { |
sub get_order { |
my ($partid,$respid,$symb,$uname,$udom,$no_increment)=@_; |
my ($partid,$respid,$symb,$uname,$udom,$no_increment,$type,$trial,$rndseed)=@_; |
my $analyze = &get_analyze($symb,$uname,$udom,$no_increment); |
my $analyze = &get_analyze($symb,$uname,$udom,$no_increment,undef,$type,$trial,$rndseed); |
return $analyze->{"$partid.$respid.shown"}; |
return $analyze->{"$partid.$respid.shown"}; |
} |
} |
|
|
sub get_radiobutton_correct_foil { |
sub get_radiobutton_correct_foil { |
my ($partid,$respid,$symb,$uname,$udom)=@_; |
my ($partid,$respid,$symb,$uname,$udom,$type,$trial,$rndseed)=@_; |
my $analyze = &get_analyze($symb,$uname,$udom); |
my $analyze = &get_analyze($symb,$uname,$udom,undef,undef,$type,$trial,$rndseed); |
my $foils = &get_order($partid,$respid,$symb,$uname,$udom); |
my $foils = &get_order($partid,$respid,$symb,$uname,$udom,undef,$type,$trial,$rndseed); |
if (ref($foils) eq 'ARRAY') { |
if (ref($foils) eq 'ARRAY') { |
foreach my $foil (@{$foils}) { |
foreach my $foil (@{$foils}) { |
if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') { |
if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') { |
Line 273 sub reset_caches {
|
Line 290 sub reset_caches {
|
} |
} |
|
|
sub scantron_partids_tograde { |
sub scantron_partids_tograde { |
my ($resource,$cid,$uname,$udom,$check_for_randomlist) = @_; |
my ($resource,$cid,$uname,$udom,$check_for_randomlist,$bubbles_per_row) = @_; |
my (%analysis,@parts); |
my (%analysis,@parts); |
if (ref($resource)) { |
if (ref($resource)) { |
my $symb = $resource->symb(); |
my $symb = $resource->symb(); |
Line 281 sub reset_caches {
|
Line 298 sub reset_caches {
|
if ($check_for_randomlist) { |
if ($check_for_randomlist) { |
$add_to_form = { 'check_parts_withrandomlist' => 1,}; |
$add_to_form = { 'check_parts_withrandomlist' => 1,}; |
} |
} |
my $analyze = &get_analyze($symb,$uname,$udom,undef,$add_to_form); |
my $analyze = |
|
&get_analyze($symb,$uname,$udom,undef,$add_to_form, |
|
undef,undef,undef,$bubbles_per_row); |
if (ref($analyze) eq 'HASH') { |
if (ref($analyze) eq 'HASH') { |
%analysis = %{$analyze}; |
%analysis = %{$analyze}; |
} |
} |
Line 304 sub reset_caches {
|
Line 323 sub reset_caches {
|
# response types only. |
# response types only. |
sub cleanRecord { |
sub cleanRecord { |
my ($answer,$response,$symb,$partid,$respid,$record,$order,$version, |
my ($answer,$response,$symb,$partid,$respid,$record,$order,$version, |
$uname,$udom) = @_; |
$uname,$udom,$type,$trial,$rndseed) = @_; |
my $grayFont = '<span class="LC_internal_info">'; |
my $grayFont = '<span class="LC_internal_info">'; |
if ($response =~ /^(option|rank)$/) { |
if ($response =~ /^(option|rank)$/) { |
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
Line 348 sub cleanRecord {
|
Line 367 sub cleanRecord {
|
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
my ($toprow,$bottomrow); |
my ($toprow,$bottomrow); |
my $correct = |
my $correct = |
&get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom); |
&get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom,$type,$trial,$rndseed); |
foreach my $foil (@$order) { |
foreach my $foil (@$order) { |
if (exists($answer{$foil})) { |
if (exists($answer{$foil})) { |
if ($foil eq $correct) { |
if ($foil eq $correct) { |
Line 818 sub listStudents {
|
Line 837 sub listStudents {
|
$submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; |
$submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; |
} |
} |
|
|
my $result='<h3><span class="LC_info"> ' |
my $result=''; |
.&mt("View/Grade/Regrade Submissions for a Student or a Group of Students") |
my $res_error; |
.'</span></h3>'; |
my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error); |
|
|
my ($partlist,$handgrade,$responseType) = &response_type($symb |
|
#,$res_error |
|
); |
|
|
|
my %lt = &Apache::lonlocal::texthash ( |
my %lt = &Apache::lonlocal::texthash ( |
'multiple' => 'Please select a student or group of students before clicking on the Next button.', |
'multiple' => 'Please select a student or group of students before clicking on the Next button.', |
Line 864 LISTJAVASCRIPT
|
Line 879 LISTJAVASCRIPT
|
&commonJSfunctions($request); |
&commonJSfunctions($request); |
$request->print($result); |
$request->print($result); |
|
|
my $checkhdgrade = ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked="checked"' : ''; |
|
my $checklastsub = $checkhdgrade eq '' ? 'checked="checked"' : ''; |
|
my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'. |
my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'. |
"\n"; |
"\n"; |
|
|
Line 882 LISTJAVASCRIPT
|
Line 895 LISTJAVASCRIPT
|
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure(); |
|
|
my $submission_options; |
my $submission_options; |
if ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { |
|
$submission_options.= |
|
'<label><input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> '.&mt('essay part only').' </label>'."\n"; |
|
} |
|
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status; |
my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status; |
$env{'form.Status'} = $saveStatus; |
$env{'form.Status'} = $saveStatus; |
$submission_options.= |
$submission_options.= |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '. |
'<label><input type="radio" name="lastSub" value="lastonly" /> '. |
&mt('last submission only').' </label></span>'."\n". |
&mt('last submission only').' </label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="last" /> '. |
'<label><input type="radio" name="lastSub" value="last" /> '. |
&mt('last submission & parts info').' </label></span>'."\n". |
&mt('last submission & parts info').' </label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="datesub" /> '. |
'<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '. |
&mt('by dates and submissions').'</label></span>'."\n". |
&mt('by dates and submissions').'</label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="all" /> '. |
'<label><input type="radio" name="lastSub" value="all" /> '. |
Line 918 LISTJAVASCRIPT
|
Line 927 LISTJAVASCRIPT
|
$gradeTable .= |
$gradeTable .= |
&build_section_inputs(). |
&build_section_inputs(). |
'<input type="hidden" name="submitonly" value="'.$submitonly.'" />'."\n". |
'<input type="hidden" name="submitonly" value="'.$submitonly.'" />'."\n". |
'<input type="hidden" name="handgrade" value="'.$env{'form.handgrade'}.'" /><br />'."\n". |
|
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". |
'<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n"; |
'<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n"; |
|
|
Line 1276 sub sub_page_js {
|
Line 1284 sub sub_page_js {
|
} |
} |
|
|
} |
} |
if (val == "Grade Student") { |
|
if (formname.Status.value == "") { |
|
formname.Status.value = "Active"; |
|
} |
|
formname.studentNo.value = total; |
|
} |
|
formname.submit(); |
formname.submit(); |
} |
} |
|
|
Line 1330 sub sub_page_kw_js {
|
Line 1332 sub sub_page_kw_js {
|
my $iconpath = $request->dir_config('lonIconsURL'); |
my $iconpath = $request->dir_config('lonIconsURL'); |
&commonJSfunctions($request); |
&commonJSfunctions($request); |
|
|
my $inner_js_msg_central= &Apache::lonhtmlcommon::scripttag(<<INNERJS); |
my $inner_js_msg_central= (<<INNERJS); |
|
<script type="text/javascript"> |
function checkInput() { |
function checkInput() { |
opener.document.SCORE.msgsub.value = opener.checkEntities(document.msgcenter.msgsub.value); |
opener.document.SCORE.msgsub.value = opener.checkEntities(document.msgcenter.msgsub.value); |
var nmsg = opener.document.SCORE.savemsgN.value; |
var nmsg = opener.document.SCORE.savemsgN.value; |
Line 1367 sub sub_page_kw_js {
|
Line 1370 sub sub_page_kw_js {
|
self.close() |
self.close() |
|
|
} |
} |
|
</script> |
INNERJS |
INNERJS |
|
|
my $inner_js_highlight_central= &Apache::lonhtmlcommon::scripttag(<<INNERJS); |
my $inner_js_highlight_central= (<<INNERJS); |
|
<script type="text/javascript"> |
function updateChoice(flag) { |
function updateChoice(flag) { |
opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr); |
opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr); |
opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize); |
opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize); |
Line 1380 INNERJS
|
Line 1385 INNERJS
|
} |
} |
self.close() |
self.close() |
} |
} |
|
</script> |
INNERJS |
INNERJS |
|
|
my $start_page_msg_central = |
my $start_page_msg_central = |
Line 1511 INNERJS
|
Line 1517 INNERJS
|
var ypos = (screen.height-height)/2-30; |
var ypos = (screen.height-height)/2-30; |
ypos = (ypos < 0) ? '0' : ypos; |
ypos = (ypos < 0) ? '0' : ypos; |
|
|
pWin = window.open('', 'MessageCenter', 'resizable=yes,toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=600,height='+height); |
pWin = window.open('', 'MessageCenter', 'resizable=yes,toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=700,height='+height); |
pWin.focus(); |
pWin.focus(); |
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.$docopen; |
pDoc.$docopen; |
Line 1740 sub gradeBox {
|
Line 1746 sub gradeBox {
|
} |
} |
|
|
sub handback_box { |
sub handback_box { |
my ($symb,$uname,$udom,$counter,$partid,$record,$res_error) = @_; |
my ($symb,$uname,$udom,$counter,$partid,$record,$res_error_pointer) = @_; |
my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error); |
my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error_pointer); |
my (@respids); |
my (@respids); |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id = &flatten_responseType($responseType); |
foreach my $part_response_id (@part_response_id) { |
foreach my $part_response_id (@part_response_id) { |
Line 1916 sub submission {
|
Line 1922 sub submission {
|
if ($counter == 0) { |
if ($counter == 0) { |
&sub_page_js($request); |
&sub_page_js($request); |
&sub_page_kw_js($request); |
&sub_page_kw_js($request); |
$request->print('<h3> <span class="LC_info">'.&mt('Submission Record').'</span></h3>'); |
|
|
|
# option to display problem, only once else it cause problems |
# option to display problem, only once else it cause problems |
# with the form later since the problem has a form. |
# with the form later since the problem has a form. |
Line 1936 sub submission {
|
Line 1941 sub submission {
|
# kwclr is the only variable that is guaranteed to be non blank |
# kwclr is the only variable that is guaranteed to be non blank |
# if this subroutine has been called once. |
# if this subroutine has been called once. |
my %keyhash = (); |
my %keyhash = (); |
if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') { |
|
if (1) { |
%keyhash = &Apache::lonnet::dump('nohist_handgrade', |
%keyhash = &Apache::lonnet::dump('nohist_handgrade', |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}); |
$env{'course.'.$env{'request.course.id'}.'.num'}); |
Line 1965 sub submission {
|
Line 1971 sub submission {
|
'<input type="hidden" name="lastSub" value="'.$env{'form.lastSub'}.'" />'."\n". |
'<input type="hidden" name="lastSub" value="'.$env{'form.lastSub'}.'" />'."\n". |
&build_section_inputs(). |
&build_section_inputs(). |
'<input type="hidden" name="submitonly" value="'.$env{'form.submitonly'}.'" />'."\n". |
'<input type="hidden" name="submitonly" value="'.$env{'form.submitonly'}.'" />'."\n". |
'<input type="hidden" name="handgrade" value="'.$env{'form.handgrade'}.'" />'."\n". |
|
'<input type="hidden" name="NCT"'. |
'<input type="hidden" name="NCT"'. |
' value="'.($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : $total+1).'" />'."\n"); |
' value="'.($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : $total+1).'" />'."\n"); |
if ($env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.handgrade'} eq 'yes') { |
|
if (1) { |
$request->print('<input type="hidden" name="keywords" value="'.$env{'form.keywords'}.'" />'."\n". |
$request->print('<input type="hidden" name="keywords" value="'.$env{'form.keywords'}.'" />'."\n". |
'<input type="hidden" name="kwclr" value="'.$env{'form.kwclr'}.'" />'."\n". |
'<input type="hidden" name="kwclr" value="'.$env{'form.kwclr'}.'" />'."\n". |
'<input type="hidden" name="kwsize" value="'.$env{'form.kwsize'}.'" />'."\n". |
'<input type="hidden" name="kwsize" value="'.$env{'form.kwsize'}.'" />'."\n". |
Line 1993 sub submission {
|
Line 1999 sub submission {
|
} |
} |
$request->print($prnmsg); |
$request->print($prnmsg); |
|
|
if ($env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.handgrade'} eq 'yes') { |
|
if (1) { |
# |
# |
# Print out the keyword options line |
# Print out the keyword options line |
# |
# |
Line 2069 KEYWORDS
|
Line 2076 KEYWORDS
|
.'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>'; |
.'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>'; |
$result.='<input type="hidden" name="name'.$counter. |
$result.='<input type="hidden" name="name'.$counter. |
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
if ($env{'form.handgrade'} eq 'no') { |
# if ($env{'form.handgrade'} eq 'no') { |
|
if (1) { |
$result.='<p class="LC_info">' |
$result.='<p class="LC_info">' |
.&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon) |
.&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon) |
."</p>\n"; |
."</p>\n"; |
Line 2078 KEYWORDS
|
Line 2086 KEYWORDS
|
# If any part of the problem is an essay-response (handgraded), then check for collaborators |
# If any part of the problem is an essay-response (handgraded), then check for collaborators |
my $fullname; |
my $fullname; |
my $col_fullnames = []; |
my $col_fullnames = []; |
if ($env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.handgrade'} eq 'yes') { |
|
if (1) { |
(my $sub_result,$fullname,$col_fullnames)= |
(my $sub_result,$fullname,$col_fullnames)= |
&check_collaborators($symb,$uname,$udom,\%record,$handgrade, |
&check_collaborators($symb,$uname,$udom,\%record,$handgrade, |
$counter); |
$counter); |
Line 2129 KEYWORDS
|
Line 2138 KEYWORDS
|
$lastsubonly.="\n".'<div class="LC_grade_submission_part">'. |
$lastsubonly.="\n".'<div class="LC_grade_submission_part">'. |
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
' <span class="LC_internal_info">'. |
' <span class="LC_internal_info">'. |
'('.&mt('Part ID: [_1]',$respid).')'. |
'('.&mt('Response ID: [_1]',$respid).')'. |
'</span> '. |
'</span> '. |
'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br /><br /></div>'; |
'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br /><br /></div>'; |
next; |
next; |
Line 2140 KEYWORDS
|
Line 2149 KEYWORDS
|
my ($ressub,$hide,$subval) = split(/:/,$submission,3); |
my ($ressub,$hide,$subval) = split(/:/,$submission,3); |
# Similarity check |
# Similarity check |
my $similar=''; |
my $similar=''; |
|
my ($type,$trial,$rndseed); |
|
if ($hide eq 'rand') { |
|
$type = 'randomizetry'; |
|
$trial = $record{"resource.$partid.tries"}; |
|
$rndseed = $record{"resource.$partid.rndseed"}; |
|
} |
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,$subval,\%old_essays); |
Line 2149 KEYWORDS
|
Line 2164 KEYWORDS
|
&Apache::lonnet::coursedescription($ocrsid, |
&Apache::lonnet::coursedescription($ocrsid, |
{'one_time' => 1}); |
{'one_time' => 1}); |
|
|
if ($hide) { |
if ($hide eq 'anon') { |
$similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'. |
$similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'. |
&mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; |
&mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; |
} else { |
} else { |
Line 2166 KEYWORDS
|
Line 2181 KEYWORDS
|
} |
} |
} |
} |
} |
} |
my $order=&get_order($partid,$respid,$symb,$uname,$udom); |
my $order=&get_order($partid,$respid,$symb,$uname,$udom, |
|
undef,$type,$trial,$rndseed); |
if ($env{'form.lastSub'} eq 'lastonly' || |
if ($env{'form.lastSub'} eq 'lastonly' || |
($env{'form.lastSub'} eq 'hdgrade' && |
($env{'form.lastSub'} eq 'hdgrade' && |
$$handgrade{$$part[0].'_'.$$part[1]} eq 'yes')) { |
$$handgrade{$$part[0].'_'.$$part[1]} eq 'yes')) { |
Line 2174 KEYWORDS
|
Line 2190 KEYWORDS
|
$lastsubonly.='<div class="LC_grade_submission_part">'. |
$lastsubonly.='<div class="LC_grade_submission_part">'. |
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
' <span class="LC_internal_info">'. |
' <span class="LC_internal_info">'. |
'('.&mt('Part ID: [_1]',$respid).')'. |
'('.&mt('Response ID: [_1]',$respid).')'. |
'</span> '; |
'</span> '; |
my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record); |
my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record); |
if (@$files) { |
if (@$files) { |
if ($hide) { |
if ($hide eq 'anon') { |
$lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files})); |
$lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files})); |
} else { |
} else { |
$lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />'; |
$lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />'; |
Line 2189 KEYWORDS
|
Line 2205 KEYWORDS
|
} |
} |
$lastsubonly.='<br />'; |
$lastsubonly.='<br />'; |
} |
} |
if ($hide) { |
if ($hide eq 'anon') { |
$lastsubonly.='<b>'.&mt('Anonymous Survey').'</b>'; |
$lastsubonly.='<b>'.&mt('Anonymous Survey').'</b>'; |
} else { |
} else { |
$lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'. |
$lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'. |
&cleanRecord($subval,$responsetype,$symb,$partid, |
&cleanRecord($subval,$responsetype,$symb,$partid, |
$respid,\%record,$order,undef,$uname,$udom); |
$respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed); |
} |
} |
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
$lastsubonly.='</div>'; |
$lastsubonly.='</div>'; |
Line 2205 KEYWORDS
|
Line 2221 KEYWORDS
|
} |
} |
$request->print($lastsubonly); |
$request->print($lastsubonly); |
} elsif ($env{'form.lastSub'} eq 'datesub') { |
} elsif ($env{'form.lastSub'} eq 'datesub') { |
my ($parts,$handgrade,$responseType) = &response_type($symb); |
my ($parts,$handgrade,$responseType) = &response_type($symb,\$res_error); |
$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom)); |
$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom)); |
} elsif ($env{'form.lastSub'} =~ /^(last|all)$/) { |
} elsif ($env{'form.lastSub'} =~ /^(last|all)$/) { |
$request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, |
$request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, |
Line 2213 KEYWORDS
|
Line 2229 KEYWORDS
|
$last,'.submission', |
$last,'.submission', |
'Apache::grades::keywords_highlight')); |
'Apache::grades::keywords_highlight')); |
} |
} |
|
|
$request->print('<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':' |
$request->print('<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':' |
.$udom.'" />'."\n"); |
.$udom.'" />'."\n"); |
# return if view submission with no grading option |
# return if view submission with no grading option |
# FIXME: the logic seems off here. Why show the grade button if you cannot grade? |
|
if (!&canmodify($usec)) { |
if (!&canmodify($usec)) { |
my $toGrade.='<input type="button" value="Grade Student" '. |
$request->print('<p><span class="LC_warning">'.&mt('No grading privileges').'</span></p></div>'); |
'onclick="javascript:checksubmit(this.form,\'Grade Student\',\'' |
|
.$counter.'\');" target="_self" /> '."\n" if (&canmodify($usec)); |
|
$toGrade.='</div>'."\n"; |
|
$request->print($toGrade); |
|
return; |
return; |
} else { |
} else { |
$request->print('</div>'."\n"); |
$request->print('</div>'."\n"); |
} |
} |
|
|
# essay grading message center |
# essay grading message center |
if ($env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.handgrade'} eq 'yes') { |
|
if (1) { |
my $result='<div class="LC_grade_message_center">'; |
my $result='<div class="LC_grade_message_center">'; |
|
|
$result.='<div class="LC_grade_message_center_header">'. |
$result.='<div class="LC_grade_message_center_header">'. |
Line 2340 sub check_collaborators {
|
Line 2351 sub check_collaborators {
|
next if ($record->{'resource.'.$part.'.collaborators'} eq ''); |
next if ($record->{'resource.'.$part.'.collaborators'} eq ''); |
my (@good_collaborators, @bad_collaborators); |
my (@good_collaborators, @bad_collaborators); |
foreach my $possible_collaborator |
foreach my $possible_collaborator |
(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 2356 sub check_collaborators {
|
Line 2367 sub check_collaborators {
|
} |
} |
} |
} |
if (scalar(@good_collaborators) != 0) { |
if (scalar(@good_collaborators) != 0) { |
$result.='<br />'.&mt('Collaborators: '); |
$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); |
$result.=$fullname->{$name}.' '; |
$result.='<li>'.$fullname->{$name}.'</li>'; |
} |
} |
$result.='<br />'."\n"; |
$result.='</ol><br />'."\n"; |
my ($part)=split(/\./,$part); |
my ($part)=split(/\./,$part); |
$result.='<input type="hidden" name="collaborator'.$counter. |
$result.='<input type="hidden" name="collaborator'.$counter. |
'" value="'.$part.':'.(join ':',@good_collaborators).'" />'. |
'" value="'.$part.':'.(join ':',@good_collaborators).'" />'. |
Line 2398 sub get_last_submission {
|
Line 2409 sub get_last_submission {
|
&Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'}); |
&Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'}); |
} |
} |
} |
} |
my %typeparts; |
my (%typeparts,%randombytry); |
my $showsurv = |
my $showsurv = |
&Apache::lonnet::allowed('vas',$env{'request.course.id'}); |
&Apache::lonnet::allowed('vas',$env{'request.course.id'}); |
foreach my $key (sort(keys(%lasthash))) { |
foreach my $key (sort(keys(%lasthash))) { |
if ($key =~ /\.type$/) { |
if ($key =~ /\.type$/) { |
if (($lasthash{$key} eq 'anonsurvey') || |
if (($lasthash{$key} eq 'anonsurvey') || |
($lasthash{$key} eq 'anonsurveycred')) { |
($lasthash{$key} eq 'anonsurveycred') || |
|
($lasthash{$key} eq 'randomizetry')) { |
my ($ign,@parts) = split(/\./,$key); |
my ($ign,@parts) = split(/\./,$key); |
pop(@parts); |
pop(@parts); |
unless ($showsurv) { |
my $id = join('.',@parts); |
my $id = join(',',@parts); |
if ($lasthash{$key} eq 'randomizetry') { |
$typeparts{$ign.'.'.$id} = $lasthash{$key}; |
$randombytry{$ign.'.'.$id} = $lasthash{$key}; |
|
} else { |
|
unless ($showsurv) { |
|
$typeparts{$ign.'.'.$id} = $lasthash{$key}; |
|
} |
} |
} |
delete($lasthash{$key}); |
delete($lasthash{$key}); |
} |
} |
} |
} |
} |
} |
my @hidden = keys(%typeparts); |
my @hidden = keys(%typeparts); |
|
my @randomize = keys(%randombytry); |
foreach my $key (keys(%lasthash)) { |
foreach my $key (keys(%lasthash)) { |
next if ($key !~ /\.submission$/); |
next if ($key !~ /\.submission$/); |
my $hide; |
my $hide; |
if (@hidden) { |
if (@hidden) { |
foreach my $id (@hidden) { |
foreach my $id (@hidden) { |
if ($key =~ /^\Q$id\E/) { |
if ($key =~ /^\Q$id\E/) { |
$hide = 1; |
$hide = 'anon'; |
last; |
last; |
} |
} |
} |
} |
} |
} |
|
unless ($hide) { |
|
if (@randomize) { |
|
foreach my $id (@hidden) { |
|
if ($key =~ /^\Q$id\E/) { |
|
$hide = 'rand'; |
|
last; |
|
} |
|
} |
|
} |
|
} |
my ($partid,$foo) = split(/submission$/,$key); |
my ($partid,$foo) = split(/submission$/,$key); |
my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? |
my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? |
'<span class="LC_warning">Draft Copy</span> ' : ''; |
'<span class="LC_warning">Draft Copy</span> ' : ''; |
Line 2535 sub processHandGrade {
|
Line 2562 sub processHandGrade {
|
} |
} |
} |
} |
|
|
if ($env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.handgrade'} eq 'yes') { |
|
if (1) { |
# Keywords sorted in alphabatical order |
# Keywords sorted in alphabatical order |
my $loginuser = $env{'user.name'}.':'.$env{'user.domain'}; |
my $loginuser = $env{'user.name'}.':'.$env{'user.domain'}; |
my %keyhash = (); |
my %keyhash = (); |
Line 2588 sub processHandGrade {
|
Line 2616 sub processHandGrade {
|
my $processUser = $env{'form.unamedom'.$ctr}; |
my $processUser = $env{'form.unamedom'.$ctr}; |
($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser); |
($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser); |
$env{'form.fullname'} = $$fullname{$processUser}; |
$env{'form.fullname'} = $$fullname{$processUser}; |
&submission($request,$ctr,$total-1); |
&submission($request,$ctr,$total-1,$symb); |
$ctr++; |
$ctr++; |
} |
} |
return ''; |
return ''; |
} |
} |
|
|
# Go directly to grade student - from submission or link from chart page |
|
if ($button eq 'Grade Student') { |
|
# (undef,undef,$env{'form.handgrade'},undef,undef) = &showResourceInfo($symb); |
|
my $processUser = $env{'form.unamedom'.$env{'form.studentNo'}}; |
|
($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser); |
|
$env{'form.fullname'} = $$fullname{$processUser}; |
|
&submission($request,0,0); |
|
return ''; |
|
} |
|
|
|
# Get the next/previous one or group of students |
# Get the next/previous one or group of students |
my $firststu = $env{'form.unamedom0'}; |
my $firststu = $env{'form.unamedom0'}; |
my $laststu = $env{'form.unamedom'.($ngrade-1)}; |
my $laststu = $env{'form.unamedom'.($ngrade-1)}; |
Line 2687 sub processHandGrade {
|
Line 2705 sub processHandGrade {
|
$env{'form.student'} = $uname; |
$env{'form.student'} = $uname; |
$env{'form.userdom'} = $udom; |
$env{'form.userdom'} = $udom; |
$env{'form.fullname'} = $$fullname{$_}; |
$env{'form.fullname'} = $$fullname{$_}; |
&submission($request,$ctr,$total); |
&submission($request,$ctr,$total,$symb); |
$ctr++; |
$ctr++; |
} |
} |
if ($total < 0) { |
if ($total < 0) { |
my $the_end = '<h3><span class="LC_info">'.&mt('LON-CAPA User Message').'</span></h3><br />'."\n"; |
my $the_end.=&mt('<b>Message: </b> No more students for this section or class.').'<br /><br />'."\n"; |
$the_end.=&mt('<b>Message: </b> No more students for this section or class.').'<br /><br />'."\n"; |
|
$the_end.=&mt('Click on the button below to return to the grading menu.').'<br /><br />'."\n"; |
|
$request->print($the_end); |
$request->print($the_end); |
} |
} |
return ''; |
return ''; |
Line 2848 sub handback_files {
|
Line 2864 sub handback_files {
|
foreach my $part_response_id (@part_response_id) { |
foreach my $part_response_id (@part_response_id) { |
my ($part_id,$resp_id) = @{ $part_response_id }; |
my ($part_id,$resp_id) = @{ $part_response_id }; |
my $part_resp = join('_',@{ $part_response_id }); |
my $part_resp = join('_',@{ $part_response_id }); |
if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part == $part_id)) { |
if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part eq $part_id)) { |
# if multiple files are uploaded names will be 'returndoc2','returndoc3' |
# if multiple files are uploaded names will be 'returndoc2','returndoc3' |
my $file_counter = 1; |
my $file_counter = 1; |
my $file_msg; |
my $file_msg; |
Line 3373 sub viewgrades {
|
Line 3389 sub viewgrades {
|
if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); } |
if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); } |
my ($partid) = &split_part_type($part); |
my ($partid) = &split_part_type($part); |
push(@partids,$partid); |
push(@partids,$partid); |
|
# |
|
# FIXME: Looks like $display looks at English text |
|
# |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
if ($display =~ /^Partial Credit Factor/) { |
if ($display =~ /^Partial Credit Factor/) { |
$result.='<th>'. |
$result.='<th>'. |
Line 3819 sub csvuploadmap_header {
|
Line 3838 sub csvuploadmap_header {
|
$javascript=&csvupload_javascript_forward_associate(); |
$javascript=&csvupload_javascript_forward_associate(); |
} |
} |
|
|
my $result=''; |
|
my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); |
|
my $ignore=&mt('Ignore First Line'); |
|
$symb = &Apache::lonenc::check_encrypt($symb); |
$symb = &Apache::lonenc::check_encrypt($symb); |
|
$request->print('<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">'. |
|
&mt('Total number of records found in file: [_1]',$distotal).'<hr />'. |
|
&mt('Associate entries from the uploaded file with as many fields as you can.')); |
|
my $reverse=&mt("Reverse Association"); |
$request->print(<<ENDPICK); |
$request->print(<<ENDPICK); |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> |
<br /> |
<h3><span class="LC_info">Uploading Class Grades</span></h3> |
<input type="button" value="$reverse" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" /> |
$result |
|
<hr /> |
|
<h3>Identify fields</h3> |
|
Total number of records found in file: $distotal <hr /> |
|
Enter as many fields as you can. The system will inform you and bring you back |
|
to this page if the data selected is insufficient to run your class.<hr /> |
|
<input type="button" value="Reverse Association" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" /> |
|
<label><input type="checkbox" name="noFirstLine" $checked />$ignore</label> |
|
<input type="hidden" name="associate" value="" /> |
<input type="hidden" name="associate" value="" /> |
<input type="hidden" name="phase" value="three" /> |
<input type="hidden" name="phase" value="three" /> |
<input type="hidden" name="datatoken" value="$datatoken" /> |
<input type="hidden" name="datatoken" value="$datatoken" /> |
Line 3906 sub upcsvScores_form {
|
Line 3918 sub upcsvScores_form {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $result=&checkforfile_js(); |
my $result=&checkforfile_js(); |
$result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; |
$result.=&Apache::loncommon::start_data_table(). |
$result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; |
&Apache::loncommon::start_data_table_header_row(). |
$result.=' <b>'.&mt('Specify a file containing the class scores for current resource.'). |
'<th>'.&mt('Specify a file containing the class scores for current resource.').'</th>'. |
'</b></td></tr>'."\n"; |
&Apache::loncommon::end_data_table_header_row(). |
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
&Apache::loncommon::start_data_table_row().'<td>'; |
my $upload=&mt("Upload Scores"); |
my $upload=&mt("Upload Scores"); |
my $upfile_select=&Apache::loncommon::upfile_select_html(); |
my $upfile_select=&Apache::loncommon::upfile_select_html(); |
my $ignore=&mt('Ignore First Line'); |
my $ignore=&mt('Ignore First Line'); |
Line 3921 sub upcsvScores_form {
|
Line 3933 sub upcsvScores_form {
|
<input type="hidden" name="command" value="csvuploadmap" /> |
<input type="hidden" name="command" value="csvuploadmap" /> |
$upfile_select |
$upfile_select |
<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> |
<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> |
<label><input type="checkbox" name="noFirstLine" />$ignore</label> |
|
</form> |
</form> |
ENDUPFORM |
ENDUPFORM |
$result.=&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", |
$result.=&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", |
&mt("How do I create a CSV file from a spreadsheet")) |
&mt("How do I create a CSV file from a spreadsheet")). |
.'</td></tr></table>'."\n"; |
'</td>'. |
$result.='</td></tr></table><br /><br />'."\n"; |
&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::end_data_table(); |
return $result; |
return $result; |
} |
} |
|
|
Line 3944 sub csvuploadmap {
|
Line 3956 sub csvuploadmap {
|
&Apache::loncommon::load_tmp_file($request); |
&Apache::loncommon::load_tmp_file($request); |
} |
} |
my @records=&Apache::loncommon::upfile_record_sep(); |
my @records=&Apache::loncommon::upfile_record_sep(); |
if ($env{'form.noFirstLine'}) { shift(@records); } |
|
&csvuploadmap_header($request,$symb,$datatoken,$#records+1); |
&csvuploadmap_header($request,$symb,$datatoken,$#records+1); |
my ($i,$keyfields); |
my ($i,$keyfields); |
if (@records) { |
if (@records) { |
Line 3980 sub csvuploadmap {
|
Line 3991 sub csvuploadmap {
|
|
|
sub csvuploadoptions { |
sub csvuploadoptions { |
my ($request,$symb)= @_; |
my ($request,$symb)= @_; |
my $checked=(($env{'form.noFirstLine'})?'1':'0'); |
my $overwrite=&mt('Overwrite any existing score'); |
my $ignore=&mt('Ignore First Line'); |
|
$request->print(<<ENDPICK); |
$request->print(<<ENDPICK); |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> |
<h3><span class="LC_info">Uploading Class Grade Options</span></h3> |
|
<input type="hidden" name="command" value="csvuploadassign" /> |
<input type="hidden" name="command" value="csvuploadassign" /> |
<!-- |
|
<p> |
|
<label> |
|
<input type="checkbox" name="show_full_results" /> |
|
Show a table of all changes |
|
</label> |
|
</p> |
|
--> |
|
<p> |
<p> |
<label> |
<label> |
<input type="checkbox" name="overwite_scores" checked="checked" /> |
<input type="checkbox" name="overwite_scores" checked="checked" /> |
Overwrite any existing score |
$overwrite |
</label> |
</label> |
</p> |
</p> |
ENDPICK |
ENDPICK |
my %fields=&get_fields(); |
my %fields=&get_fields(); |
if (!defined($fields{'domain'})) { |
if (!defined($fields{'domain'})) { |
my $domform = &Apache::loncommon::select_dom_form($env{'request.role.domain'},'default_domain'); |
my $domform = &Apache::loncommon::select_dom_form($env{'request.role.domain'},'default_domain'); |
$request->print("\n<p> Users are in domain: ".$domform."</p>\n"); |
$request->print("\n<p>".&mt('Users are in domain: [_1]',$domform)."</p>\n"); |
} |
} |
foreach my $key (sort(keys(%env))) { |
foreach my $key (sort(keys(%env))) { |
if ($key !~ /^form\.(.*)$/) { next; } |
if ($key !~ /^form\.(.*)$/) { next; } |
Line 4043 sub csvuploadassign {
|
Line 4044 sub csvuploadassign {
|
my $error_msg = ''; |
my $error_msg = ''; |
&Apache::loncommon::load_tmp_file($request); |
&Apache::loncommon::load_tmp_file($request); |
my @gradedata = &Apache::loncommon::upfile_record_sep(); |
my @gradedata = &Apache::loncommon::upfile_record_sep(); |
if ($env{'form.noFirstLine'}) { shift(@gradedata); } |
|
my %fields=&get_fields(); |
my %fields=&get_fields(); |
$request->print('<h3>Assigning Grades</h3>'); |
|
my $courseid=$env{'request.course.id'}; |
my $courseid=$env{'request.course.id'}; |
my ($classlist) = &getclasslist('all',0); |
my ($classlist) = &getclasslist('all',0); |
my @notallowed; |
my @notallowed; |
Line 4098 sub csvuploadassign {
|
Line 4097 sub csvuploadassign {
|
my $pcr=$entries{$fields{$dest}} / $wgt; |
my $pcr=$entries{$fields{$dest}} / $wgt; |
my $award=($pcr == 0) ? 'incorrect_by_override' |
my $award=($pcr == 0) ? 'incorrect_by_override' |
: 'correct_by_override'; |
: 'correct_by_override'; |
|
if ($pcr>1) { |
|
push(@skipped,&mt("[_1]: point value larger than weight","$username:$domain")); |
|
} |
$grades{"resource.$part.awarded"}=$pcr; |
$grades{"resource.$part.awarded"}=$pcr; |
$grades{"resource.$part.solved"}=$award; |
$grades{"resource.$part.solved"}=$award; |
$points{$part}=1; |
$points{$part}=1; |
Line 4125 sub csvuploadassign {
|
Line 4127 sub csvuploadassign {
|
$env{'request.course.id'}, |
$env{'request.course.id'}, |
$domain,$username); |
$domain,$username); |
if ($result eq 'ok') { |
if ($result eq 'ok') { |
|
# Successfully stored |
$request->print('.'); |
$request->print('.'); |
} else { |
# Remove from grading queue |
|
&Apache::bridgetask::remove_from_queue('gradingqueue',$symb, |
|
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
|
$env{'course.'.$env{'request.course.id'}.'.num'}, |
|
$domain,$username); |
|
$countdone++; |
|
} else { |
$request->print("<p><span class=\"LC_error\">". |
$request->print("<p><span class=\"LC_error\">". |
&mt("Failed to save data for student [_1]. Message when trying to save was: [_2]", |
&mt("Failed to save data for student [_1]. Message when trying to save was: [_2]", |
"$username:$domain",$result)."</span></p>"); |
"$username:$domain",$result)."</span></p>"); |
} |
} |
$request->rflush(); |
$request->rflush(); |
$countdone++; |
|
} |
} |
} |
} |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0)); |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0)); |
Line 4397 sub displayPage {
|
Line 4405 sub displayPage {
|
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td align="center" valign="top" >'.$prob. |
'<td align="center" valign="top" >'.$prob. |
(scalar(@{$parts}) == 1 ? '' |
(scalar(@{$parts}) == 1 ? '' |
: '<br />('.&mt('[_1] parts)', |
: '<br />('.&mt('[_1]parts)', |
scalar(@{$parts})) |
scalar(@{$parts}).' ') |
). |
). |
'</td>'; |
'</td>'; |
$studentTable.='<td valign="top">'; |
$studentTable.='<td valign="top">'; |
Line 4492 sub displaySubByDates {
|
Line 4500 sub displaySubByDates {
|
|
|
my $interaction; |
my $interaction; |
my $no_increment = 1; |
my $no_increment = 1; |
|
my %lastrndseed; |
for ($version=1;$version<=$$record{'version'};$version++) { |
for ($version=1;$version<=$$record{'version'};$version++) { |
my $timestamp = |
my $timestamp = |
&Apache::lonlocal::locallocaltime($$record{$version.':timestamp'}); |
&Apache::lonlocal::locallocaltime($$record{$version.':timestamp'}); |
Line 4509 sub displaySubByDates {
|
Line 4518 sub displaySubByDates {
|
my @versionKeys = split(/\:/,$$record{$version.':keys'}); |
my @versionKeys = split(/\:/,$$record{$version.':keys'}); |
my @displaySub = (); |
my @displaySub = (); |
foreach my $partid (@{$parts}) { |
foreach my $partid (@{$parts}) { |
my $hidden; |
my ($hidden,$type); |
if (($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurvey') || |
$type = $$record{$version.':resource.'.$partid.'.type'}; |
($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurveycred')) { |
if (($type eq 'anonsurvey') || ($type eq 'anonsurveycred')) { |
$hidden = 1; |
$hidden = 1; |
} |
} |
my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys) |
my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys) |
Line 4528 sub displaySubByDates {
|
Line 4537 sub displaySubByDates {
|
$displaySub[0].='<span class="LC_nobreak"'; |
$displaySub[0].='<span class="LC_nobreak"'; |
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
.' <span class="LC_internal_info">' |
.' <span class="LC_internal_info">' |
.'('.&mt('Part ID: [_1]',$responseId).')' |
.'('.&mt('Response ID: [_1]',$responseId).')' |
.'</span>' |
.'</span>' |
.' <b>'; |
.' <b>'; |
if ($hidden) { |
if ($hidden) { |
$displaySub[0].= &mt('Anonymous Survey').'</b>'; |
$displaySub[0].= &mt('Anonymous Survey').'</b>'; |
} else { |
} else { |
|
my ($trial,$rndseed,$newvariation); |
|
if ($type eq 'randomizetry') { |
|
$trial = $$record{"$where.$partid.tries"}; |
|
$rndseed = $$record{"$where.$partid.rndseed"}; |
|
} |
if ($$record{"$where.$partid.tries"} eq '') { |
if ($$record{"$where.$partid.tries"} eq '') { |
$displaySub[0].=&mt('Trial not counted'); |
$displaySub[0].=&mt('Trial not counted'); |
} else { |
} else { |
$displaySub[0].=&mt('Trial: [_1]', |
$displaySub[0].=&mt('Trial: [_1]', |
$$record{"$where.$partid.tries"}); |
$$record{"$where.$partid.tries"}); |
|
if ($rndseed || $lastrndseed{$partid}) { |
|
if ($rndseed ne $lastrndseed{$partid}) { |
|
$newvariation = ' ('.&mt('New variation this try').')'; |
|
} |
|
} |
|
$lastrndseed{$partid} = $rndseed; |
} |
} |
my $responseType=($isTask ? 'Task' |
my $responseType=($isTask ? 'Task' |
: $responseType->{$partid}->{$responseId}); |
: $responseType->{$partid}->{$responseId}); |
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
if (!exists($orders{$partid}->{$responseId})) { |
if ((!exists($orders{$partid}->{$responseId})) || ($trial)) { |
$orders{$partid}->{$responseId}= |
$orders{$partid}->{$responseId}= |
&get_order($partid,$responseId,$symb,$uname,$udom, |
&get_order($partid,$responseId,$symb,$uname,$udom, |
$no_increment); |
$no_increment,$type,$trial,$rndseed); |
} |
} |
$displaySub[0].='</b></span>'; # /nobreak |
$displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak |
$displaySub[0].=' '. |
$displaySub[0].=' '. |
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom).'<br />'; |
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />'; |
} |
} |
} |
} |
} |
} |
Line 4649 sub updateGradeByPage {
|
Line 4669 sub updateGradeByPage {
|
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td align="center" valign="top" >'.$prob. |
'<td align="center" valign="top" >'.$prob. |
(scalar(@{$parts}) == 1 ? '' |
(scalar(@{$parts}) == 1 ? '' |
: '<br />('.&mt('[quant,_1, part]',scalar(@{$parts})) |
: '<br />('.&mt('[quant,_1,part]',scalar(@{$parts})) |
.')').'</td>'; |
.')').'</td>'; |
$studentTable.='<td valign="top"> <b>'.$title.'</b> </td>'; |
$studentTable.='<td valign="top"> <b>'.$title.'</b> </td>'; |
|
|
Line 5335 sub scantron_selectphase {
|
Line 5355 sub scantron_selectphase {
|
|
|
LastName - column that the last name starts in |
LastName - column that the last name starts in |
LastNameLength - number of columns that the last name spans |
LastNameLength - number of columns that the last name spans |
|
BubblesPerRow - number of bubbles available in each row used to |
|
bubble an answer. (If not specified, 10 assumed). |
=cut |
=cut |
|
|
sub get_scantron_config { |
sub get_scantron_config { |
Line 5365 sub get_scantron_config {
|
Line 5386 sub get_scantron_config {
|
$config{'FirstNamelength'}=$config[14]; |
$config{'FirstNamelength'}=$config[14]; |
$config{'LastName'}=$config[15]; |
$config{'LastName'}=$config[15]; |
$config{'LastNamelength'}=$config[16]; |
$config{'LastNamelength'}=$config[16]; |
|
$config{'BubblesPerRow'}=$config[17]; |
last; |
last; |
} |
} |
return %config; |
return %config; |
Line 6136 sub check_for_error {
|
Line 6158 sub check_for_error {
|
=cut |
=cut |
|
|
sub scantron_warning_screen { |
sub scantron_warning_screen { |
my ($button_text)=@_; |
my ($button_text,$symb)=@_; |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my $CODElist; |
my $CODElist; |
Line 6159 sub scantron_warning_screen {
|
Line 6181 sub scantron_warning_screen {
|
<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.' |
</table> |
</table> |
<br /> |
<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)).'</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> |
<p> '.&mt('If something is incorrect, please click the \'Grading Menu\' button to start over.').'</p> |
|
|
|
<br /> |
<br /> |
'); |
'); |
Line 6184 sub scantron_do_warning {
|
Line 6205 sub scantron_do_warning {
|
if ( $env{'form.selectpage'} eq '' || |
if ( $env{'form.selectpage'} eq '' || |
$env{'form.scantron_selectfile'} eq '' || |
$env{'form.scantron_selectfile'} eq '' || |
$env{'form.scantron_format'} eq '' ) { |
$env{'form.scantron_format'} eq '' ) { |
$r->print("<p>".&mt('You have forgetten to specify some information. Please go Back and try again.')."</p>"); |
$r->print("<p>".&mt('You have forgotten to specify some information. Please go Back and try again.')."</p>"); |
if ( $env{'form.selectpage'} eq '') { |
if ( $env{'form.selectpage'} eq '') { |
$r->print('<p><span class="LC_error">'.&mt('You have not selected a Sequence to grade').'</span></p>'); |
$r->print('<p><span class="LC_error">'.&mt('You have not selected a Sequence to grade').'</span></p>'); |
} |
} |
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 a 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',$symb); |
$r->print(' |
$r->print(' |
'.$warning.' |
'.$warning.' |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
Line 6286 sub scantron_validate_file {
|
Line 6307 sub scantron_validate_file {
|
#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; |
my $max_bubble=&scantron_get_maxbubble(\$nav_error); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
|
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config); |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return ''; |
return ''; |
Line 6316 sub scantron_validate_file {
|
Line 6338 sub scantron_validate_file {
|
} |
} |
} |
} |
if (!$stop) { |
if (!$stop) { |
my $warning=&scantron_warning_screen('Start Grading'); |
my $warning=&scantron_warning_screen('Start Grading',$symb); |
$r->print(&mt('Validation process complete.').'<br />'. |
$r->print(&mt('Validation process complete.').'<br />'. |
$warning. |
$warning. |
&mt('Perform verification for each student after storage of submissions?'). |
&mt('Perform verification for each student after storage of submissions?'). |
Line 6326 sub scantron_validate_file {
|
Line 6348 sub scantron_validate_file {
|
'<input type="radio" name="verifyrecord" value="0" checked="checked" />'.&mt('No'). |
'<input type="radio" name="verifyrecord" value="0" checked="checked" />'.&mt('No'). |
'</label></span><br />'. |
'</label></span><br />'. |
&mt('Grading will take longer if you use verification.').'<br />'. |
&mt('Grading will take longer if you use verification.').'<br />'. |
&mt("Alternatively, the 'Review bubblesheet data' utility (see grading menu) can be used for all students after grading is complete.").'<br /><br />'. |
&mt('Otherwise, Grade/Manage/Review Bubblesheets [_1] Review bubblesheet data can be used once grading is complete.','»').'<br /><br />'. |
'<input type="submit" name="submit" value="'.&mt('Start Grading').'" />'. |
'<input type="submit" name="submit" value="'.&mt('Start Grading').'" />'. |
'<input type="hidden" name="command" value="scantron_process" />'."\n"); |
'<input type="hidden" name="command" value="scantron_process" />'."\n"); |
} else { |
} else { |
Line 6338 sub scantron_validate_file {
|
Line 6360 sub scantron_validate_file {
|
$r->print('<input type="submit" name="submit" value="'.&mt('Ignore').' → " />'); |
$r->print('<input type="submit" name="submit" value="'.&mt('Ignore').' → " />'); |
$r->print(' '.&mt('this error').' <br />'); |
$r->print(' '.&mt('this error').' <br />'); |
|
|
$r->print(" <p>".&mt("Or click the 'Grading Menu' button to start over.")."</p>"); |
$r->print('<p>'.&mt('Or 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>'); |
} else { |
} else { |
if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') { |
if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') { |
$r->print('<input type="button" name="submitbutton" value="'.&mt('Continue').' →" onclick="javascript:verify_bubble_radio(this.form)" />'); |
$r->print('<input type="button" name="submitbutton" value="'.&mt('Continue').' →" onclick="javascript:verify_bubble_radio(this.form)" />'); |
Line 6739 sub scantron_validate_ID {
|
Line 6761 sub scantron_validate_ID {
|
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
|
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # parse needs the bubble_lines.. array. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble_lines.. array. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return(1,$currentphase); |
return(1,$currentphase); |
Line 7138 sub scantron_bubble_selector {
|
Line 7160 sub scantron_bubble_selector {
|
my $max=$$scan_config{'Qlength'}; |
my $max=$$scan_config{'Qlength'}; |
|
|
my $scmode=$$scan_config{'Qon'}; |
my $scmode=$$scan_config{'Qon'}; |
if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; } |
if ($scmode eq 'number' || $scmode eq 'letter') { |
|
if (($$scan_config{'BubblesPerRow'} =~ /^\d+$/) && |
|
($$scan_config{'BubblesPerRow'} > 0)) { |
|
$max=$$scan_config{'BubblesPerRow'}; |
|
if (($scmode eq 'number') && ($max > 10)) { |
|
$max = 10; |
|
} elsif (($scmode eq 'letter') && $max > 26) { |
|
$max = 26; |
|
} |
|
} else { |
|
$max = 10; |
|
} |
|
} |
|
|
my @alphabet=('A'..'Z'); |
my @alphabet=('A'..'Z'); |
$r->print(&Apache::loncommon::start_data_table(). |
$r->print(&Apache::loncommon::start_data_table(). |
Line 7293 sub scantron_validate_CODE {
|
Line 7327 sub scantron_validate_CODE {
|
my %allcodes=&get_codes(); |
my %allcodes=&get_codes(); |
|
|
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # parse needs the lines per response array. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the lines per response array. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return(1,$currentphase); |
return(1,$currentphase); |
Line 7352 sub scantron_validate_doublebubble {
|
Line 7386 sub scantron_validate_doublebubble {
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # parse needs the bubble line array. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble line array. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return(1,$currentphase); |
return(1,$currentphase); |
Line 7374 sub scantron_validate_doublebubble {
|
Line 7408 sub scantron_validate_doublebubble {
|
|
|
|
|
sub scantron_get_maxbubble { |
sub scantron_get_maxbubble { |
my ($nav_error) = @_; |
my ($nav_error,$scantron_config) = @_; |
if (defined($env{'form.scantron_maxbubble'}) && |
if (defined($env{'form.scantron_maxbubble'}) && |
$env{'form.scantron_maxbubble'}) { |
$env{'form.scantron_maxbubble'}) { |
&restore_bubble_lines(); |
&restore_bubble_lines(); |
Line 7393 sub scantron_get_maxbubble {
|
Line 7427 sub scantron_get_maxbubble {
|
} |
} |
my $map=$navmap->getResourceByUrl($sequence); |
my $map=$navmap->getResourceByUrl($sequence); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
|
my $bubbles_per_row = &bubblesheet_bubbles_per_row($scantron_config); |
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
|
|
Line 7408 sub scantron_get_maxbubble {
|
Line 7443 sub scantron_get_maxbubble {
|
my $response_number = 0; |
my $response_number = 0; |
my $bubble_line = 0; |
my $bubble_line = 0; |
foreach my $resource (@resources) { |
foreach my $resource (@resources) { |
my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,$udom); |
my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,$udom,undef,$bubbles_per_row); |
if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) { |
if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) { |
foreach my $part_id (@{$parts}) { |
foreach my $part_id (@{$parts}) { |
my $lines; |
my $lines; |
Line 7437 sub scantron_get_maxbubble {
|
Line 7472 sub scantron_get_maxbubble {
|
if (ref($analysis->{$part_id.'.shown'}) eq 'ARRAY') { |
if (ref($analysis->{$part_id.'.shown'}) eq 'ARRAY') { |
$numshown = scalar(@{$analysis->{$part_id.'.shown'}}); |
$numshown = scalar(@{$analysis->{$part_id.'.shown'}}); |
} |
} |
my $bubbles_per_line = 10; |
my $bubbles_per_row = |
my $inner_bubble_lines = int($numbub/$bubbles_per_line); |
&bubblesheet_bubbles_per_row($scantron_config); |
if (($numbub % $bubbles_per_line) != 0) { |
my $inner_bubble_lines = int($numbub/$bubbles_per_row); |
|
if (($numbub % $bubbles_per_row) != 0) { |
$inner_bubble_lines++; |
$inner_bubble_lines++; |
} |
} |
for (my $i=0; $i<$numshown; $i++) { |
for (my $i=0; $i<$numshown; $i++) { |
Line 7450 sub scantron_get_maxbubble {
|
Line 7486 sub scantron_get_maxbubble {
|
$lines = $numshown * $inner_bubble_lines; |
$lines = $numshown * $inner_bubble_lines; |
} else { |
} else { |
$lines = $analysis->{"$part_id.bubble_lines"}; |
$lines = $analysis->{"$part_id.bubble_lines"}; |
} |
} |
|
|
$first_bubble_line{$response_number} = $bubble_line; |
$first_bubble_line{$response_number} = $bubble_line; |
$bubble_lines_per_response{$response_number} = $lines; |
$bubble_lines_per_response{$response_number} = $lines; |
Line 7471 sub scantron_get_maxbubble {
|
Line 7507 sub scantron_get_maxbubble {
|
return $env{'form.scantron_maxbubble'}; |
return $env{'form.scantron_maxbubble'}; |
} |
} |
|
|
|
sub bubblesheet_bubbles_per_row { |
|
my ($scantron_config) = @_; |
|
my $bubbles_per_row; |
|
if (ref($scantron_config) eq 'HASH') { |
|
$bubbles_per_row = $scantron_config->{'BubblesPerRow'}; |
|
} |
|
if ((!$bubbles_per_row) || ($bubbles_per_row < 1)) { |
|
$bubbles_per_row = 10; |
|
} |
|
return $bubbles_per_row; |
|
} |
|
|
sub scantron_validate_missingbubbles { |
sub scantron_validate_missingbubbles { |
my ($r,$currentphase) = @_; |
my ($r,$currentphase) = @_; |
#get student info |
#get student info |
Line 7481 sub scantron_validate_missingbubbles {
|
Line 7529 sub scantron_validate_missingbubbles {
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $nav_error; |
my $nav_error; |
my $max_bubble=&scantron_get_maxbubble(\$nav_error); |
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config); |
if ($nav_error) { |
if ($nav_error) { |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
Line 7539 sub scantron_process_students {
|
Line 7587 sub scantron_process_students {
|
my $default_form_data=&defaultFormData($symb); |
my $default_form_data=&defaultFormData($symb); |
|
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
|
my $bubbles_per_row = |
|
&bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my %idmap=&username_to_idmap($classlist); |
my %idmap=&username_to_idmap($classlist); |
Line 7551 sub scantron_process_students {
|
Line 7601 sub scantron_process_students {
|
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my (%grader_partids_by_symb,%grader_randomlists_by_symb); |
my (%grader_partids_by_symb,%grader_randomlists_by_symb); |
&graders_resources_pass(\@resources,\%grader_partids_by_symb, |
&graders_resources_pass(\@resources,\%grader_partids_by_symb, |
\%grader_randomlists_by_symb); |
\%grader_randomlists_by_symb,$bubbles_per_row); |
my $resource_error; |
my $resource_error; |
foreach my $resource (@resources) { |
foreach my $resource (@resources) { |
my $ressymb; |
my $ressymb; |
Line 7563 sub scantron_process_students {
|
Line 7613 sub scantron_process_students {
|
} |
} |
my ($analysis,$parts) = |
my ($analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
$env{'user.name'},$env{'user.domain'},1); |
$env{'user.name'},$env{'user.domain'},1,$bubbles_per_row); |
$grader_partids_by_symb{$ressymb} = $parts; |
$grader_partids_by_symb{$ressymb} = $parts; |
if (ref($analysis) eq 'HASH') { |
if (ref($analysis) eq 'HASH') { |
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') { |
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') { |
Line 7601 SCANTRONFORM
|
Line 7651 SCANTRONFORM
|
my $started; |
my $started; |
|
|
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return ''; |
return ''; |
Line 7657 SCANTRONFORM
|
Line 7707 SCANTRONFORM
|
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
my ($analysis,$parts) = |
my ($analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom); |
&scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom,undef,$bubbles_per_row); |
$partids_by_symb{$ressymb} = $parts; |
$partids_by_symb{$ressymb} = $parts; |
} else { |
} else { |
$partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb}; |
$partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb}; |
Line 7686 SCANTRONFORM
|
Line 7736 SCANTRONFORM
|
} |
} |
|
|
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
\@resources,\%partids_by_symb) eq 'ssi_error') { |
\@resources,\%partids_by_symb, |
|
$bubbles_per_row) eq 'ssi_error') { |
$ssi_error = 0; # So end of handler error message does not trigger. |
$ssi_error = 0; # So end of handler error message does not trigger. |
$r->print("</form>"); |
$r->print("</form>"); |
&ssi_print_error($r); |
&ssi_print_error($r); |
Line 7713 SCANTRONFORM
|
Line 7764 SCANTRONFORM
|
if ($studentrecord ne $studentdata) { |
if ($studentrecord ne $studentdata) { |
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
\@resources,\%partids_by_symb) eq 'ssi_error') { |
\@resources,\%partids_by_symb, |
|
$bubbles_per_row) eq 'ssi_error') { |
$ssi_error = 0; # So end of handler error message does not trigger. |
$ssi_error = 0; # So end of handler error message does not trigger. |
$r->print("</form>"); |
$r->print("</form>"); |
&ssi_print_error($r); |
&ssi_print_error($r); |
Line 7776 SCANTRONFORM
|
Line 7828 SCANTRONFORM
|
} |
} |
|
|
sub graders_resources_pass { |
sub graders_resources_pass { |
my ($resources,$grader_partids_by_symb,$grader_randomlists_by_symb) = @_; |
my ($resources,$grader_partids_by_symb,$grader_randomlists_by_symb, |
|
$bubbles_per_row) = @_; |
if ((ref($resources) eq 'ARRAY') && (ref($grader_partids_by_symb)) && |
if ((ref($resources) eq 'ARRAY') && (ref($grader_partids_by_symb)) && |
(ref($grader_randomlists_by_symb) eq 'HASH')) { |
(ref($grader_randomlists_by_symb) eq 'HASH')) { |
foreach my $resource (@{$resources}) { |
foreach my $resource (@{$resources}) { |
my $ressymb = $resource->symb(); |
my $ressymb = $resource->symb(); |
my ($analysis,$parts) = |
my ($analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
$env{'user.name'},$env{'user.domain'},1); |
$env{'user.name'},$env{'user.domain'},1,$bubbles_per_row); |
$grader_partids_by_symb->{$ressymb} = $parts; |
$grader_partids_by_symb->{$ressymb} = $parts; |
if (ref($analysis) eq 'HASH') { |
if (ref($analysis) eq 'HASH') { |
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') { |
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') { |
Line 7797 sub graders_resources_pass {
|
Line 7850 sub graders_resources_pass {
|
} |
} |
|
|
sub grade_student_bubbles { |
sub grade_student_bubbles { |
my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts) = @_; |
my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts,$bubbles_per_row) = @_; |
|
# Walk folder as student here to get resources in order student sees. |
if (ref($resources) eq 'ARRAY') { |
if (ref($resources) eq 'ARRAY') { |
my $count = 0; |
my $count = 0; |
foreach my $resource (@{$resources}) { |
foreach my $resource (@{$resources}) { |
Line 7810 sub grade_student_bubbles {
|
Line 7864 sub grade_student_bubbles {
|
'grade_symb' => $ressymb, |
'grade_symb' => $ressymb, |
'CODE' => $scancode |
'CODE' => $scancode |
); |
); |
|
if ($bubbles_per_row ne '') { |
|
$form{'bubbles_per_row'} = $bubbles_per_row; |
|
} |
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 7869 sub scantron_upload_scantron_data {
|
Line 7926 sub scantron_upload_scantron_data {
|
|
|
')); |
')); |
$r->print(' |
$r->print(' |
<h3>'.&mt('Send scanned bubblesheet data to a course').'</h3> |
<h3>'.&mt('Send bubblesheet data to a course').'</h3> |
|
|
<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. |
Line 8085 sub checkscantron_results {
|
Line 8142 sub checkscantron_results {
|
my %record; |
my %record; |
my %scantron_config = |
my %scantron_config = |
&Apache::grades::get_scantron_config($env{'form.scantron_format'}); |
&Apache::grades::get_scantron_config($env{'form.scantron_format'}); |
|
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile(); |
my ($scanlines,$scan_data)=&Apache::grades::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); |
Line 8112 sub checkscantron_results {
|
Line 8170 sub checkscantron_results {
|
'inline',undef,'checkscantron'); |
'inline',undef,'checkscantron'); |
my ($username,$domain,$started); |
my ($username,$domain,$started); |
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return ''; |
return ''; |
Line 8162 sub checkscantron_results {
|
Line 8220 sub checkscantron_results {
|
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
(my $analysis,$parts) = |
(my $analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'},$username,$domain); |
&scantron_partids_tograde($resource,$env{'request.course.id'},$username,$domain,undef,$bubbles_per_row); |
} else { |
} else { |
$parts = $grader_partids_by_symb{$ressymb}; |
$parts = $grader_partids_by_symb{$ressymb}; |
} |
} |
Line 8207 sub checkscantron_results {
|
Line 8265 sub checkscantron_results {
|
} |
} |
} |
} |
} |
} |
$r->print('<p>'.&mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for <b>[quant,_1,student]</b> ([_2] scantron lines/student).',$numstudents,$env{'form.scantron_maxbubble'}).'</p>'); |
$r->print( |
|
'<p>' |
|
.&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>', |
|
$numstudents, |
|
'</b>', |
|
$env{'form.scantron_maxbubble'}) |
|
.'</p>' |
|
); |
$r->print('<p>'.&mt('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>'); |
$r->print('<p>'.&mt('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>'); |
if ($passed) { |
if ($passed) { |
$r->print(&mt('Students with exact correspondence between bubblesheet data and submissions are as follows:').'<br /><br />'); |
$r->print(&mt('Students with exact correspondence between bubblesheet data and submissions are as follows:').'<br /><br />'); |
Line 8415 sub grading_menu {
|
Line 8481 sub grading_menu {
|
{ linktext => 'Select individual students to grade', |
{ linktext => 'Select individual students to grade', |
url => $url1a, |
url => $url1a, |
permission => 'F', |
permission => 'F', |
icon => 'edit-find-replace.png', |
icon => 'grade_students.png', |
linktitle => 'Grade current resource for a selection of students.' |
linktitle => 'Grade current resource for a selection of students.' |
}, |
}, |
{ linktext => 'Grade ungraded submissions.', |
{ linktext => 'Grade ungraded submissions.', |
url => $url1b, |
url => $url1b, |
permission => 'F', |
permission => 'F', |
icon => 'edit-find-replace.png', |
icon => 'ungrade_sub.png', |
linktitle => 'Grade all submissions that have not been graded yet.' |
linktitle => 'Grade all submissions that have not been graded yet.' |
}, |
}, |
|
|
{ linktext => 'Grading table', |
{ linktext => 'Grading table', |
url => $url1c, |
url => $url1c, |
permission => 'F', |
permission => 'F', |
icon => 'edit-find-replace.png', |
icon => 'grading_table.png', |
linktitle => 'Grade current resource for all students.' |
linktitle => 'Grade current resource for all students.' |
}, |
}, |
{ linktext => 'Grade page/folder for one student', |
{ linktext => 'Grade page/folder for one student', |
url => $url1d, |
url => $url1d, |
permission => 'F', |
permission => 'F', |
icon => 'edit-find-replace.png', |
icon => 'grade_PageFolder.png', |
linktitle => 'Grade all resources in current page/sequence/folder for one student.' |
linktitle => 'Grade all resources in current page/sequence/folder for one student.' |
}, |
}, |
{ linktext => 'Download submissions', |
{ linktext => 'Download submissions', |
url => $url1e, |
url => $url1e, |
permission => 'F', |
permission => 'F', |
icon => 'edit-find-replace.png', |
icon => 'download_sub.png', |
linktitle => 'Download all students submissions.' |
linktitle => 'Download all students submissions.' |
}]}, |
}]}, |
{ categorytitle=>'Automated Grading', |
{ categorytitle=>'Automated Grading', |
Line 8461 sub grading_menu {
|
Line 8527 sub grading_menu {
|
{ linktext => 'Grade/Manage/Review Bubblesheets', |
{ linktext => 'Grade/Manage/Review Bubblesheets', |
url => $url4, |
url => $url4, |
permission => 'F', |
permission => 'F', |
icon => 'stat.png', |
icon => 'bubblesheet.png', |
linktitle => 'Grade scantron exams, upload/download scantron data files, and review previously graded scantron exams.' |
linktitle => 'Grade bubblesheet exams, upload/download bubblesheet data files, and review previously graded bubblesheet exams.' |
}, |
}, |
{ linktext => 'Verify Receipt Number', |
{ linktext => 'Verify Receipt Number', |
url => $url5, |
url => $url5, |
permission => 'F', |
permission => 'F', |
icon => 'edit-find-replace.png', |
icon => 'receipt_number.png', |
linktitle => 'Verify a system-generated receipt number for correct problem solution.' |
linktitle => 'Verify a system-generated receipt number for correct problem solution.' |
} |
} |
|
|
Line 8498 sub submit_options_sequence {
|
Line 8564 sub submit_options_sequence {
|
|
|
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
$result.=' |
$result.=&selectfield(0). |
<h2> |
|
'.&mt('Grade page/folder for one student').' |
|
</h2>'. |
|
&selectfield(0). |
|
'<input type="hidden" name="command" value="pickStudentPage" /> |
'<input type="hidden" name="command" value="pickStudentPage" /> |
<div> |
<div> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
Line 8521 sub submit_options_table {
|
Line 8583 sub submit_options_table {
|
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
|
|
$result.=' |
$result.=&selectfield(0). |
<h2> |
|
'.&mt('Grading table').' |
|
</h2>'. |
|
&selectfield(0). |
|
'<input type="hidden" name="command" value="viewgrades" /> |
'<input type="hidden" name="command" value="viewgrades" /> |
<div> |
<div> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
Line 8567 sub submit_options {
|
Line 8625 sub submit_options {
|
|
|
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
$result.=' |
$result.=&selectfield(1).' |
<h2> |
|
'.&mt('Select individual students to grade').' |
|
</h2>'.&selectfield(1).' |
|
<input type="hidden" name="command" value="submission" /> |
<input type="hidden" name="command" value="submission" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
</div> |
</div> |
Line 8583 sub submit_options {
|
Line 8638 sub submit_options {
|
|
|
sub selectfield { |
sub selectfield { |
my ($full)=@_; |
my ($full)=@_; |
|
my %options = |
|
(&Apache::lonlocal::texthash( |
|
'yes' => 'with submissions', |
|
'queued' => 'in grading queue', |
|
'graded' => 'with ungraded submissions', |
|
'incorrect' => 'with incorrect submissions', |
|
'all' => 'with any status'), |
|
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
my $result='<div class="LC_columnSection"> |
my $result='<div class="LC_columnSection"> |
|
|
<fieldset> |
<fieldset> |
Line 8611 sub selectfield {
|
Line 8674 sub selectfield {
|
<legend> |
<legend> |
'.&mt('Submission Status').' |
'.&mt('Submission Status').' |
</legend>'. |
</legend>'. |
&Apache::loncommon::select_form('all','submitonly', |
&Apache::loncommon::select_form('all','submitonly',\%options). |
(&Apache::lonlocal::texthash( |
|
'yes' => 'with submissions', |
|
'queued' => 'in grading queue', |
|
'graded' => 'with ungraded submissions', |
|
'incorrect' => 'with incorrect submissions', |
|
'all' => 'with any status'), |
|
'select_form_order' => ['yes','queued','graded','incorrect','all'])). |
|
'</fieldset>'; |
'</fieldset>'; |
} |
} |
$result.='</div><br />'; |
$result.='</div><br />'; |
Line 8712 sub process_clicker {
|
Line 8768 sub process_clicker {
|
my ($r,$symb)=@_; |
my ($r,$symb)=@_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $result=&checkforfile_js(); |
my $result=&checkforfile_js(); |
$result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; |
$result.=&Apache::loncommon::start_data_table(). |
$result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; |
&Apache::loncommon::start_data_table_header_row(). |
$result.=' <b>'.&mt('Specify a file containing the clicker information for this resource.'). |
'<th>'.&mt('Specify a file containing clicker information and set grading options.').'</th>'. |
'</b></td></tr>'."\n"; |
&Apache::loncommon::end_data_table_header_row(). |
$result.='<tr bgcolor="#ffffe6"><td>'."\n"; |
&Apache::loncommon::start_data_table_row()."<td>\n"; |
# Attempt to restore parameters from last session, set defaults if not present |
# Attempt to restore parameters from last session, set defaults if not present |
my %Saveable_Parameters=&clicker_grading_parameters(); |
my %Saveable_Parameters=&clicker_grading_parameters(); |
&Apache::loncommon::restore_course_settings('grades_clicker', |
&Apache::loncommon::restore_course_settings('grades_clicker', |
Line 8733 sub process_clicker {
|
Line 8789 sub process_clicker {
|
} |
} |
} |
} |
|
|
my $upload=&mt("Upload File"); |
my $upload=&mt("Evaluate File"); |
my $type=&mt("Type"); |
my $type=&mt("Type"); |
my $attendance=&mt("Award points just for participation"); |
my $attendance=&mt("Award points just for participation"); |
my $personnel=&mt("Correctness determined from response by course personnel"); |
my $personnel=&mt("Correctness determined from response by course personnel"); |
Line 8743 sub process_clicker {
|
Line 8799 sub process_clicker {
|
my $pcorrect=&mt("Percentage points for correct solution"); |
my $pcorrect=&mt("Percentage points for correct solution"); |
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'}); |
$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 8791 ENDUPFORM
|
Line 8847 ENDUPFORM
|
<input type="hidden" name="command" value="processclickerfile" /> |
<input type="hidden" name="command" value="processclickerfile" /> |
<input type="file" name="upfile" size="50" /> |
<input type="file" name="upfile" size="50" /> |
<br /><label>$type: $selectform</label> |
<br /><label>$type: $selectform</label> |
<br /><label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label> |
ENDUPFORM |
|
$result.='</td>'.&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::start_data_table_row().'<td>'.(<<ENDGRADINGFORM); |
|
<label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label> |
<br /><label><input type="radio" name="gradingmechanism" value="personnel"$checked{'personnel'} onclick="sanitycheck()" />$personnel</label> |
<br /><label><input type="radio" name="gradingmechanism" value="personnel"$checked{'personnel'} onclick="sanitycheck()" />$personnel</label> |
<br /><label><input type="radio" name="gradingmechanism" value="specific"$checked{'specific'} onclick="sanitycheck()" />$specific </label> |
<br /><label><input type="radio" name="gradingmechanism" value="specific"$checked{'specific'} onclick="sanitycheck()" />$specific </label> |
<input type="text" name="specificid" value="$env{'form.specificid'}" size="20" /> |
<input type="text" name="specificid" value="$env{'form.specificid'}" size="20" /> |
Line 8799 ENDUPFORM
|
Line 8858 ENDUPFORM
|
<br /> |
<br /> |
<input type="text" name="givenanswer" size="50" /> |
<input type="text" name="givenanswer" size="50" /> |
<input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" /> |
<input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" /> |
<br /><label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> |
ENDGRADINGFORM |
|
$result.='</td>'.&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::start_data_table_row().'<td>'.(<<ENDPERCFORM); |
|
<label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> |
<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label> |
<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label> |
<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> |
<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> |
</form>' |
</form>' |
ENDUPFORM |
ENDPERCFORM |
$result.='</td></tr></table>'."\n". |
$result.='</td>'. |
'</td></tr></table><br /><br />'."\n"; |
&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::end_data_table(); |
return $result; |
return $result; |
} |
} |
|
|
Line 8829 sub process_clicker_file {
|
Line 8892 sub process_clicker_file {
|
if ($env{'form.gradingmechanism'} eq 'given') { |
if ($env{'form.gradingmechanism'} eq 'given') { |
$env{'form.givenanswer'}=~s/^\s*//gs; |
$env{'form.givenanswer'}=~s/^\s*//gs; |
$env{'form.givenanswer'}=~s/\s*$//gs; |
$env{'form.givenanswer'}=~s/\s*$//gs; |
$env{'form.givenanswer'}=~s/[^a-zA-Z0-9\.\*\-]+/\,/g; |
$env{'form.givenanswer'}=~s/[^a-zA-Z0-9\.\*\-\+]+/\,/g; |
$env{'form.givenanswer'}=uc($env{'form.givenanswer'}); |
$env{'form.givenanswer'}=uc($env{'form.givenanswer'}); |
my @answers=split(/\,/,$env{'form.givenanswer'}); |
my @answers=split(/\,/,$env{'form.givenanswer'}); |
$foundgiven=$#answers+1; |
$foundgiven=$#answers+1; |
Line 8885 sub process_clicker_file {
|
Line 8948 sub process_clicker_file {
|
|
|
$result.=&Apache::loncommon::studentbrowser_javascript(); |
$result.=&Apache::loncommon::studentbrowser_javascript(); |
$symb = &Apache::lonenc::check_encrypt($symb); |
$symb = &Apache::lonenc::check_encrypt($symb); |
my $heading=&mt('Scanning clicker file'); |
$result.=&Apache::loncommon::start_data_table(). |
$result.=(<<ENDHEADER); |
&Apache::loncommon::start_data_table_header_row(). |
<br /><table width="100%" border="0"><tr><td bgcolor="#777777"> |
'<th>'.&mt('Evaluate clicker file').'</th>'. |
<table width="100%" border="0"><tr bgcolor="#e6ffff"><td> |
&Apache::loncommon::end_data_table_header_row(). |
<b>$heading</b></td></tr><tr bgcolor=#ffffe6><td> |
&Apache::loncommon::start_data_table_row().(<<ENDHEADER); |
|
<td> |
<form method="post" action="/adm/grades" name="clickeranalysis"> |
<form method="post" action="/adm/grades" name="clickeranalysis"> |
<input type="hidden" name="symb" value="$symb" /> |
<input type="hidden" name="symb" value="$symb" /> |
<input type="hidden" name="command" value="assignclickergrades" /> |
<input type="hidden" name="command" value="assignclickergrades" /> |
Line 8937 ENDHEADER
|
Line 9001 ENDHEADER
|
} elsif ($clicker_ids{$id}) { |
} elsif ($clicker_ids{$id}) { |
if ($clicker_ids{$id}=~/\,/) { |
if ($clicker_ids{$id}=~/\,/) { |
# More than one user with the same clicker! |
# More than one user with the same clicker! |
$result.="\n<hr />".&mt('Clicker registered more than once').": <tt>".$id."</tt><br />"; |
$result.="</td>".&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::start_data_table_row()."<td>". |
|
&mt('Clicker registered more than once').": <tt>".$id."</tt><br />"; |
$result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'. |
$result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'. |
"<select name='multi".$id."'>"; |
"<select name='multi".$id."'>"; |
foreach my $reguser (sort(split(/\,/,$clicker_ids{$id}))) { |
foreach my $reguser (sort(split(/\,/,$clicker_ids{$id}))) { |
Line 8951 ENDHEADER
|
Line 9017 ENDHEADER
|
$student_count++; |
$student_count++; |
} |
} |
} else { |
} else { |
$result.="\n<hr />".&mt('Unregistered Clicker')." <tt>".$id."</tt><br />"; |
$result.="</td>".&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::start_data_table_row()."<td>". |
|
&mt('Unregistered Clicker')." <tt>".$id."</tt><br />"; |
$result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'. |
$result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'. |
"\n".&mt("Username").": <input type='text' name='uname".$id."' /> ". |
"\n".&mt("Username").": <input type='text' name='uname".$id."' /> ". |
"\n".&mt("Domain").": ". |
"\n".&mt("Domain").": ". |
&Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).' '. |
&Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).' '. |
&Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id); |
&Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id,0,$id); |
$unknown_count++; |
$unknown_count++; |
} |
} |
} |
} |
Line 8977 ENDHEADER
|
Line 9045 ENDHEADER
|
} else { |
} else { |
$result.='<br /><input type="submit" name="finalize" value="'.&mt('Finalize Grading').'" />'; |
$result.='<br /><input type="submit" name="finalize" value="'.&mt('Finalize Grading').'" />'; |
} |
} |
$result.='</form></td></tr></table>'."\n". |
$result.='</form></td>'. |
'</td></tr></table><br /><br />'."\n"; |
&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::end_data_table(); |
return $result; |
return $result; |
} |
} |
|
|
Line 9001 sub iclicker_eval {
|
Line 9070 sub iclicker_eval {
|
$id=~s/^[\#0]+//; |
$id=~s/^[\#0]+//; |
for (my $i=0;$i<$number;$i++) { |
for (my $i=0;$i<$number;$i++) { |
my $idx=3+$i*6; |
my $idx=3+$i*6; |
|
$entries[$idx]=~s/[^a-zA-Z0-9\.\*\-\+]+//g; |
push(@idresponses,$entries[$idx]); |
push(@idresponses,$entries[$idx]); |
} |
} |
$$responses{$id}=join(',',@idresponses); |
$$responses{$id}=join(',',@idresponses); |
Line 9052 sub assign_clicker_grades {
|
Line 9122 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=''; |
my $result=&Apache::loncommon::start_data_table(). |
|
&Apache::loncommon::start_data_table_header_row(). |
my $heading=&mt('Assigning grades based on clicker file'); |
'<th>'.&mt('Assigning grades based on clicker file').'</th>'. |
$result.=(<<ENDHEADER); |
&Apache::loncommon::end_data_table_header_row(). |
<br /><table width="100%" border="0"><tr><td bgcolor="#777777"> |
&Apache::loncommon::start_data_table_row().'<td>'; |
<table width="100%" border="0"><tr bgcolor="#e6ffff"><td> |
|
<b>$heading</b></td></tr><tr bgcolor=#ffffe6><td> |
|
ENDHEADER |
|
# Get correct result |
# Get correct result |
# FIXME: Possibly need delimiter other than ":" |
# FIXME: Possibly need delimiter other than ":" |
my @correct=(); |
my @correct=(); |
Line 9075 ENDHEADER
|
Line 9142 ENDHEADER
|
$result.='<br /><span class="LC_warning">'. |
$result.='<br /><span class="LC_warning">'. |
&mt('More than one correct result given for question "[_1]": [_2] versus [_3].', |
&mt('More than one correct result given for question "[_1]": [_2] versus [_3].', |
$env{'form.question:'.$i},$correct[$i],$input[$i]).'</span>'; |
$env{'form.question:'.$i},$correct[$i],$input[$i]).'</span>'; |
} elsif ($input[$i]) { |
} elsif (($input[$i]) || ($input[$i] eq '0')) { |
$correct[$i]=$input[$i]; |
$correct[$i]=$input[$i]; |
} |
} |
} |
} |
} |
} |
} |
} |
for (my $i=0;$i<$number;$i++) { |
for (my $i=0;$i<$number;$i++) { |
if (!$correct[$i]) { |
if ((!$correct[$i]) && ($correct[$i] ne '0')) { |
$result.='<br /><span class="LC_error">'. |
$result.='<br /><span class="LC_error">'. |
&mt('No correct result given for question "[_1]"!', |
&mt('No correct result given for question "[_1]"!', |
$env{'form.question:'.$i}).'</span>'; |
$env{'form.question:'.$i}).'</span>'; |
} |
} |
} |
} |
$result.='<br />'.&mt("Correct answer: [_1]",join(', ',map { ($_?$_:'-') } @correct)); |
$result.='<br />'.&mt("Correct answer: [_1]",join(', ',map { ((($_) || ($_ eq '0'))?$_:'-') } @correct)); |
} |
} |
# Start grading |
# Start grading |
my $pcorrect=$env{'form.pcorrect'}; |
my $pcorrect=$env{'form.pcorrect'}; |
my $pincorrect=$env{'form.pincorrect'}; |
my $pincorrect=$env{'form.pincorrect'}; |
my $storecount=0; |
my $storecount=0; |
|
my %users=(); |
foreach my $key (keys(%env)) { |
foreach my $key (keys(%env)) { |
my $user=''; |
my $user=''; |
if ($key=~/^form\.student\:(.*)$/) { |
if ($key=~/^form\.student\:(.*)$/) { |
Line 9107 ENDHEADER
|
Line 9175 ENDHEADER
|
$user=$env{'form.multi'.$id}; |
$user=$env{'form.multi'.$id}; |
} |
} |
} |
} |
if ($user) { |
if ($user) { |
|
if ($users{$user}) { |
|
$result.='<br /><span class="LC_warning">'. |
|
&mt("More than one entry found for <tt>[_1]</tt>!",$user). |
|
'</span><br />'; |
|
} |
|
$users{$user}=1; |
my @answer=split(/\,/,$env{$key}); |
my @answer=split(/\,/,$env{$key}); |
my $sum=0; |
my $sum=0; |
my $realnumber=$number; |
my $realnumber=$number; |
for (my $i=0;$i<$number;$i++) { |
for (my $i=0;$i<$number;$i++) { |
if ($correct[$i] eq '-') { |
if ($correct[$i] eq '-') { |
$realnumber--; |
$realnumber--; |
} elsif ($answer[$i]) { |
} elsif (($answer[$i]) || ($answer[$i]=~/^[0\.]+$/)) { |
if ($gradingmechanism eq 'attendance') { |
if ($gradingmechanism eq 'attendance') { |
$sum+=$pcorrect; |
$sum+=$pcorrect; |
} elsif ($correct[$i] eq '*') { |
} elsif ($correct[$i] eq '*') { |
$sum+=$pcorrect; |
$sum+=$pcorrect; |
} else { |
} else { |
if ($answer[$i] eq $correct[$i]) { |
# We actually grade if correct or not |
$sum+=$pcorrect; |
my $increment=$pincorrect; |
} else { |
# Special case: numerical answer "0" |
$sum+=$pincorrect; |
if ($correct[$i] eq '0') { |
|
if ($answer[$i]=~/^[0\.]+$/) { |
|
$increment=$pcorrect; |
|
} |
|
# General numerical answer, both evaluate to something non-zero |
|
} elsif ((1.0*$correct[$i]!=0) && (1.0*$answer[$i]!=0)) { |
|
if (1.0*$correct[$i]==1.0*$answer[$i]) { |
|
$increment=$pcorrect; |
|
} |
|
# Must be just alphanumeric |
|
} elsif ($answer[$i] eq $correct[$i]) { |
|
$increment=$pcorrect; |
} |
} |
|
$sum+=$increment; |
} |
} |
} |
} |
} |
} |
Line 9147 ENDHEADER
|
Line 9233 ENDHEADER
|
} |
} |
# We are done |
# We are done |
$result.='<br />'.&mt('Successfully stored grades for [quant,_1,student].',$storecount). |
$result.='<br />'.&mt('Successfully stored grades for [quant,_1,student].',$storecount). |
'</td></tr></table>'."\n". |
'</td>'. |
'</td></tr></table><br /><br />'."\n"; |
&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::end_data_table(); |
return $result; |
return $result; |
} |
} |
|
|
Line 9164 sub startpage {
|
Line 9251 sub startpage {
|
unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); |
unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); |
$r->print(&Apache::loncommon::start_page('Grading',undef, |
$r->print(&Apache::loncommon::start_page('Grading',undef, |
{'bread_crumbs' => $crumbs})); |
{'bread_crumbs' => $crumbs})); |
|
&Apache::lonquickgrades::startGradeScreen($r,($env{'form.symb'}?'probgrading':'grading')); |
unless ($nodisplayflag) { |
unless ($nodisplayflag) { |
$r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag)); |
$r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag)); |
} |
} |
} |
} |
|
|
|
sub select_problem { |
|
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(&Apache::lonstathelpers::problem_selector('.',undef,1)); |
|
$r->print('<input type="hidden" name="command" value="gradingmenu" />'); |
|
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
|
} |
|
|
sub handler { |
sub handler { |
my $request=$_[0]; |
my $request=$_[0]; |
&reset_caches(); |
&reset_caches(); |
if ($env{'browser.mathml'}) { |
if ($request->header_only) { |
&Apache::loncommon::content_type($request,'text/xml'); |
&Apache::loncommon::content_type($request,'text/html'); |
} else { |
$request->send_http_header; |
&Apache::loncommon::content_type($request,'text/html'); |
return OK; |
} |
} |
$request->send_http_header; |
|
return '' if $request->header_only; |
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); |
|
|
|
&init_perm(); |
|
if (!$env{'request.course.id'}) { |
|
# 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) { |
|
$request->internal_redirect('/adm/quickgrades'); |
|
} |
|
&Apache::loncommon::content_type($request,'text/html'); |
|
$request->send_http_header; |
|
|
|
|
# see what command we need to execute |
# see what command we need to execute |
|
|
my @commands=&Apache::loncommon::get_env_multiple('form.command'); |
my @commands=&Apache::loncommon::get_env_multiple('form.command'); |
Line 9197 sub handler {
|
Line 9303 sub handler {
|
(my $url=$env{'form.url'}) =~ s-^https*://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; |
(my $url=$env{'form.url'}) =~ s-^https*://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; |
$symb=&Apache::lonnet::symbread($url); |
$symb=&Apache::lonnet::symbread($url); |
} |
} |
&Apache::lonenc::check_decrypt(\$symb); |
&Apache::lonenc::check_decrypt(\$symb); |
|
|
$ssi_error = 0; |
$ssi_error = 0; |
if ($symb eq '' && $command eq '') { |
if (($symb eq '' || $command eq '') && ($env{'request.course.id'})) { |
# |
# |
# Not called from a resource |
# Not called from a resource, but inside a course |
# |
# |
|
&startpage($request,undef,[],1,1); |
|
&select_problem($request); |
} else { |
} else { |
&init_perm(); |
|
if ($command eq 'submission' && $perm{'vgr'}) { |
if ($command eq 'submission' && $perm{'vgr'}) { |
&startpage($request,$symb,[{href=>"", text=>"Student Submissions"}]); |
&startpage($request,$symb,[{href=>"", text=>"Student Submissions"}]); |
($env{'form.student'} eq '' ? &listStudents($request,$symb) : &submission($request,0,0,$symb)); |
($env{'form.student'} eq '' ? &listStudents($request,$symb) : &submission($request,0,0,$symb)); |
Line 9278 sub handler {
|
Line 9384 sub handler {
|
{href=>'', text=>'Store grades'}]); |
{href=>'', text=>'Store grades'}]); |
$request->print(&assign_clicker_grades($request,$symb)); |
$request->print(&assign_clicker_grades($request,$symb)); |
} elsif ($command eq 'csvform' && $perm{'mgr'}) { |
} elsif ($command eq 'csvform' && $perm{'mgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
$request->print(&upcsvScores_form($request,$symb)); |
$request->print(&upcsvScores_form($request,$symb)); |
} elsif ($command eq 'csvupload' && $perm{'mgr'}) { |
} elsif ($command eq 'csvupload' && $perm{'mgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
$request->print(&csvupload($request,$symb)); |
$request->print(&csvupload($request,$symb)); |
} elsif ($command eq 'csvuploadmap' && $perm{'mgr'} ) { |
} elsif ($command eq 'csvuploadmap' && $perm{'mgr'} ) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
$request->print(&csvuploadmap($request,$symb)); |
$request->print(&csvuploadmap($request,$symb)); |
} elsif ($command eq 'csvuploadoptions' && $perm{'mgr'}) { |
} elsif ($command eq 'csvuploadoptions' && $perm{'mgr'}) { |
if ($env{'form.associate'} ne 'Reverse Association') { |
if ($env{'form.associate'} ne 'Reverse Association') { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
$request->print(&csvuploadoptions($request,$symb)); |
$request->print(&csvuploadoptions($request,$symb)); |
} else { |
} else { |
if ( $env{'form.upfile_associate'} ne 'reverse' ) { |
if ( $env{'form.upfile_associate'} ne 'reverse' ) { |
Line 9296 sub handler {
|
Line 9402 sub handler {
|
} else { |
} else { |
$env{'form.upfile_associate'} = 'forward'; |
$env{'form.upfile_associate'} = 'forward'; |
} |
} |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
$request->print(&csvuploadmap($request,$symb)); |
$request->print(&csvuploadmap($request,$symb)); |
} |
} |
} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) { |
} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
$request->print(&csvuploadassign($request,$symb)); |
$request->print(&csvuploadassign($request,$symb)); |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
Line 9347 sub handler {
|
Line 9453 sub handler {
|
if ($ssi_error) { |
if ($ssi_error) { |
&ssi_print_error($request); |
&ssi_print_error($request); |
} |
} |
|
&Apache::lonquickgrades::endGradeScreen($request); |
$request->print(&Apache::loncommon::end_page()); |
$request->print(&Apache::loncommon::end_page()); |
&reset_caches(); |
&reset_caches(); |
return ''; |
return OK; |
} |
} |
|
|
1; |
1; |
Line 9453 ssi_with_retries()
|
Line 9560 ssi_with_retries()
|
calling routine should trap the error condition and display the warning |
calling routine should trap the error condition and display the warning |
found in &navmap_errormsg(). |
found in &navmap_errormsg(). |
|
|
|
$scantron_config - Reference to bubblesheet format configuration hash. |
|
|
Returns the maximum number of bubble lines that are expected to |
Returns the maximum number of bubble lines that are expected to |
occur. Does this by walking the selected sequence rendering the |
occur. Does this by walking the selected sequence rendering the |
resource and then checking &Apache::lonxml::get_problem_counter() |
resource and then checking &Apache::lonxml::get_problem_counter() |