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

raeburn raeburn at source.lon-capa.org
Wed May 2 10:01:33 EDT 2012


raeburn		Wed May  2 14:01:33 2012 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/homework	grades.pm 
  Log:
  - Backport 1.649, 1.672.
  
  
-------------- next part --------------
Index: loncom/homework/grades.pm
diff -u loncom/homework/grades.pm:1.596.2.12 loncom/homework/grades.pm:1.596.2.12.2.1
--- loncom/homework/grades.pm:1.596.2.12	Thu Dec  1 00:36:59 2011
+++ loncom/homework/grades.pm	Wed May  2 14:01:32 2012
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.596.2.12 2011/12/01 00:36:59 raeburn Exp $
+# $Id: grades.pm,v 1.596.2.12.2.1 2012/05/02 14:01:32 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -272,7 +272,7 @@
     }
 
     sub get_analyze {
-	my ($symb,$uname,$udom,$no_increment,$add_to_hash,$type,$trial,$rndseed)=@_;
+	my ($symb,$uname,$udom,$no_increment,$add_to_hash,$type,$trial,$rndseed,$bubbles_per_row)=@_;
 	my $key = "$symb\0$uname\0$udom";
         if ($type eq 'randomizetry') {
             if ($trial ne '') {
@@ -306,6 +306,9 @@
                     'grade_courseid'    =>  $env{'request.course.id'},
                     'grade_username'    => $uname,
                     'grade_noincrement' => $no_increment);
+        if ($bubbles_per_row ne '') {
+            $form{'bubbles_per_row'} = $bubbles_per_row;
+        }
         if ($type eq 'randomizetry') {
             $form{'grade_questiontype'} = $type;
             if ($rndseed ne '') {
@@ -346,7 +349,7 @@
     }
 
     sub scantron_partids_tograde {
-        my ($resource,$cid,$uname,$udom,$check_for_randomlist) = @_;
+        my ($resource,$cid,$uname,$udom,$check_for_randomlist,$bubbles_per_row) = @_;
         my (%analysis, at parts);
         if (ref($resource)) {
             my $symb = $resource->symb();
@@ -354,7 +357,9 @@
             if ($check_for_randomlist) {
                 $add_to_form = { 'check_parts_withrandomlist' => 1,};
             }
-            my $analyze = &get_analyze($symb,$uname,$udom,undef,$add_to_form);
+            my $analyze =
+                &get_analyze($symb,$uname,$udom,undef,$add_to_form,
+                             undef,undef,undef,$bubbles_per_row);
             if (ref($analyze) eq 'HASH') {
                 %analysis = %{$analyze};
             }
@@ -1825,7 +1830,6 @@
     $line.='<option value="reset status">'.&mt('reset status').'</option></select>'."\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);
     $result .= 
 	    '<td>'.$display_part.'</td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>';
     $result.=&Apache::loncommon::end_data_table_row();
@@ -5562,6 +5566,8 @@
  
       LastName    - column that the last name starts in
       LastNameLength - number of columns that the last name spans
+      BubblesPerRow - number of bubbles available in each row used to
+                      bubble an answer. (If not specified, 10 assumed).
 
 =cut
 
@@ -5592,6 +5598,7 @@
 	$config{'FirstNamelength'}=$config[14];
 	$config{'LastName'}=$config[15];
 	$config{'LastNamelength'}=$config[16];
+        $config{'BubblesPerRow'}=$config[17];
 	last;
     }
     return %config;
@@ -6515,7 +6522,8 @@
     #get the student pick code ready
     $r->print(&Apache::loncommon::studentbrowser_javascript());
     my $nav_error;
-    my $max_bubble=&scantron_get_maxbubble(\$nav_error);
+    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return '';
@@ -6968,7 +6976,7 @@
     my ($scanlines,$scan_data)=&scantron_getfile();
 
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error); # parse needs the bubble_lines.. array.
+    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble_lines.. array.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return(1,$currentphase);
@@ -7381,7 +7389,19 @@
     my $max=$$scan_config{'Qlength'};
 
     my $scmode=$$scan_config{'Qon'};
-    if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; }	     
+    if ($scmode eq 'number' || $scmode eq 'letter') {
+        if (($$scan_config{'BubblesPerRow'} =~ /^\d+$/) &&
+            ($$scan_config{'BubblesPerRow'} > 0)) {
+            $max=$$scan_config{'BubblesPerRow'};
+            if (($scmode eq 'number') && ($max > 10)) {
+                $max = 10;
+            } elsif (($scmode eq 'letter') && $max > 26) {
+                $max = 26;
+            }
+        } else {
+            $max = 10;
+        }
+    }
 
     my @alphabet=('A'..'Z');
     $r->print(&Apache::loncommon::start_data_table().
@@ -7536,7 +7556,7 @@
     my %allcodes=&get_codes();
 
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error); # parse needs the lines per response array.
+    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the lines per response array.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return(1,$currentphase);
@@ -7595,7 +7615,7 @@
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error); # parse needs the bubble line array.
+    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble line array.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return(1,$currentphase);
@@ -7617,7 +7637,7 @@
 
 
 sub scantron_get_maxbubble {
-    my ($nav_error) = @_;
+    my ($nav_error,$scantron_config) = @_;
     if (defined($env{'form.scantron_maxbubble'}) &&
 	$env{'form.scantron_maxbubble'}) {
 	&restore_bubble_lines();
@@ -7636,6 +7656,7 @@
     }
     my $map=$navmap->getResourceByUrl($sequence);
     my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
+    my $bubbles_per_row = &bubblesheet_bubbles_per_row($scantron_config);
 
     &Apache::lonxml::clear_problem_counter();
 
@@ -7651,7 +7672,8 @@
     my $response_number = 0;
     my $bubble_line     = 0;
     foreach my $resource (@resources) {
-        my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,$udom);
+        my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,
+                                                          $udom,$bubbles_per_row);
         if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) {
 	    foreach my $part_id (@{$parts}) {
                 my $lines;
@@ -7680,9 +7702,10 @@
                     if (ref($analysis->{$part_id.'.shown'}) eq 'ARRAY') {
                         $numshown = scalar(@{$analysis->{$part_id.'.shown'}});
                     }
-                    my $bubbles_per_line = 10;
-                    my $inner_bubble_lines = int($numbub/$bubbles_per_line);
-                    if (($numbub % $bubbles_per_line) != 0) {
+                    my $bubbles_per_row =
+                        &bubblesheet_bubbles_per_row($scantron_config);
+                    my $inner_bubble_lines = int($numbub/$bubbles_per_row);
+                    if (($numbub % $bubbles_per_row) != 0) {
                         $inner_bubble_lines++;
                     }
                     for (my $i=0; $i<$numshown; $i++) {
@@ -7693,7 +7716,7 @@
                     $lines = $numshown * $inner_bubble_lines;
                 } else {
                     $lines = $analysis->{"$part_id.bubble_lines"};
-                } 
+                }
 
                 $first_bubble_line{$response_number} = $bubble_line;
 	        $bubble_lines_per_response{$response_number} = $lines;
@@ -7714,6 +7737,18 @@
     return $env{'form.scantron_maxbubble'};
 }
 
+sub bubblesheet_bubbles_per_row {
+    my ($scantron_config) = @_;
+    my $bubbles_per_row;
+    if (ref($scantron_config) eq 'HASH') {
+        $bubbles_per_row = $scantron_config->{'BubblesPerRow'};
+    }
+    if ((!$bubbles_per_row) || ($bubbles_per_row < 1)) {
+        $bubbles_per_row = 10;
+    }
+    return $bubbles_per_row;
+}
+
 sub scantron_validate_missingbubbles {
     my ($r,$currentphase) = @_;
     #get student info
@@ -7724,7 +7759,7 @@
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
     my $nav_error;
-    my $max_bubble=&scantron_get_maxbubble(\$nav_error);
+    my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
     if ($nav_error) {
         return(1,$currentphase);
     }
@@ -7807,7 +7842,8 @@
         }
         my ($analysis,$parts) =
             &scantron_partids_tograde($resource,$env{'request.course.id'},
-                                      $env{'user.name'},$env{'user.domain'},1);
+                                      $env{'user.name'},$env{'user.domain'},
+                                      1,$bubbles_per_row);
         $grader_partids_by_symb{$ressymb} = $parts;
         if (ref($analysis) eq 'HASH') {
             if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') {
@@ -7845,7 +7881,7 @@
     my $started;
 
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse.
+    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return '';
@@ -7902,7 +7938,8 @@
             if ((exists($grader_randomlists_by_symb{$ressymb})) ||
                 (ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) {
                 my ($analysis,$parts) =
-                    &scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom);
+                    &scantron_partids_tograde($resource,$env{'request.course.id'},
+                                              $uname,$udom,undef,$bubbles_per_row);
                 $partids_by_symb{$ressymb} = $parts;
             } else {
                 $partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb};
@@ -7931,7 +7968,8 @@
         }
 
         if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
-                                   \@resources,\%partids_by_symb) eq 'ssi_error') {
+                                   \@resources,\%partids_by_symb,
+                                   $bubbles_per_row) eq 'ssi_error') {
             $ssi_error = 0; # So end of handler error message does not trigger.
             $r->print("</form>");
             &ssi_print_error($r);
@@ -7959,7 +7997,8 @@
             if ($studentrecord ne $studentdata) {
                 &Apache::lonxml::clear_problem_counter();
                 if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
-                                           \@resources,\%partids_by_symb) eq 'ssi_error') {
+                                           \@resources,\%partids_by_symb,
+                                           $bubbles_per_row) eq 'ssi_error') {
                     $ssi_error = 0; # So end of handler error message does not trigger.
                     $r->print("</form>");
                     &ssi_print_error($r);
@@ -8031,7 +8070,8 @@
             my $ressymb = $resource->symb();
             my ($analysis,$parts) =
                 &scantron_partids_tograde($resource,$env{'request.course.id'},
-                                          $env{'user.name'},$env{'user.domain'},1);
+                                          $env{'user.name'},$env{'user.domain'},
+                                          1,$bubbles_per_row);
             $grader_partids_by_symb->{$ressymb} = $parts;
             if (ref($analysis) eq 'HASH') {
                 if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') {
@@ -8045,7 +8085,7 @@
 }
 
 sub grade_student_bubbles {
-    my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts) = @_;
+    my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts,$bubbles_per_row) = @_;
     if (ref($resources) eq 'ARRAY') {
         my $count = 0;
         foreach my $resource (@{$resources}) {
@@ -8058,6 +8098,9 @@
                         'grade_symb'     => $ressymb,
                         'CODE'           => $scancode
                        );
+            if ($bubbles_per_row ne '') {
+                $form{'bubbles_per_row'} = $bubbles_per_row;
+            }
             if (ref($parts) eq 'HASH') {
                 if (ref($parts->{$ressymb}) eq 'ARRAY') {
                     foreach my $part (@{$parts->{$ressymb}}) {
@@ -8368,7 +8411,7 @@
                                     'inline',undef,'checkscantron');
     my ($username,$domain,$started);
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse.
+    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return '';
@@ -8418,7 +8461,9 @@
             if ((exists($grader_randomlists_by_symb{$ressymb})) ||
                 (ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) {
                 (my $analysis,$parts) =
-                    &scantron_partids_tograde($resource,$env{'request.course.id'},$username,$domain);
+                    &scantron_partids_tograde($resource,$env{'request.course.id'},
+                                              $username,$domain,undef,
+                                              $bubbles_per_row);
             } else {
                 $parts = $grader_partids_by_symb{$ressymb};
             }
@@ -9766,6 +9811,8 @@
        calling routine should trap the error condition and display the warning
        found in &navmap_errormsg().
 
+       $scantron_config - Reference to bubblesheet format configuration hash.
+
    Returns the maximum number of bubble lines that are expected to
    occur. Does this by walking the selected sequence rendering the
    resource and then checking &Apache::lonxml::get_problem_counter()


More information about the LON-CAPA-cvs mailing list