version 1.513, 2008/03/04 11:23:12
|
version 1.528.2.15, 2009/08/17 17:50:23
|
Line 73 my $ssi_error_message;
|
Line 73 my $ssi_error_message;
|
# the number of times requested by the caller. |
# the number of times requested by the caller. |
# If we still have a proble, no text is appended to the |
# If we still have a proble, no text is appended to the |
# output and we set some global variables. |
# output and we set some global variables. |
# to indicate to the caller an SSI error occured. |
# to indicate to the caller an SSI error occurred. |
# All of this is supposed to deal with the issues described |
# All of this is supposed to deal with the issues described |
# in LonCAPA BZ 5631 see: |
# in LonCAPA BZ 5631 see: |
# http://bugs.lon-capa.org/show_bug.cgi?id=5631 |
# http://bugs.lon-capa.org/show_bug.cgi?id=5631 |
Line 89 my $ssi_error_message;
|
Line 89 my $ssi_error_message;
|
# On success, returns the rendered resource identified by the resource parameter. |
# On success, returns the rendered resource identified by the resource parameter. |
# Side Effects: |
# Side Effects: |
# The following global variables can be set: |
# The following global variables can be set: |
# ssi_error - If an unrecoverable error occured this becomes true. |
# ssi_error - If an unrecoverable error occurred this becomes true. |
# It is up to the caller to initialize this to false |
# It is up to the caller to initialize this to false |
# if desired. |
# if desired. |
# ssi_last_error_resource - If an unrecoverable error occured, this is the value |
# ssi_error_resource - If an unrecoverable error occurred, this is the value |
# of the resource that could not be rendered by the ssi |
# of the resource that could not be rendered by the ssi |
# call. |
# call. |
# ssi_last_error - The error string fetched from the ssi response |
# ssi_error_message - The error string fetched from the ssi response |
# in the event of an error. |
# in the event of an error. |
# |
# |
sub ssi_with_retries { |
sub ssi_with_retries { |
Line 116 sub ssi_with_retries {
|
Line 116 sub ssi_with_retries {
|
|
|
sub ssi_print_error { |
sub ssi_print_error { |
my ($r) = @_; |
my ($r) = @_; |
$r->print('<h2>Unrecoverable network error</h2>'); |
my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk'); |
$r->print('<p>Unable to perform a resource fetch from a server: <br />'); |
$r->print(' |
$r->print("Resource: $ssi_error_resource <br />"); |
<br /> |
$r->print("Error: $ssi_error_message <br /> Try again later."); |
<h2>'.&mt('An unrecoverable network error occurred:').'</h2> |
$r->print('If errors persist, contact LonCAPA support for assistance</p>'); |
<p> |
|
'.&mt('Unable to retrieve a resource from a server:').'<br /> |
|
'.&mt('Resource:').' '.$ssi_error_resource.'<br /> |
|
'.&mt('Error:').' '.$ssi_error_message.' |
|
</p> |
|
<p>'. |
|
&mt('It is recommended that you try again later, as this error may mean the server was just temporarily unavailable, or is down for maintenance.').'<br />'. |
|
&mt('If the error persists, please contact the [_1] for assistance.',$helpurl). |
|
'</p>'); |
|
return; |
} |
} |
|
|
# |
# |
Line 231 sub showResourceInfo {
|
Line 240 sub showResourceInfo {
|
my %resptype = (); |
my %resptype = (); |
my $hdgrade='no'; |
my $hdgrade='no'; |
my %partsseen; |
my %partsseen; |
foreach my $partID (sort keys(%$responseType)) { |
foreach my $partID (sort(keys(%$responseType))) { |
foreach my $resID (sort keys(%{ $responseType->{$partID} })) { |
foreach my $resID (sort(keys(%{ $responseType->{$partID} }))) { |
my $handgrade=$$handgrade{$partID.'_'.$resID}; |
my $handgrade=$$handgrade{$partID.'_'.$resID}; |
my $responsetype = $responseType->{$partID}->{$resID}; |
my $responsetype = $responseType->{$partID}->{$resID}; |
$hdgrade = $handgrade if ($handgrade eq 'yes'); |
$hdgrade = $handgrade if ($handgrade eq 'yes'); |
Line 246 sub showResourceInfo {
|
Line 255 sub showResourceInfo {
|
$partsseen{$partID}=1; |
$partsseen{$partID}=1; |
} |
} |
my $display_part=&get_display_part($partID,$symb); |
my $display_part=&get_display_part($partID,$symb); |
$result.='<td>'.&mt('<b>Part: </b>[_1]',$display_part).' <span class="LC_internal_info">'. |
$result.='<td><b>'.&mt('Part').': </b>'.$display_part. |
$resID.'</span></td>'. |
' <span class="LC_internal_info">'.$resID.'</span></td>'. |
'<td>'.&mt('<b>Type: </b>[_1]',$responsetype).'</td></tr>'; |
'<td><b>'.&mt('Type').': </b>'.$responsetype.'</td></tr>'; |
# '<td>'.&mt('<b>Handgrade: </b>[_1]',$handgrade).'</td></tr>'; |
# '<td>'.&mt('<b>Handgrade: </b>[_1]',$handgrade).'</td></tr>'; |
} |
} |
} |
} |
Line 269 sub reset_caches {
|
Line 278 sub reset_caches {
|
} |
} |
|
|
sub get_analyze { |
sub get_analyze { |
my ($symb,$uname,$udom)=@_; |
my ($symb,$uname,$udom,$no_increment)=@_; |
my $key = "$symb\0$uname\0$udom"; |
my $key = "$symb\0$uname\0$udom"; |
return $analyze_cache{$key} if (exists($analyze_cache{$key})); |
return $analyze_cache{$key} if (exists($analyze_cache{$key})); |
|
|
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
$url=&Apache::lonnet::clutter($url); |
$url=&Apache::lonnet::clutter($url); |
my $subresult=&ssi_with_retries($url, $ssi_retries, |
my $subresult=&ssi_with_retries($url, $ssi_retries, |
('grade_target' => 'analyze'), |
('grade_target' => 'analyze', |
('grade_domain' => $udom), |
'grade_domain' => $udom, |
('grade_symb' => $symb), |
'grade_symb' => $symb, |
('grade_courseid' => |
'grade_courseid' => |
$env{'request.course.id'}), |
$env{'request.course.id'}, |
('grade_username' => $uname)); |
'grade_username' => $uname, |
|
'grade_noincrement' => $no_increment)); |
(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); |
return $analyze_cache{$key} = \%analyze; |
return $analyze_cache{$key} = \%analyze; |
} |
} |
|
|
sub get_order { |
sub get_order { |
my ($partid,$respid,$symb,$uname,$udom)=@_; |
my ($partid,$respid,$symb,$uname,$udom,$no_increment)=@_; |
my $analyze = &get_analyze($symb,$uname,$udom); |
my $analyze = &get_analyze($symb,$uname,$udom,$no_increment); |
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)=@_; |
my $analyze = &get_analyze($symb,$uname,$udom); |
my $analyze = &get_analyze($symb,$uname,$udom); |
foreach my $foil (@{&get_order($partid,$respid,$symb,$uname,$udom)}) { |
my $foils = &get_order($partid,$respid,$symb,$uname,$udom); |
if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') { |
if (ref($foils) eq 'ARRAY') { |
return $foil; |
foreach my $foil (@{$foils}) { |
} |
if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') { |
} |
return $foil; |
|
} |
|
} |
|
} |
} |
} |
} |
} |
|
|
Line 727 sub verifyreceipt {
|
Line 740 sub verifyreceipt {
|
|
|
my $title.= |
my $title.= |
'<h3><span class="LC_info">'. |
'<h3><span class="LC_info">'. |
&mt('Verifying Submission Receipt [_1]',$receipt). |
&mt('Verifying Receipt No. [_1]',$receipt). |
'</span></h3>'."\n". |
'</span></h3>'."\n". |
'<h4>'.&mt('<b>Resource: </b>[_1]',$env{'form.probTitle'}). |
'<h4>'.&mt('<b>Resource: </b>[_1]',$env{'form.probTitle'}). |
'</h4>'."\n"; |
'</h4>'."\n"; |
Line 812 sub listStudents {
|
Line 825 sub listStudents {
|
&Apache::lonnet::gettitle($symb) : $env{'form.probTitle'}; |
&Apache::lonnet::gettitle($symb) : $env{'form.probTitle'}; |
|
|
my $result='<h3><span class="LC_info"> '. |
my $result='<h3><span class="LC_info"> '. |
&mt($viewgrade.' Submissions for a Student or a Group of Students') |
&mt("$viewgrade Submissions for a Student or a Group of Students") |
.'</span></h3>'; |
.'</span></h3>'; |
|
|
my ($table,undef,$hdgrade,$partlist,$handgrade) = &showResourceInfo($symb,$env{'form.probTitle'},($env{'form.showgrading'} eq 'yes')); |
my ($table,undef,$hdgrade,$partlist,$handgrade) = &showResourceInfo($symb,$env{'form.probTitle'},($env{'form.showgrading'} eq 'yes')); |
|
|
my %lt = ( 'multiple' => |
my %lt = &Apache::lonlocal::texthash ( |
"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.', |
'single' => |
'single' => 'Please select the student before clicking on the Next button.', |
"Please select the student before clicking on the Next button.", |
); |
); |
|
%lt = &Apache::lonlocal::texthash(%lt); |
|
$request->print(<<LISTJAVASCRIPT); |
$request->print(<<LISTJAVASCRIPT); |
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
function checkSelect(checkBox) { |
function checkSelect(checkBox) { |
Line 865 LISTJAVASCRIPT
|
Line 876 LISTJAVASCRIPT
|
"\n".$table; |
"\n".$table; |
|
|
$gradeTable .= |
$gradeTable .= |
' '. |
' <b>'.&mt('View Problem Text').': </b>'. |
&mt('<b>View Problem Text: </b>[_1]', |
|
'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n". |
'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n". |
'<label><input type="radio" name="vProb" value="yes" /> '.&mt('one student').' </label>'."\n". |
'<label><input type="radio" name="vProb" value="yes" /> '.&mt('one student').' </label>'."\n". |
'<label><input type="radio" name="vProb" value="all" /> '.&mt('all students').' </label>').'<br />'."\n"; |
'<label><input type="radio" name="vProb" value="all" /> '.&mt('all students').' </label><br />'."\n"; |
$gradeTable .= |
$gradeTable .= |
' '. |
' <b>'.&mt('View Answer').': </b>'. |
&mt('<b>View Answer: </b>[_1]', |
|
'<label><input type="radio" name="vAns" value="no" /> '.&mt('no').' </label>'."\n". |
'<label><input type="radio" name="vAns" value="no" /> '.&mt('no').' </label>'."\n". |
'<label><input type="radio" name="vAns" value="yes" /> '.&mt('one student').' </label>'."\n". |
'<label><input type="radio" name="vAns" value="yes" /> '.&mt('one student').' </label>'."\n". |
'<label><input type="radio" name="vAns" value="all" checked="checked" /> '.&mt('all students').' </label>').'<br />'."\n"; |
'<label><input type="radio" name="vAns" value="all" checked="checked" /> '.&mt('all students').' </label><br />'."\n"; |
|
|
my $submission_options; |
my $submission_options; |
if ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { |
if ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { |
Line 891 LISTJAVASCRIPT
|
Line 900 LISTJAVASCRIPT
|
'<label><input type="radio" name="lastSub" value="datesub" /> '.&mt('by dates and submissions').' </label>'."\n". |
'<label><input type="radio" name="lastSub" value="datesub" /> '.&mt('by dates and submissions').' </label>'."\n". |
'<label><input type="radio" name="lastSub" value="all" /> '.&mt('all details').'</label>'; |
'<label><input type="radio" name="lastSub" value="all" /> '.&mt('all details').'</label>'; |
$gradeTable .= |
$gradeTable .= |
' '. |
' <b>'.&mt('Submissions').': </b>'.$submission_options.'<br />'."\n"; |
&mt('<b>Submissions: </b>[_1]',$submission_options).'<br />'."\n"; |
|
|
|
$gradeTable .= |
$gradeTable .= |
' '. |
' <b>'.&mt('Grading Increments').': </b>'. |
&mt('<b>Grading Increments:</b> [_1]', |
|
'<select name="increment">'. |
'<select name="increment">'. |
'<option value="1">'.&mt('Whole Points').'</option>'. |
'<option value="1">'.&mt('Whole Points').'</option>'. |
'<option value=".5">'.&mt('Half Points').'</option>'. |
'<option value=".5">'.&mt('Half Points').'</option>'. |
'<option value=".25">'.&mt('Quarter Points').'</option>'. |
'<option value=".25">'.&mt('Quarter Points').'</option>'. |
'<option value=".1">'.&mt('Tenths of a Point').'</option>'. |
'<option value=".1">'.&mt('Tenths of a Point').'</option>'. |
'</select>'); |
'</select>'; |
|
|
$gradeTable .= |
$gradeTable .= |
&build_section_inputs(). |
&build_section_inputs(). |
Line 921 LISTJAVASCRIPT
|
Line 928 LISTJAVASCRIPT
|
&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,1,'javascript:reLoadList(this.form);')).'<br />'; |
&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,1,'javascript:reLoadList(this.form);')).'<br />'; |
} |
} |
|
|
$gradeTable.=&mt('To '.lc($viewgrade).' a submission or a group of submissions, click on the check box(es) '. |
$gradeTable.=&mt('To '.lc($viewgrade)." a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button.").'<br />'."\n". |
'next to the student\'s name(s). Then click on the Next button.').'<br />'."\n". |
|
'<input type="hidden" name="command" value="processGroup" />'."\n"; |
'<input type="hidden" name="command" value="processGroup" />'."\n"; |
|
|
# checkall buttons |
# checkall buttons |
$gradeTable.=&check_script('gradesub', 'stuinfo'); |
$gradeTable.=&check_script('gradesub', 'stuinfo'); |
$gradeTable.='<input type="button" '."\n". |
$gradeTable.='<input type="button" '."\n". |
'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n". |
'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n". |
'value="'.&mt('Next->').'" /> <br />'."\n"; |
'value="'.&mt('Next').' →" /> <br />'."\n"; |
$gradeTable.=&check_buttons(); |
$gradeTable.=&check_buttons(); |
$gradeTable.='<label><input type="checkbox" name="checkPlag" checked="checked" />'.&mt('Check For Plagiarism').'</label>'; |
$gradeTable.='<label><input type="checkbox" name="checkPlag" checked="checked" />'.&mt('Check For Plagiarism').'</label>'; |
my ($classlist, undef, $fullname) = &getclasslist($getsec,'1',$getgroup); |
my ($classlist, undef, $fullname) = &getclasslist($getsec,'1',$getgroup); |
Line 1021 LISTJAVASCRIPT
|
Line 1027 LISTJAVASCRIPT
|
' '.$section.($group ne '' ?'/'.$group:'').'</td>'."\n"; |
' '.$section.($group ne '' ?'/'.$group:'').'</td>'."\n"; |
|
|
if ($env{'form.showgrading'} eq 'yes' && $submitonly ne 'all') { |
if ($env{'form.showgrading'} eq 'yes' && $submitonly ne 'all') { |
foreach (sort keys(%status)) { |
foreach (sort(keys(%status))) { |
next if ($_ =~ /^resource.*?submitted_by$/); |
next if ($_ =~ /^resource.*?submitted_by$/); |
$gradeTable.='<td align="center"> '.&mt($status{$_}).' </td>'."\n"; |
$gradeTable.='<td align="center"> '.&mt($status{$_}).' </td>'."\n"; |
} |
} |
Line 1049 LISTJAVASCRIPT
|
Line 1055 LISTJAVASCRIPT
|
$gradeTable.=&Apache::loncommon::end_data_table()."\n". |
$gradeTable.=&Apache::loncommon::end_data_table()."\n". |
'<input type="button" '. |
'<input type="button" '. |
'onClick="javascript:checkSelect(this.form.stuinfo);" '. |
'onClick="javascript:checkSelect(this.form.stuinfo);" '. |
'value="'.&mt('Next->').'" /></form>'."\n"; |
'value="'.&mt('Next').' →" /></form>'."\n"; |
if ($ctr == 0) { |
if ($ctr == 0) { |
my $num_students=(scalar(keys(%$fullname))); |
my $num_students=(scalar(keys(%$fullname))); |
if ($num_students eq 0) { |
if ($num_students eq 0) { |
Line 1145 sub processGroup {
|
Line 1151 sub processGroup {
|
#--- Javascript to handle the submission page functionality --- |
#--- Javascript to handle the submission page functionality --- |
sub sub_page_js { |
sub sub_page_js { |
my $request = shift; |
my $request = shift; |
|
my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); |
$request->print(<<SUBJAVASCRIPT); |
$request->print(<<SUBJAVASCRIPT); |
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
function updateRadio(formname,id,weight) { |
function updateRadio(formname,id,weight) { |
Line 1155 sub sub_page_js {
|
Line 1162 sub sub_page_js {
|
gradeBox.value = pts; |
gradeBox.value = pts; |
var resetbox = false; |
var resetbox = false; |
if (isNaN(pts) || pts < 0) { |
if (isNaN(pts) || pts < 0) { |
alert("A number equal or greater than 0 is expected. Entered value = "+pts); |
alert("$alertmsg"+pts); |
for (var i=0; i<radioButton.length; i++) { |
for (var i=0; i<radioButton.length; i++) { |
if (radioButton[i].checked) { |
if (radioButton[i].checked) { |
gradeBox.value = i; |
gradeBox.value = i; |
Line 1400 INNERJS
|
Line 1407 INNERJS
|
|
|
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
$docopen=~s/^document\.//; |
$docopen=~s/^document\.//; |
|
my $alertmsg = &mt('Please select a word or group of words from document and then click this link.'); |
$request->print(<<SUBJAVASCRIPT); |
$request->print(<<SUBJAVASCRIPT); |
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
|
|
Line 1432 INNERJS
|
Line 1440 INNERJS
|
else return; |
else return; |
var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); |
var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); |
if (cleantxt=="") { |
if (cleantxt=="") { |
alert("Please select a word or group of words from document and then click this link."); |
alert("$alertmsg"); |
return; |
return; |
} |
} |
var nret = prompt("Add selection to keyword list? Edit if desired.",cleantxt); |
var nret = prompt("Add selection to keyword list? Edit if desired.",cleantxt); |
Line 1671 sub gradeBox {
|
Line 1679 sub gradeBox {
|
|
|
my $radio.='<table border="0"><tr>'."\n"; # display radio buttons in a nice table 10 across |
my $radio.='<table border="0"><tr>'."\n"; # display radio buttons in a nice table 10 across |
while ($thisweight<=$wgt) { |
while ($thisweight<=$wgt) { |
$radio.= '<td><span style="white-space: nowrap;"><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '. |
$radio.= '<td><span class="LC_nobreak"><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '. |
'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','. |
'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','. |
$thisweight.')" value="'.$thisweight.'" '. |
$thisweight.')" value="'.$thisweight.'" '. |
($score eq $thisweight ? 'checked="checked"':'').' /> '.$thisweight."</label></span></td>\n"; |
($score eq $thisweight ? 'checked="checked"':'').' /> '.$thisweight."</label></span></td>\n"; |
Line 1687 sub gradeBox {
|
Line 1695 sub gradeBox {
|
$wgt.')" /></td>'."\n"; |
$wgt.')" /></td>'."\n"; |
$line.='<td>/'.$wgt.' '.$wgtmsg. |
$line.='<td>/'.$wgt.' '.$wgtmsg. |
($$record{'resource.'.$partid.'.solved'} eq 'correct_by_student' ? ' '.$checkIcon : ''). |
($$record{'resource.'.$partid.'.solved'} eq 'correct_by_student' ? ' '.$checkIcon : ''). |
' </td><td>'."\n"; |
' </td><td><b>'.&mt('Grade Status').':</b>'."\n"; |
$line.='<select name="GD_SEL'.$counter.'_'.$partid.'" '. |
$line.='<select name="GD_SEL'.$counter.'_'.$partid.'" '. |
'onChange="javascript:clearRadBox(this.form,\''.$counter.'_'.$partid.'\')" >'."\n"; |
'onChange="javascript:clearRadBox(this.form,\''.$counter.'_'.$partid.'\')" >'."\n"; |
if ($$record{'resource.'.$partid.'.solved'} eq 'excused') { |
if ($$record{'resource.'.$partid.'.solved'} eq 'excused') { |
Line 1701 sub gradeBox {
|
Line 1709 sub gradeBox {
|
|
|
|
|
$result .= |
$result .= |
&mt('<td><b>Part:</b></td><td>[_1]</td><td><b>Points:</b></td><td>[_2]</td><td>or</td><td>[_3]</td>',$display_part,$radio,$line); |
'<td><b>'.&mt('Part').':</b></td><td>'.$display_part.'</td><td><b>'.&mt('Points').':</b></td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>'; |
|
|
|
|
$result.='</tr></table>'."\n"; |
$result.='</tr></table>'."\n"; |
$result.='<input type="hidden" name="stores'.$counter.'_'.$partid.'" value="" />'."\n". |
$result.='<input type="hidden" name="stores'.$counter.'_'.$partid.'" value="" />'."\n". |
Line 1833 sub download_all_link {
|
Line 1840 sub download_all_link {
|
join("\n",&Apache::loncommon::get_env_multiple('form.vPart')); |
join("\n",&Apache::loncommon::get_env_multiple('form.vPart')); |
|
|
my $identifier = &Apache::loncommon::get_cgi_id(); |
my $identifier = &Apache::loncommon::get_cgi_id(); |
&Apache::lonnet::appenv('cgi.'.$identifier.'.students' => $all_students, |
&Apache::lonnet::appenv({'cgi.'.$identifier.'.students' => $all_students, |
'cgi.'.$identifier.'.symb' => $symb, |
'cgi.'.$identifier.'.symb' => $symb, |
'cgi.'.$identifier.'.parts' => $parts,); |
'cgi.'.$identifier.'.parts' => $parts,}); |
$r->print('<a href="/cgi-bin/multidownload.pl?'.$identifier.'">'. |
$r->print('<a href="/cgi-bin/multidownload.pl?'.$identifier.'">'. |
&mt('Download All Submitted Documents').'</a>'); |
&mt('Download All Submitted Documents').'</a>'); |
return |
return |
Line 2084 KEYWORDS
|
Line 2091 KEYWORDS
|
$lastsubonly.="\n".'<div class="LC_grade_submission_part"><b>Part:</b> '. |
$lastsubonly.="\n".'<div class="LC_grade_submission_part"><b>Part:</b> '. |
$display_part.' <span class="LC_internal_info">( ID '.$respid. |
$display_part.' <span class="LC_internal_info">( ID '.$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; |
} |
} |
foreach my $submission (@$string) { |
foreach my $submission (@$string) { |
Line 2125 KEYWORDS
|
Line 2132 KEYWORDS
|
' )</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) { |
$lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain virusses').'</span><br />'; |
$lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />'; |
my $file_counter = 0; |
my $file_counter = 0; |
foreach my $file (@$files) { |
foreach my $file (@$files) { |
$file_counter++; |
$file_counter++; |
Line 2136 KEYWORDS
|
Line 2143 KEYWORDS
|
} |
} |
$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); |
$respid,\%record,$order,undef,$uname,$udom); |
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
$lastsubonly.='</div>'; |
$lastsubonly.='</div>'; |
} |
} |
Line 2216 KEYWORDS
|
Line 2223 KEYWORDS
|
$seen{$partid}++; |
$seen{$partid}++; |
next if ($$handgrade{$part_resp} ne 'yes' |
next if ($$handgrade{$part_resp} ne 'yes' |
&& $env{'form.lastSub'} eq 'hdgrade'); |
&& $env{'form.lastSub'} eq 'hdgrade'); |
push @partlist,$partid; |
push(@partlist,$partid); |
push @gradePartRespid,$partid.'.'.$respid; |
push(@gradePartRespid,$partid.'.'.$respid); |
$request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record)); |
$request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record)); |
} |
} |
$request->print('</div></div>'); |
$request->print('</div></div>'); |
Line 2265 KEYWORDS
|
Line 2272 KEYWORDS
|
'<option>7</option><option>10</option></select>'."\n"; |
'<option>7</option><option>10</option></select>'."\n"; |
my $nsel = ($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : '1'); |
my $nsel = ($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : '1'); |
$ntstu =~ s/<option>$nsel</<option selected="selected">$nsel</; |
$ntstu =~ s/<option>$nsel</<option selected="selected">$nsel</; |
$endform.=&mt('[_1]student(s)',$ntstu); |
$endform.=&mt('[_1]student(s)',$ntstu); |
$endform.=' <input type="button" value="'.&mt('Previous').'" '. |
$endform.=' <input type="button" value="'.&mt('Previous').'" '. |
'onClick="javascript:checksubmit(this.form,\'Previous\');" target="_self" /> '."\n". |
'onClick="javascript:checksubmit(this.form,\'Previous\');" target="_self" /> '."\n". |
'<input type="button" value="'.&mt('Next').'" '. |
'<input type="button" value="'.&mt('Next').'" '. |
Line 2348 sub get_last_submission {
|
Line 2355 sub get_last_submission {
|
$$returnhash{$version.':keys'}))) { |
$$returnhash{$version.':keys'}))) { |
$lasthash{$key}=$$returnhash{$version.':'.$key}; |
$lasthash{$key}=$$returnhash{$version.':'.$key}; |
$timestamp = |
$timestamp = |
scalar(localtime($$returnhash{$version.':timestamp'})); |
&Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'}); |
} |
} |
} |
} |
foreach my $key (keys(%lasthash)) { |
foreach my $key (keys(%lasthash)) { |
Line 2544 sub processHandGrade {
|
Line 2551 sub processHandGrade {
|
|
|
my (@parsedlist,@nextlist); |
my (@parsedlist,@nextlist); |
my ($nextflg) = 0; |
my ($nextflg) = 0; |
foreach (sort |
foreach my $item (sort |
{ |
{ |
if (lc($$fullname{$a}) ne lc($$fullname{$b})) { |
if (lc($$fullname{$a}) ne lc($$fullname{$b})) { |
return (lc($$fullname{$a}) cmp lc($$fullname{$b})); |
return (lc($$fullname{$a}) cmp lc($$fullname{$b})); |
Line 2552 sub processHandGrade {
|
Line 2559 sub processHandGrade {
|
return $a cmp $b; |
return $a cmp $b; |
} (keys(%$fullname))) { |
} (keys(%$fullname))) { |
if ($nextflg == 1 && $button =~ /Next$/) { |
if ($nextflg == 1 && $button =~ /Next$/) { |
push @parsedlist,$_; |
push(@parsedlist,$item); |
} |
} |
$nextflg = 1 if ($_ eq $laststu); |
$nextflg = 1 if ($item eq $laststu); |
if ($button eq 'Previous') { |
if ($button eq 'Previous') { |
last if ($_ eq $firststu); |
last if ($item eq $firststu); |
push @parsedlist,$_; |
push(@parsedlist,$item); |
} |
} |
} |
} |
$ctr = 0; |
$ctr = 0; |
Line 2580 sub processHandGrade {
|
Line 2587 sub processHandGrade {
|
my $submitted = 0; |
my $submitted = 0; |
my $ungraded = 0; |
my $ungraded = 0; |
my $incorrect = 0; |
my $incorrect = 0; |
foreach (keys(%status)) { |
foreach my $item (keys(%status)) { |
$submitted = 1 if ($status{$_} ne 'nothing'); |
$submitted = 1 if ($status{$item} ne 'nothing'); |
$ungraded = 1 if ($status{$_} =~ /^ungraded/); |
$ungraded = 1 if ($status{$item} =~ /^ungraded/); |
$incorrect = 1 if ($status{$_} =~ /^incorrect/); |
$incorrect = 1 if ($status{$item} =~ /^incorrect/); |
my ($foo,$partid,$foo1) = split(/\./,$_); |
my ($foo,$partid,$foo1) = split(/\./,$item); |
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
$submitted = 0; |
$submitted = 0; |
} |
} |
Line 2595 sub processHandGrade {
|
Line 2602 sub processHandGrade {
|
next if (!$ungraded && ($submitonly eq 'graded')); |
next if (!$ungraded && ($submitonly eq 'graded')); |
next if (!$incorrect && $submitonly eq 'incorrect'); |
next if (!$incorrect && $submitonly eq 'incorrect'); |
} |
} |
push @nextlist,$student if ($ctr < $ntstu); |
push(@nextlist,$student) if ($ctr < $ntstu); |
last if ($ctr == $ntstu); |
last if ($ctr == $ntstu); |
$ctr++; |
$ctr++; |
} |
} |
Line 2603 sub processHandGrade {
|
Line 2610 sub processHandGrade {
|
$ctr = 0; |
$ctr = 0; |
my $total = scalar(@nextlist)-1; |
my $total = scalar(@nextlist)-1; |
|
|
foreach (sort @nextlist) { |
foreach (sort(@nextlist)) { |
my ($uname,$udom,$submitter) = split(/:/); |
my ($uname,$udom,$submitter) = split(/:/); |
$env{'form.student'} = $uname; |
$env{'form.student'} = $uname; |
$env{'form.userdom'} = $udom; |
$env{'form.userdom'} = $udom; |
Line 2649 sub saveHandGrade {
|
Line 2656 sub saveHandGrade {
|
} |
} |
} elsif ($dropMenu eq 'reset status' |
} elsif ($dropMenu eq 'reset status' |
&& exists($record{'resource.'.$new_part.'.solved'})) { #don't bother if no old records -> no attempts |
&& exists($record{'resource.'.$new_part.'.solved'})) { #don't bother if no old records -> no attempts |
foreach my $key (keys (%record)) { |
foreach my $key (keys(%record)) { |
if ($key=~/^resource\.\Q$new_part\E\./) { $newrecord{$key} = ''; } |
if ($key=~/^resource\.\Q$new_part\E\./) { $newrecord{$key} = ''; } |
} |
} |
$newrecord{'resource.'.$new_part.'.regrader'}= |
$newrecord{'resource.'.$new_part.'.regrader'}= |
Line 2684 sub saveHandGrade {
|
Line 2691 sub saveHandGrade {
|
&handback_files($request,$symb,$stuname,$domain,$newflg,$new_part,\%newrecord); |
&handback_files($request,$symb,$stuname,$domain,$newflg,$new_part,\%newrecord); |
next; |
next; |
} else { |
} else { |
push @parts_graded, $new_part; |
push(@parts_graded,$new_part); |
} |
} |
if ($record{'resource.'.$new_part.'.awarded'} ne $partial) { |
if ($record{'resource.'.$new_part.'.awarded'} ne $partial) { |
$newrecord{'resource.'.$new_part.'.awarded'} = $partial; |
$newrecord{'resource.'.$new_part.'.awarded'} = $partial; |
Line 2711 sub saveHandGrade {
|
Line 2718 sub saveHandGrade {
|
$record{'resource.'.$new_part.'.solved'} eq 'incorrect_by_override' || |
$record{'resource.'.$new_part.'.solved'} eq 'incorrect_by_override' || |
$dropMenu eq 'reset status') |
$dropMenu eq 'reset status') |
{ |
{ |
push (@version_parts,$new_part); |
push(@version_parts,$new_part); |
} |
} |
} |
} |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
Line 2759 sub check_and_remove_from_queue {
|
Line 2766 sub check_and_remove_from_queue {
|
|
|
sub handback_files { |
sub handback_files { |
my ($request,$symb,$stuname,$domain,$newflg,$new_part,$newrecord) = @_; |
my ($request,$symb,$stuname,$domain,$newflg,$new_part,$newrecord) = @_; |
my $portfolio_root = &propath($domain,$stuname).'/userfiles/portfolio'; |
my $portfolio_root = '/userfiles/portfolio'; |
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
|
|
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id = &flatten_responseType($responseType); |
Line 2777 sub handback_files {
|
Line 2784 sub handback_files {
|
my ($answer_name,$answer_ver,$answer_ext) = |
my ($answer_name,$answer_ver,$answer_ext) = |
&file_name_version_ext($answer_file); |
&file_name_version_ext($answer_file); |
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/); |
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/); |
my @dir_list = &Apache::lonnet::dirlist($portfolio_path,$domain,$stuname,$portfolio_root); |
my $getpropath = 1; |
|
my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$portfolio_path,$domain,$stuname,$getpropath); |
my $version = &get_next_version($answer_name, $answer_ext, \@dir_list); |
my $version = &get_next_version($answer_name, $answer_ext, \@dir_list); |
# fix file name |
# fix file name |
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/); |
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/); |
Line 2785 sub handback_files {
|
Line 2793 sub handback_files {
|
$newflg.'_'.$part_resp.'_returndoc'.$file_counter, |
$newflg.'_'.$part_resp.'_returndoc'.$file_counter, |
$save_file_name); |
$save_file_name); |
if ($result !~ m|^/uploaded/|) { |
if ($result !~ m|^/uploaded/|) { |
$request->print('<span class="LC_error">An error occurred ('.$result. |
$request->print('<br /><span class="LC_error">'. |
') while trying to upload '.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'</span><br />'); |
&mt('An error occurred ([_1]) while trying to upload [_2].', |
|
$result,$newflg.'_'.$part_resp.'_returndoc'.$file_counter). |
|
'</span>'); |
} else { |
} else { |
# mark the file as read only |
# mark the file as read only |
my @files = ($save_file_name); |
my @files = ($save_file_name); |
Line 2883 sub decrement_aggs {
|
Line 2893 sub decrement_aggs {
|
if ($aggtries == $totaltries) { |
if ($aggtries == $totaltries) { |
$decrement{'users'} = 1; |
$decrement{'users'} = 1; |
} |
} |
foreach my $type (keys (%decrement)) { |
foreach my $type (keys(%decrement)) { |
$$aggregate{$symb."\0".$part."\0".$type} = -$decrement{$type}; |
$$aggregate{$symb."\0".$part."\0".$type} = -$decrement{$type}; |
} |
} |
return; |
return; |
Line 2913 sub version_portfiles {
|
Line 2923 sub version_portfiles {
|
my $version_parts = join('|',@$v_flag); |
my $version_parts = join('|',@$v_flag); |
my @returned_keys; |
my @returned_keys; |
my $parts = join('|', @$parts_graded); |
my $parts = join('|', @$parts_graded); |
my $portfolio_root = &propath($domain,$stu_name). |
my $portfolio_root = '/userfiles/portfolio'; |
'/userfiles/portfolio'; |
|
foreach my $key (keys(%$record)) { |
foreach my $key (keys(%$record)) { |
my $new_portfiles; |
my $new_portfiles; |
if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) { |
if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) { |
Line 2925 sub version_portfiles {
|
Line 2934 sub version_portfiles {
|
my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/); |
my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/); |
my ($answer_name,$answer_ver,$answer_ext) = |
my ($answer_name,$answer_ver,$answer_ext) = |
&file_name_version_ext($answer_file); |
&file_name_version_ext($answer_file); |
my @dir_list = &Apache::lonnet::dirlist($directory,$domain,$stu_name,$portfolio_root); |
my $getpropath = 1; |
|
my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$directory,$domain,$stu_name,$getpropath); |
my $version = &get_next_version($answer_name, $answer_ext, \@dir_list); |
my $version = &get_next_version($answer_name, $answer_ext, \@dir_list); |
my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version); |
my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version); |
if ($new_answer ne 'problem getting file') { |
if ($new_answer ne 'problem getting file') { |
Line 3005 sub file_name_version_ext {
|
Line 3015 sub file_name_version_ext {
|
sub viewgrades_js { |
sub viewgrades_js { |
my ($request) = shift; |
my ($request) = shift; |
|
|
|
my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); |
$request->print(<<VIEWJAVASCRIPT); |
$request->print(<<VIEWJAVASCRIPT); |
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
function writePoint(partid,weight,point) { |
function writePoint(partid,weight,point) { |
Line 3013 sub viewgrades_js {
|
Line 3024 sub viewgrades_js {
|
if (point == "textval") { |
if (point == "textval") { |
point = document.classgrade["TEXTVAL_"+partid].value; |
point = document.classgrade["TEXTVAL_"+partid].value; |
if (isNaN(point) || parseFloat(point) < 0) { |
if (isNaN(point) || parseFloat(point) < 0) { |
alert("A number equal or greater than 0 is expected. Entered value = "+parseFloat(point)); |
alert("$alertmsg"+parseFloat(point)); |
var resetbox = false; |
var resetbox = false; |
for (var i=0; i<radioButton.length; i++) { |
for (var i=0; i<radioButton.length; i++) { |
if (radioButton[i].checked) { |
if (radioButton[i].checked) { |
Line 3111 sub viewgrades_js {
|
Line 3122 sub viewgrades_js {
|
var weight = document.classgrade["weight_"+partid].value; |
var weight = document.classgrade["weight_"+partid].value; |
|
|
if (isNaN(point) || parseFloat(point) < 0) { |
if (isNaN(point) || parseFloat(point) < 0) { |
alert("A number equal or greater than 0 is expected. Entered value = "+parseFloat(point)); |
alert("$alertmsg"+parseFloat(point)); |
textbox.value = ""; |
textbox.value = ""; |
return; |
return; |
} |
} |
Line 3200 sub viewgrades {
|
Line 3211 sub viewgrades {
|
'<input type="hidden" name="Status" value="'.$env{'stu_status'}.'" />'."\n". |
'<input type="hidden" name="Status" value="'.$env{'stu_status'}.'" />'."\n". |
'<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n"; |
'<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n"; |
|
|
my $sectionClass; |
my ($common_header,$specific_header); |
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
|
if ($env{'form.section'} eq 'all') { |
if ($env{'form.section'} eq 'all') { |
$sectionClass='Class'; |
$common_header = &mt('Assign Common Grade to Class'); |
|
$specific_header = &mt('Assign Grade to Specific Students in Class'); |
} elsif ($env{'form.section'} eq 'none') { |
} elsif ($env{'form.section'} eq 'none') { |
$sectionClass='Students in no Section'; |
$common_header = &mt('Assign Common Grade to Students in no Section'); |
|
$specific_header = &mt('Assign Grade to Specific Students in no Section'); |
} else { |
} else { |
$sectionClass='Students in Section(s) [_1]'; |
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
|
$common_header = &mt('Assign Common Grade to Students in Section(s) [_1]',$section_display); |
|
$specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1]',$section_display); |
} |
} |
$result.= |
$result.= '<h3>'.$common_header.'</h3>'.&Apache::loncommon::start_data_table(); |
'<h3>'. |
|
&mt("Assign Common Grade To $sectionClass",$section_display).'</h3>'; |
|
$result.= &Apache::loncommon::start_data_table(); |
|
#radio buttons/text box for assigning points for a section or class. |
#radio buttons/text box for assigning points for a section or class. |
#handles different parts of a problem |
#handles different parts of a problem |
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
Line 3243 sub viewgrades {
|
Line 3254 sub viewgrades {
|
my $line = '<input type="text" name="TEXTVAL_'. |
my $line = '<input type="text" name="TEXTVAL_'. |
$partid.'" size="4" '.'onChange="javascript:writePoint(\''. |
$partid.'" size="4" '.'onChange="javascript:writePoint(\''. |
$partid.'\','.$weight{$partid}.',\'textval\')" /> /'. |
$partid.'\','.$weight{$partid}.',\'textval\')" /> /'. |
$weight{$partid}.' (problem weight)</td>'."\n"; |
$weight{$partid}.' '.&mt('(problem weight)').'</td>'."\n"; |
$line.= '<td><select name="SELVAL_'.$partid.'"'. |
$line.= '<td><b>'.&mt('Grade Status').':</b><select name="SELVAL_'.$partid.'"'. |
'onChange="javascript:writeRadText(\''.$partid.'\','. |
'onChange="javascript:writeRadText(\''.$partid.'\','. |
$weight{$partid}.')"> '. |
$weight{$partid}.')"> '. |
'<option selected="selected"> </option>'. |
'<option selected="selected"> </option>'. |
Line 3259 sub viewgrades {
|
Line 3270 sub viewgrades {
|
|
|
$result.= |
$result.= |
&Apache::loncommon::start_data_table_row()."\n". |
&Apache::loncommon::start_data_table_row()."\n". |
&mt('<td><b>Part:</b></td><td>[_1]</td><td><b>Points:</b></td><td>[_2]</td><td>or</td><td>[_3]</td>',$display_part,$radio,$line). |
'<td><b>'.&mt('Part').':</b></td><td>'.$display_part.'</td><td><b>'.&mt('Points').':</b></td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>'. |
&Apache::loncommon::end_data_table_row()."\n"; |
&Apache::loncommon::end_data_table_row()."\n"; |
$ctsparts++; |
$ctsparts++; |
} |
} |
Line 3270 sub viewgrades {
|
Line 3281 sub viewgrades {
|
|
|
#table listing all the students in a section/class |
#table listing all the students in a section/class |
#header of table |
#header of table |
$result.= '<h3>'.&mt('Assign Grade to Specific Students in '.$sectionClass, |
$result.= '<h3>'.$specific_header.'</h3>'. |
$section_display).'</h3>'; |
&Apache::loncommon::start_data_table(). |
$result.= &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
'<th>'.&mt('No.').'</th>'. |
'<th>'.&mt('No.').'</th>'. |
'<th>'.&nameUserString('header')."</th>\n"; |
'<th>'.&nameUserString('header')."</th>\n"; |
|
my (@parts) = sort(&getpartlist($symb)); |
my (@parts) = sort(&getpartlist($symb)); |
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
my @partids = (); |
my @partids = (); |
foreach my $part (@parts) { |
foreach my $part (@parts) { |
my $display=&Apache::lonnet::metadata($url,$part.'.display'); |
my $display=&Apache::lonnet::metadata($url,$part.'.display'); |
$display =~ s|^Number of Attempts|Tries<br />|; # makes the column narrower |
my $narrowtext = &mt('Tries').'<br />'; |
|
$display =~ s{^Number of Attempts}{$narrowtext}; # makes the column narrower |
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); |
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>'. |
&mt('Score Part: [_1]<br /> (weight = [_2])', |
&mt('Score Part: [_1] (weight = [_2])', |
$display_part,$weight{$partid}).'</th>'."\n"; |
$display_part.'<br />',$weight{$partid}).'</th>'."\n"; |
next; |
next; |
|
|
} else { |
} else { |
if ($display =~ /Problem Status/) { |
if ($display =~ /Problem Status/) { |
my $grade_status_mt = &mt('Grade Status'); |
my $grade_status_mt = &mt('Grade Status').'<br />'; |
$display =~ s{Problem Status}{$grade_status_mt<br />}; |
$display =~ s{Problem Status}{$grade_status_mt}; |
} |
} |
my $part_mt = &mt('Part:'); |
my $part_mt = &mt('Part:'); |
$display =~s{\[Part: \Q$partid\E\]}{$part_mt $display_part}; |
$display =~s{\[Part: \Q$partid\E\]}{$part_mt $display_part}; |
Line 3438 sub editgrades {
|
Line 3449 sub editgrades {
|
my $header; |
my $header; |
while ($ctr < $env{'form.totalparts'}) { |
while ($ctr < $env{'form.totalparts'}) { |
my $partid = $env{'form.partid_'.$ctr}; |
my $partid = $env{'form.partid_'.$ctr}; |
push @partid,$partid; |
push(@partid,$partid); |
$weight{$partid} = $env{'form.weight_'.$partid}; |
$weight{$partid} = $env{'form.weight_'.$partid}; |
$ctr++; |
$ctr++; |
} |
} |
Line 3452 sub editgrades {
|
Line 3463 sub editgrades {
|
if ($part !~ m/^\Q$partid\E/) { next;} |
if ($part !~ m/^\Q$partid\E/) { next;} |
if ($type eq 'awarded' || $type eq 'solved') { next; } |
if ($type eq 'awarded' || $type eq 'solved') { next; } |
my $display=&Apache::lonnet::metadata($url,$stores.'.display'); |
my $display=&Apache::lonnet::metadata($url,$stores.'.display'); |
$display =~ s/\[Part: (\w)+\]//; |
$display =~ s/\[Part: \Q$part\E\]//; |
$display =~ s/Number of Attempts/Tries/; |
my $narrowtext = &mt('Tries'); |
$header .= '<th align="center">'.&mt('Old '.$display).'</th>'. |
$display =~ s{Number of Attempts}{$narrowtext}; |
'<th align="center">'.&mt('New '.$display).'</th>'; |
$header .= '<th align="center">'.&mt('Old').' '.$display.'</th>'. |
|
'<th align="center">'.&mt('New').' '.$display.'</th>'; |
$columns{$partid}+=2; |
$columns{$partid}+=2; |
} |
} |
} |
} |
Line 3797 ENDPICK
|
Line 3809 ENDPICK
|
} |
} |
|
|
sub checkforfile_js { |
sub checkforfile_js { |
|
my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); |
my $result =<<CSVFORMJS; |
my $result =<<CSVFORMJS; |
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
function checkUpload(formname) { |
function checkUpload(formname) { |
if (formname.upfile.value == "") { |
if (formname.upfile.value == "") { |
alert("Please use the browse button to select a file from your local directory."); |
alert("$alertmsg"); |
return false; |
return false; |
} |
} |
formname.submit(); |
formname.submit(); |
Line 3821 sub upcsvScores_form {
|
Line 3834 sub upcsvScores_form {
|
$result.=$table; |
$result.=$table; |
$result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; |
$result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; |
$result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; |
$result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; |
$result.=' <b>'.&mt('Specify a file containing the class scores for current resource'). |
$result.=' <b>'.&mt('Specify a file containing the class scores for current resource.'). |
'.</b></td></tr>'."\n"; |
'.</b></td></tr>'."\n"; |
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
my $upload=&mt("Upload Scores"); |
my $upload=&mt("Upload Scores"); |
Line 4075 sub csvuploadassign {
|
Line 4088 sub csvuploadassign {
|
sub pickStudentPage { |
sub pickStudentPage { |
my ($request) = shift; |
my ($request) = shift; |
|
|
|
my $alertmsg = &mt('Please select the student you wish to grade.'); |
$request->print(<<LISTJAVASCRIPT); |
$request->print(<<LISTJAVASCRIPT); |
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
|
|
function checkPickOne(formname) { |
function checkPickOne(formname) { |
if (radioSelection(formname.student) == null) { |
if (radioSelection(formname.student) == null) { |
alert("Please select the student you wish to grade."); |
alert("$alertmsg"); |
return; |
return; |
} |
} |
ptr = pullDownSelection(formname.selectpage); |
ptr = pullDownSelection(formname.selectpage); |
Line 4115 LISTJAVASCRIPT
|
Line 4129 LISTJAVASCRIPT
|
$ctr++; |
$ctr++; |
} |
} |
$select.= '</select>'; |
$select.= '</select>'; |
$result.=&mt(' <b>Problems from:</b> [_1]',$select)."<br />\n"; |
$result.=' <b>'.&mt('Problems from').":</b> $select<br />\n"; |
|
|
$ctr=0; |
$ctr=0; |
foreach (@$titles) { |
foreach (@$titles) { |
Line 4130 LISTJAVASCRIPT
|
Line 4144 LISTJAVASCRIPT
|
my $options = |
my $options = |
'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n". |
'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n". |
'<label><input type="radio" name="vProb" value="yes" /> '.&mt('yes').' </label>'."<br />\n"; |
'<label><input type="radio" name="vProb" value="yes" /> '.&mt('yes').' </label>'."<br />\n"; |
$result.=' '.&mt('<b>View Problems Text: </b> [_1]',$options); |
$result.=' <b>'.&mt('View Problem Text').": </b> $options"; |
|
|
$options = |
$options = |
'<label><input type="radio" name="lastSub" value="none" /> '.&mt('none').' </label>'."\n". |
'<label><input type="radio" name="lastSub" value="none" /> '.&mt('none').' </label>'."\n". |
'<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '.&mt('by dates and submissions').'</label>'."\n". |
'<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '.&mt('by dates and submissions').'</label>'."\n". |
'<label><input type="radio" name="lastSub" value="all" /> '.&mt('all details').' </label>'."\n"; |
'<label><input type="radio" name="lastSub" value="all" /> '.&mt('all details').' </label>'."\n"; |
$result.=' '.&mt('<b>Submission Details: </b>[_1]',$options); |
$result.=' <b>'.&mt('Submissions').": </b>$options"; |
|
|
$result.=&build_section_inputs(); |
$result.=&build_section_inputs(); |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
Line 4145 LISTJAVASCRIPT
|
Line 4159 LISTJAVASCRIPT
|
'<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="saveState" value="'.$env{'form.saveState'}.'" />'."<br />\n"; |
'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."<br />\n"; |
|
|
$result.=' '.&mt('<b>Use CODE: [_1] </b>', |
$result.=' <b>'.&mt('Use CODE').': </b> <input type="text" name="CODE" value="" /><br />'."\n"; |
'<input type="text" name="CODE" value="" />'). |
|
'<br />'."\n"; |
|
|
|
$result.=' <input type="button" '. |
$result.=' <input type="button" '. |
'onClick="javascript:checkPickOne(this.form);" value="'.&mt('Next->').'" /><br />'."\n"; |
'onClick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' →" /><br />'."\n"; |
|
|
$request->print($result); |
$request->print($result); |
|
|
Line 4326 sub displayPage {
|
Line 4338 sub displayPage {
|
# $request->print('match='.$1."<br />\n"); |
# $request->print('match='.$1."<br />\n"); |
# } |
# } |
# $companswer =~ s|<table border=\"1\">|<table border=\"0\">|g; |
# $companswer =~ s|<table border=\"1\">|<table border=\"0\">|g; |
$studentTable.=' <b>'.$title.'</b> <br /> '.&mt('<b>Correct answer:</b><br />[_1]',$companswer); |
$studentTable.=' <b>'.$title.'</b> <br /> <b>'.&mt('Correct answer').':</b><br />'.$companswer; |
} |
} |
|
|
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
Line 4396 sub displaySubByDates {
|
Line 4408 sub displaySubByDates {
|
my %orders; |
my %orders; |
$mark{'correct_by_student'} = $checkIcon; |
$mark{'correct_by_student'} = $checkIcon; |
if (!exists($$record{'1:timestamp'})) { |
if (!exists($$record{'1:timestamp'})) { |
return '<br /> <span class="LC_warning">'.&mt('Nothing submitted - no attempts').'</span><br />'; |
return '<br /> <span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br />'; |
} |
} |
|
|
my $interaction; |
my $interaction; |
|
my $no_increment = 1; |
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 4443 sub displaySubByDates {
|
Line 4456 sub displaySubByDates {
|
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
if (!exists($orders{$partid}->{$responseId})) { |
if (!exists($orders{$partid}->{$responseId})) { |
$orders{$partid}->{$responseId}= |
$orders{$partid}->{$responseId}= |
&get_order($partid,$responseId,$symb,$uname,$udom); |
&get_order($partid,$responseId,$symb,$uname,$udom, |
|
$no_increment); |
} |
} |
$displaySub[0].='</b> '. |
$displaySub[0].='</b> '. |
&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).'<br />'; |
Line 4496 sub updateGradeByPage {
|
Line 4510 sub updateGradeByPage {
|
my ($uname,$udom) = split(/:/,$env{'form.student'}); |
my ($uname,$udom) = split(/:/,$env{'form.student'}); |
my $usec=$classlist->{$env{'form.student'}}[5]; |
my $usec=$classlist->{$env{'form.student'}}[5]; |
if (!&canmodify($usec)) { |
if (!&canmodify($usec)) { |
$request->print('<span class="LC_warning">Unable to modify requested student.('.$env{'form.student'}.'</span>'); |
$request->print('<span class="LC_warning">'.&mt('Unable to modify requested student ([_1])',$env{'form.student'}).'</span>'); |
$request->print(&show_grading_menu_form($env{'form.symb'})); |
$request->print(&show_grading_menu_form($env{'form.symb'})); |
return; |
return; |
} |
} |
my $result='<h3><span class="LC_info"> '.$env{'form.title'}.'</span></h3>'; |
my $result='<h3><span class="LC_info"> '.$env{'form.title'}.'</span></h3>'; |
$result.='<h3> Student: '.&nameUserString(undef,$env{'form.fullname'},$uname,$udom). |
$result.='<h3> '.&mt('Student: ').&nameUserString(undef,$env{'form.fullname'},$uname,$udom). |
'</h3>'."\n"; |
'</h3>'."\n"; |
|
|
$request->print($result); |
$request->print($result); |
Line 4510 sub updateGradeByPage {
|
Line 4524 sub updateGradeByPage {
|
my ($mapUrl, $id, $resUrl) = &Apache::lonnet::decode_symb( $env{'form.page'}); |
my ($mapUrl, $id, $resUrl) = &Apache::lonnet::decode_symb( $env{'form.page'}); |
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps |
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps |
if (!$map) { |
if (!$map) { |
$request->print('<span class="LC_warning">Unable to grade requested sequence. ('.$resUrl.')</span>'); |
$request->print('<span class="LC_warning">'.&mt('Unable to grade requested sequence ([_1]).',$resUrl).'</span>'); |
my ($symb)=&get_symb($request); |
my ($symb)=&get_symb($request); |
$request->print(&show_grading_menu_form($symb)); |
$request->print(&show_grading_menu_form($symb)); |
return; |
return; |
Line 4542 sub updateGradeByPage {
|
Line 4556 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, parts]',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>'; |
|
|
my %newrecord=(); |
my %newrecord=(); |
Line 4587 sub updateGradeByPage {
|
Line 4601 sub updateGradeByPage {
|
} |
} |
my $display_part=&get_display_part($partid,$curRes->symb()); |
my $display_part=&get_display_part($partid,$curRes->symb()); |
my $oldstatus = $env{'form.solved'.$question.'_'.$partid}; |
my $oldstatus = $env{'form.solved'.$question.'_'.$partid}; |
$displayPts[0].=' <b>Part:</b> '.$display_part.' = '. |
$displayPts[0].=' <b>'.&mt('Part').':</b> '.$display_part.' = '. |
(($oldstatus eq 'excused') ? 'excused' : $oldpts). |
(($oldstatus eq 'excused') ? 'excused' : $oldpts). |
' <br />'; |
' <br />'; |
$displayPts[1].=' <b>Part:</b> '.$display_part.' = '. |
$displayPts[1].=' <b>'.&mt('Part').':</b> '.$display_part.' = '. |
(($score eq 'excused') ? 'excused' : $newpts). |
(($score eq 'excused') ? 'excused' : $newpts). |
' <br />'; |
' <br />'; |
$question++; |
$question++; |
Line 4639 sub updateGradeByPage {
|
Line 4653 sub updateGradeByPage {
|
|
|
$studentTable.=&Apache::loncommon::end_data_table(); |
$studentTable.=&Apache::loncommon::end_data_table(); |
$studentTable.=&show_grading_menu_form($env{'form.symb'}); |
$studentTable.=&show_grading_menu_form($env{'form.symb'}); |
my $grademsg=($changeflag == 0 ? 'No score was changed or updated.' : |
my $grademsg=($changeflag == 0 ? &mt('No score was changed or updated.') : |
'The scores were changed for '. |
&mt('The scores were changed for [quant,_1,problem].', |
$changeflag.' problem'.($changeflag == 1 ? '.' : 's.')); |
$changeflag)); |
$request->print($grademsg.$studentTable); |
$request->print($grademsg.$studentTable); |
|
|
return ''; |
return ''; |
Line 4825 sub get_response_bubbles {
|
Line 4839 sub get_response_bubbles {
|
sub scantron_filenames { |
sub scantron_filenames { |
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $getpropath = 1; |
my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname, |
my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname, |
&propath($cdom,$cname)); |
$getpropath); |
my @possiblenames; |
my @possiblenames; |
foreach my $filename (sort(@files)) { |
foreach my $filename (sort(@files)) { |
($filename)=split(/&/,$filename); |
($filename)=split(/&/,$filename); |
Line 4869 sub scantron_uploads {
|
Line 4884 sub scantron_uploads {
|
=cut |
=cut |
|
|
sub scantron_scantab { |
sub scantron_scantab { |
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
|
my $result='<select name="scantron_format">'."\n"; |
my $result='<select name="scantron_format">'."\n"; |
$result.='<option></option>'."\n"; |
$result.='<option></option>'."\n"; |
foreach my $line (<$fh>) { |
my @lines = &get_scantronformat_file(); |
my ($name,$descrip)=split(/:/,$line); |
if (@lines > 0) { |
if ($name =~ /^\#/) { next; } |
foreach my $line (@lines) { |
$result.='<option value="'.$name.'">'.$descrip.'</option>'."\n"; |
next if (($line =~ /^\#/) || ($line eq '')); |
|
my ($name,$descrip)=split(/:/,$line); |
|
$result.='<option value="'.$name.'">'.$descrip.'</option>'."\n"; |
|
} |
} |
} |
$result.='</select>'."\n"; |
$result.='</select>'."\n"; |
|
|
return $result; |
return $result; |
} |
} |
|
|
|
=pod |
|
|
|
=item get_scantronformat_file |
|
|
|
Returns an array containing lines from the scantron format file for |
|
the domain of the course. |
|
|
|
If a url for a custom.tab file is listed in domain's configuration.db, |
|
lines are from this file. |
|
|
|
Otherwise, if a default.tab has been published in RES space by the |
|
domainconfig user, lines are from this file. |
|
|
|
Otherwise, fall back to getting lines from the legacy file on the |
|
local server: /home/httpd/lonTabs/default_scantronformat.tab |
|
|
|
=cut |
|
|
|
sub get_scantronformat_file { |
|
my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$cdom); |
|
my $gottab = 0; |
|
my @lines; |
|
if (ref($domconfig{'scantron'}) eq 'HASH') { |
|
if ($domconfig{'scantron'}{'scantronformat'} ne '') { |
|
my $formatfile = &Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.$domconfig{'scantron'}{'scantronformat'}); |
|
if ($formatfile ne '-1') { |
|
@lines = split("\n",$formatfile,-1); |
|
$gottab = 1; |
|
} |
|
} |
|
} |
|
if (!$gottab) { |
|
my $confname = $cdom.'-domainconfig'; |
|
my $default = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$cdom.'/'.$confname.'/default.tab'; |
|
my $formatfile = &Apache::lonnet::getfile($default); |
|
if ($formatfile ne '-1') { |
|
@lines = split("\n",$formatfile,-1); |
|
$gottab = 1; |
|
} |
|
} |
|
if (!$gottab) { |
|
my @domains = &Apache::lonnet::current_machine_domains(); |
|
if (grep(/^\Q$cdom\E$/,@domains)) { |
|
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
|
@lines = <$fh>; |
|
close($fh); |
|
} else { |
|
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab'); |
|
@lines = <$fh>; |
|
close($fh); |
|
} |
|
} |
|
return @lines; |
|
} |
|
|
=pod |
=pod |
|
|
=item scantron_CODElist |
=item scantron_CODElist |
Line 4914 sub scantron_CODElist {
|
Line 4986 sub scantron_CODElist {
|
=cut |
=cut |
|
|
sub scantron_CODEunique { |
sub scantron_CODEunique { |
my $result='<span style="white-space: nowrap;"> |
my $result='<span class="LC_nobreak"> |
<label><input type="radio" name="scantron_CODEunique" |
<label><input type="radio" name="scantron_CODEunique" |
value="yes" checked="checked" />'.&mt('Yes').' </label> |
value="yes" checked="checked" />'.&mt('Yes').' </label> |
</span> |
</span> |
<span style="white-space: nowrap;"> |
<span class="LC_nobreak"> |
<label><input type="radio" name="scantron_CODEunique" |
<label><input type="radio" name="scantron_CODEunique" |
value="no" />'.&mt('No').' </label> |
value="no" />'.&mt('No').' </label> |
</span>'; |
</span>'; |
Line 5077 sub scantron_selectphase {
|
Line 5149 sub scantron_selectphase {
|
'); |
'); |
|
|
&Apache::lonpickcode::code_list($r,2); |
&Apache::lonpickcode::code_list($r,2); |
|
|
|
$r->print('<br /><form method="post" name="checkscantron">'. |
|
$default_form_data."\n". |
|
&Apache::loncommon::start_data_table('LC_scantron_action')."\n". |
|
&Apache::loncommon::start_data_table_header_row()."\n". |
|
'<th colspan="2"> |
|
'.&mt('Review scantron data and submissions for a previously graded folder/sequence')."\n". |
|
'</th>'."\n". |
|
&Apache::loncommon::end_data_table_header_row()."\n". |
|
&Apache::loncommon::start_data_table_row()."\n". |
|
'<td> '.&mt('Graded folder/sequence:').' </td>'."\n". |
|
'<td> '.$sequence_selector.' </td>'. |
|
&Apache::loncommon::end_data_table_row()."\n". |
|
&Apache::loncommon::start_data_table_row()."\n". |
|
'<td> '.&mt('Filename of scoring office file:').' </td>'."\n". |
|
'<td> '.$file_selector.' </td>'."\n". |
|
&Apache::loncommon::end_data_table_row()."\n". |
|
&Apache::loncommon::start_data_table_row()."\n". |
|
'<td> '.&mt('Format of data file:').' </td>'."\n". |
|
'<td> '.$format_selector.' </td>'."\n". |
|
&Apache::loncommon::end_data_table_row()."\n". |
|
&Apache::loncommon::start_data_table_row()."\n". |
|
'<td colspan="2">'."\n". |
|
'<input type="hidden" name="command" value="checksubmissions" />'."\n". |
|
'<input type="submit" value="'.&mt('Review Scantron Data and Submission Records').'" />'."\n". |
|
'</td>'."\n". |
|
&Apache::loncommon::end_data_table_row()."\n". |
|
&Apache::loncommon::end_data_table()."\n". |
|
'</form><br />'); |
$r->print($grading_menu_button); |
$r->print($grading_menu_button); |
return |
return; |
} |
} |
|
|
=pod |
=pod |
Line 5140 sub scantron_selectphase {
|
Line 5241 sub scantron_selectphase {
|
|
|
sub get_scantron_config { |
sub get_scantron_config { |
my ($which) = @_; |
my ($which) = @_; |
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my @lines = &get_scantronformat_file(); |
my %config; |
my %config; |
#FIXME probably should move to XML it has already gotten a bit much now |
#FIXME probably should move to XML it has already gotten a bit much now |
foreach my $line (<$fh>) { |
foreach my $line (@lines) { |
my ($name,$descrip)=split(/:/,$line); |
my ($name,$descrip)=split(/:/,$line); |
if ($name ne $which ) { next; } |
if ($name ne $which ) { next; } |
chomp($line); |
chomp($line); |
Line 5423 sub scantron_parse_scanline {
|
Line 5524 sub scantron_parse_scanline {
|
my ($line,$whichline,$scantron_config,$scan_data,$just_header)=@_; |
my ($line,$whichline,$scantron_config,$scan_data,$just_header)=@_; |
|
|
my %record; |
my %record; |
my $questions=substr($line,$$scantron_config{'Qstart'}-1); # Answers |
my $lastpos = $env{'form.scantron_maxbubble'}*$$scantron_config{'Qlength'}; |
|
my $questions=substr($line,$$scantron_config{'Qstart'}-1,$lastpos); # Answers |
my $data=substr($line,0,$$scantron_config{'Qstart'}-1); # earlier stuff |
my $data=substr($line,0,$$scantron_config{'Qstart'}-1); # earlier stuff |
if (!($$scantron_config{'CODElocation'} eq 0 || |
if (!($$scantron_config{'CODElocation'} eq 0 || |
$$scantron_config{'CODElocation'} eq 'none')) { |
$$scantron_config{'CODElocation'} eq 'none')) { |
Line 6112 sub scantron_validate_file {
|
Line 6214 sub scantron_validate_file {
|
} |
} |
} |
} |
if (!$stop) { |
if (!$stop) { |
my $warning=&scantron_warning_screen('Start Grading'); |
my $warning=&scantron_warning_screen('Start Grading'); |
$r->print(&mt('Validation process complete.').'<br /> |
$r->print(&mt('Validation process complete.').'<br />'. |
'.$warning.' |
$warning. |
<input type="submit" name="submit" value="'.&mt('Start Grading').'" /> |
&mt('Perform verification for each student after storage of submissions?'). |
<input type="hidden" name="command" value="scantron_process" /> |
' <span class="LC_nobreak"><label>'. |
'); |
'<input type="radio" name="verifyrecord" value="1" />'.&mt('Yes').'</label>'. |
|
(' 'x3).'<label>'. |
|
'<input type="radio" name="verifyrecord" value="0" checked="checked" />'.&mt('No'). |
|
'</label></span><br />'. |
|
&mt('Grading will take longer if you use verification.').'<br />'. &mt("Alternatively, the 'Review scantron data' utility (see grading menu) can be used for all students after grading is complete.").'<br /><br />'. |
|
'<input type="submit" name="submit" value="'.&mt('Start Grading').'" />'. |
|
'<input type="hidden" name="command" value="scantron_process" />'."\n"); |
} else { |
} else { |
$r->print('<input type="hidden" name="command" value="scantron_validate" />'); |
$r->print('<input type="hidden" name="command" value="scantron_validate" />'); |
$r->print("<input type='hidden' name='validatepass' value='".$currentphase."' />"); |
$r->print("<input type='hidden' name='validatepass' value='".$currentphase."' />"); |
} |
} |
if ($stop) { |
if ($stop) { |
if ($validate_phases[$currentphase] eq 'sequence') { |
if ($validate_phases[$currentphase] eq 'sequence') { |
$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 click the 'Grading Menu' button to start over.")."</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)" />'); |
} else { |
} else { |
$r->print('<input type="submit" name="submit" value="'.&mt('Continue ->').'" />'); |
$r->print('<input type="submit" name="submit" value="'.&mt('Continue').' →" />'); |
} |
} |
$r->print(' '.&mt('using corrected info').' <br />'); |
$r->print(' '.&mt('using corrected info').' <br />'); |
$r->print("<input type='submit' value='".&mt("Skip")."' name='scantron_skip_record' />"); |
$r->print("<input type='submit' value='".&mt("Skip")."' name='scantron_skip_record' />"); |
Line 6726 ENDSCRIPT
|
Line 6833 ENDSCRIPT
|
".&mt("[_1]Select[_2] a CODE from the list of all CODEs and use it.", |
".&mt("[_1]Select[_2] a CODE from the list of all CODEs and use it.", |
"<a target='_blank' href='$href'>","</a>")." |
"<a target='_blank' href='$href'>","</a>")." |
</label> |
</label> |
".&mt("Selected CODE is [_1]","<input readonly='true' type='text' size='8' name='scantron_CODE_selectedvalue' onfocus=\"javascript:change_radio('use_found')\" onchange=\"javascript:change_radio('use_found')\" />")); |
".&mt('Selected CODE is [_1]','<input readonly="readonly" type="text" size="8" name="scantron_CODE_selectedvalue" onfocus="javascript:change_radio(\'use_found\')" onchange="javascript:change_radio(\'use_found\')" />')); |
$r->print("\n<br />"); |
$r->print("\n<br />"); |
} |
} |
$r->print(" |
$r->print(" |
Line 6750 ENDSCRIPT
|
Line 6857 ENDSCRIPT
|
foreach my $question (@{$arg}) { |
foreach my $question (@{$arg}) { |
my @linenums = &prompt_for_corrections($r,$question,$scan_config, |
my @linenums = &prompt_for_corrections($r,$question,$scan_config, |
$scan_record, $error); |
$scan_record, $error); |
push (@lines_to_correct,@linenums); |
push(@lines_to_correct,@linenums); |
} |
} |
$r->print(&verify_bubbles_checked(@lines_to_correct)); |
$r->print(&verify_bubbles_checked(@lines_to_correct)); |
} elsif ($error eq 'missingbubble') { |
} elsif ($error eq 'missingbubble') { |
Line 6770 ENDSCRIPT
|
Line 6877 ENDSCRIPT
|
foreach my $question (@{$arg}) { |
foreach my $question (@{$arg}) { |
my @linenums = &prompt_for_corrections($r,$question,$scan_config, |
my @linenums = &prompt_for_corrections($r,$question,$scan_config, |
$scan_record, $error); |
$scan_record, $error); |
push (@lines_to_correct,@linenums); |
push(@lines_to_correct,@linenums); |
} |
} |
$r->print(&verify_bubbles_checked(@lines_to_correct)); |
$r->print(&verify_bubbles_checked(@lines_to_correct)); |
} else { |
} else { |
Line 6928 sub prompt_for_corrections {
|
Line 7035 sub prompt_for_corrections {
|
my $selected = $$scan_record{"scantron.$current_line.answer"}; |
my $selected = $$scan_record{"scantron.$current_line.answer"}; |
&scantron_bubble_selector($r,$scan_config,$current_line, |
&scantron_bubble_selector($r,$scan_config,$current_line, |
$questionnum,$error,split('', $selected)); |
$questionnum,$error,split('', $selected)); |
push (@linenums,$current_line); |
push(@linenums,$current_line); |
$current_line++; |
$current_line++; |
} |
} |
if ($lines > 1) { |
if ($lines > 1) { |
Line 7144 sub scantron_validate_CODE {
|
Line 7251 sub scantron_validate_CODE {
|
$line,'duplicateCODE',$usedCODEs{$CODE}); |
$line,'duplicateCODE',$usedCODEs{$CODE}); |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
push (@{$usedCODEs{$CODE}},$$scan_record{'scantron.PaperID'}); |
push(@{$usedCODEs{$CODE}},$$scan_record{'scantron.PaperID'}); |
} |
} |
return (0,$currentphase+1); |
return (0,$currentphase+1); |
} |
} |
Line 7231 sub scantron_get_maxbubble {
|
Line 7338 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) { |
# Need to retrieve part IDs and response IDs because essayresponse, |
my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,$udom); |
# reactionresponse and organicresponse items are not included in |
if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) { |
# $analysis{'parts'} from lonnet::ssi. |
foreach my $part_id (@{$parts}) { |
my %possible_part_ids; |
|
if (ref($resource->parts()) eq 'ARRAY') { |
my $lines; |
foreach my $part (@{$resource->parts()}) { |
|
my @resp_ids = $resource->responseIds($part); |
# TODO - make this a persistent hash not an array. |
foreach my $id (@resp_ids) { |
|
$possible_part_ids{$part.'.'.$id} = 1; |
# optionresponse, matchresponse and rankresponse type items |
} |
# render as separate sub-questions in exam mode. |
} |
if (($analysis->{$part_id.'.type'} eq 'optionresponse') || |
} |
($analysis->{$part_id.'.type'} eq 'matchresponse') || |
my $result=&ssi_with_retries($resource->src(), $ssi_retries, |
($analysis->{$part_id.'.type'} eq 'rankresponse')) { |
('symb' => $resource->symb()), |
my ($numbub,$numshown); |
('grade_target' => 'analyze'), |
if ($analysis->{$part_id.'.type'} eq 'optionresponse') { |
('grade_courseid' => $cid), |
if (ref($analysis->{$part_id.'.options'}) eq 'ARRAY') { |
('grade_domain' => $udom), |
$numbub = scalar(@{$analysis->{$part_id.'.options'}}); |
('grade_username' => $uname)); |
} |
my (undef, $an) = |
} elsif ($analysis->{$part_id.'.type'} eq 'matchresponse') { |
split(/_HASH_REF__/,$result, 2); |
if (ref($analysis->{$part_id.'.items'}) eq 'ARRAY') { |
|
$numbub = scalar(@{$analysis->{$part_id.'.items'}}); |
my @parts; |
} |
|
} elsif ($analysis->{$part_id.'.type'} eq 'rankresponse') { |
my %analysis = &Apache::lonnet::str2hash($an); |
if (ref($analysis->{$part_id.'.foils'}) eq 'ARRAY') { |
|
$numbub = scalar(@{$analysis->{$part_id.'.foils'}}); |
if (ref($analysis{'parts'}) eq 'ARRAY') { |
} |
@parts = @{$analysis{'parts'}}; |
|
} |
|
# Add part_ids for any essayresponse items. |
|
foreach my $part_id (keys(%possible_part_ids)) { |
|
if (($analysis{$part_id.'.type'} eq 'essayresponse') || |
|
($analysis{$part_id.'.type'} eq 'reactionresponse') || |
|
($analysis{$part_id.'.type'} eq 'organicresponse')) { |
|
if (!grep(/^\Q$part_id\E$/,@parts)) { |
|
push (@parts,$part_id); |
|
} |
|
} |
|
} |
|
|
|
foreach my $part_id (@parts) { |
|
my $lines = $analysis{"$part_id.bubble_lines"}; |
|
|
|
# TODO - make this a persistent hash not an array. |
|
|
|
# optionresponse, matchresponse and rankresponse type items |
|
# render as separate sub-questions in exam mode. |
|
if (($analysis{$part_id.'.type'} eq 'optionresponse') || |
|
($analysis{$part_id.'.type'} eq 'matchresponse') || |
|
($analysis{$part_id.'.type'} eq 'rankresponse')) { |
|
my ($numbub,$numshown); |
|
if ($analysis{$part_id.'.type'} eq 'optionresponse') { |
|
if (ref($analysis{$part_id.'.options'}) eq 'ARRAY') { |
|
$numbub = scalar(@{$analysis{$part_id.'.options'}}); |
|
} |
} |
} elsif ($analysis{$part_id.'.type'} eq 'matchresponse') { |
if (ref($analysis->{$part_id.'.shown'}) eq 'ARRAY') { |
if (ref($analysis{$part_id.'.items'}) eq 'ARRAY') { |
$numshown = scalar(@{$analysis->{$part_id.'.shown'}}); |
$numbub = scalar(@{$analysis{$part_id.'.items'}}); |
|
} |
} |
} elsif ($analysis{$part_id.'.type'} eq 'rankresponse') { |
my $bubbles_per_line = 10; |
if (ref($analysis{$part_id.'.foils'}) eq 'ARRAY') { |
my $inner_bubble_lines = int($numbub/$bubbles_per_line); |
$numbub = scalar(@{$analysis{$part_id.'.foils'}}); |
if (($numbub % $bubbles_per_line) != 0) { |
|
$inner_bubble_lines++; |
} |
} |
} |
for (my $i=0; $i<$numshown; $i++) { |
if (ref($analysis{$part_id.'.shown'}) eq 'ARRAY') { |
$subdivided_bubble_lines{$response_number} .= |
$numshown = scalar(@{$analysis{$part_id.'.shown'}}); |
$inner_bubble_lines.','; |
} |
} |
my $bubbles_per_line = 10; |
$subdivided_bubble_lines{$response_number} =~ s/,$//; |
my $inner_bubble_lines = int($numshown/$bubbles_per_line); |
$lines = $numshown * $inner_bubble_lines; |
if (($numshown % $bubbles_per_line) != 0) { |
} else { |
$inner_bubble_lines++; |
$lines = $analysis->{"$part_id.bubble_lines"}; |
} |
} |
for (my $i=0; $i<$numshown; $i++) { |
|
$subdivided_bubble_lines{$response_number} .= |
|
$inner_bubble_lines.','; |
|
} |
|
$subdivided_bubble_lines{$response_number} =~ s/,$//; |
|
} |
|
|
|
$first_bubble_line{$response_number} = $bubble_line; |
|
$bubble_lines_per_response{$response_number} = $lines; |
|
$responsetype_per_response{$response_number} = |
|
$analysis{$part_id.'.type'}; |
|
$response_number++; |
|
|
|
$bubble_line += $lines; |
$first_bubble_line{$response_number} = $bubble_line; |
$total_lines += $lines; |
$bubble_lines_per_response{$response_number} = $lines; |
} |
$responsetype_per_response{$response_number} = |
|
$analysis->{$part_id.'.type'}; |
|
$response_number++; |
|
|
|
$bubble_line += $lines; |
|
$total_lines += $lines; |
|
} |
|
} |
} |
} |
&Apache::lonnet::delenv('scantron\.'); |
&Apache::lonnet::delenv('scantron.'); |
|
|
&save_bubble_lines(); |
&save_bubble_lines(); |
$env{'form.scantron_maxbubble'} = |
$env{'form.scantron_maxbubble'} = |
Line 7328 sub scantron_get_maxbubble {
|
Line 7402 sub scantron_get_maxbubble {
|
return $env{'form.scantron_maxbubble'}; |
return $env{'form.scantron_maxbubble'}; |
} |
} |
|
|
|
sub scantron_partids_tograde { |
|
my ($resource,$cid,$uname,$udom) = @_; |
|
my (%analysis,@parts); |
|
|
|
if (ref($resource)) { |
|
my $symb = $resource->symb(); |
|
my $result=&ssi_with_retries($resource->src(), $ssi_retries, |
|
('symb' => $symb, |
|
'grade_target' => 'analyze', |
|
'grade_courseid' => $cid, |
|
'grade_domain' => $udom, |
|
'grade_username' => $uname)); |
|
my (undef, $an) = split(/_HASH_REF__/,$result, 2); |
|
%analysis = &Apache::lonnet::str2hash($an); |
|
|
|
if (ref($analysis{'parts'}) eq 'ARRAY') { |
|
foreach my $part (@{$analysis{'parts'}}) { |
|
my ($id,$respid) = split(/\./,$part); |
|
if (!&Apache::loncommon::check_if_partid_hidden($id,$symb,$udom,$uname)) { |
|
push(@parts,$part); |
|
} |
|
} |
|
} |
|
} |
|
return (\%analysis,\@parts); |
|
} |
|
|
=pod |
=pod |
|
|
=item scantron_validate_missingbubbles |
=item scantron_validate_missingbubbles |
Line 7432 sub scantron_process_students {
|
Line 7533 sub scantron_process_students {
|
my $navmap=Apache::lonnavmaps::navmap->new(); |
my $navmap=Apache::lonnavmaps::navmap->new(); |
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 ($uname,$udom,%partids_by_symb); |
|
foreach my $resource (@resources) { |
|
my $ressymb = $resource->symb(); |
|
my ($analysis,$parts) = |
|
&scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom); |
|
$partids_by_symb{$ressymb} = $parts; |
|
} |
# $r->print("geto ".scalar(@resources)."<br />"); |
# $r->print("geto ".scalar(@resources)."<br />"); |
my $result= <<SCANTRONFORM; |
my $result= <<SCANTRONFORM; |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantronupload"> |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantronupload"> |
Line 7441 SCANTRONFORM
|
Line 7550 SCANTRONFORM
|
$r->print($result); |
$r->print($result); |
|
|
my @delayqueue; |
my @delayqueue; |
my %completedstudents; |
my (%completedstudents,,%scandata); |
|
|
|
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $count=&get_todo_count($scanlines,$scan_data); |
my $count=&get_todo_count($scanlines,$scan_data); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Scantron Status', |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Scantron Status', |
'Scantron Progress',$count, |
'Scantron Progress',$count, |
'inline',undef,'scantronupload'); |
'inline',undef,'scantronupload'); |
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
'Processing first student'); |
'Processing first student'); |
|
$r->print('<br />'); |
my $start=&Time::HiRes::time(); |
my $start=&Time::HiRes::time(); |
my $i=-1; |
my $i=-1; |
my ($uname,$udom,$started); |
my $started; |
|
|
&scantron_get_maxbubble(); # Need the bubble lines array to parse. |
&scantron_get_maxbubble(); # Need the bubble lines array to parse. |
|
|
Line 7463 SCANTRONFORM
|
Line 7574 SCANTRONFORM
|
$r->print("</form>"); |
$r->print("</form>"); |
&ssi_print_error($r); |
&ssi_print_error($r); |
$r->print(&show_grading_menu_form($symb)); |
$r->print(&show_grading_menu_form($symb)); |
|
&Apache::lonnet::remove_lock($lock); |
return ''; # Dunno why the other returns return '' rather than just returning. |
return ''; # Dunno why the other returns return '' rather than just returning. |
} |
} |
|
|
|
my %lettdig = &letter_to_digits(); |
|
my $numletts = scalar(keys(%lettdig)); |
|
|
while ($i<$scanlines->{'count'}) { |
while ($i<$scanlines->{'count'}) { |
($uname,$udom)=('',''); |
($uname,$udom)=('',''); |
$i++; |
$i++; |
Line 7492 SCANTRONFORM
|
Line 7607 SCANTRONFORM
|
($uname,$udom)=split(/:/,$uname); |
($uname,$udom)=split(/:/,$uname); |
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonnet::appenv(%$scan_record); |
&Apache::lonnet::appenv($scan_record); |
|
|
if (&scantron_clear_skip($scanlines,$scan_data,$i)) { |
if (&scantron_clear_skip($scanlines,$scan_data,$i)) { |
&scantron_putfile($scanlines,$scan_data); |
&scantron_putfile($scanlines,$scan_data); |
} |
} |
|
|
my $i=0; |
|
foreach my $resource (@resources) { |
|
$i++; |
|
my %form=('submitted' =>'scantron', |
|
'grade_target' =>'grade', |
|
'grade_username'=>$uname, |
|
'grade_domain' =>$udom, |
|
'grade_courseid'=>$env{'request.course.id'}, |
|
'grade_symb' =>$resource->symb()); |
|
if (exists($scan_record->{'scantron.CODE'}) |
|
&& |
|
&Apache::lonnet::validCODE($scan_record->{'scantron.CODE'})) { |
|
$form{'CODE'}=$scan_record->{'scantron.CODE'}; |
|
} else { |
|
$form{'CODE'}=''; |
|
} |
|
my $result=&ssi_with_retries($resource->src(), $ssi_retries, %form); |
|
if ($ssi_error) { |
|
$ssi_error = 0; # So end of handler error message does not trigger. |
|
$r->print("</form>"); |
|
&ssi_print_error($r); |
|
$r->print(&show_grading_menu_form($symb)); |
|
return ''; # Why return ''? Beats me. |
|
} |
|
|
|
if (&Apache::loncommon::connection_aborted($r)) { last; } |
my $scancode; |
} |
if ((exists($scan_record->{'scantron.CODE'})) && |
|
(&Apache::lonnet::validCODE($scan_record->{'scantron.CODE'}))) { |
|
$scancode = $scan_record->{'scantron.CODE'}; |
|
} else { |
|
$scancode = ''; |
|
} |
|
|
|
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
|
@resources) eq 'ssi_error') { |
|
$ssi_error = 0; # So end of handler error message does not trigger. |
|
$r->print("</form>"); |
|
&ssi_print_error($r); |
|
$r->print(&show_grading_menu_form($symb)); |
|
&Apache::lonnet::remove_lock($lock); |
|
return ''; # Why return ''? Beats me. |
|
} |
|
|
$completedstudents{$uname}={'line'=>$line}; |
$completedstudents{$uname}={'line'=>$line}; |
|
if ($env{'form.verifyrecord'}) { |
|
my $lastpos = $env{'form.scantron_maxbubble'}*$scantron_config{'Qlength'}; |
|
my $studentdata = substr($line,$scantron_config{'Qstart'}-1,$lastpos); |
|
chomp($studentdata); |
|
$studentdata =~ s/\r$//; |
|
my $studentrecord = ''; |
|
my $counter = -1; |
|
foreach my $resource (@resources) { |
|
($counter,my $recording) = |
|
&verify_scantron_grading($resource,$udom,$uname,$env{'request.course.id'}, |
|
$counter,$studentdata,\%partids_by_symb, |
|
\%scantron_config,\%lettdig,$numletts); |
|
$studentrecord .= $recording; |
|
} |
|
if ($studentrecord ne $studentdata) { |
|
&Apache::lonxml::clear_problem_counter(); |
|
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
|
@resources) eq 'ssi_error') { |
|
$ssi_error = 0; # So end of handler error message does not trigger. |
|
$r->print("</form>"); |
|
&ssi_print_error($r); |
|
$r->print(&show_grading_menu_form($symb)); |
|
&Apache::lonnet::remove_lock($lock); |
|
delete($completedstudents{$uname}); |
|
return ''; |
|
} |
|
$counter = -1; |
|
$studentrecord = ''; |
|
foreach my $resource (@resources) { |
|
($counter,my $recording) = |
|
&verify_scantron_grading($resource,$udom,$uname,$env{'request.course.id'}, |
|
$counter,$studentdata,\%partids_by_symb, |
|
\%scantron_config,\%lettdig,$numletts); |
|
$studentrecord .= $recording; |
|
} |
|
if ($studentrecord ne $studentdata) { |
|
$r->print('<p><span class="LC_error">'); |
|
if ($scancode eq '') { |
|
$r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2].', |
|
$uname.':'.$udom,$scan_record->{'scantron.ID'})); |
|
} else { |
|
$r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2] and CODE: [_3].', |
|
$uname.':'.$udom,$scan_record->{'scantron.ID'},$scancode)); |
|
} |
|
$r->print('</span><br />'.&Apache::loncommon::start_data_table()."\n". |
|
&Apache::loncommon::start_data_table_header_row()."\n". |
|
'<th>'.&mt('Source').'</th><th>'.&mt('Bubbled responses').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row()."\n". |
|
&Apache::loncommon::start_data_table_row(). |
|
'<td>'.&mt('Bubble Sheet').'</td>'. |
|
'<td><span class="LC_nobreak">'.$studentdata.'</span></td>'. |
|
&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::start_data_table_row(). |
|
'<td>Stored submissions</td>'. |
|
'<td><span class="LC_nobreak">'.$studentrecord.'</span></td>'."\n". |
|
&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::end_data_table().'</p>'); |
|
} else { |
|
$r->print('<br /><span class="LC_warning">'. |
|
&mt('A second grading pass was needed for user: [_1] with ID: [_2], because a mismatch was seen on the first pass.',$uname.':'.$udom,$scan_record->{'scantron.ID'}).'<br />'. |
|
&mt("As a consequence, this user's submission history records two tries."). |
|
'</span><br />'); |
|
} |
|
} |
|
} |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
} continue { |
} continue { |
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonnet::delenv('scantron\.'); |
&Apache::lonnet::delenv('scantron.'); |
} |
} |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
&Apache::lonnet::remove_lock($lock); |
# my $lasttime = &Time::HiRes::time()-$start; |
# my $lasttime = &Time::HiRes::time()-$start; |
# $r->print("<p>took $lasttime</p>"); |
# $r->print("<p>took $lasttime</p>"); |
|
|
Line 7540 SCANTRONFORM
|
Line 7712 SCANTRONFORM
|
return ''; |
return ''; |
} |
} |
|
|
|
sub grade_student_bubbles { |
|
my ($r,$uname,$udom,$scan_record,$scancode,@resources) = @_; |
|
foreach my $resource (@resources) { |
|
my %form = ('submitted' => 'scantron', |
|
'grade_target' => 'grade', |
|
'grade_username'=> $uname, |
|
'grade_domain' => $udom, |
|
'grade_courseid'=> $env{'request.course.id'}, |
|
'grade_symb' => $resource->symb(), |
|
'CODE' => $scancode); |
|
my $result=&ssi_with_retries($resource->src(),$ssi_retries,%form); |
|
return 'ssi_error' if ($ssi_error); |
|
last if (&Apache::loncommon::connection_aborted($r)); |
|
} |
|
return; |
|
} |
|
|
=pod |
=pod |
|
|
=item scantron_upload_scantron_data |
=item scantron_upload_scantron_data |
Line 7561 sub scantron_upload_scantron_data {
|
Line 7750 sub scantron_upload_scantron_data {
|
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
function checkUpload(formname) { |
function checkUpload(formname) { |
if (formname.upfile.value == "") { |
if (formname.upfile.value == "") { |
alert("Please use the browse button to select a file from your local directory."); |
alert("'.&mt('Please use the browse button to select a file from your local directory.').'"); |
return false; |
return false; |
} |
} |
formname.submit(); |
formname.submit(); |
Line 7722 sub scantron_download_scantron_data {
|
Line 7911 sub scantron_download_scantron_data {
|
return ''; |
return ''; |
} |
} |
|
|
|
sub checkscantron_results { |
|
my ($r) = @_; |
|
my ($symb)=&get_symb($r); |
|
if (!$symb) {return '';} |
|
my $grading_menu_button=&show_grading_menu_form($symb); |
|
my $cid = $env{'request.course.id'}; |
|
my %lettdig = &letter_to_digits(); |
|
my $numletts = scalar(keys(%lettdig)); |
|
my $cnum = $env{'course.'.$cid.'.num'}; |
|
my $cdom = $env{'course.'.$cid.'.domain'}; |
|
my (undef, undef, $sequence) = &Apache::lonnet::decode_symb($env{'form.selectpage'}); |
|
my %record; |
|
my %scantron_config = |
|
&Apache::grades::get_scantron_config($env{'form.scantron_format'}); |
|
my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile(); |
|
my $classlist=&Apache::loncoursedata::get_classlist(); |
|
my %idmap=&Apache::grades::username_to_idmap($classlist); |
|
my $navmap=Apache::lonnavmaps::navmap->new(); |
|
my $map=$navmap->getResourceByUrl($sequence); |
|
my @resources=$navmap->retrieveResources($map,undef,1,0); |
|
my ($uname,$udom,%partids_by_symb); |
|
foreach my $resource (@resources) { |
|
my $ressymb = $resource->symb(); |
|
my ($analysis,$parts) = |
|
&scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom); |
|
$partids_by_symb{$ressymb} = $parts; |
|
} |
|
my (%scandata,%lastname,%bylast); |
|
$r->print(' |
|
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="checkscantron">'."\n"); |
|
|
|
my @delayqueue; |
|
my %completedstudents; |
|
|
|
my $count=&Apache::grades::get_todo_count($scanlines,$scan_data); |
|
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Scantron/Submissions Comparison Status', |
|
'Progress of Scantron Data/Submission Records Comparison',$count, |
|
'inline',undef,'checkscantron'); |
|
my ($username,$domain,$started); |
|
|
|
&Apache::grades::scantron_get_maxbubble(); # Need the bubble lines array to parse. |
|
|
|
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
|
'Processing first student'); |
|
my $start=&Time::HiRes::time(); |
|
my $i=-1; |
|
|
|
while ($i<$scanlines->{'count'}) { |
|
($username,$domain,$uname)=('','',''); |
|
$i++; |
|
my $line=&Apache::grades::scantron_get_line($scanlines,$scan_data,$i); |
|
if ($line=~/^[\s\cz]*$/) { next; } |
|
if ($started) { |
|
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
|
'last student'); |
|
} |
|
$started=1; |
|
my $scan_record= |
|
&Apache::grades::scantron_parse_scanline($line,$i,\%scantron_config, |
|
$scan_data); |
|
unless ($uname=&Apache::grades::scantron_find_student($scan_record,$scan_data, |
|
\%idmap,$i)) { |
|
&Apache::grades::scantron_add_delay(\@delayqueue,$line, |
|
'Unable to find a student that matches',1); |
|
next; |
|
} |
|
if (exists $completedstudents{$uname}) { |
|
&Apache::grades::scantron_add_delay(\@delayqueue,$line, |
|
'Student '.$uname.' has multiple sheets',2); |
|
next; |
|
} |
|
my $pid = $scan_record->{'scantron.ID'}; |
|
$lastname{$pid} = $scan_record->{'scantron.LastName'}; |
|
push(@{$bylast{$lastname{$pid}}},$pid); |
|
my $lastpos = $env{'form.scantron_maxbubble'}*$scantron_config{'Qlength'}; |
|
$scandata{$pid} = substr($line,$scantron_config{'Qstart'}-1,$lastpos); |
|
chomp($scandata{$pid}); |
|
$scandata{$pid} =~ s/\r$//; |
|
($username,$domain)=split(/:/,$uname); |
|
my $counter = -1; |
|
foreach my $resource (@resources) { |
|
($counter,my $recording) = |
|
&verify_scantron_grading($resource,$domain,$username,$cid,$counter, |
|
$scandata{$pid},\%partids_by_symb, |
|
\%scantron_config,\%lettdig,$numletts); |
|
$record{$pid} .= $recording; |
|
} |
|
} |
|
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
$r->print('<br />'); |
|
my ($okstudents,$badstudents,$numstudents,$passed,$failed); |
|
$passed = 0; |
|
$failed = 0; |
|
$numstudents = 0; |
|
foreach my $last (sort(keys(%bylast))) { |
|
if (ref($bylast{$last}) eq 'ARRAY') { |
|
foreach my $pid (sort(@{$bylast{$last}})) { |
|
my $showscandata = $scandata{$pid}; |
|
my $showrecord = $record{$pid}; |
|
$showscandata =~ s/\s/ /g; |
|
$showrecord =~ s/\s/ /g; |
|
if ($scandata{$pid} eq $record{$pid}) { |
|
my $css_class = ($passed % 2)?'LC_odd_row':'LC_even_row'; |
|
$okstudents .= '<tr class="'.$css_class.'">'. |
|
'<td>'.&mt('Scantron').'</td><td>'.$showscandata.'</td><td rowspan="2">'.$last.'</td><td rowspan="2">'.$pid.'</td>'."\n". |
|
'</tr>'."\n". |
|
'<tr class="'.$css_class.'">'."\n". |
|
'<td>Submissions</td><td>'.$showrecord.'</td></tr>'."\n"; |
|
$passed ++; |
|
} else { |
|
my $css_class = ($failed % 2)?'LC_odd_row':'LC_even_row'; |
|
$badstudents .= '<tr class="'.$css_class.'"><td>'.&mt('Scantron').'</td><td><span class="LC_nobreak">'.$scandata{$pid}.'</span></td><td rowspan="2">'.$last.'</td><td rowspan="2">'.$pid.'</td>'."\n". |
|
'</tr>'."\n". |
|
'<tr class="'.$css_class.'">'."\n". |
|
'<td>Submissions</td><td><span class="LC_nobreak">'.$record{$pid}.'</span></td>'."\n". |
|
'</tr>'."\n"; |
|
$failed ++; |
|
} |
|
$numstudents ++; |
|
} |
|
} |
|
} |
|
$r->print('<p>'.&mt('Comparison of scantron 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('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>'); |
|
if ($passed) { |
|
$r->print(&mt('Students with exact correspondence between scantron data and submissions are as follows:').'<br /><br />'); |
|
$r->print(&Apache::loncommon::start_data_table()."\n". |
|
&Apache::loncommon::start_data_table_header_row()."\n". |
|
'<th>'.&mt('Source').'</th><th>'.&mt('Bubble records').'</th><th>'.&mt('Name').'</th><th>'.&mt('ID').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row()."\n". |
|
$okstudents."\n". |
|
&Apache::loncommon::end_data_table().'<br />'); |
|
} |
|
if ($failed) { |
|
$r->print(&mt('Students with differences between scantron data and submissions are as follows:').'<br /><br />'); |
|
$r->print(&Apache::loncommon::start_data_table()."\n". |
|
&Apache::loncommon::start_data_table_header_row()."\n". |
|
'<th>'.&mt('Source').'</th><th>'.&mt('Bubble records').'</th><th>'.&mt('Name').'</th><th>'.&mt('ID').'</th>'. |
|
&Apache::loncommon::end_data_table_header_row()."\n". |
|
$badstudents."\n". |
|
&Apache::loncommon::end_data_table()).'<br />'. |
|
&mt('Differences can occur if submissions were modified using manual grading after a scantron grading pass.').'<br />'.&mt('If unexpected discrepancies were detected, it is recommended that you inspect the original scantron sheets.'); |
|
} |
|
$r->print('</form><br />'.$grading_menu_button); |
|
return; |
|
} |
|
|
|
sub verify_scantron_grading { |
|
my ($resource,$domain,$username,$cid,$counter,$scandata,$partids_by_symb, |
|
$scantron_config,$lettdig,$numletts) = @_; |
|
my ($record,%expected,%startpos); |
|
return ($counter,$record) if (!ref($resource)); |
|
return ($counter,$record) if (!$resource->is_problem()); |
|
my $symb = $resource->symb(); |
|
return ($counter,$record) if (ref($partids_by_symb) ne 'HASH'); |
|
return ($counter,$record) if (ref($partids_by_symb->{$symb}) ne 'ARRAY'); |
|
foreach my $part_id (@{$partids_by_symb->{$symb}}) { |
|
$counter ++; |
|
$expected{$part_id} = 0; |
|
if ($env{"form.scantron.sub_bubblelines.$counter"}) { |
|
my @sub_lines = split(/,/,$env{"form.scantron.sub_bubblelines.$counter"}); |
|
foreach my $item (@sub_lines) { |
|
$expected{$part_id} += $item; |
|
} |
|
} else { |
|
$expected{$part_id} = $env{"form.scantron.bubblelines.$counter"}; |
|
} |
|
$startpos{$part_id} = $env{"form.scantron.first_bubble_line.$counter"}; |
|
} |
|
if ($symb) { |
|
my %recorded; |
|
my (%returnhash) = &Apache::lonnet::restore($symb,$cid,$domain,$username); |
|
if ($returnhash{'version'}) { |
|
my %lasthash=(); |
|
my $version; |
|
for ($version=1;$version<=$returnhash{'version'};$version++) { |
|
foreach my $key (sort(split(/\:/,$returnhash{$version.':keys'}))) { |
|
$lasthash{$key}=$returnhash{$version.':'.$key}; |
|
} |
|
} |
|
foreach my $key (keys(%lasthash)) { |
|
if ($key =~ /\.scantron$/) { |
|
my $value = &unescape($lasthash{$key}); |
|
my ($part_id) = ($key =~ /^resource\.(.+)\.scantron$/); |
|
if ($value eq '') { |
|
for (my $i=0; $i<$expected{$part_id}; $i++) { |
|
for (my $j=0; $j<$scantron_config->{'length'}; $j++) { |
|
$recorded{$part_id} .= $scantron_config->{'Qoff'}; |
|
} |
|
} |
|
} else { |
|
my @tocheck; |
|
my @items = split(//,$value); |
|
if (($scantron_config->{'Qon'} eq 'letter') || |
|
($scantron_config->{'Qon'} eq 'number')) { |
|
if (@items < $expected{$part_id}) { |
|
my $fragment = substr($scandata,$startpos{$part_id},$expected{$part_id}); |
|
my @singles = split(//,$fragment); |
|
foreach my $pos (@singles) { |
|
if ($pos eq ' ') { |
|
push(@tocheck,$pos); |
|
} else { |
|
my $next = shift(@items); |
|
push(@tocheck,$next); |
|
} |
|
} |
|
} else { |
|
@tocheck = @items; |
|
} |
|
foreach my $letter (@tocheck) { |
|
if ($scantron_config->{'Qon'} eq 'letter') { |
|
if ($letter !~ /^[A-J]$/) { |
|
$letter = $scantron_config->{'Qoff'}; |
|
} |
|
$recorded{$part_id} .= $letter; |
|
} elsif ($scantron_config->{'Qon'} eq 'number') { |
|
my $digit; |
|
if ($letter !~ /^[A-J]$/) { |
|
$digit = $scantron_config->{'Qoff'}; |
|
} else { |
|
$digit = $lettdig->{$letter}; |
|
} |
|
$recorded{$part_id} .= $digit; |
|
} |
|
} |
|
} else { |
|
@tocheck = @items; |
|
for (my $i=0; $i<$expected{$part_id}; $i++) { |
|
my $curr_sub = shift(@tocheck); |
|
my $digit; |
|
if ($curr_sub =~ /^[A-J]$/) { |
|
$digit = $lettdig->{$curr_sub}-1; |
|
} |
|
if ($curr_sub eq 'J') { |
|
$digit += scalar($numletts); |
|
} |
|
for (my $j=0; $j<$scantron_config->{'Qlength'}; $j++) { |
|
if ($j == $digit) { |
|
$recorded{$part_id} .= $scantron_config->{'Qon'}; |
|
} else { |
|
$recorded{$part_id} .= $scantron_config->{'Qoff'}; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
foreach my $part_id (@{$partids_by_symb->{$symb}}) { |
|
if ($recorded{$part_id} eq '') { |
|
for (my $i=0; $i<$expected{$part_id}; $i++) { |
|
for (my $j=0; $j<$scantron_config->{'Qlength'}; $j++) { |
|
$recorded{$part_id} .= $scantron_config->{'Qoff'}; |
|
} |
|
} |
|
} |
|
$record .= $recorded{$part_id}; |
|
} |
|
} |
|
return ($counter,$record); |
|
} |
|
|
|
sub letter_to_digits { |
|
my %lettdig = ( |
|
A => 1, |
|
B => 2, |
|
C => 3, |
|
D => 4, |
|
E => 5, |
|
F => 6, |
|
G => 7, |
|
H => 8, |
|
I => 9, |
|
J => 0, |
|
); |
|
return %lettdig; |
|
} |
|
|
=pod |
=pod |
|
|
=back |
=back |
Line 7781 sub grading_menu {
|
Line 8249 sub grading_menu {
|
}); |
}); |
$fields{'command'} = 'csvform'; |
$fields{'command'} = 'csvform'; |
$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
push (@menu, { url => $url, |
push(@menu, { url => $url, |
name => &mt('Upload Scores'), |
name => &mt('Upload Scores'), |
short_description => |
short_description => |
&mt('Specify a file containing the class scores for current resource.')}); |
&mt('Specify a file containing the class scores for current resource.')}); |
$fields{'command'} = 'processclicker'; |
$fields{'command'} = 'processclicker'; |
$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
push (@menu, { url => $url, |
push(@menu, { url => $url, |
name => &mt('Process Clicker'), |
name => &mt('Process Clicker'), |
short_description => |
short_description => |
&mt('Specify a file containing the clicker information for this resource.')}); |
&mt('Specify a file containing the clicker information for this resource.')}); |
$fields{'command'} = 'scantron_selectphase'; |
$fields{'command'} = 'scantron_selectphase'; |
$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
push (@menu, { url => $url, |
push(@menu, { url => $url, |
name => &mt('Grade/Manage Scantron Forms'), |
name => &mt('Grade/Manage/Review Scantron Forms'), |
short_description => |
short_description => |
&mt('')}); |
&mt('Grade scantron exams, upload/download scantron data files, and review previously graded scantron exams.')}); |
$fields{'command'} = 'verify'; |
$fields{'command'} = 'verify'; |
$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields); |
push (@menu, { url => "", |
push(@menu, { url => "", |
name => &mt('Verify Receipt'), |
name => &mt('Verify Receipt'), |
short_description => |
short_description => |
&mt('')}); |
&mt('')}); |
Line 7835 sub grading_menu {
|
Line 8303 sub grading_menu {
|
"\n"; |
"\n"; |
} |
} |
$Str .="</form>\n"; |
$Str .="</form>\n"; |
|
my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box."); |
$request->print(<<GRADINGMENUJS); |
$request->print(<<GRADINGMENUJS); |
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
function checkChoice(formname,val,cmdx) { |
function checkChoice(formname,val,cmdx) { |
Line 7862 sub grading_menu {
|
Line 8331 sub grading_menu {
|
if (nospace == "OK" && isNaN(receiptNo)) {checkOpt = true;} |
if (nospace == "OK" && isNaN(receiptNo)) {checkOpt = true;} |
if (nospace == "notOK" && (isNaN(receiptNo) || receiptNo == "")) {checkOpt = true;} |
if (nospace == "notOK" && (isNaN(receiptNo) || receiptNo == "")) {checkOpt = true;} |
if (checkOpt) { |
if (checkOpt) { |
alert("Please enter a receipt number given by a student in the receipt box."); |
alert("$receiptalert$receiptalert"); |
formname.receipt.value = ""; |
formname.receipt.value = ""; |
formname.receipt.focus(); |
formname.receipt.focus(); |
return false; |
return false; |
Line 7883 sub submit_options {
|
Line 8352 sub submit_options {
|
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $probTitle = &Apache::lonnet::gettitle($symb); |
my $probTitle = &Apache::lonnet::gettitle($symb); |
|
|
|
my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box."); |
$request->print(<<GRADINGMENUJS); |
$request->print(<<GRADINGMENUJS); |
<script type="text/javascript" language="javascript"> |
<script type="text/javascript" language="javascript"> |
function checkChoice(formname,val,cmdx) { |
function checkChoice(formname,val,cmdx) { |
Line 7910 sub submit_options {
|
Line 8380 sub submit_options {
|
if (nospace == "OK" && isNaN(receiptNo)) {checkOpt = true;} |
if (nospace == "OK" && isNaN(receiptNo)) {checkOpt = true;} |
if (nospace == "notOK" && (isNaN(receiptNo) || receiptNo == "")) {checkOpt = true;} |
if (nospace == "notOK" && (isNaN(receiptNo) || receiptNo == "")) {checkOpt = true;} |
if (checkOpt) { |
if (checkOpt) { |
alert("Please enter a receipt number given by a student in the receipt box."); |
alert("$receiptalert"); |
formname.receipt.value = ""; |
formname.receipt.value = ""; |
formname.receipt.focus(); |
formname.receipt.focus(); |
return false; |
return false; |
Line 7955 GRADINGMENUJS
|
Line 8425 GRADINGMENUJS
|
<div class="LC_grade_select_mode_selector_body"> |
<div class="LC_grade_select_mode_selector_body"> |
<select name="section" multiple="multiple" size="5">'."\n"; |
<select name="section" multiple="multiple" size="5">'."\n"; |
if (ref($sections)) { |
if (ref($sections)) { |
foreach my $section (sort (@$sections)) { |
foreach my $section (sort(@$sections)) { |
$result.='<option value="'.$section.'" '. |
$result.='<option value="'.$section.'" '. |
($saveSec eq $section ? 'selected="selected"':'').'>'.$section.'</option>'."\n"; |
($saveSec eq $section ? 'selected="selected"':'').'>'.$section.'</option>'."\n"; |
} |
} |
Line 8010 GRADINGMENUJS
|
Line 8480 GRADINGMENUJS
|
</label> |
</label> |
</div> |
</div> |
<div class="LC_grade_select_mode_type"> |
<div class="LC_grade_select_mode_type"> |
<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next->').'" /> |
<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' →" /> |
</div> |
</div> |
</div> |
</div> |
</div> |
</div> |
Line 8029 GRADINGMENUJS
|
Line 8499 GRADINGMENUJS
|
</label> |
</label> |
</div> |
</div> |
<div class="LC_grade_select_mode_type"> |
<div class="LC_grade_select_mode_type"> |
<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next->').'" /> |
<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' →" /> |
</div> |
</div> |
</div> |
</div> |
</div> |
</div> |
Line 8133 sub process_clicker {
|
Line 8603 sub process_clicker {
|
$result.=$table; |
$result.=$table; |
$result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; |
$result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; |
$result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; |
$result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; |
$result.=' <b>'.&mt('Specify a file containing the clicker information for this resource'). |
$result.=' <b>'.&mt('Specify a file containing the clicker information for this resource.'). |
'.</b></td></tr>'."\n"; |
'.</b></td></tr>'."\n"; |
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
$result.='<tr bgcolor=#ffffe6><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 |
Line 8146 sub process_clicker {
|
Line 8616 sub process_clicker {
|
if (!$env{'form.upfiletype'}) { $env{'form.upfiletype'}='iclicker'; } |
if (!$env{'form.upfiletype'}) { $env{'form.upfiletype'}='iclicker'; } |
|
|
my %checked; |
my %checked; |
foreach my $gradingmechanism ('attendance','personnel','specific') { |
foreach my $gradingmechanism ('attendance','personnel','specific','given') { |
if ($env{'form.gradingmechanism'} eq $gradingmechanism) { |
if ($env{'form.gradingmechanism'} eq $gradingmechanism) { |
$checked{$gradingmechanism}="checked='checked'"; |
$checked{$gradingmechanism}="checked='checked'"; |
} |
} |
Line 8157 sub process_clicker {
|
Line 8627 sub process_clicker {
|
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"); |
my $specific=&mt("Correctness determined from response with clicker ID(s)"); |
my $specific=&mt("Correctness determined from response with clicker ID(s)"); |
|
my $given=&mt("Correctness determined from given list of answers").' '. |
|
'<font size="-2"><tt>('.&mt("Provide comma-separated list. Use '*' for any answer correct, '-' for skip").')</tt></font>'; |
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', |
Line 8214 function sanitycheck() {
|
Line 8686 function sanitycheck() {
|
<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" /> |
|
<br /><label><input type="radio" name="gradingmechanism" value="given" $checked{'given'} onClick="sanitycheck()" />$given </label> |
|
<br /> |
|
<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> |
<br /><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> |
Line 8240 sub process_clicker_file {
|
Line 8715 sub process_clicker_file {
|
$result.='<span class="LC_error">'.&mt('You need to specify a clicker ID for the correct answer').'</span>'; |
$result.='<span class="LC_error">'.&mt('You need to specify a clicker ID for the correct answer').'</span>'; |
return $result.&show_grading_menu_form($symb); |
return $result.&show_grading_menu_form($symb); |
} |
} |
|
if (($env{'form.gradingmechanism'} eq 'given') && ($env{'form.givenanswer'}!~/\S/)) { |
|
$result.='<span class="LC_error">'.&mt('You need to specify the correct answer').'</span>'; |
|
return $result.&show_grading_menu_form($symb); |
|
} |
|
my $foundgiven=0; |
|
if ($env{'form.gradingmechanism'} eq 'given') { |
|
$env{'form.givenanswer'}=~s/^\s*//gs; |
|
$env{'form.givenanswer'}=~s/\s*$//gs; |
|
$env{'form.givenanswer'}=~s/[^a-zA-Z0-9\.\*\-]+/\,/g; |
|
$env{'form.givenanswer'}=uc($env{'form.givenanswer'}); |
|
my @answers=split(/\,/,$env{'form.givenanswer'}); |
|
$foundgiven=$#answers+1; |
|
} |
my %clicker_ids=&gather_clicker_ids(); |
my %clicker_ids=&gather_clicker_ids(); |
my %correct_ids; |
my %correct_ids; |
if ($env{'form.gradingmechanism'} eq 'personnel') { |
if ($env{'form.gradingmechanism'} eq 'personnel') { |
Line 8258 sub process_clicker_file {
|
Line 8746 sub process_clicker_file {
|
} |
} |
if ($env{'form.gradingmechanism'} eq 'attendance') { |
if ($env{'form.gradingmechanism'} eq 'attendance') { |
$result.=&mt('Score based on attendance only'); |
$result.=&mt('Score based on attendance only'); |
|
} elsif ($env{'form.gradingmechanism'} eq 'given') { |
|
$result.=&mt('Score based on [_1] ([_2] answers)','<tt>'.$env{'form.givenanswer'}.'</tt>',$foundgiven); |
} else { |
} else { |
my $number=0; |
my $number=0; |
$result.='<p><b>'.&mt('Correctness determined by the following IDs').'</b>'; |
$result.='<p><b>'.&mt('Correctness determined by the following IDs').'</b>'; |
Line 8303 sub process_clicker_file {
|
Line 8793 sub process_clicker_file {
|
<input type="hidden" name="pcorrect" value="$env{'form.pcorrect'}" /> |
<input type="hidden" name="pcorrect" value="$env{'form.pcorrect'}" /> |
<input type="hidden" name="pincorrect" value="$env{'form.pincorrect'}" /> |
<input type="hidden" name="pincorrect" value="$env{'form.pincorrect'}" /> |
ENDHEADER |
ENDHEADER |
|
if ($env{'form.gradingmechanism'} eq 'given') { |
|
$result.='<input type="hidden" name="correct:given" value="'.$env{'form.givenanswer'}.'" />'; |
|
} |
my %responses; |
my %responses; |
my @questiontitles; |
my @questiontitles; |
my $errormsg=''; |
my $errormsg=''; |
Line 8318 ENDHEADER
|
Line 8811 ENDHEADER
|
&mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses', |
&mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses', |
$env{'form.pcorrect'},$env{'form.pincorrect'}). |
$env{'form.pcorrect'},$env{'form.pincorrect'}). |
'<br />'; |
'<br />'; |
|
if (($env{'form.gradingmechanism'} eq 'given') && ($number!=$foundgiven)) { |
|
$result.='<span class="LC_error">'.&mt('Number of given answers does not agree with number of questions in file.').'</span>'; |
|
return $result.&show_grading_menu_form($symb); |
|
} |
# Remember Question Titles |
# Remember Question Titles |
# FIXME: Possibly need delimiter other than ":" |
# FIXME: Possibly need delimiter other than ":" |
for (my $i=0;$i<$number;$i++) { |
for (my $i=0;$i<$number;$i++) { |
Line 8361 ENDHEADER
|
Line 8858 ENDHEADER
|
} |
} |
$result.='<hr />'. |
$result.='<hr />'. |
&mt('Found [_1] registered and [_2] unregistered clickers.',$student_count,$unknown_count); |
&mt('Found [_1] registered and [_2] unregistered clickers.',$student_count,$unknown_count); |
if ($env{'form.gradingmechanism'} ne 'attendance') { |
if (($env{'form.gradingmechanism'} ne 'attendance') && ($env{'form.gradingmechanism'} ne 'given')) { |
if ($correct_count==0) { |
if ($correct_count==0) { |
$errormsg.="Found no correct answers answers for grading!"; |
$errormsg.="Found no correct answers answers for grading!"; |
} elsif ($correct_count>1) { |
} elsif ($correct_count>1) { |
Line 8432 sub interwrite_eval {
|
Line 8929 sub interwrite_eval {
|
$id=~s/[\-\:]//g; |
$id=~s/[\-\:]//g; |
$idresponses{$id}[$number]=$entries[6]; |
$idresponses{$id}[$number]=$entries[6]; |
} |
} |
foreach my $id (keys %idresponses) { |
foreach my $id (keys(%idresponses)) { |
$$responses{$id}=join(',',@{$idresponses{$id}}); |
$$responses{$id}=join(',',@{$idresponses{$id}}); |
$$responses{$id}=~s/^\s*\,//; |
$$responses{$id}=~s/^\s*\,//; |
} |
} |
Line 8506 ENDHEADER
|
Line 9003 ENDHEADER
|
if ($user) { |
if ($user) { |
my @answer=split(/\,/,$env{$key}); |
my @answer=split(/\,/,$env{$key}); |
my $sum=0; |
my $sum=0; |
|
my $realnumber=$number; |
for (my $i=0;$i<$number;$i++) { |
for (my $i=0;$i<$number;$i++) { |
if ($answer[$i]) { |
if ($answer[$i]) { |
if ($gradingmechanism eq 'attendance') { |
if ($gradingmechanism eq 'attendance') { |
$sum+=$pcorrect; |
$sum+=$pcorrect; |
|
} elsif ($answer[$i] eq '*') { |
|
$sum+=$pcorrect; |
|
} elsif ($answer[$i] eq '-') { |
|
$realnumber--; |
} else { |
} else { |
if ($answer[$i] eq $correct[$i]) { |
if ($answer[$i] eq $correct[$i]) { |
$sum+=$pcorrect; |
$sum+=$pcorrect; |
Line 8519 ENDHEADER
|
Line 9021 ENDHEADER
|
} |
} |
} |
} |
} |
} |
my $ave=$sum/(100*$number); |
my $ave=$sum/(100*$realnumber); |
# Store |
# Store |
my ($username,$domain)=split(/\:/,$user); |
my ($username,$domain)=split(/\:/,$user); |
my %grades=(); |
my %grades=(); |
Line 8537 ENDHEADER
|
Line 9039 ENDHEADER
|
} |
} |
} |
} |
# We are done |
# We are done |
$result.='<br />'.&mt('Successfully stored grades for [_1] student(s).',$storecount). |
$result.='<br />'.&mt('Successfully stored grades for [quant,_1,student].',$storecount). |
'</td></tr></table>'."\n". |
'</td></tr></table>'."\n". |
'</td></tr></table><br /><br />'."\n"; |
'</td></tr></table><br /><br />'."\n"; |
return $result.&show_grading_menu_form($symb); |
return $result.&show_grading_menu_form($symb); |
Line 8658 sub handler {
|
Line 9160 sub handler {
|
} elsif ($command eq 'scantron_download' && |
} elsif ($command eq 'scantron_download' && |
&Apache::lonnet::allowed('usc',$env{'request.course.id'})) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'})) { |
$request->print(&scantron_download_scantron_data($request)); |
$request->print(&scantron_download_scantron_data($request)); |
|
} elsif ($command eq 'checksubmissions' && $perm{'vgr'}) { |
|
$request->print(&checkscantron_results($request)); |
} elsif ($command) { |
} elsif ($command) { |
$request->print("Access Denied ($command)"); |
$request->print("Access Denied ($command)"); |
} |
} |