--- loncom/homework/bridgetask.pm 2006/06/12 23:17:56 1.167 +++ loncom/homework/bridgetask.pm 2006/06/13 15:45:54 1.168 @@ -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 @@ BEGIN { &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 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 @@ DONEBUTTON 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 @@ DONEBUTTON 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 @@ DONEBUTTON 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 @@ sub end_ClosingParagraph { 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 @@ sub get_id { 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 @@ sub get_instance { $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 @@ sub get_instance { 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 @@ sub get_instance { 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 @@ sub get_instance { 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 @@ sub get_instance { } 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 @@ sub get_instance { 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 @@ sub get_instance { '

' .$mandatory.' Criteria

'; @Apache::scripttag::parser_env = @_; - $result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id}); + $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'criteria.'.$id}); $result.='

'.$status_display.'

'; if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}) { $result.='

'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'

'; @@ -2080,21 +2087,21 @@ sub get_instance { } 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.='
'."\n". '
'."\n"; @Apache::scripttag::parser_env = @_; - $result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id}); + $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'criteria.'.$id}); $result.='
'."\n". - #$dimension{'criteria.'.$id}. + #$dimension_info{$dim}{'criteria.'.$id}. '
'."\n". ''."\n". ''."\n". @@ -2119,18 +2126,18 @@ sub get_instance { 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 @@ sub get_instance { } } # FIXME optional required can apply to only 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 @@ sub get_instance { 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 @@ sub get_instance { 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 grading_history { 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 end_IntroParagraph { 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 end_Instance { 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 @@ sub start_Criteria { 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 '';