version 1.451, 2007/10/09 23:42:49
|
version 1.464, 2007/10/25 20:05:52
|
Line 35 use Apache::loncommon;
|
Line 35 use Apache::loncommon;
|
use Apache::lonhtmlcommon; |
use Apache::lonhtmlcommon; |
use Apache::lonnavmaps; |
use Apache::lonnavmaps; |
use Apache::lonhomework; |
use Apache::lonhomework; |
|
use Apache::lonpickcode; |
use Apache::loncoursedata; |
use Apache::loncoursedata; |
use Apache::lonmsg(); |
use Apache::lonmsg(); |
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common); |
Line 56 my %first_bubble_line = (); # First bubb
|
Line 57 my %first_bubble_line = (); # First bubb
|
|
|
|
|
sub save_bubble_lines { |
sub save_bubble_lines { |
&Apache::lonnet::logthis("Saving bubble_lines..."); |
|
foreach my $line (keys(%bubble_lines_per_response)) { |
foreach my $line (keys(%bubble_lines_per_response)) { |
&Apache::lonnet::logthis("Saving form.scantron.bubblelines.$line value: $bubble_lines_per_response{$line}"); |
|
$env{"form.scantron.bubblelines.$line"} = $bubble_lines_per_response{$line}; |
$env{"form.scantron.bubblelines.$line"} = $bubble_lines_per_response{$line}; |
$env{"form.scantron.first_bubble_line.$line"} = |
$env{"form.scantron.first_bubble_line.$line"} = |
$first_bubble_line{$line}; |
$first_bubble_line{$line}; |
Line 71 sub restore_bubble_lines {
|
Line 70 sub restore_bubble_lines {
|
%bubble_lines_per_response = (); |
%bubble_lines_per_response = (); |
while ($env{"form.scantron.bubblelines.$line"}) { |
while ($env{"form.scantron.bubblelines.$line"}) { |
my $value = $env{"form.scantron.bubblelines.$line"}; |
my $value = $env{"form.scantron.bubblelines.$line"}; |
&Apache::lonnet::logthis("Restoring form.scantron.bubblelines.$line value: $value"); |
|
$bubble_lines_per_response{$line} = $value; |
$bubble_lines_per_response{$line} = $value; |
$first_bubble_line{$line} = |
$first_bubble_line{$line} = |
$env{"form.scantron.first_bubble_line.$line"}; |
$env{"form.scantron.first_bubble_line.$line"}; |
Line 86 sub restore_bubble_lines {
|
Line 84 sub restore_bubble_lines {
|
sub get_response_bubbles { |
sub get_response_bubbles { |
my ($parsed_line, $response) = @_; |
my ($parsed_line, $response) = @_; |
|
|
my $bubble_line = $first_bubble_line{$response}; |
|
my $bubble_lines= $bubble_lines_per_response{$response}; |
my $bubble_line = $first_bubble_line{$response-1} +1; |
|
my $bubble_lines= $bubble_lines_per_response{$response-1}; |
|
|
my $selected = ""; |
my $selected = ""; |
|
|
for (my $bline = 0; $bline < $bubble_lines; $bline++) { |
for (my $bline = 0; $bline < $bubble_lines; $bline++) { |
$selected .= $$parsed_line{"scantron.$bubble_line.answer"}; |
$selected .= $$parsed_line{"scantron.$bubble_line.answer"}.":"; |
$bubble_line++; |
$bubble_line++; |
} |
} |
return $selected; |
return $selected; |
Line 526 sub getclasslist {
|
Line 526 sub getclasslist {
|
} |
} |
} |
} |
# filter students according to groups selected |
# filter students according to groups selected |
|
my @stu_groups = split(/,/,$group); |
if (@getgroup) { |
if (@getgroup) { |
my $exclude = 1; |
my $exclude = 1; |
foreach my $grp(@getgroup) { |
foreach my $grp (@getgroup) { |
if ($group eq $grp) { |
foreach my $stu_group (@stu_groups) { |
$exclude = 0; |
if ($stu_group eq $grp) { |
|
$exclude = 0; |
|
} |
} |
} |
|
if (($grp eq 'none') && !$group) { |
|
$exclude = 0; |
|
} |
} |
} |
if ($exclude) { |
if ($exclude) { |
delete($classlist->{$student}); |
delete($classlist->{$student}); |
Line 970 LISTJAVASCRIPT
|
Line 976 LISTJAVASCRIPT
|
|
|
$ctr++; |
$ctr++; |
my $section = $classlist->{$student}->[&Apache::loncoursedata::CL_SECTION()]; |
my $section = $classlist->{$student}->[&Apache::loncoursedata::CL_SECTION()]; |
|
my $group = $classlist->{$student}->[&Apache::loncoursedata::CL_GROUP()]; |
if ( $perm{'vgr'} eq 'F' ) { |
if ( $perm{'vgr'} eq 'F' ) { |
$gradeTable.='<tr bgcolor="#ffffe6">' if ($ctr%2 ==1); |
$gradeTable.='<tr bgcolor="#ffffe6">' if ($ctr%2 ==1); |
$gradeTable.='<td align="right">'.$ctr.' </td>'. |
$gradeTable.='<td align="right">'.$ctr.' </td>'. |
Line 978 LISTJAVASCRIPT
|
Line 984 LISTJAVASCRIPT
|
$student.':'.$$fullname{$student}.':::SECTION'.$section. |
$student.':'.$$fullname{$student}.':::SECTION'.$section. |
') " /> </label></td>'."\n".'<td>'. |
') " /> </label></td>'."\n".'<td>'. |
&nameUserString(undef,$$fullname{$student},$uname,$udom). |
&nameUserString(undef,$$fullname{$student},$uname,$udom). |
' '.$section.'</td>'."\n"; |
' '.$section.'/'.$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)) { |
Line 1954 KEYWORDS
|
Line 1960 KEYWORDS
|
|
|
# This is where output for one specific student would start |
# This is where output for one specific student would start |
my $bgcolor='#DDEEDD'; |
my $bgcolor='#DDEEDD'; |
if (int($counter/2) eq $counter) { $bgcolor='#DDDDEE'; } |
if ($counter%2) { $bgcolor='#DDDDEE'; } |
$request->print("\n\n". |
$request->print("\n\n". |
'<p><table border="2"><tr><th bgcolor="'.$bgcolor.'">'.$env{'form.fullname'}.'</th></tr><tr><td bgcolor="'.$bgcolor.'">'); |
'<p><table border="2"><tr><th bgcolor="'.$bgcolor.'">'.$env{'form.fullname'}.'</th></tr><tr><td bgcolor="'.$bgcolor.'">'); |
|
|
Line 1984 KEYWORDS
|
Line 1990 KEYWORDS
|
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
|
|
# If any part of the problem is an essay-response (handgraded), then check for collaborators |
# If any part of the problem is an essay-response (handgraded), then check for collaborators |
my @col_fullnames; |
my $fullname; |
my ($classlist,$fullname); |
my $col_fullnames = []; |
if ($env{'form.handgrade'} eq 'yes') { |
if ($env{'form.handgrade'} eq 'yes') { |
($classlist,undef,$fullname) = &getclasslist('all','0'); |
(my $sub_result,$fullname,$col_fullnames)= |
for (keys (%$handgrade)) { |
&check_collaborators($symb,$uname,$udom,\%record,$handgrade, |
my $ncol = &Apache::lonnet::EXT('resource.'.$_. |
$counter); |
'.maxcollaborators', |
$result.=$sub_result; |
$symb,$udom,$uname); |
|
next if ($ncol <= 0); |
|
s/\_/\./g; |
|
next if ($record{'resource.'.$_.'.collaborators'} eq ''); |
|
my @goodcollaborators = (); |
|
my @badcollaborators = (); |
|
foreach (split(/,?\s+/,$record{'resource.'.$_.'.collaborators'})) { |
|
$_ =~ s/[\$\^\(\)]//g; |
|
next if ($_ eq ''); |
|
my ($co_name,$co_dom) = split /\@|:/,$_; |
|
$co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i); |
|
next if ($co_name eq $uname && $co_dom eq $udom); |
|
# Doing this grep allows 'fuzzy' specification |
|
my @Matches = grep /^$co_name:$co_dom$/i,keys %$classlist; |
|
if (! scalar(@Matches)) { |
|
push @badcollaborators,$_; |
|
} else { |
|
push @goodcollaborators, @Matches; |
|
} |
|
} |
|
if (scalar(@goodcollaborators) != 0) { |
|
$result.='<b>Collaborators: </b>'; |
|
foreach (@goodcollaborators) { |
|
my ($lastname,$givenn) = split(/,/,$$fullname{$_}); |
|
push @col_fullnames, $givenn.' '.$lastname; |
|
$result.=$$fullname{$_}.' '; |
|
} |
|
$result.='<br />'."\n"; |
|
my ($part)=split(/\./,$_); |
|
$result.='<input type="hidden" name="collaborator'.$counter. |
|
'" value="'.$part.':'.(join ':',@goodcollaborators).'" />'. |
|
"\n"; |
|
} |
|
if (scalar(@badcollaborators) > 0) { |
|
$result.='<table border="0"><tr bgcolor="#ffbbbb"><td>'; |
|
$result.='This student has submitted '; |
|
$result.=(scalar(@badcollaborators) == 1) ? 'an invalid collaborator' : 'invalid collaborators'; |
|
$result .= ': '.join(', ',@badcollaborators); |
|
$result .= '</td></tr></table>'; |
|
} |
|
if (scalar(@badcollaborators > $ncol)) { |
|
$result .= '<table border="0"><tr bgcolor="#ffbbbb"><td>'; |
|
$result .= 'This student has submitted too many '. |
|
'collaborators. Maximum is '.$ncol.'.'; |
|
$result .= '</td></tr></table>'; |
|
} |
|
} |
|
} |
} |
$request->print($result."\n"); |
$request->print($result."\n"); |
|
|
Line 2173 KEYWORDS
|
Line 2132 KEYWORDS
|
if ($env{'form.handgrade'} eq 'yes') { |
if ($env{'form.handgrade'} eq 'yes') { |
my ($lastname,$givenn) = split(/,/,$env{'form.fullname'}); |
my ($lastname,$givenn) = split(/,/,$env{'form.fullname'}); |
my $msgfor = $givenn.' '.$lastname; |
my $msgfor = $givenn.' '.$lastname; |
if (scalar(@col_fullnames) > 0) { |
if (scalar(@$col_fullnames) > 0) { |
my $lastone = pop @col_fullnames; |
my $lastone = pop(@$col_fullnames); |
$msgfor .= ', '.(join ', ',@col_fullnames).' and '.$lastone.'.'; |
$msgfor .= ', '.(join ', ',@$col_fullnames).' and '.$lastone.'.'; |
} |
} |
$msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript |
$msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript |
$result='<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n". |
$result='<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n". |
'<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n"; |
'<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n"; |
$result.=' <a href="javascript:msgCenter(document.SCORE,'.$counter. |
$result.=' <a href="javascript:msgCenter(document.SCORE,'.$counter. |
',\''.$msgfor.'\');" target="_self">'. |
',\''.$msgfor.'\');" target="_self">'. |
&mt('Compose message to student').(scalar(@col_fullnames) >= 1 ? 's' : '').'</a><label> ('. |
&mt('Compose message to student').(scalar(@$col_fullnames) >= 1 ? 's' : '').'</a><label> ('. |
&mt('incl. grades').' <input type="checkbox" name="withgrades'.$counter.'" /></label>)'. |
&mt('incl. grades').' <input type="checkbox" name="withgrades'.$counter.'" /></label>)'. |
'<img src="'.$request->dir_config('lonIconsURL'). |
'<img src="'.$request->dir_config('lonIconsURL'). |
'/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n". |
'/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n". |
Line 2260 KEYWORDS
|
Line 2219 KEYWORDS
|
return ''; |
return ''; |
} |
} |
|
|
|
sub check_collaborators { |
|
my ($symb,$uname,$udom,$record,$handgrade,$counter) = @_; |
|
my ($result,@col_fullnames); |
|
my ($classlist,undef,$fullname) = &getclasslist('all','0'); |
|
foreach my $part (keys(%$handgrade)) { |
|
my $ncol = &Apache::lonnet::EXT('resource.'.$part. |
|
'.maxcollaborators', |
|
$symb,$udom,$uname); |
|
next if ($ncol <= 0); |
|
$part =~ s/\_/\./g; |
|
next if ($record->{'resource.'.$part.'.collaborators'} eq ''); |
|
my (@good_collaborators, @bad_collaborators); |
|
foreach my $possible_collaborator |
|
(split(/,?\s+/,$record->{'resource.'.$part.'.collaborators'})) { |
|
$possible_collaborator =~ s/[\$\^\(\)]//g; |
|
next if ($possible_collaborator eq ''); |
|
my ($co_name,$co_dom) = split(/\@|:/,$possible_collaborator); |
|
$co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i); |
|
next if ($co_name eq $uname && $co_dom eq $udom); |
|
# Doing this grep allows 'fuzzy' specification |
|
my @matches = grep(/^\Q$co_name\E:\Q$co_dom\E$/i, |
|
keys(%$classlist)); |
|
if (! scalar(@matches)) { |
|
push(@bad_collaborators, $possible_collaborator); |
|
} else { |
|
push(@good_collaborators, @matches); |
|
} |
|
} |
|
if (scalar(@good_collaborators) != 0) { |
|
$result.='<b>Collaborators: </b>'; |
|
foreach my $name (@good_collaborators) { |
|
my ($lastname,$givenn) = split(/,/,$$fullname{$name}); |
|
push(@col_fullnames, $givenn.' '.$lastname); |
|
$result.=$fullname->{$name}.' '; |
|
} |
|
$result.='<br />'."\n"; |
|
my ($part)=split(/\./,$_); |
|
$result.='<input type="hidden" name="collaborator'.$counter. |
|
'" value="'.$part.':'.(join ':',@good_collaborators).'" />'. |
|
"\n"; |
|
} |
|
if (scalar(@bad_collaborators) > 0) { |
|
$result.='<div class="LC_error">'; |
|
$result.=&mt('This student has submitted [quant,_1,invalid collaborator]: [_2]',scalar(@bad_collaborators),join(', ',@bad_collaborators)); |
|
$result .= '</div>'; |
|
} |
|
if (scalar(@bad_collaborators > $ncol)) { |
|
$result .= '<div class="LC_error">'; |
|
$result .= &mt('This student has submitted too many '. |
|
'collaborators. Maximum is [_1].',$ncol); |
|
$result .= '</div>'; |
|
} |
|
} |
|
return ($result,$fullname,\@col_fullnames); |
|
} |
|
|
#--- Retrieve the last submission for all the parts |
#--- Retrieve the last submission for all the parts |
sub get_last_submission { |
sub get_last_submission { |
my ($returnhash)=@_; |
my ($returnhash)=@_; |
Line 3906 sub csvuploadassign {
|
Line 3921 sub csvuploadassign {
|
if ($wgt) { |
if ($wgt) { |
$entries{$fields{$dest}}=~s/\s//g; |
$entries{$fields{$dest}}=~s/\s//g; |
my $pcr=$entries{$fields{$dest}} / $wgt; |
my $pcr=$entries{$fields{$dest}} / $wgt; |
my $award='correct_by_override'; |
my $award=($pcr == 0) ? 'incorrect_by_override' |
|
: 'correct_by_override'; |
$grades{"resource.$part.awarded"}=$pcr; |
$grades{"resource.$part.awarded"}=$pcr; |
$grades{"resource.$part.solved"}=$award; |
$grades{"resource.$part.solved"}=$award; |
$points{$part}=1; |
$points{$part}=1; |
Line 4887 SCANTRONFORM
|
Line 4903 SCANTRONFORM
|
</tr> |
</tr> |
SCANTRONFORM |
SCANTRONFORM |
|
|
$r->print(<<SCANTRONFORM); |
$r->print('<tr><td bgcolor="#777777">'); |
</table> |
&Apache::lonpickcode::code_list($r,2); |
$grading_menu_button |
$r->print('</td></tr></table>'); |
SCANTRONFORM |
$r->print($grading_menu_button); |
|
|
return |
return |
} |
} |
|
|
Line 5263 sub scantron_parse_scanline {
|
Line 5278 sub scantron_parse_scanline {
|
|| (&occurence_count($currentquest, "[A-Z]") > 1)) { |
|| (&occurence_count($currentquest, "[A-Z]") > 1)) { |
push(@{$record{'scantron.doubleerror'}},$questnum); |
push(@{$record{'scantron.doubleerror'}},$questnum); |
for (my $ans = 0; $ans < $answers_needed; $ans++) { |
for (my $ans = 0; $ans < $answers_needed; $ans++) { |
$record{"scantron.$ansnum.answer"}=''; |
my $bubble = substr($currentquest, $ans, 1); |
|
if ($bubble =~ /[A-Z]/ ) { |
|
$record{"scantron.$ansnum.answer"} = $bubble; |
|
} else { |
|
$record{"scantron.$ansnum.answer"}=''; |
|
} |
$ansnum++; |
$ansnum++; |
} |
} |
|
|
Line 5298 sub scantron_parse_scanline {
|
Line 5318 sub scantron_parse_scanline {
|
|| (&occurence_count($currentquest, '\d') > 1)) { |
|| (&occurence_count($currentquest, '\d') > 1)) { |
push(@{$record{'scantron.doubleerror'}},$questnum); |
push(@{$record{'scantron.doubleerror'}},$questnum); |
for (my $ans = 0; $ans < $answers_needed; $ans++) { |
for (my $ans = 0; $ans < $answers_needed; $ans++) { |
$record{"scantron.$ansnum.answer"}=''; |
my $bubble = substr($currentquest, $ans, 1); |
|
if ($bubble =~ /\d/) { |
|
$record{"scantron.$ansnum.answer"} = $alphabet[$bubble]; |
|
} else { |
|
$record{"scantron.$ansnum.answer"}=' '; |
|
} |
$ansnum++; |
$ansnum++; |
} |
} |
|
|
Line 5345 sub scantron_parse_scanline {
|
Line 5370 sub scantron_parse_scanline {
|
} |
} |
} elsif (scalar(@array) lt 2) { |
} elsif (scalar(@array) lt 2) { |
|
|
my $location = [length($array[0])]; |
my $location = length($array[0]); |
my $line_num = $location / $$scantron_config{'Qlength'}; |
my $line_num = $location / $$scantron_config{'Qlength'}; |
my $bubble = $alphabet[$location % $$scantron_config{'Qlength'}]; |
my $bubble = $alphabet[$location % $$scantron_config{'Qlength'}]; |
|
|
Line 5368 sub scantron_parse_scanline {
|
Line 5393 sub scantron_parse_scanline {
|
|
|
my $first_answer = $ansnum; |
my $first_answer = $ansnum; |
for (my $ans =0; $ans < $answers_needed; $ans++) { |
for (my $ans =0; $ans < $answers_needed; $ans++) { |
$record{"scantron.$ansnum.answer"} = ''; |
my $item = $first_answer+$ans; |
$ans++; |
$record{"scantron.$item.answer"} = ''; |
} |
} |
|
|
my @ans=@array; |
my @ans=@array; |
my $i=length($ans[0]);shift(@ans); |
my $i=0; |
|
my $increment = 0; |
while ($#ans) { |
while ($#ans) { |
$i+=length($ans[0])+1; |
$i+=length($ans[0]) + $increment; |
my $line = $i/$$scantron_config{'Qlength'} + $first_answer; |
my $line = int($i/$$scantron_config{'Qlength'} + $first_answer); |
my $bubble = $i%$$scantron_config{'Qlength'}; |
my $bubble = $i%$$scantron_config{'Qlength'}; |
|
|
$record{"scantron.$line.answer"}.=$alphabet[$bubble]; |
$record{"scantron.$line.answer"}.=$alphabet[$bubble]; |
shift(@ans); |
shift(@ans); |
|
$increment = 1; |
} |
} |
|
$ansnum += $answers_needed; |
} |
} |
} |
} |
} |
} |
Line 5741 SCANTRONFORM
|
Line 5768 SCANTRONFORM
|
|
|
my $line = 0; |
my $line = 0; |
while (defined($env{"form.scantron.bubblelines.$line"})) { |
while (defined($env{"form.scantron.bubblelines.$line"})) { |
&Apache::lonnet::logthis("Saving chunk for $line"); |
|
my $chunk = |
my $chunk = |
'<input type="hidden" name="scantron.bubblelines.'.$line.'" value="'.$env{"form.scantron.bubblelines.$line"}.'" />'."\n"; |
'<input type="hidden" name="scantron.bubblelines.'.$line.'" value="'.$env{"form.scantron.bubblelines.$line"}.'" />'."\n"; |
$chunk .= |
$chunk .= |
Line 5807 sub scantron_validate_file {
|
Line 5833 sub scantron_validate_file {
|
} |
} |
my $currentphase=$env{'form.validatepass'}; |
my $currentphase=$env{'form.validatepass'}; |
|
|
&Apache::lonnet::logthis("Phase: $currentphase"); |
|
|
|
my $stop=0; |
my $stop=0; |
while (!$stop && $currentphase < scalar(@validate_phases)) { |
while (!$stop && $currentphase < scalar(@validate_phases)) { |
Line 6319 sub scantron_validate_ID {
|
Line 6344 sub scantron_validate_ID {
|
sub scantron_get_correction { |
sub scantron_get_correction { |
my ($r,$i,$scan_record,$scan_config,$line,$error,$arg)=@_; |
my ($r,$i,$scan_record,$scan_config,$line,$error,$arg)=@_; |
|
|
#FIXME in the case of a duplicated ID the previous line, probaly need |
#FIXME in the case of a duplicated ID the previous line, probably need |
#to show both the current line and the previous one and allow skipping |
#to show both the current line and the previous one and allow skipping |
#the previous one or the current one |
#the previous one or the current one |
|
|
Line 6418 ENDSCRIPT
|
Line 6443 ENDSCRIPT
|
$r->print($message); |
$r->print($message); |
$r->print("<p>Please indicate which bubble should be used for grading</p>"); |
$r->print("<p>Please indicate which bubble should be used for grading</p>"); |
foreach my $question (@{$arg}) { |
foreach my $question (@{$arg}) { |
|
|
my $selected = &get_response_bubbles($scan_record, $question); |
my $selected = &get_response_bubbles($scan_record, $question); |
|
my @select_array = split(/:/,$selected); |
&scantron_bubble_selector($r,$scan_config,$question, |
&scantron_bubble_selector($r,$scan_config,$question, |
split('',$selected)); |
@select_array); |
} |
} |
} elsif ($error eq 'missingbubble') { |
} elsif ($error eq 'missingbubble') { |
$r->print("<p>There have been <b>no</b> bubbles scanned for some question(s)</p>\n"); |
$r->print("<p>There have been <b>no</b> bubbles scanned for some question(s)</p>\n"); |
Line 6452 ENDSCRIPT
|
Line 6477 ENDSCRIPT
|
$r - Apache request object |
$r - Apache request object |
$scan_config - hash from &get_scantron_config() |
$scan_config - hash from &get_scantron_config() |
$quest - number of the bubble line to make a corrector for |
$quest - number of the bubble line to make a corrector for |
$selected - array of letters of previously selected bubbles |
$lines - array of answer lines. |
|
|
=cut |
=cut |
|
|
sub scantron_bubble_selector { |
sub scantron_bubble_selector { |
my ($r,$scan_config,$quest,@selected)=@_; |
my ($r,$scan_config,$quest,@lines)=@_; |
my $max=$$scan_config{'Qlength'}; |
my $max=$$scan_config{'Qlength'}; |
|
|
|
|
my $scmode=$$scan_config{'Qon'}; |
my $scmode=$$scan_config{'Qon'}; |
|
|
|
my $bubble_length = scalar(@lines); |
|
|
|
|
if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; } |
if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; } |
|
|
my $response = $quest-1; |
my $response = $quest-1; |
my $lines = $bubble_lines_per_response{$response}; |
my $lines = $bubble_lines_per_response{$response}; |
&Apache::lonnet::logthis("Question $quest, lines: $lines"); |
|
|
|
my $total_lines = $lines*2; |
my $total_lines = $lines*2; |
my @alphabet=('A'..'Z'); |
my @alphabet=('A'..'Z'); |
Line 6477 sub scantron_bubble_selector {
|
Line 6504 sub scantron_bubble_selector {
|
if ($l != 0) { |
if ($l != 0) { |
$r->print('<tr>'); |
$r->print('<tr>'); |
} |
} |
|
my @selected = split(//,$lines[$l]); |
# FIXME: This loop probably has to be considerably more clever for |
|
# multiline bubbles: User can multibubble by having bubbles in |
|
# several lines. User can skip lines legitimately etc. etc. |
|
|
|
for (my $i=0;$i<$max;$i++) { |
for (my $i=0;$i<$max;$i++) { |
$r->print("\n".'<td align="center">'); |
$r->print("\n".'<td align="center">'); |
if ($selected[0] eq $alphabet[$i]) { |
if ($selected[0] eq $alphabet[$i]) { |
Line 6731 sub scantron_validate_doublebubble {
|
Line 6754 sub scantron_validate_doublebubble {
|
=cut |
=cut |
|
|
sub scantron_get_maxbubble { |
sub scantron_get_maxbubble { |
&Apache::lonnet::logthis("get_max_bubble"); |
|
if (defined($env{'form.scantron_maxbubble'}) && |
if (defined($env{'form.scantron_maxbubble'}) && |
$env{'form.scantron_maxbubble'}) { |
$env{'form.scantron_maxbubble'}) { |
&Apache::lonnet::logthis("cached"); |
|
&restore_bubble_lines(); |
&restore_bubble_lines(); |
return $env{'form.scantron_maxbubble'}; |
return $env{'form.scantron_maxbubble'}; |
} |
} |
&Apache::lonnet::logthis("computing"); |
|
|
|
my (undef, undef, $sequence) = |
my (undef, undef, $sequence) = |
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
Line 6776 sub scantron_get_maxbubble {
|
Line 6796 sub scantron_get_maxbubble {
|
|
|
|
|
foreach my $part_id (@{$analysis{'parts'}}) { |
foreach my $part_id (@{$analysis{'parts'}}) { |
my ($trash, $part) = split(/\./, $part_id); |
|
|
|
my $lines = $analysis{"$part_id.bubble_lines"}[0]; |
|
|
my $lines = $analysis{"$part_id.bubble_lines"};; |
|
|
# TODO - make this a persistent hash not an array. |
# TODO - make this a persistent hash not an array. |
|
|
Line 7184 sub grading_menu {
|
Line 7204 sub grading_menu {
|
my $probTitle = &Apache::lonnet::gettitle($symb); |
my $probTitle = &Apache::lonnet::gettitle($symb); |
my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle); |
my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle); |
|
|
# |
|
# Define menu data |
|
$env{'form.probTitle'} = &Apache::lonnet::gettitle($symb); |
|
my ($table) = &showResourceInfo($symb,$env{'form.probTitle'}); |
|
$request->print($table); |
$request->print($table); |
my %fields = ('symb'=>&Apache::lonenc::check_encrypt($symb), |
my %fields = ('symb'=>&Apache::lonenc::check_encrypt($symb), |
'handgrade'=>$hdgrade, |
'handgrade'=>$hdgrade, |
Line 7217 sub grading_menu {
|
Line 7233 sub grading_menu {
|
$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 Scantron Forms'), |
name => &mt('Grade/Manage Scantron Forms'), |
short_description => |
short_description => |
&mt('')}); |
&mt('')}); |
$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 => "", |
jscript => ' onClick="javascript:checkChoice2(document.forms.gradingMenu,\'5\',\'verify\')" ', |
|
name => &mt('Verify Receipt'), |
name => &mt('Verify Receipt'), |
short_description => |
short_description => |
&mt('')}); |
&mt('')}); |
$fields{'command'} = 'manage'; |
|
$url = &Apache::lonhtmlcommon::build_url('/adm/helper/resettimes.helper',\%fields); |
|
push (@menu, { url => $url, |
|
name => &mt('Manage Access Times'), |
|
short_description => |
|
&mt('')}); |
|
$fields{'command'} = 'view'; |
|
$url = &Apache::lonhtmlcommon::build_url('/adm/pickcode',\%fields); |
|
push (@menu, { url => $url, |
|
name => &mt('View Saved CODEs'), |
|
short_description => |
|
&mt('')}); |
|
|
|
# |
# |
# Create the menu |
# Create the menu |
my $Str; |
my $Str; |
Line 7261 sub grading_menu {
|
Line 7263 sub grading_menu {
|
$menudata->{'url'}.'" >'. |
$menudata->{'url'}.'" >'. |
$menudata->{'name'}."</a></h3>\n"; |
$menudata->{'name'}."</a></h3>\n"; |
} else { |
} else { |
$Str .=' <h3><a '. |
$Str .=' <h3><input type="button" value="Verify Receipt" '. |
$menudata->{'jscript'}. |
$menudata->{'jscript'}. |
' href="javascript:checkChoice2(document.forms.gradingMenu,\'5\',\'verify\')" >'. |
' onClick="javascript:checkChoice(document.forms.gradingMenu,\'5\',\'verify\')" '. |
$menudata->{'name'}."</a></h3>\n"; |
' /></h3>'; |
$Str .= (' 'x8). |
$Str .= (' 'x8). |
' receipt: '.&Apache::lonnet::recprefix($env{'request.course.id'}). |
' receipt: '.&Apache::lonnet::recprefix($env{'request.course.id'}). |
'-<input type="text" name="receipt" size="4" onChange="javascript:checkReceiptNo(this.form,\'OK\')" />'; |
'-<input type="text" name="receipt" size="4" onChange="javascript:checkReceiptNo(this.form,\'OK\')" />'; |
Line 7285 sub grading_menu {
|
Line 7287 sub grading_menu {
|
cmdsave = 'submission'; |
cmdsave = 'submission'; |
} |
} |
formname.command.value = cmd; |
formname.command.value = cmd; |
formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+ |
|
":saveSub="+pullDownSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status); |
|
if (val < 5) formname.submit(); |
if (val < 5) formname.submit(); |
if (val == 5) { |
if (val == 5) { |
if (!checkReceiptNo(formname,'notOK')) { return false;} |
if (!checkReceiptNo(formname,'notOK')) { |
formname.submit(); |
return false; |
} |
} else { |
if (val < 7) formname.submit(); |
formname.submit(); |
} |
} |
function checkChoice2(formname,val,cmdx) { |
|
if (val <= 2) { |
|
var cmd = radioSelection(formname.radioChoice); |
|
var cmdsave = cmd; |
|
} else { |
|
cmd = cmdx; |
|
cmdsave = 'submission'; |
|
} |
|
formname.command.value = cmd; |
|
if (val < 5) formname.submit(); |
|
if (val == 5) { |
|
if (!checkReceiptNo(formname,'notOK')) { return false;} |
|
formname.submit(); |
|
} |
} |
if (val < 7) formname.submit(); |
|
} |
} |
|
|
function checkReceiptNo(formname,nospace) { |
function checkReceiptNo(formname,nospace) { |
Line 7327 sub grading_menu {
|
Line 7313 sub grading_menu {
|
</script> |
</script> |
GRADINGMENUJS |
GRADINGMENUJS |
&commonJSfunctions($request); |
&commonJSfunctions($request); |
my $result='<h3> <span class="LC_info">Manual Grading/View Submission</span></h3>'; |
|
$result.=$table; |
|
my (undef,$sections) = &getclasslist('all','0'); |
|
my $savedState = &savedState(); |
|
my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'submission' : $$savedState{'saveCmd'}); |
|
my $saveSec = ($$savedState{'saveSec'} eq '' ? 'all' : $$savedState{'saveSec'}); |
|
my $saveSub = ($$savedState{'saveSub'} eq '' ? 'all' : $$savedState{'saveSub'}); |
|
my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'}); |
|
|
|
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
|
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". |
|
'<input type="hidden" name="handgrade" value="'.$hdgrade.'" />'."\n". |
|
'<input type="hidden" name="probTitle" value="'.$probTitle.'" ue="" />'."\n". |
|
'<input type="hidden" name="saveState" value="" />'."\n". |
|
'<input type="hidden" name="gradingMenu" value="1" />'."\n". |
|
'<input type="hidden" name="showgrading" value="yes" />'."\n"; |
|
|
|
$result.='<table width="100%" border="0"><tr><td bgcolor=#777777>'."\n". |
|
'<table width="100%" border="0"><tr bgcolor="#e6ffff"><td colspan="2">'."\n". |
|
' <b>Select a Grading/Viewing Option</b></td></tr>'."\n". |
|
'<tr bgcolor="#ffffe6" valign="top"><td>'."\n"; |
|
|
|
$result.='<table width="100%" border="0">'; |
|
$result.='<tr bgcolor="#ffffe6" valign="top">'."\n"; |
|
$result.='<td><b>'.&mt('Sections').'</b></td>'; |
|
# $result.='<td>Groups</td>'; |
|
$result.='<td><b>'.&mt('Access Status').'</td>'."\n"; |
|
$result.='</tr>'; |
|
$result.='<tr bgcolor="#ffffe6" valign="top"><td>'."\n". |
|
' <select name="section" multiple="multiple" size="3">'."\n"; |
|
if (ref($sections)) { |
|
foreach (sort (@$sections)) { |
|
$result.='<option value="'.$_.'" '. |
|
($saveSec eq $_ ? 'selected="selected"':'').'>'.$_.'</option>'."\n"; |
|
} |
|
} |
|
$result.= '<option value="all" '.($saveSec eq 'all' ? 'selected="selected"' : ''). '>all</option></select> '; |
|
return $Str; |
return $Str; |
} |
} |
|
|
Line 7441 GRADINGMENUJS
|
Line 7390 GRADINGMENUJS
|
$result.='<td><b>'.&mt('Sections').'</b></td>'; |
$result.='<td><b>'.&mt('Sections').'</b></td>'; |
$result.='<td><b>'.&mt('Groups').'</b></td>'; |
$result.='<td><b>'.&mt('Groups').'</b></td>'; |
$result.='<td><b>'.&mt('Access Status').'</td>'."\n"; |
$result.='<td><b>'.&mt('Access Status').'</td>'."\n"; |
|
$result.='<td><b>'.&mt('Submission Status').'</td>'."\n"; |
$result.='</tr>'; |
$result.='</tr>'; |
$result.='<tr bgcolor="#ffffe6" valign="top"><td>'."\n". |
$result.='<tr bgcolor="#ffffe6" valign="top"><td>'."\n". |
' <select name="section" multiple="multiple" size="3">'."\n"; |
' <select name="section" multiple="multiple" size="3">'."\n"; |
Line 7456 GRADINGMENUJS
|
Line 7406 GRADINGMENUJS
|
$result.='</td><td>'."\n"; |
$result.='</td><td>'."\n"; |
$result.=&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,3,undef,'mult'); |
$result.=&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,3,undef,'mult'); |
|
|
$result.='</td></tr>'; |
$result.='</td>'; |
|
$result.='<td><select name="submitonly" size="3">'. |
$result.='<tr bgcolor="#ffffe6"valign="top"><td colspan="3"><label>'. |
|
'<input type="radio" name="radioChoice" value="submission" '. |
|
($saveCmd eq 'submission' ? 'checked="checked"' : '').' /> '.'<b>'.&mt('Current Resource').':</b> '.&mt('For one or more students'). |
|
'</label> <select name="submitonly">'. |
|
'<option value="yes" '. |
'<option value="yes" '. |
($saveSub eq 'yes' ? 'selected="selected"' : '').'>'.&mt('with submissions').'</option>'. |
($saveSub eq 'yes' ? 'selected="selected"' : '').'>'.&mt('with submissions').'</option>'. |
'<option value="queued" '. |
'<option value="queued" '. |
Line 7471 GRADINGMENUJS
|
Line 7417 GRADINGMENUJS
|
'<option value="incorrect" '. |
'<option value="incorrect" '. |
($saveSub eq 'incorrect' ? 'selected="selected"' : '').'>'.&mt('with incorrect submissions').'</option>'. |
($saveSub eq 'incorrect' ? 'selected="selected"' : '').'>'.&mt('with incorrect submissions').'</option>'. |
'<option value="all" '. |
'<option value="all" '. |
($saveSub eq 'all' ? 'selected="selected"' : '').'>'.&mt('with any status').'</option></select></td></tr>'."\n"; |
($saveSub eq 'all' ? 'selected="selected"' : '').'>'.&mt('with any status').'</option></select></td></tr>'; |
|
|
|
$result.='<tr bgcolor="#ffffe6"valign="top"><td colspan="3"><label>'. |
|
'<input type="radio" name="radioChoice" value="submission" '. |
|
($saveCmd eq 'submission' ? 'checked="checked"' : '').' /> '.'<b>'.&mt('Current Resource').':</b> '.&mt('For one or more students'). |
|
'</label> </td></tr>'."\n"; |
|
|
$result.='<tr bgcolor="#ffffe6"valign="top"><td colspan="2">'. |
$result.='<tr bgcolor="#ffffe6"valign="top"><td colspan="3">'. |
'<label><input type="radio" name="radioChoice" value="viewgrades" '. |
'<label><input type="radio" name="radioChoice" value="viewgrades" '. |
($saveCmd eq 'viewgrades' ? 'checked="checked"' : '').' /> '. |
($saveCmd eq 'viewgrades' ? 'checked="checked"' : '').' /> '. |
'<b>Current Resource:</b> For all students in selected section or course</label></td></tr>'."\n"; |
'<b>Current Resource:</b> For all students in selected section or course</label></td></tr>'."\n"; |
|
|
$result.='<tr bgcolor="#ffffe6" valign="top"><td colspan="2">'. |
$result.='<tr bgcolor="#ffffe6"><td colspan="3"><br />'. |
'<label><input type="radio" name="radioChoice" value="pickStudentPage" '. |
'<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="Next->" />'. |
|
'</td></tr>'."\n"; |
|
|
|
|
|
$result.='<tr bgcolor="#ffffe6" valign="top"><td colspan="3">'. |
|
'<br /><label><input type="radio" name="radioChoice" value="pickStudentPage" '. |
($saveCmd eq 'pickStudentPage' ? 'checked="checked"' : '').' /> '. |
($saveCmd eq 'pickStudentPage' ? 'checked="checked"' : '').' /> '. |
'The <b>complete</b> set/page/sequence: For one student</label></td></tr>'."\n"; |
'The <b>complete</b> set/page/sequence/folder: For one student</label></td></tr>'."\n"; |
|
|
$result.='<tr bgcolor="#ffffe6"><td colspan="2"><br />'. |
$result.='<tr bgcolor="#ffffe6"><td colspan="3"><br />'. |
'<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="Next->" />'. |
'<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="Next->" />'. |
'</td></tr></table>'."\n"; |
'</td></tr></table>'."\n"; |
|
|
Line 8030 ENDHEADER
|
Line 7986 ENDHEADER
|
|
|
sub handler { |
sub handler { |
my $request=$_[0]; |
my $request=$_[0]; |
|
|
&reset_caches(); |
&reset_caches(); |
if ($env{'browser.mathml'}) { |
if ($env{'browser.mathml'}) { |
&Apache::loncommon::content_type($request,'text/xml'); |
&Apache::loncommon::content_type($request,'text/xml'); |
Line 8126 sub handler {
|
Line 8081 sub handler {
|
} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) { |
} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) { |
$request->print(&csvuploadassign($request)); |
$request->print(&csvuploadassign($request)); |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
&Apache::lonnet::logthis("Selecting pyhase"); |
|
$request->print(&scantron_selectphase($request)); |
$request->print(&scantron_selectphase($request)); |
} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) { |
$request->print(&scantron_do_warning($request)); |
$request->print(&scantron_do_warning($request)); |