--- loncom/homework/bridgetask.pm 2006/06/13 15:45:54 1.168 +++ loncom/homework/bridgetask.pm 2006/06/13 20:28:49 1.169 @@ -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 @@ BEGIN { &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 only) @@ -59,7 +59,7 @@ sub initialize_bridgetask { @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 @@ sub start_Dimension { 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 @@ sub start_QuestionText { 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 @@ 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_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 @@ sub get_instance { 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_instance { } } +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 @@ sub get_instance { 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 @@ sub get_instance { 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 @@ sub get_instance { 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 @@ sub get_instance { '

' .$mandatory.' Criteria

'; @Apache::scripttag::parser_env = @_; - $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'criteria.'.$id}); + $result.=&Apache::scripttag::xmlparse($dimension{$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"}).'

'; + if ($comment) { + $result.='

'. + &mt('Comment: [_1]',$comment).'

'; } $result.='
'; } @@ -2087,21 +2108,25 @@ sub get_instance { } 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.='
'."\n". '
'."\n"; @Apache::scripttag::parser_env = @_; - $result.=&Apache::scripttag::xmlparse($dimension_info{$dim}{'criteria.'.$id}); + $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'criteria.'.$id}); $result.='
'."\n". - #$dimension_info{$dim}{'criteria.'.$id}. + #$dimension{$dim}{'criteria.'.$id}. '
'."\n". ''."\n". ''."\n". @@ -2109,7 +2134,7 @@ sub get_instance { ''."\n". '
'."\n". ''."\n". '