[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--