[LON-CAPA-cvs] cvs: loncom /homework grades.pm

foxr lon-capa-cvs-allow@mail.lon-capa.org
Mon, 05 Nov 2007 10:19:04 -0000


foxr		Mon Nov  5 05:19:04 2007 EDT

  Modified files:              
    /loncom/homework	grades.pm 
  Log:
  Resolve update conflict
  
  
Index: loncom/homework/grades.pm
diff -u loncom/homework/grades.pm:1.478 loncom/homework/grades.pm:1.479
--- loncom/homework/grades.pm:1.478	Fri Nov  2 20:18:37 2007
+++ loncom/homework/grades.pm	Mon Nov  5 05:19:03 2007
@@ -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::lonlocal;
 use Apache::lonenc;
 use String::Similarity;
+use Data::Dumper;
 use LONCAPA;
 
 use POSIX qw(floor);
@@ -5116,7 +5117,8 @@
 
 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 @@
 		   $$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 @@
 	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 @@
 
     my $total_lines = $lines*2;
     my @alphabet=('A'..'Z');
+
     $r->print("<table border='1'><tr><td rowspan='".$total_lines."'>$quest</td>");
 
     for (my $l = 0; $l < $lines; $l++) {
@@ -6579,9 +6609,10 @@
 	#        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".
 		      '<td><label><input type="radio" name="scantron_correct_Q_'.
-		      $quest.'" value="'.$i.'" />'.$alphabet[$i]."</label></td>");
+		      $quest.'" value="'.$value.'" />'.$alphabet[$i]."</label></td>");
 	}
 	$r->print('</tr>');
 
@@ -6769,6 +6800,7 @@
     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 @@
 	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'});