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

albertel lon-capa-cvs@mail.lon-capa.org
Tue, 13 Jun 2006 20:28:49 -0000


This is a MIME encoded message

--albertel1150230529
Content-Type: text/plain

albertel		Tue Jun 13 16:28:49 2006 EDT

  Modified files:              
    /loncom/homework	bridgetask.pm 
  Log:
  - nested <Dimension>s almost working, placement of output is not yet correct
  
  
--albertel1150230529
Content-Type: text/plain
Content-Disposition: attachment; filename="albertel-20060613162849.txt"

Index: loncom/homework/bridgetask.pm
diff -u loncom/homework/bridgetask.pm:1.168 loncom/homework/bridgetask.pm:1.169
--- loncom/homework/bridgetask.pm:1.168	Tue Jun 13 11:45:54 2006
+++ loncom/homework/bridgetask.pm	Tue Jun 13 16:28:49 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.168 2006/06/13 15:45:54 albertel Exp $
+# $Id: bridgetask.pm,v 1.169 2006/06/13 20:28:49 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -46,7 +46,7 @@
     &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','QuestionText','Setup','Instance','InstanceText','Criteria','ClosingParagraph'));
 }
 
-my %dimension_info;
+my %dimension;
 sub initialize_bridgetask {
     # id of current Dimension, 0 means that no dimension is current 
     # (inside <Task> only)
@@ -59,7 +59,7 @@
     @Apache::bridgetask::instancelist=();
     # key of queud user data that we are currently grading
     $Apache::bridgetask::queue_key='';
-    undef(%dimension_info);
+    undef(%dimension);
 }
 
 sub proctor_check_auth {
@@ -1917,6 +1917,11 @@
 	push(@{$Apache::bridgetask::dimension{$previous_dim}{'contains'}},
 	     $dim);
 	# FIXME need to add as a 'criteria' for nesting
+	$dimension{$previous_dim}{'criteria.'.$dim}='';
+	$dimension{$previous_dim}{'criteria.'.$dim.'.type'}='dimension';
+	$dimension{$previous_dim}{'criteria.'.$dim.'.mandatory'}=
+	    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
+	push(@{$dimension{$previous_dim}{'criterias'}},$dim);
     } else {
 	$Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'}=
 	    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
@@ -1931,7 +1936,7 @@
     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_info{$dim}{'questiontext'}=$text;
+	$dimension{$dim}{'questiontext'}=$text;
     }
     return '';
 }
@@ -1947,7 +1952,7 @@
 	$rand_alg eq '64bit2' || $rand_alg eq '64bit3' ||
 	$rand_alg eq '64bit4' ) {
 	&Apache::response::pushrandomnumber();
-	my @order=&Math::Random::random_permutation(@{$dimension_info{$dim}{'instances'}});
+	my @order=&Math::Random::random_permutation(@{$dimension{$dim}{'instances'}});
 	my $num=@order;
 	my $version=&get_version();
 	my $which=($version-1)%$num;
@@ -1959,10 +1964,10 @@
 	if (defined($instance)) { return $instance; }
 
 	&Apache::response::pushrandomnumber();
-	my @instances = @{$dimension_info{$dim}{'instances'}};
+	my @instances = @{$dimension{$dim}{'instances'}};
 	# remove disabled instances
 	for (my $i=0; $i < $#instances; $i++) {
-	    if ($dimension_info{$dim}{$instances[$i].'.disabled'}) {
+	    if ($dimension{$dim}{$instances[$i].'.disabled'}) {
 		splice(@instances,$i,1);
 		$i--;
 	    }
@@ -1979,6 +1984,18 @@
     }
 }
 
+sub get_criteria {
+    my ($what,$version,$dim,$id) = @_;
+    my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+    my $prefix = ($type eq 'criteria') ? "$dim.$id"
+	                               : "$id";
+    my $entry = "resource.$version.0.$prefix.$what";
+    if (exists($Apache::lonhomework::results{$entry})) {
+	return $Apache::lonhomework::results{$entry};
+    }
+    return $Apache::lonhomework::history{$entry};
+}
+
 {
     my $last_link;
     sub link {
@@ -1995,19 +2012,21 @@
 	my $version=&get_version();
 	if ($target eq 'web') {
 	    @Apache::scripttag::parser_env = @_;
-	    $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
+	    $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
 	    my @instances = $instance;
 	    if (&Apache::response::showallfoils()) {
-		@instances = @{$dimension_info{$dim}{'instances'}};
+		@instances = @{$dimension{$dim}{'instances'}};
 	    }
 	    my $shown_question_text;
 	    foreach my $instance (@instances) {
 		@Apache::scripttag::parser_env = @_;
-		$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
+		$result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
 		@Apache::scripttag::parser_env = @_;
-		$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') {
+		$result.=&Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
+
+		my $task_status = 
+		    $Apache::lonhomework::history{"resource.$version.0.status"};
+		if ($task_status eq 'pass' || $task_status eq 'fail') {
 
 		    my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
 		    my $mandatory='Mandatory';
@@ -2025,24 +2044,21 @@
 		    my $man_passed=0;
 		    my $opt_count=0;
 		    my $opt_passed=0;
-		    foreach my $id ( @{$dimension_info{$dim}{$instance.'.criterias'}},
-				     @{$dimension_info{$dim}{'criterias'}} ) {
-			if ($dimension_info{$dim}{'criteria.'.$id.'.mandatory'} 
+		    foreach my $id ( @{$dimension{$dim}{$instance.'.criterias'}},
+				     @{$dimension{$dim}{'criterias'}} ) {
+			my $status = &get_criteria('status',$version,$dim,$id);
+			if ($dimension{$dim}{'criteria.'.$id.'.mandatory'} 
 			    eq 'N') {
 			    $opt_count++;
-			    if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"} eq 'pass') {
-				$opt_passed++;
-			    }
+			    if ($status eq 'pass') { $opt_passed++; }
 			} else {
 			    $man_count++;
-			    if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
-				$man_passed++;
-			    }
+			    if ($status eq 'pass') { $man_passed++; }
 			}
 		    }
 		    if ($man_passed eq $man_count) { $man_passed='all'; }
 
-		    my $opt_req=$dimension_info{$dim}{$instance.'.optionalrequired'};
+		    my $opt_req=$dimension{$dim}{$instance.'.optionalrequired'};
 		    if ($opt_req !~ /\S/) {
 			$opt_req=
 			    &Apache::lonxml::get_param('OptionalRequired',
@@ -2054,11 +2070,15 @@
 		    my $internal_location=&internal_location($dim);
 		    $result=~s/\Q$internal_location\E/$dim_info/;
 
-		    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_info{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
+		    foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+				    @{$dimension{$dim}{'criterias'}}) {
+			# FIXME need to collect the dimension style criteria 
+			# and output them here.
+			my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+			next if ($type eq 'dimension');
+			my $status= &get_criteria('status', $version,$dim,$id);
+			my $comment=&get_criteria('comment',$version,$dim,$id);
+			my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
 			if ($mandatory) {
 			    $mandatory='Mandatory';
 			} else {
@@ -2075,10 +2095,11 @@
 			    '<div class="LC_'.$status.' LC_criteria"><h4>'
 			    .$mandatory.' Criteria</h4><p>';
 			@Apache::scripttag::parser_env = @_;
-			$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'criteria.'.$id});
+			$result.=&Apache::scripttag::xmlparse($dimension{$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>';
+			if ($comment) {
+			    $result.='<p class="LC_comment">'.
+				&mt('Comment: [_1]',$comment).'</p>';
 			}
 			$result.='</div>';
 		    }
@@ -2087,21 +2108,25 @@
 	} elsif ($target eq 'webgrade') {
 	    # in case of any side effects that we need
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
+	    &Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
+	    &Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
-	    foreach my $id (@{$dimension_info{$dim}{$instance.'.criterias'}},
-			    @{$dimension_info{$dim}{'criterias'}} ) {
+	    &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
+	    foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+			    @{$dimension{$dim}{'criterias'}} ) {
+		# dimensional 'criteria' don't get assigned grades
+		my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+		next if ($type eq 'dimension');
+
 		my $link=&link($id);
-		my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
+		my $status= &get_criteria('status',$version,$dim,$id);
 		$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_info{$dim}{'criteria.'.$id});
+		$result.=&Apache::scripttag::xmlparse($dimension{$dim}{'criteria.'.$id});
 		$result.='</div>'."\n".
-		    #$dimension_info{$dim}{'criteria.'.$id}.
+		    #$dimension{$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".
@@ -2109,7 +2134,7 @@
 		    '<label class="LC_GRADING_review"><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label>'."\n".
 		    '</div>'."\n".
 		    '<label class="LC_GRADING_comment">'.&mt('Additional Comment for Student')."\n".
-		    '<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'</textarea>'."\n".
+		    '<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode(&get_criteria('comment',$version,$dim,$id),'<>"&').'</textarea>'."\n".
 		    '</label>'."\n".
 		    '<ul class="LC_GRADING_navbuttons">'."\n".
 		    '<li><a href="#'.$last_link.'">Prev</a></li>'."\n".
@@ -2126,18 +2151,25 @@
 	    my $review=0;
 
 	    @Apache::scripttag::parser_env = @_;
-	    $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
+	    $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
 	    @Apache::scripttag::parser_env = @_;
-	    $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
+	    $result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
+	    &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
 
-	    foreach my $id (@{$dimension_info{$dim}{$instance.'.criterias'}},
-			    @{$dimension_info{$dim}{'criterias'}}) {
+	    foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+			    @{$dimension{$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_info{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
+
+		my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+		if ($type eq 'criteria') {
+		    # dimensional 'criteria' don't get assigned grades
+		    $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 $status= &get_criteria('status',$version,$dim,$id);
+
+		my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
 		if ($status eq 'pass') {
 		    if (!$mandatory) { $optional_passed++; }
 		} elsif ($status eq 'fail') {
@@ -2151,7 +2183,7 @@
 		}
 	    }
 	    # FIXME optional required can apply to only <instance> right now...
-	    my $opt_req=$dimension_info{$dim}{$instance.'.optionalrequired'};
+	    my $opt_req=$dimension{$dim}{$instance.'.optionalrequired'};
 	    if ($opt_req !~ /\S/) {
 		$opt_req=
 		    &Apache::lonxml::get_param('OptionalRequired',
@@ -2161,7 +2193,7 @@
 	    if ($optional_passed < $opt_req) {
 		$mandatory_failed++;
 	    }
-	    &Apache::lonxml::debug("all instance ".join(':',@{$dimension_info{$dim}{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
+	    &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$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';
@@ -2179,6 +2211,7 @@
 	    # any other targets no output
 	    undef($result);
 	}
+	pop(@Apache::bridgetask::dimension);
 	return $result;
     }
 
@@ -2190,30 +2223,31 @@
 	my $version=&get_version();
 	if ($target eq 'web') {
 	    @Apache::scripttag::parser_env = @_;
-	    $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'intro'});
+	    $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
 	    my @instances = $instance;
 	    if (&Apache::response::showallfoils()) {
-		@instances = @{$dimension_info{$dim}{'instances'}};
+		@instances = @{$dimension{$dim}{'instances'}};
 	    }
 	    foreach my $instance (@instances) {
 		@Apache::scripttag::parser_env = @_;
-		$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
+		$result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
 		@Apache::scripttag::parser_env = @_;
-		$result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
+		$result.=&Apache::scripttag::xmlparse($dimension{$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_info{$dim}{'intro'});
+	    &Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension_info{$dim}{$instance.'.text'});
+	    &Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
 	    @Apache::scripttag::parser_env = @_;
-	    &Apache::scripttag::xmlparse($dimension_info{$dim}{'questiontext'});
+	    &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
 	} else {
 	    # any other targets no output
 	    undef($result);
 	}
+	pop(@Apache::bridgetask::dimension);
 	return $result;
     }
 }
@@ -2256,7 +2290,7 @@
     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_info{$dim}{'intro'}=
+	    $dimension{$dim}{'intro'}=
 		&Apache::lonxml::get_all_text('/introparagraph',
 					      $parser,$style);
        	} elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
@@ -2278,14 +2312,14 @@
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $dim = &get_dim_id();
     my $id  = &get_id($parstack,$safeeval);
-    push(@{$dimension_info{$dim}{'instances'}},$id);
+    push(@{$dimension{$dim}{'instances'}},$id);
     push(@{$Apache::bridgetask::instance{$dim}},$id);
     push(@Apache::bridgetask::instancelist,$id);
-    $dimension_info{$dim}{$id.'.optionalrequired'}=
+    $dimension{$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_info{$dim}{$id.'.disabled'}='1';
+	$dimension{$dim}{$id.'.disabled'}='1';
     }
     return '';
 }
@@ -2299,7 +2333,7 @@
     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_info{$dim}{$instance_id.'.text'}=$text;
+	$dimension{$dim}{$instance_id.'.text'}=$text;
     }
     return '';
 }
@@ -2314,17 +2348,20 @@
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {
 	my $dim = &get_dim_id();
 	my $id=&get_id($parstack,$safeeval);
+	&Apache::lonxml::debug("Criteria $id with $dim");
 	if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {
 	    my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
-	    $dimension_info{$dim}{"criteria.$instance_id.$id"}=$criteria;
-	    $dimension_info{$dim}{"criteria.$instance_id.$id.mandatory"}=
+	    $dimension{$dim}{"criteria.$instance_id.$id"}=$criteria;
+	    $dimension{$dim}{"criteria.$instance_id.$id.type"}='criteria';
+	    $dimension{$dim}{"criteria.$instance_id.$id.mandatory"}=
 		&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
-	    push(@{$dimension_info{$dim}{$instance_id.'.criterias'}},"$instance_id.$id");
+	    push(@{$dimension{$dim}{$instance_id.'.criterias'}},"$instance_id.$id");
 	} else {
-	    $dimension_info{$dim}{'criteria.'.$id}=$criteria;
-	    $dimension_info{$dim}{'criteria.'.$id.'.mandatory'}=
+	    $dimension{$dim}{'criteria.'.$id}=$criteria;
+	    $dimension{$dim}{'criteria.'.$id.'.type'}='criteria';
+	    $dimension{$dim}{'criteria.'.$id.'.mandatory'}=
 		&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
-	    push(@{$dimension_info{$dim}{'criterias'}},$id);
+	    push(@{$dimension{$dim}{'criterias'}},$id);
 	}
     }
     return '';

--albertel1150230529--