--- loncom/homework/grades.pm 2007/11/03 00:18:37 1.478 +++ loncom/homework/grades.pm 2007/11/05 10:19:03 1.479 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.478 2007/11/03 00:18:37 albertel Exp $ +# $Id: grades.pm,v 1.479 2007/11/05 10:19:03 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,6 +42,7 @@ use Apache::Constants qw(:common); use Apache::lonlocal; use Apache::lonenc; use String::Similarity; +use Data::Dumper; use LONCAPA; use POSIX qw(floor); @@ -5116,7 +5117,8 @@ sub username_to_idmap { sub scantron_fixup_scanline { my ($scantron_config,$scan_data,$line,$whichline,$field,$args)=@_; - + + if ($field eq 'ID') { if (length($args->{'newid'}) > $$scantron_config{'IDlength'}) { return ($line,1,'New value too large'); @@ -5147,28 +5149,54 @@ sub scantron_fixup_scanline { $$scantron_config{'CODElength'})=$args->{'CODE'}; } } elsif ($field eq 'answer') { + &scantron_get_maxbubble(); # Need the bubble counter info. my $length=$scantron_config->{'Qlength'}; my $off=$scantron_config->{'Qoff'}; my $on=$scantron_config->{'Qon'}; my $answer=${off}x$length; - if ($args->{'response'} eq 'none') { - &scan_data($scan_data, - "$whichline.no_bubble.".$args->{'question'},'1'); - } else { - if ($on eq 'letter') { - my @alphabet=('A'..'Z'); - $answer=$alphabet[$args->{'response'}]; - } elsif ($on eq 'number') { - $answer=$args->{'response'}+1; - if ($answer == 10) { $answer = '0'; } + my $question_number = $args->{'question'} -1; + my $first_position = $first_bubble_line{$question_number}; + my $bubble_count = $bubble_lines_per_response{$question_number}; + my $bubbles_per_line= $$scantron_config{'Qlength'}; + my $final_answer; + if ($$scantron_config{'Qon'} eq 'letter' || + $$scantron_config{'Qon'} eq 'number') { + $bubbles_per_line = 10; + } + if (defined $args->{'response'}) { + + if ($args->{'response'} eq 'none') { + &scan_data($scan_data, + "$whichline.no_bubble.".$args->{'question'},'1'); } else { - substr($answer,$args->{'response'},1)=$on; + my ($bubble_line, $bubble_number) = split(/:/,$args->{'response'}); + if ($on eq 'letter') { + my @alphabet=('A'..'Z'); + $answer=$alphabet[$bubble_number]; + } elsif ($on eq 'number') { + $answer=$args->$bubble_number+1; + if ($answer == 10) { $answer = '0'; } + } else { + substr($answer,$args->{'response'},1)=$on; + } + my $before = Dumper($scan_data); + &scan_data($scan_data, + "$whichline.no_bubble.".$args->{'question'},undef,'1'); + my $after = Dumper($scan_data); + for (my $l = 0; $l < $bubble_count; $l++) { + if ($l eq $bubble_line) { + $final_answer .= $answer; + } else { + $final_answer .= ' '; + } + } } - &scan_data($scan_data, - "$whichline.no_bubble.".$args->{'question'},undef,'1'); + # $where=$length*($args->{'question'}-1)+$scantron_config->{'Qstart'}; + #substr($line,$where-1,$length)=$answer; + substr($line, + $scantron_config->{'Qstart'}+$first_position-1, + $bubbles_per_line) = $final_answer; } - my $where=$length*($args->{'question'}-1)+$scantron_config->{'Qstart'}; - substr($line,$where-1,$length)=$answer; } return $line; } @@ -6492,6 +6520,7 @@ ENDSCRIPT foreach my $question (@{$arg}) { my $selected = &get_response_bubbles($scan_record, $question); my @select_array = split(/:/,$selected); + &Apache::lonnet::logthis("Questnum: $question, bubbles: $selected scanline $i"); &scantron_bubble_selector($r,$scan_config,$question, @select_array); } @@ -6546,6 +6575,7 @@ sub scantron_bubble_selector { my $total_lines = $lines*2; my @alphabet=('A'..'Z'); + $r->print(""); for (my $l = 0; $l < $lines; $l++) { @@ -6579,9 +6609,10 @@ sub scantron_bubble_selector { # multiline questions (different values e.g..). for (my $i=0;$i<$max;$i++) { + my $value = "$l:$i"; # Relative bubble line #: Bubble in line. $r->print("\n". '"); + $quest.'" value="'.$value.'" />'.$alphabet[$i].""); } $r->print(''); @@ -6769,6 +6800,7 @@ sub scantron_validate_doublebubble { my ($scanlines,$scan_data)=&scantron_getfile(); &scantron_get_maxbubble(); # parse needs the bubble line array. + &Apache::lonnet::logthis("validate_double_bubble"); for (my $i=0;$i<=$scanlines->{'count'};$i++) { my $line=&scantron_get_line($scanlines,$scan_data,$i); @@ -6776,6 +6808,7 @@ sub scantron_validate_doublebubble { my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, $scan_data); if (!defined($$scan_record{'scantron.doubleerror'})) { next; } + &Apache::lonnet::logthis("Double found for line $i : $line"); &scantron_get_correction($r,$i,$scan_record,\%scantron_config,$line, 'doublebubble', $$scan_record{'scantron.doubleerror'});
$quest