version 1.269, 2005/06/03 18:23:19
|
version 1.274, 2005/06/05 06:12:16
|
Line 1352 sub gradeBox {
|
Line 1352 sub gradeBox {
|
my $result='<input type="hidden" name="WGT'.$counter.'_'.$partid.'" value="'.$wgt.'" />'."\n"; |
my $result='<input type="hidden" name="WGT'.$counter.'_'.$partid.'" value="'.$wgt.'" />'."\n"; |
|
|
my $display_part=&get_display_part($partid,undef,$symb); |
my $display_part=&get_display_part($partid,undef,$symb); |
my @partids = ("$partid"); |
|
my %last_resets = (); |
my %last_resets = &get_last_resets($symb,$env{'request.course.id'}, |
&get_last_resets($symb,$env{'request.course.id'},\%last_resets,\@partids); |
[$partid]); |
my $aggtries; |
my $aggtries = $$record{'resource.'.$partid.'.tries'}; |
if ($last_resets{$partid}) { |
if ($last_resets{$partid}) { |
$aggtries = &get_num_tries($record,$last_resets{$partid},$partid); |
$aggtries = &get_num_tries($record,$last_resets{$partid},$partid); |
} else { |
|
$aggtries = $$record{'resource.'.$partid.'.tries'}; |
|
} |
} |
|
|
$result.='<table border="0"><tr><td>'. |
$result.='<table border="0"><tr><td>'. |
'<b>Part: </b>'.$display_part.' <b>Points: </b></td><td>'."\n"; |
'<b>Part: </b>'.$display_part.' <b>Points: </b></td><td>'."\n"; |
|
|
Line 2156 sub saveHandGrade {
|
Line 2155 sub saveHandGrade {
|
} |
} |
$newrecord{'resource.'.$new_part.'.regrader'}= |
$newrecord{'resource.'.$new_part.'.regrader'}= |
"$env{'user.name'}:$env{'user.domain'}"; |
"$env{'user.name'}:$env{'user.domain'}"; |
my @partids = ("$new_part"); |
my $totaltries = $record{'resource.'.$part.'.tries'}; |
my %last_resets = (); |
|
&get_last_resets($symb,$env{'request.course.id'},\%last_resets,\@partids); |
my %last_resets = &get_last_resets($symb,$env{'request.course.id'}, |
my ($totaltries,$aggtries,$solvedstatus); |
[$new_part]); |
$totaltries = $record{'resource.'.$part.'.tries'}; |
my $aggtries =$totaltries; |
if ($last_resets{$new_part}) { |
if ($last_resets{$new_part}) { |
$aggtries = &get_num_tries(\%record,$last_resets{$new_part},$new_part); |
$aggtries = &get_num_tries(\%record,$last_resets{$new_part}, |
} else { |
$new_part); |
$aggtries = $totaltries; |
|
} |
} |
$solvedstatus = $record{'resource.'.$new_part.'.solved'}; |
|
|
my $solvedstatus = $record{'resource.'.$new_part.'.solved'}; |
if ($aggtries > 0) { |
if ($aggtries > 0) { |
&decrement($symb,$new_part,\%aggregate,$aggtries,$totaltries,$solvedstatus); |
&decrement($symb,$new_part,\%aggregate,$aggtries,$totaltries,$solvedstatus); |
$aggregateflag = 1; |
$aggregateflag = 1; |
Line 2270 sub decrement_aggs {
|
Line 2269 sub decrement_aggs {
|
|
|
# ----------- Determine timestamps for last reset of aggregate totals for parts |
# ----------- Determine timestamps for last reset of aggregate totals for parts |
sub get_last_resets { |
sub get_last_resets { |
my ($symb,$courseid,$last_resets,$partids) =@_; |
my ($symb,$courseid,$partids) =@_; |
|
my %last_resets; |
my $cdom = $env{'course.'.$courseid.'.domain'}; |
my $cdom = $env{'course.'.$courseid.'.domain'}; |
my $cname = $env{'course.'.$courseid.'.num'}; |
my $cname = $env{'course.'.$courseid.'.num'}; |
my %resethash = &Apache::lonnet::restore($symb,'nohist_resourcetracker',$cdom,$cname); |
my @keys; |
if ($resethash{'version'}) { |
foreach my $part (@{$partids}) { |
foreach my $part (@{$partids}) { |
push(@keys,"$symb\0$part\0resettime"); |
$$last_resets{$part} = ''; |
} |
for (my $version=$resethash{'version'};$version>=1;$version--) { |
my %results=&Apache::lonnet::get('nohist_resourcetracker',\@keys, |
if (exists($resethash{$version.':'.$part."\0".'prev_attempts'})) { |
$cdom,$cname); |
$$last_resets{$part} = $resethash{$version.':timestamp'}; |
foreach my $part (@{$partids}) { |
last; |
$last_resets{$part}=$results{"$symb\0$part\0resettime"}; |
} |
|
} |
|
} |
|
} |
} |
return; |
return %last_resets; |
} |
} |
|
|
# ----------- Handles creating versions for portfolio files as answers |
# ----------- Handles creating versions for portfolio files as answers |
Line 2630 sub viewgrades {
|
Line 2627 sub viewgrades {
|
} |
} |
$result.='</tr>'; |
$result.='</tr>'; |
|
|
# retrieve last reset information |
my %last_resets = |
my %last_resets = (); |
&get_last_resets($symb,$env{'request.course.id'},\@partids); |
&get_last_resets($symb,$env{'request.course.id'},\%last_resets,\@partids); |
|
|
|
#get info for each student |
#get info for each student |
#list all the students - with points and grade status |
#list all the students - with points and grade status |
Line 2675 sub viewstudentgrade {
|
Line 2671 sub viewstudentgrade {
|
$result.='<td align="middle">'; |
$result.='<td align="middle">'; |
my ($aggtries,$totaltries); |
my ($aggtries,$totaltries); |
unless (exists($aggregates{$part})) { |
unless (exists($aggregates{$part})) { |
$totaltries = $record{'resource.'.$part.'.tries'}; |
$totaltries = $record{'resource.'.$part.'.tries'}; |
|
|
|
$aggtries = $totaltries; |
if ($$last_resets{$part}) { |
if ($$last_resets{$part}) { |
$aggtries = &get_num_tries(\%record,$$last_resets{$part},$part); |
$aggtries = &get_num_tries(\%record,$$last_resets{$part}, |
} else { |
$part); |
$aggtries = $totaltries; |
} |
} |
|
$result.='<input type="hidden" name="'. |
$result.='<input type="hidden" name="'. |
'GD_'.$student.'_'.$part.'_aggtries" value="'.$aggtries.'" />'."\n"; |
'GD_'.$student.'_'.$part.'_aggtries" value="'.$aggtries.'" />'."\n"; |
$result.='<input type="hidden" name="'. |
$result.='<input type="hidden" name="'. |
Line 3876 sub scantron_CODElist {
|
Line 3873 sub scantron_CODElist {
|
|
|
sub scantron_CODEunique { |
sub scantron_CODEunique { |
my $result='<nobr> |
my $result='<nobr> |
<input type="radio" name="scantron_CODEunique" |
<label><input type="radio" name="scantron_CODEunique" |
value="Yes" checked="on" /> Yes |
value="Yes" checked="on" /> Yes </label> |
</nobr> |
</nobr> |
<nobr> |
<nobr> |
<input type="radio" name="scantron_CODEunique" |
<label><input type="radio" name="scantron_CODEunique" |
value="No" /> No |
value="No" /> No </label> |
</nobr>'; |
</nobr>'; |
return $result; |
return $result; |
} |
} |
Line 3931 sub scantron_selectphase {
|
Line 3928 sub scantron_selectphase {
|
<tr bgcolor="#ffffe6"> |
<tr bgcolor="#ffffe6"> |
<td> Options: </td> |
<td> Options: </td> |
<td> |
<td> |
<input type="checkbox" name="scantron_options_redo" value="redo_skipped"/> Do only previously skipped records <br /> |
<label><input type="checkbox" name="scantron_options_redo" value="redo_skipped"/> Do only previously skipped records</label> <br /> |
<input type="checkbox" name="scantron_options_ignore" value="ignore_corrections"/> Remove all exisiting corrections |
<label><input type="checkbox" name="scantron_options_ignore" value="ignore_corrections"/> Remove all exisiting corrections</label> |
</td> |
</td> |
</tr> |
</tr> |
<tr bgcolor="#ffffe6"> |
<tr bgcolor="#ffffe6"> |
Line 4111 sub scantron_fixup_scanline {
|
Line 4108 sub scantron_fixup_scanline {
|
&scan_data($scan_data, |
&scan_data($scan_data, |
"$whichline.no_bubble.".$args->{'question'},'1'); |
"$whichline.no_bubble.".$args->{'question'},'1'); |
} else { |
} else { |
substr($answer,$args->{'response'},1)=$on; |
if ($on eq 'letter') { |
|
my @alphabet=('A'..'Z'); |
|
$answer=$alphabet[$args->{'response'}]; |
|
} elsif ($on eq 'number') { |
|
$answer=$args->{'response'}+1; |
|
} else { |
|
substr($answer,$args->{'response'},1)=$on; |
|
} |
&scan_data($scan_data, |
&scan_data($scan_data, |
"$whichline.no_bubble.".$args->{'question'},undef,'1'); |
"$whichline.no_bubble.".$args->{'question'},undef,'1'); |
} |
} |
Line 4172 sub scantron_parse_scanline {
|
Line 4176 sub scantron_parse_scanline {
|
substr($questions,0,$$scantron_config{'Qlength'})=''; |
substr($questions,0,$$scantron_config{'Qlength'})=''; |
if (length($currentquest) < $$scantron_config{'Qlength'}) { next; } |
if (length($currentquest) < $$scantron_config{'Qlength'}) { next; } |
if ($$scantron_config{'Qon'} eq 'letter') { |
if ($$scantron_config{'Qon'} eq 'letter') { |
if (!$currentquest || $currentquest eq $$scantron_config{'Qoff'} || |
if ($currentquest eq '?') { |
$currentquest !~ /^[A-Z]$/) { |
push(@{$record{'scantron.doubleerror'}},$questnum); |
|
$record{"scantron.$questnum.answer"}=''; |
|
} elsif (!$currentquest |
|
|| $currentquest eq $$scantron_config{'Qoff'} |
|
|| $currentquest !~ /^[A-Z]$/) { |
$record{"scantron.$questnum.answer"}=''; |
$record{"scantron.$questnum.answer"}=''; |
if (!&scan_data($scan_data,"$whichline.no_bubble.$questnum")) { |
if (!&scan_data($scan_data,"$whichline.no_bubble.$questnum")) { |
push(@{$record{"scantron.missingerror"}},$questnum); |
push(@{$record{"scantron.missingerror"}},$questnum); |
Line 4182 sub scantron_parse_scanline {
|
Line 4190 sub scantron_parse_scanline {
|
$record{"scantron.$questnum.answer"}=$currentquest; |
$record{"scantron.$questnum.answer"}=$currentquest; |
} |
} |
} elsif ($$scantron_config{'Qon'} eq 'number') { |
} elsif ($$scantron_config{'Qon'} eq 'number') { |
if (!$currentquest || $currentquest eq $$scantron_config{'Qoff'} || |
if ($currentquest eq '?') { |
$currentquest !~ /^\d$/) { |
push(@{$record{'scantron.doubleerror'}},$questnum); |
|
$record{"scantron.$questnum.answer"}=''; |
|
} elsif (!$currentquest |
|
|| $currentquest eq $$scantron_config{'Qoff'} |
|
|| $currentquest !~ /^\d$/) { |
$record{"scantron.$questnum.answer"}=''; |
$record{"scantron.$questnum.answer"}=''; |
if (!&scan_data($scan_data,"$whichline.no_bubble.$questnum")) { |
if (!&scan_data($scan_data,"$whichline.no_bubble.$questnum")) { |
push(@{$record{"scantron.missingerror"}},$questnum); |
push(@{$record{"scantron.missingerror"}},$questnum); |
Line 4738 sub scantron_get_correction {
|
Line 4750 sub scantron_get_correction {
|
$r->print("<p>How should I handle this? <br /> \n"); |
$r->print("<p>How should I handle this? <br /> \n"); |
$r->print("\n<br /> "); |
$r->print("\n<br /> "); |
my $i=0; |
my $i=0; |
if ($error eq 'incorrectCODE') { |
if ($error eq 'incorrectCODE' |
|
&& $$scan_record{'scantron.CODE'}=~/\S/ ) { |
my ($max,$closest)=&scantron_get_closely_matching_CODEs($arg,$$scan_record{'scantron.CODE'}); |
my ($max,$closest)=&scantron_get_closely_matching_CODEs($arg,$$scan_record{'scantron.CODE'}); |
foreach my $testcode (@{$closest}) { |
foreach my $testcode (@{$closest}) { |
my $checked=''; |
my $checked=''; |
if (!$i) { $checked=' checked="on" '; } |
if (!$i) { $checked=' checked="on" '; } |
$r->print("<input type='radio' name='scantron_CODE_resolution' value='use_closest_$i' $checked /> Use the similar CODE <b><tt>".$testcode."</tt></b> instead.<input type='hidden' name='scantron_CODE_closest_$i' value='$testcode' />"); |
$r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_closest_$i' $checked /> Use the similar CODE <b><tt>".$testcode."</tt></b> instead.</label><input type='hidden' name='scantron_CODE_closest_$i' value='$testcode' />"); |
$r->print("\n<br />"); |
$r->print("\n<br />"); |
$i++; |
$i++; |
} |
} |
} |
} |
my $checked; if (!$i) { $checked=' checked="on" '; } |
if ($$scan_record{'scantron.CODE'}=~/\S/ ) { |
$r->print("<input type='radio' name='scantron_CODE_resolution' value='use_unfound' $checked /> Use the CODE <b><tt>".$$scan_record{'scantron.CODE'}."</tt></b> that is was on the paper, ignoring the error."); |
my $checked; if (!$i) { $checked=' checked="on" '; } |
$r->print("\n<br />"); |
$r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_unfound' $checked /> Use the CODE <b><tt>".$$scan_record{'scantron.CODE'}."</tt></b> that is was on the paper, ignoring the error.</label>"); |
|
$r->print("\n<br />"); |
|
} |
|
|
$r->print(<<ENDSCRIPT); |
$r->print(<<ENDSCRIPT); |
<script type="text/javascript"> |
<script type="text/javascript"> |
Line 4769 ENDSCRIPT
|
Line 4784 ENDSCRIPT
|
"&scantron_CODElist=".&Apache::lonnet::escape($env{'form.scantron_CODElist'}). |
"&scantron_CODElist=".&Apache::lonnet::escape($env{'form.scantron_CODElist'}). |
"&curCODE=".&Apache::lonnet::escape($$scan_record{'scantron.CODE'}). |
"&curCODE=".&Apache::lonnet::escape($$scan_record{'scantron.CODE'}). |
"&scantron_selectfile=".&Apache::lonnet::escape($env{'form.scantron_selectfile'}); |
"&scantron_selectfile=".&Apache::lonnet::escape($env{'form.scantron_selectfile'}); |
$r->print("<input type='radio' name='scantron_CODE_resolution' value='use_found' /> <a target='_blank' href='$href'>Select</a> a CODE from the list of all CODEs and use it. Selected CODE is <input readonly='true' type='text' size='8' name='scantron_CODE_selectedvalue' onfocus=\"javascript:change_radio('use_found')\" onchange=\"javascript:change_radio('use_found')\" />"); |
$r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_found' /> <a target='_blank' href='$href'>Select</a> a CODE from the list of all CODEs and use it.</label> Selected CODE is <input readonly='true' 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("<input type='radio' name='scantron_CODE_resolution' value='use_typed' /> Use <input type='text' size='8' name='scantron_CODE_newvalue' onfocus=\"javascript:change_radio('use_typed')\" onkeypress=\"javascript:change_radio('use_typed')\" /> as the CODE."); |
$r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_typed' /> Use </label><input type='text' size='8' name='scantron_CODE_newvalue' onfocus=\"javascript:change_radio('use_typed')\" onkeypress=\"javascript:change_radio('use_typed')\" /> as the CODE."); |
$r->print("\n<br /><br />"); |
$r->print("\n<br /><br />"); |
} elsif ($error eq 'doublebubble') { |
} elsif ($error eq 'doublebubble') { |
$r->print("<p>There have been multiple bubbles scanned for a some question(s)</p>\n"); |
$r->print("<p>There have been multiple bubbles scanned for a some question(s)</p>\n"); |
Line 4804 ENDSCRIPT
|
Line 4819 ENDSCRIPT
|
sub scantron_bubble_selector { |
sub scantron_bubble_selector { |
my ($r,$scan_config,$quest,@selected)=@_; |
my ($r,$scan_config,$quest,@selected)=@_; |
my $max=$$scan_config{'Qlength'}; |
my $max=$$scan_config{'Qlength'}; |
|
|
|
my $scmode=$$scan_config{'Qon'}; |
|
if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; } |
|
|
my @alphabet=('A'..'Z'); |
my @alphabet=('A'..'Z'); |
$r->print("<table border='1'><tr><td rowspan='2'>$quest</td>"); |
$r->print("<table border='1'><tr><td rowspan='2'>$quest</td>"); |
for (my $i=0;$i<$max+1;$i++) { |
for (my $i=0;$i<$max+1;$i++) { |
$r->print('<td align="center">'); |
$r->print("\n".'<td align="center">'); |
if ($selected[0] eq $alphabet[$i]) { $r->print('X'); shift(@selected) } |
if ($selected[0] eq $alphabet[$i]) { $r->print('X'); shift(@selected) } |
else { $r->print(' '); } |
else { $r->print(' '); } |
$r->print('</td>'); |
$r->print('</td>'); |
} |
} |
$r->print('<td></td></tr><tr>'); |
$r->print('</tr><tr>'); |
for (my $i=0;$i<$max;$i++) { |
for (my $i=0;$i<$max;$i++) { |
$r->print('<td><input type="radio" name="scantron_correct_Q_'.$quest. |
$r->print("\n". |
'" value="'.$i.'" />'.$alphabet[$i]."</td>"); |
'<td><label><input type="radio" name="scantron_correct_Q_'. |
|
$quest.'" value="'.$i.'" />'.$alphabet[$i]."</label></td>"); |
} |
} |
$r->print('<td><input type="radio" name="scantron_correct_Q_'.$quest. |
$r->print('<td><label><input type="radio" name="scantron_correct_Q_'. |
'" value="none" /> No bubble </td>'); |
$quest.'" value="none" /> No bubble </label></td>'); |
$r->print('</tr></table>'); |
$r->print('</tr></table>'); |
} |
} |
|
|