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

raeburn raeburn at source.lon-capa.org
Wed Mar 11 10:50:10 EDT 2015


raeburn		Wed Mar 11 14:50:10 2015 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/homework	structuretags.pm 
  Log:
  - For 2.11
    - Backport 1.520, 1.521, 1.522, 1.523, 1.524, 1.525, 1.526, 1.528, 1.529,
      1.531, 1.532.
  
  
-------------- next part --------------
Index: loncom/homework/structuretags.pm
diff -u loncom/homework/structuretags.pm:1.512.2.8 loncom/homework/structuretags.pm:1.512.2.9
--- loncom/homework/structuretags.pm:1.512.2.8	Sun May 18 02:21:28 2014
+++ loncom/homework/structuretags.pm	Wed Mar 11 14:50:10 2015
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: structuretags.pm,v 1.512.2.8 2014/05/18 02:21:28 raeburn Exp $
+# $Id: structuretags.pm,v 1.512.2.9 2015/03/11 14:50:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -224,9 +224,54 @@
 }
 
 sub homework_js {
+    my ($postsubmit,$timeout);
+    if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {
+        my $crstype;
+        if (&Apache::loncommon::course_type() eq 'Community') {
+            $crstype = 'community';
+        } else {
+            if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) {
+                $crstype = 'official';
+            } elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) {
+                $crstype = 'textbook';
+            } else {
+                $crstype = 'unofficial';
+            }
+        }
+        $postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'};
+        if ($postsubmit eq '') {
+            my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+            $postsubmit = $domdefs{'postsubmit'};
+            unless ($postsubmit eq 'off') {
+                $timeout = $domdefs{$crstype.'postsubtimeout'};
+            }
+        } elsif ($postsubmit eq '0') {
+            $postsubmit = 'off';
+        } elsif ($postsubmit eq '1') {
+            $postsubmit = 'on';
+            $timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'};
+            if ($timeout eq '') {
+                my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+                $timeout = $domdefs{$crstype.'postsubtimeout'};
+            }
+        }
+        if ($timeout eq '') {
+            $timeout = 60;
+        }
+    } else {
+        my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
+        $postsubmit = $domdefs{'postsubmit'};
+        unless ($postsubmit eq 'off') {
+            $timeout = 60;
+        }
+    }
+    my $jstimeout = 0;
+    if ($timeout) {
+        $jstimeout = 1000 * $timeout;
+    }
     return &Apache::loncommon::resize_textarea_js().
            &setmode_javascript().
-	<<'JS';
+	<<"JS";
 <script type="text/javascript">
 // <![CDATA[
 function setSubmittedPart (part,prefix) {
@@ -241,6 +286,17 @@
     }
 }
 
+function disableAutoComplete (id) {
+    var field = document.getElementById(id);
+    if (field != null && field != undefined){
+        if ('autocomplete' in field) {
+            field.autocomplete = "off";
+        } else {
+            field.setAttribute("autocomplete", "off");
+        }
+    }
+}
+
 function image_response_click (which, e) {
     init_geometry();
     if (!e) { e = window.event; } //IE
@@ -254,6 +310,75 @@
     input_element.value = click;
     img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click;
 }
+
+var submithandled = 0;
+var keypresshandled = 0;
+var postsubmit = '$postsubmit';
+
+\$(document).ready(function(){
+  if (postsubmit != 'off') {
+    \$(document).keypress(function(event){
+        var keycode = (event.keyCode ? event.keyCode : event.which);
+        if ((keycode == '13') && (keypresshandled == 0)) {
+            if ( \$( document.activeElement ).hasClass("LC_textline") ) {
+                keypresshandled = 1;
+                var idsArray = \$( document.activeElement ).attr("id").split(/HWVAL_/);
+                if (idsArray.length) {
+                    event.preventDefault();
+                    var itemsArray = idsArray[1].split(/_/);
+                    var buttonId = idsArray[0]+'submit_'+itemsArray[0];
+                    \$("#"+buttonId).trigger("click");
+                }
+            }
+        }
+    });
+
+    \$(document).delegate('form :submit', 'click', function( event ) {
+        if ( \$( this ).hasClass( "LC_hwk_submit" ) ) {
+            var buttonId = this.id;
+            var timeout = $jstimeout;
+            if (submithandled == 0) {
+                submithandled = 1;
+                \$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa",
+                                           "color": "black","padding": "2px"}) ;
+                if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) {
+                    if (buttonId != "all_submit") {
+                        \$( ".LC_status_"+buttonId ).hide();
+                        if (( "#"+buttonId+"_pressed" ).length) {
+                            \$( "#"+buttonId+"_pressed" ).val( "1" );
+                        }
+                    }
+                } else {
+                    \$( ".LC_status_"+buttonId ).hide();
+                }
+                \$(this.form).submit();
+                \$( ".LC_hwk_submit" ).prop( "disabled", true);
+                \$( ".LC_textline" ).prop( "readonly", "readonly");
+                event.preventDefault();
+
+                if (timeout > 0) {
+                    setTimeout(function(){
+                                       \$( "#msg_"+buttonId ).css({"display": "none"});
+                                       if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) {
+                                           if (buttonId != "all_submit") {
+                                               if (( "#"+buttonId+"_pressed" ).length) {
+                                                   \$( "#"+buttonId+"_pressed" ).val( "" );
+                                               }
+                                           }
+                                       }
+                                       \$( ".LC_hwk_submit" ).prop( "disabled", false);
+                                       \$( ".LC_textline" ).prop( "readonly", false);
+                                       submithandled = 0;
+                                       keypresshandled = 0;
+                                     }, timeout);
+                }
+                return true;
+            }
+        }
+    });
+  }
+});
+
 // ]]>
 </script>
 JS
@@ -297,7 +422,7 @@
         $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args);
     }
     my $is_task = ($env{'request.uri'} =~ /\.task$/);
-    my $needs_upload;
+    my ($needs_upload,$partlist);
     my ($symb)= &Apache::lonnet::whichuser();
     my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb);
     if ($is_task) {
@@ -315,6 +440,12 @@
                     unless ($is_page) {
                         $needs_upload = 1;
                     }
+                    if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) {
+                        my $res = $navmap->getBySymb($symb);
+                        if (ref($res)) {
+                            $partlist = $res->parts();
+                        }
+                    }
                 }
             }
         } else {
@@ -326,10 +457,17 @@
                     if (ref($mapres)) {
                         $is_page = $mapres->is_page();
                     }
-                    unless ($is_page) {
+                    if ($is_page) {
+                        if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) {
+                            my $res = $navmap->getBySymb($symb);
+                            if (ref($res)) {
+                                $partlist = $res->parts();
+                            }
+                        }
+                    } else {
                         my $res = $navmap->getBySymb($symb);
                         if (ref($res)) {
-                            my $partlist = $res->parts();
+                            $partlist = $res->parts();
                             if (ref($partlist) eq 'ARRAY') {
                                 foreach my $part (@{$partlist}) {
                                     my @types = $res->responseType($part);
@@ -370,6 +508,9 @@
 		"if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".
 		&Apache::loncommon::browser_and_searcher_javascript().
                 "\n</script>\n";
+            if ($target eq 'edit') {
+                $extra_head .= &Apache::edit::js_update_linknum();
+            }
 	}
     }
 
@@ -462,7 +603,7 @@
 		"\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n";
 	}
     }
-    return ($page_start,$form_tag_start);
+    return ($page_start,$form_tag_start,$partlist);
 }
 
 #use Time::HiRes();
@@ -493,7 +634,7 @@
 }
 
 sub setup_rndseed {
-    my ($safeeval,$target)=@_;
+    my ($safeeval,$target,$probpartlist)=@_;
     my ($symb)=&Apache::lonnet::whichuser();
     my ($questiontype,$set_safespace,$rndseed);
     if ($target eq 'analyze') {
@@ -554,7 +695,13 @@
         }
         unless (($target eq 'analyze') && (defined($rndseed))) {
             $rndseed=&Apache::lonnet::rndseed();
-            my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
+            my $partfortries = $Apache::inputtags::part;
+            if (ref($probpartlist) eq 'ARRAY') {
+                if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) {
+                    $partfortries = $probpartlist->[0];
+                }
+            }
+            my $curr_try = $Apache::lonhomework::history{"resource.$partfortries.tries"};
             if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                 $curr_try ++;
             }
@@ -562,7 +709,7 @@
                 $rndseed = $1;
             }
             if ($curr_try) {
-                my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
+                my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
                     my $inc = int(($curr_try-1)/$reqtries);
                     $rndseed += $inc;
@@ -572,6 +719,9 @@
             }
         }
         $set_safespace = 1;
+        if ($target eq 'grade') {
+            $Apache::lonhomework::rawrndseed = $rndseed;
+        }
     }
     if ($set_safespace) {
         if ($safeeval) {
@@ -832,7 +982,7 @@
 	}
 	%Apache::lonhomework::history=
 	    &Apache::lonnet::tmprestore($namespace,'',$domain,$name);
-	my ($temp)=keys %Apache::lonhomework::history ;
+	my ($temp)=keys(%Apache::lonhomework::history);
 	&Apache::lonxml::debug("Return message of $temp");
     } else {
 	%Apache::lonhomework::history=
@@ -840,7 +990,7 @@
     }
 
     #ignore error conditions
-    my ($temp)=keys %Apache::lonhomework::history ;
+    my ($temp)=keys(%Apache::lonhomework::history);
     if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
 }
 
@@ -848,11 +998,36 @@
 
 =item finalize_storage()
 
-	Stores away the result has to a student's environment
-	checks form.grade_ for specific values, other wises stores
-	to the running users environment
-	Will increment totals for attempts, students, and corrects
-	if running user has student role.
+	Stores away the result hash to a student's environment;
+	checks form.grade_ for specific values, otherwise stores
+	to the running user's environment.
+
+        &check_correctness_changes() is called in two circumstances
+        in which the results hash is to be stored permanently, for
+        grading triggered by a student's submission, where feedback on
+        correctness is to be provided to the student.
+
+        1. Immediately prior to storing the results hash
+
+        To handle the case where a student's submission (and award) were
+        stored after history was retrieved in &initialize_storage(), e.g.,
+        if a student submitted answers in quick succession (e.g., from
+        multiple tabs).  &Apache::inputtags::hidealldata() is called for
+        any parts with out-of-order storage (i.e., correct then incorrect,
+        where awarded >= 1 when correct).
+
+        2. Immediately after storing the results hash
+
+        To handle the case where lond on the student's homeserver returns
+        delay:N -- where N is the number of transactions between the last
+        retrieved in &initialize_storage() and the last stored immediately
+        before permanent storage of the current transaction via
+        lond::store_handler().  &Apache::grades::makehidden() is called
+        for any parts with out-of-order storage (i.e., correct then incorrect,
+        where awarded >= 1 when correct).
+
+	Will call &store_aggregates() to increment totals for attempts, 
+	students, and corrects, if running user has student role.
 	
 =cut
 
@@ -874,8 +1049,92 @@
 					      $namespace,'',$domain,$name);
 	    &Apache::lonxml::debug('Construct Store return message:'.$result);
 	} else {
+            my ($laststore,$checkedparts, at parts,%postcorrect);
+            if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&
+                (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&
+                (!defined($env{'form.grade_courseid'}))) {
+                if ($Apache::lonhomework::history{'version'}) {
+                    $laststore = $Apache::lonhomework::history{'version'}.'='.
+                                 $Apache::lonhomework::history{'timestamp'};
+                } else {
+                    $laststore = '0=0';
+                }
+                my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
+                if ($record{'version'}) {
+                    my ($newversion,$oldversion,$oldtimestamp);
+                    if ($Apache::lonhomework::history{'version'}) {
+                        $oldversion = $Apache::lonhomework::history{'version'};
+                        $oldtimestamp = $Apache::lonhomework::history{'timestamp'};
+                    } else {
+                        $oldversion = 0;
+                        $oldtimestamp = 0;
+                    }
+                    if ($record{'version'} > $oldversion) {
+                        if ($record{'timestamp'} >= $oldtimestamp) {
+                            $laststore = $record{'version'}.'='.$record{'timestamp'};
+                            $newversion = $record{'version'} + 1;
+                            $checkedparts = 1;
+                            foreach my $key (keys(%Apache::lonhomework::results)) {
+                                if ($key =~ /^resource\.([^\.]+)\.solved$/) {
+                                    my $part = $1;
+                                    if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') {
+                                        push(@parts,$part);
+                                    }
+                                }
+                            }
+                            if (@parts) {
+                                my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name,
+                                                                               \%record,\@parts,$newversion,
+                                                                               $oldversion);
+                                if (@parts_to_hide) {
+                                    foreach my $part (@parts_to_hide) {
+                                        $postcorrect{$part} = 1;
+                                        &Apache::inputtags::hidealldata($part);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
 	    $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
-					    $symb,$courseid,$domain,$name);
+					    $symb,$courseid,$domain,$name,$laststore);
+            if ($result =~ /^delay\:(\d+)$/) {
+                my $numtrans = $1;
+                my ($oldversion) = split(/=/,$laststore);
+                if ($numtrans) {
+                    my $newversion = $oldversion + 1 + $numtrans;
+                    my @possparts;
+                    if ($checkedparts) {
+                        foreach my $part (@parts) {
+                            unless ($postcorrect{$part}) {
+                                push(@possparts,$part);
+                            }
+                        }
+                    } else {
+                        foreach my $key (keys(%Apache::lonhomework::results)) {
+                            if ($key =~ /^resource\.([^\.]+)\.solved$/) {
+                                my $part = $1;
+                                unless ($postcorrect{$part}) {
+                                    if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') {
+                                        push(@possparts,$part);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    if (@possparts) {
+                        my %newrecord = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
+                        my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name,
+                                                                       \%newrecord,\@possparts,$newversion,
+                                                                       $oldversion);
+                        if (@parts_to_hide) {
+                            my $partslist = join(',', at parts_to_hide);
+                            &Apache::grades::makehidden($newversion,$partslist,\%newrecord,$symb,$domain,$name,1);
+                        }
+                    }
+                }
+            }
 	    &Apache::lonxml::debug('Store return message:'.$result);
             &store_aggregates($symb,$courseid);
 	}
@@ -887,6 +1146,62 @@
 
 =pod
 
+=item check_correctness_changes()
+
+        For all parts for which current results contain a solved status
+        of "incorrect_attempted", check if there was a transaction in which
+        solved was set to "correct_by_student" in the time since the last
+        transaction (retrieved when &initialize_storage() was called i.e.,
+        when &start_problem() was called), unless:
+        (a) questiontype parameter is set to survey or anonymous survey (+/- credit)
+        (b) problemstatus is set to no or no_feedback_ever
+        If such a transaction exists, and did not occur after "reset status"
+        by a user with grading privileges, then the current transaction is an
+        example of an out-of-order transaction (i.e., incorrect occurring after
+        correct).  Accordingly, the current transaction should be hidden.
+
+=cut
+
+
+sub check_correctness_changes {
+    my ($symb,$courseid,$domain,$name,$record,$parts,$newversion,$oldversion) = @_;
+    my @parts_to_hide;
+    unless ((ref($record) eq 'HASH') && (ref($parts) eq 'ARRAY')) {
+        return @parts_to_hide;
+    }
+    if (@{$parts}) {
+        my $usec;
+        if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&
+            ($env{'request.course.id'} eq $courseid)) {
+            $usec = $env{'request.course.sec'};
+        } else {
+            $usec = &Apache::lonnet::getsection($domain,$name,$courseid);
+        }
+        foreach my $id (@{$parts}) {
+            next if (($Apache::lonhomework::results{'resource.'.$id.'.type'} =~ /survey/) ||
+                     (&Apache::lonnet::EXT("resource.$id.problemstatus",$symb,
+                                           $domain,$name,$usec,undef,$courseid) =~ /^no/));
+            my $reset;
+            for (my $i=$newversion-1; $i>=$oldversion; $i--) {
+                if (($record->{$i.':resource.'.$id.'.regrader'}) &&
+                    ($record->{$i.':resource.'.$id.'.tries'} eq '') &&
+                    ($record->{$i.':resource.'.$id.'.award'} eq '')) {
+                    $reset = 1;
+                } elsif (($record->{$i.":resource.$id.solved"} eq 'correct_by_student') &&
+                         ($record->{$i.":resource.$id.awarded"} >= 1)) {
+                    unless ($reset) {
+                        push(@parts_to_hide,$id);
+                        last;
+                    }
+                }
+            }
+        }
+    }
+    return @parts_to_hide;
+}
+
+=pod
+
 item store_aggregates()
 
 	Sends hash of values to be incremented in nohist_resourcetracker.db
@@ -949,7 +1264,7 @@
             }
         }
     }
-    if (keys (%aggregate) > 0) {
+    if (keys(%aggregate) > 0) {
 	&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
                             $cdomain,$cname);
     }
@@ -1063,6 +1378,8 @@
     undef($Apache::inputtags::part);
     if ($type eq 'Task') {
         undef($Apache::inputtags::slot_name);
+    } elsif ($type eq 'problem') {
+        undef($Apache::lonhomework::rawrndseed);
     }
 #don't undef this, lonhomework.pm takes care of this, we use this to 
 #detect if we try to do 2 problems in one file
@@ -1164,7 +1481,7 @@
     my $resource_due;
 
     my $name= &get_resource_name($parstack,$safeeval);
-    my ($result,$form_tag_start,$slot_name,$slot);
+    my ($result,$form_tag_start,$slot_name,$slot,$probpartlist);
 
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
         $target eq 'tex') {
@@ -1180,9 +1497,18 @@
 
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
 	|| $target eq 'edit') {
-	($result,$form_tag_start) =
+	($result,$form_tag_start,$probpartlist) =
 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
 			$name);
+    } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) {
+        my ($symb)= &Apache::lonnet::whichuser();
+        my $navmap = Apache::lonnavmaps::navmap->new();
+        if (ref($navmap)) {
+            my $res = $navmap->getBySymb($symb);
+            if (ref($res)) {
+                $probpartlist = $res->parts();
+            }
+        }
     }
 
     if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
@@ -1192,7 +1518,20 @@
 	$target eq 'tex') {
 
 	#handle rand seed in construction space
-	my $rndseed=&setup_rndseed($safeeval,$target);
+	my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);
+        if (($target eq 'grade') && &Apache::response::submitted()) {
+            if ($Apache::lonhomework::type eq 'randomizetry') {
+                $Apache::lonhomework::results{'resource.0.rndseed'}=$rndseed;
+            } else {
+                my @parts;
+                if (ref($probpartlist) eq 'ARRAY') {
+                    @parts = @{$probpartlist};
+                }
+                unless (@parts) {
+                    $Apache::lonhomework::results{'resource.0.rndseed'}=$Apache::lonhomework::rawrndseed;
+                }
+            }
+        }
 	my ($symb)=&Apache::lonnet::whichuser();
 
 	if ($env{'request.state'} ne "construct" && 
@@ -1400,7 +1739,7 @@
 	my $id = $Apache::inputtags::part;
 	my $weight = &Apache::lonnet::EXT("resource.$id.weight");
 	my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
-	my @packages = split /,/,$packages;
+	my @packages = split(/,/,$packages);
 	my $allow_print_points = 0;
 	foreach my $partial_key (@packages) {
 	    if ($partial_key=~m/^part_0$/) {
@@ -2134,8 +2473,8 @@
                     }
                 }
             }
-	    for(0 .. $show) {
-		$bodytext .= "$randomlist[ $idx_arr[$_] ]";
+	    for my $i (0 .. $show) {
+		$bodytext .= "$randomlist[ $idx_arr[$i] ]";
 	    }
 	    &Apache::lonxml::newparser($parser,\$bodytext);
 	}
@@ -2249,6 +2588,14 @@
     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
     my $newtype=&Apache::lonnet::EXT("resource.$id.type");
     if ($newtype) { $Apache::lonhomework::type=$newtype; }
+    if ($Apache::lonhomework::type eq 'randomizetry') {
+        my $rndseed=&setup_rndseed($safeeval,$target);
+        if (($target eq 'grade') && &Apache::response::submitted()) {
+            $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed;
+        }
+    } elsif (($target eq 'grade') && &Apache::response::submitted()) {
+        $Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed;
+    }
     my $in_order_show=&ordered_show_check();
     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
@@ -2299,7 +2646,7 @@
 		    }
 		    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
 		    my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');
-		    my @allkeys = split /,/,$allkeys;
+		    my @allkeys = split(/,/,$allkeys);
 		    my $allow_print_points = 0;
 		    foreach my $partial_key (@allkeys) {
 			if ($partial_key=~m/^part_(.*)$/) {


More information about the LON-CAPA-cvs mailing list