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

albertel lon-capa-cvs@mail.lon-capa.org
Tue, 13 Jun 2006 15:45:55 -0000


This is a MIME encoded message

--albertel1150213555
Content-Type: text/plain

albertel		Tue Jun 13 11:45:55 2006 EDT

  Modified files:              
    /loncom/homework	bridgetask.pm 
  Log:
  - starting work on nesting <Dimension>s
  
  
--albertel1150213555
Content-Type: text/plain
Content-Disposition: attachment; filename="albertel-20060613114555.txt"

Index: loncom/homework/bridgetask.pm
diff -u loncom/homework/bridgetask.pm:1.167 loncom/homework/bridgetask.pm:1.168
--- loncom/homework/bridgetask.pm:1.167	Mon Jun 12 19:17:56 2006
+++ loncom/homework/bridgetask.pm	Tue Jun 13 11:45:54 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: bridgetask.pm,v 1.167 2006/06/12 23:17:56 albertel Exp $
+# $Id: bridgetask.pm,v 1.168 2006/06/13 15:45:54 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -46,20 +46,20 @@
     &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','QuestionText','Setup','Instance','InstanceText','Criteria','ClosingParagraph'));
 }
 
+my %dimension_info;
 sub initialize_bridgetask {
     # id of current Dimension, 0 means that no dimension is current 
     # (inside <Task> only)
-    $Apache::bridgetask::dimension='';
+    %Apache::bridgetask::dimension=();
     # list of all Dimension ids seen
-    @Apache::bridgetask::dimensionlist=();
-    # mandatory attribute of all Dimensions seen
-    %Apache::bridgetask::dimensionmandatory=();
+    %Apache::bridgetask::top_dimensionlist=();
     # list of all current Instance ids
-    @Apache::bridgetask::instance=();
+    %Apache::bridgetask::instance=();
     # list of all Instance ids seen in this problem
     @Apache::bridgetask::instancelist=();
     # key of queud user data that we are currently grading
     $Apache::bridgetask::queue_key='';
+    undef(%dimension_info);
 }
 
 sub proctor_check_auth {
@@ -971,11 +971,11 @@
 		    my $man_count=0;
 		    my $opt_count=0;
 		    my $opt_passed=0;
-		    foreach my $dim_id (@Apache::bridgetask::dimensionlist) {
-			if ($Apache::bridgetask::dimensionmandatory{$dim_id}
+		    foreach my $dim (keys(%Apache::bridgetask::top_dimensionlist)) {
+			if ($Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'}
 			    eq 'N') {
 			    $opt_count++;
-			    if ($Apache::lonhomework::history{"resource.$version.0.$dim_id.status"} eq 'pass') {
+			    if ($Apache::lonhomework::history{"resource.$version.0.$dim.status"} eq 'pass') {
 				$opt_passed++;
 			    }
 			} else {
@@ -1046,11 +1046,11 @@
 	    my $ungraded=0;
 	    my $review=0;   
 	    &Apache::lonhomework::showhash(%Apache::lonhomework::results);
-	    foreach my $dim_id (@Apache::bridgetask::dimensionlist) {
+	    foreach my $dim (keys(%Apache::bridgetask::top_dimensionlist)) {
 		my $status=
-		    $Apache::lonhomework::results{"resource.$version.0.$dim_id.status"};
+		    $Apache::lonhomework::results{"resource.$version.0.$dim.status"};
 		my $mandatory=
-		    ($Apache::bridgetask::dimensionmandatory{$dim_id} ne 'N');
+		    ($Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'} ne 'N');
 		if ($status eq 'pass') {
 		    if (!$mandatory) { $optional_passed++; }
 		} elsif ($status eq 'fail') {
@@ -1066,7 +1066,7 @@
 	    if ($optional_passed < $optional_required) {
 		$mandatory_failed++;
 	    }
-	    &Apache::lonxml::debug("all dim ".join(':',@Apache::bridgetask::dimensionlist)."results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
+	    &Apache::lonxml::debug("all dim ".join(':',keys(%Apache::bridgetask::top_dimensionlist))."results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
 	    $Apache::lonhomework::results{'resource.0.regrader'}=
 		$env{'user.name'}.':'.$env{'user.domain'};
 	    if ($review) {
@@ -1888,6 +1888,10 @@
     return $result;
 }
 
+sub get_dim_id {
+    return $Apache::bridgetask::dimension[-1];
+}
+
 sub get_id {
     my ($parstack,$safeeval)=@_;
     my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval);
@@ -1895,36 +1899,39 @@
     return $id;
 }
 
-my %dimension;
 sub start_Setup {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-    undef(%dimension);
-    my $dim_id=&get_id($parstack,$safeeval);
-    $Apache::bridgetask::dimension=$dim_id;
-    undef(@Apache::bridgetask::instance);
+    #undef(%dimension);
+    my $dim = &get_id($parstack,$safeeval);
+    push(@Apache::bridgetask::dimension,$dim);
     &Apache::lonxml::startredirection();
-    return &internal_location($dim_id);
+    return &internal_location($dim);
 }
 sub start_Question { return &start_Dimension(@_); }
 sub start_Dimension {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-    undef(%dimension);
-    my $dim_id=&get_id($parstack,$safeeval);
-    $Apache::bridgetask::dimension=$dim_id;
-    push(@Apache::bridgetask::dimensionlist,$dim_id);
-    undef(@Apache::bridgetask::instance);
-    $Apache::bridgetask::dimensionmandatory{$dim_id}=
-	&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
+    my $dim = &get_id($parstack,$safeeval);
+    my $previous_dim;
+    if (@Apache::bridgetask::dimension) {
+	$previous_dim = $Apache::bridgetask::dimension[-1];
+	push(@{$Apache::bridgetask::dimension{$previous_dim}{'contains'}},
+	     $dim);
+	# FIXME need to add as a 'criteria' for nesting
+    } else {
+	$Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'}=
+	    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
+    }
+    push(@Apache::bridgetask::dimension,$dim);
     &Apache::lonxml::startredirection();
-    return &internal_location($dim_id);
+    return &internal_location($dim);
 }
 
 sub start_QuestionText {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
-    my $dim_id=$Apache::bridgetask::dimension;
+    my $dim = &get_dim_id();
     my $text=&Apache::lonxml::get_all_text('/questiontext',$parser,$style);
     if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
-	$dimension{'questiontext'}=$text;
+	$dimension_info{$dim}{'questiontext'}=$text;
     }
     return '';
 }
@@ -1940,7 +1947,7 @@
 	$rand_alg eq '64bit2' || $rand_alg eq '64bit3' ||
 	$rand_alg eq '64bit4' ) {
 	&Apache::response::pushrandomnumber();
-	my @order=&Math::Random::random_permutation(@{$dimension{'instances'}});
+	my @order=&Math::Random::random_permutation(@{$dimension_info{$dim}{'instances'}});
 	my $num=@order;
 	my $version=&get_version();
 	my $which=($version-1)%$num;
@@ -1952,10 +1959,10 @@
 	if (defined($instance)) { return $instance; }
 
 	&Apache::response::pushrandomnumber();
-	my @instances = @{$dimension{'instances'}};
+	my @instances = @{$dimension_info{$dim}{'instances'}};
 	# remove disabled instances
 	for (my $i=0; $i < $#instances; $i++) {
-	    if ($dimension{$instances[$i].'.disabled'}) {
+	    if ($dimension_info{$dim}{$instances[$i].'.disabled'}) {
 		splice(@instances,$i,1);
 		$i--;
 	    }
@@ -1988,17 +1995,17 @@
 	my $version=&get_version();
 	if ($target eq 'web') {
 	    @Apache::scripttag::parser_env = @_;
-	    $result.=&Apache::scripttag::xmlparse($dimension{'intro'});
+	    $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
 	    my @instances = $instance;
 	    if (&Apache::response::showallfoils()) {
-		@instances = @{$dimension{'instances'}};
+		@instances = @{$dimension_info{$dim}{'instances'}};
 	    }
 	    my $shown_question_text;
 	    foreach my $instance (@instances) {
 		@Apache::scripttag::parser_env = @_;
-		$result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});
+		$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
 		@Apache::scripttag::parser_env = @_;
-		$result.=&Apache::scripttag::xmlparse($dimension{'questiontext'});
+		$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
 		if ($Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass' ||
 		    $Apache::lonhomework::history{"resource.$version.0.status"} eq 'fail') {
 
@@ -2018,9 +2025,9 @@
 		    my $man_passed=0;
 		    my $opt_count=0;
 		    my $opt_passed=0;
-		    foreach my $id ( @{$dimension{$instance.'.criterias'}},
-				     @{$dimension{'criterias'}} ) {
-			if ($dimension{'criteria.'.$id.'.mandatory'} 
+		    foreach my $id ( @{$dimension_info{$dim}{$instance.'.criterias'}},
+				     @{$dimension_info{$dim}{'criterias'}} ) {
+			if ($dimension_info{$dim}{'criteria.'.$id.'.mandatory'} 
 			    eq 'N') {
 			    $opt_count++;
 			    if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"} eq 'pass') {
@@ -2035,7 +2042,7 @@
 		    }
 		    if ($man_passed eq $man_count) { $man_passed='all'; }
 
-		    my $opt_req=$dimension{$instance.'.optionalrequired'};
+		    my $opt_req=$dimension_info{$dim}{$instance.'.optionalrequired'};
 		    if ($opt_req !~ /\S/) {
 			$opt_req=
 			    &Apache::lonxml::get_param('OptionalRequired',
@@ -2047,11 +2054,11 @@
 		    my $internal_location=&internal_location($dim);
 		    $result=~s/\Q$internal_location\E/$dim_info/;
 
-		    foreach my $id (@{$dimension{$instance.'.criterias'}},
-				    @{$dimension{'criterias'}}) {
+		    foreach my $id (@{$dimension_info{$dim}{$instance.'.criterias'}},
+				    @{$dimension_info{$dim}{'criterias'}}) {
 			my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
 			my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"};
-			my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N');
+			my $mandatory=($dimension_info{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
 			if ($mandatory) {
 			    $mandatory='Mandatory';
 			} else {
@@ -2068,7 +2075,7 @@
 			    '<div class="LC_'.$status.' LC_criteria"><h4>'
 			    .$mandatory.' Criteria</h4><p>';
 			@Apache::scripttag::parser_env = @_;
-			$result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id});
+			$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'criteria.'.$id});
 			$result.='</p><p class="LC_grade">'.$status_display.'</p>';
 			if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}) {
 			    $result.='<p class="LC_comment">'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'</p>';
@@ -2080,21 +2087,21 @@
 	} elsif ($target eq 'webgrade') {
 	    # in case of any side effects that we need
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension{'intro'});
+	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension{$instance.'.text'});
+	    &Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension{'questiontext'});
-	    foreach my $id (@{$dimension{$instance.'.criterias'}},
-			    @{$dimension{'criterias'}} ) {
+	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
+	    foreach my $id (@{$dimension_info{$dim}{$instance.'.criterias'}},
+			    @{$dimension_info{$dim}{'criterias'}} ) {
 		my $link=&link($id);
 		my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
 		$result.='<div class="LC_GRADING_criteria" id="'.$link.'">'."\n".
 		    '<div class="LC_GRADING_criteriatext" id="next_'.$last_link.'">'."\n";
 		@Apache::scripttag::parser_env = @_;
-		$result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id});
+		$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'criteria.'.$id});
 		$result.='</div>'."\n".
-		    #$dimension{'criteria.'.$id}.
+		    #$dimension_info{$dim}{'criteria.'.$id}.
 		    '<div class="LC_GRADING_grade">'."\n".
 		    '<label class="LC_GRADING_ungraded"><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label>'."\n".
 		    '<label class="LC_GRADING_fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".
@@ -2119,18 +2126,18 @@
 	    my $review=0;
 
 	    @Apache::scripttag::parser_env = @_;
-	    $result.=&Apache::scripttag::xmlparse($dimension{'intro'});
+	    $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
 	    @Apache::scripttag::parser_env = @_;
-	    $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});
+	    $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension{'questiontext'});
+	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
 
-	    foreach my $id (@{$dimension{$instance.'.criterias'}},
-			    @{$dimension{'criterias'}}) {
+	    foreach my $id (@{$dimension_info{$dim}{$instance.'.criterias'}},
+			    @{$dimension_info{$dim}{'criterias'}}) {
 		my $link=&link($id);
 		my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$id.status"}=$env{'form.HWVAL_'.$link};
 		$Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
-		my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N');
+		my $mandatory=($dimension_info{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
 		if ($status eq 'pass') {
 		    if (!$mandatory) { $optional_passed++; }
 		} elsif ($status eq 'fail') {
@@ -2144,7 +2151,7 @@
 		}
 	    }
 	    # FIXME optional required can apply to only <instance> right now...
-	    my $opt_req=$dimension{$instance.'.optionalrequired'};
+	    my $opt_req=$dimension_info{$dim}{$instance.'.optionalrequired'};
 	    if ($opt_req !~ /\S/) {
 		$opt_req=
 		    &Apache::lonxml::get_param('OptionalRequired',
@@ -2154,7 +2161,7 @@
 	    if ($optional_passed < $opt_req) {
 		$mandatory_failed++;
 	    }
-	    &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
+	    &Apache::lonxml::debug("all instance ".join(':',@{$dimension_info{$dim}{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
 	    if ($review) {
 		$Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
 		    'review';
@@ -2183,26 +2190,26 @@
 	my $version=&get_version();
 	if ($target eq 'web') {
 	    @Apache::scripttag::parser_env = @_;
-	    $result.=&Apache::scripttag::xmlparse($dimension{'intro'});
+	    $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
 	    my @instances = $instance;
 	    if (&Apache::response::showallfoils()) {
-		@instances = @{$dimension{'instances'}};
+		@instances = @{$dimension_info{$dim}{'instances'}};
 	    }
 	    foreach my $instance (@instances) {
 		@Apache::scripttag::parser_env = @_;
-		$result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});
+		$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
 		@Apache::scripttag::parser_env = @_;
-		$result.=&Apache::scripttag::xmlparse($dimension{'questiontext'});
+		$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
 	    }
 	} elsif ($target eq 'webgrade' 
 		 || $target eq 'grade' && $env{'form.webgrade'}) {
 	    # in case of any side effects that we need
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension{'intro'});
+	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension{$instance.'.text'});
+	    &Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension{'questiontext'});
+	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
 	} else {
 	    # any other targets no output
 	    undef($result);
@@ -2246,9 +2253,10 @@
 sub start_IntroParagraph {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
+    my $dim = &get_dim_id();
     if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
 	if ($tagstack->[-2] eq 'Dimension' || $tagstack->[-2] eq 'Question' ) {
-	    $dimension{'intro'}=
+	    $dimension_info{$dim}{'intro'}=
 		&Apache::lonxml::get_all_text('/introparagraph',
 					      $parser,$style);
        	} elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
@@ -2268,15 +2276,16 @@
 
 sub start_Instance {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-    my $id=&get_id($parstack,$safeeval);
-    push(@{$dimension{'instances'}},$id);
-    push(@Apache::bridgetask::instance,$id);
+    my $dim = &get_dim_id();
+    my $id  = &get_id($parstack,$safeeval);
+    push(@{$dimension_info{$dim}{'instances'}},$id);
+    push(@{$Apache::bridgetask::instance{$dim}},$id);
     push(@Apache::bridgetask::instancelist,$id);
-    $dimension{$id.'.optionalrequired'}=
+    $dimension_info{$dim}{$id.'.optionalrequired'}=
 	&Apache::lonxml::get_param('OptionalRequired',$parstack,$safeeval);
     my $disabled = &Apache::lonxml::get_param('Disabled',$parstack,$safeeval);
     if (lc($disabled) eq 'yes') {
-	$dimension{$id.'.disabled'}='1';
+	$dimension_info{$dim}{$id.'.disabled'}='1';
     }
     return '';
 }
@@ -2286,10 +2295,11 @@
 
 sub start_InstanceText {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
-    my $instance_id=$Apache::bridgetask::instance[-1];
+    my $dim = &get_dim_id();
+    my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
     my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style);
     if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
-	$dimension{$instance_id.'.text'}=$text;
+	$dimension_info{$dim}{$instance_id.'.text'}=$text;
     }
     return '';
 }
@@ -2302,18 +2312,19 @@
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser,$style);
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {
+	my $dim = &get_dim_id();
 	my $id=&get_id($parstack,$safeeval);
 	if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {
-	    my $instance_id=$Apache::bridgetask::instance[-1];
-	    $dimension{"criteria.$instance_id.$id"}=$criteria;
-	    $dimension{"criteria.$instance_id.$id.mandatory"}=
+	    my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
+	    $dimension_info{$dim}{"criteria.$instance_id.$id"}=$criteria;
+	    $dimension_info{$dim}{"criteria.$instance_id.$id.mandatory"}=
 		&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
-	    push(@{$dimension{$instance_id.'.criterias'}},"$instance_id.$id");
+	    push(@{$dimension_info{$dim}{$instance_id.'.criterias'}},"$instance_id.$id");
 	} else {
-	    $dimension{'criteria.'.$id}=$criteria;
-	    $dimension{'criteria.'.$id.'.mandatory'}=
+	    $dimension_info{$dim}{'criteria.'.$id}=$criteria;
+	    $dimension_info{$dim}{'criteria.'.$id.'.mandatory'}=
 		&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
-	    push(@{$dimension{'criterias'}},$id);
+	    push(@{$dimension_info{$dim}{'criterias'}},$id);
 	}
     }
     return '';

--albertel1150213555--