--- loncom/interface/lonnavmaps.pm 2002/03/15 16:31:10 1.28 +++ loncom/interface/lonnavmaps.pm 2002/03/15 23:39:41 1.31 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.28 2002/03/15 16:31:10 albertel Exp $ +# $Id: lonnavmaps.pm,v 1.31 2002/03/15 23:39:41 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -178,10 +178,11 @@ sub parmval { # 1: not attempted # 2: attempted but wrong, or incorrect by instructor # 3: solved or correct by instructor -# "excused" needs to be supported, but is not yet. Could be code=4. +# 4: partially correct (one or more parts correct) +# "excused" needs to be supported, but is not yet. sub astatus { my $rid=shift; - my $code=1; + my $code=0; my $ctext=''; $rid=~/(\d+)\.(\d+)/; my $symb=&Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'. @@ -238,13 +239,14 @@ sub astatus { my $status=$returnhash{'resource.'.$_.'.solved'}; if ($status eq 'correct_by_student') { - unless ($code==2) { $code=3; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' solved'; } elsif ($status eq 'correct_by_override') { - unless ($code==2) { $code=3; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' override'; } elsif ($status eq 'incorrect_attempted') { - $code=2; + if ($code!=4 && $code!=3) { $code=2; } + if ($code==3) { $code=4; } $ctext.=' ('. ($returnhash{'resource.'.$_.'.tries'}? $returnhash{'resource.'.$_.'.tries'}:'0'); @@ -252,105 +254,120 @@ sub astatus { if ($numtries) { $ctext.='/'.$numtries.' tries'; } $ctext.=')'; } elsif ($status eq 'incorrect_by_override') { - $code=2; + if ($code!=4 && $code!=3) { $code=2; } + if ($code==3) { $code=4; } $ctext.=' override'; } elsif ($status eq 'excused') { - unless ($code==2) { $code=3; } + if ($code==0||$code==3) { $code=3; } else { $code=4; } $ctext.=' excused'; + } else { + if ($code==0) { $code=1; } } } return 'p'.$code.$tcode.'"'.$ctext.'"'; } -# ------------------------------------------------------------ Build page table -sub tracetable { - my ($sofar,$rid,$beenhere)=@_; - my $further=$sofar; - unless ($beenhere=~/\&$rid\&/) { - $beenhere.=$rid.'&'; - - if (defined($hash{'is_map_'.$rid})) { - $sofar++; - my $tprefix=''; - if ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} - eq 'sequence') { - $tprefix='h'; +sub addresource { + my ($resource,$sofar,$rid,$showtypes)=@_; + &Apache::lonxml::debug("Adding $resource allowing $showtypes"); + if ($showtypes eq 'problems') { + if ($resource!~/\.(problem|exam|quiz|assess|survey|form)$/) { + &Apache::lonxml::debug("Returning early"); + return; + } + } + my $brepriv=&Apache::lonnet::allowed('bre',$resource); + if ($hash{'src_'.$rid}) { + if (($brepriv eq '2') || ($brepriv eq 'F')) { + my $pprefix=''; + if ($resource=~/\.(problem|exam|quiz|assess|survey|form)$/) { + $pprefix=&astatus($rid); } if (defined($rows[$sofar])) { - $rows[$sofar].='&'.$tprefix.$rid; + $rows[$sofar].='&'.$pprefix.$rid; } else { - $rows[$sofar]=$tprefix.$rid; + $rows[$sofar]=$pprefix.$rid; } - if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) && - (defined($hash{'map_finish_'.$hash{'src_'.$rid}})) && - ($tprefix eq 'h')) { - my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}}; - $sofar= - &tracetable($sofar,$hash{'map_start_'.$hash{'src_'.$rid}}, - '&'.$frid.'&'); - $sofar++; - if ($hash{'src_'.$frid}) { - my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$frid}); - if (($brepriv eq '2') || ($brepriv eq 'F')) { - my $pprefix=''; - if ($hash{'src_'.$frid}=~ - /\.(problem|exam|quiz|assess|survey|form)$/) { - $pprefix=&astatus($frid); - - } - if (defined($rows[$sofar])) { - $rows[$sofar].='&'.$pprefix.$frid; - } else { - $rows[$sofar]=$pprefix.$frid; - } - } - } + } + } +} + +sub followlinks () { + my ($rid,$sofar,$beenhere,$further,$showtypes)=@_; + my $mincond=1; + my $next=''; + foreach (split(/\,/,$hash{'to_'.$rid})) { + my $thiscond= + &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}}); + if ($thiscond>=$mincond) { + if ($next) { + $next.=','.$_.':'.$thiscond; + } else { + $next=$_.':'.$thiscond; } + if ($thiscond>$mincond) { $mincond=$thiscond; } + } + } + foreach (split(/\,/,$next)) { + my ($linkid,$condval)=split(/\:/,$_); + if ($condval>=$mincond) { + &Apache::lonxml::debug("following link $linkid"); + my $now=&tracetable($sofar,$hash{'goesto_'.$linkid}, + $beenhere,$showtypes); + if ($now>$further) { $further=$now; } + } + } + return $further; +} +# ------------------------------------------------------------ Build page table + +sub tracetable { + my ($sofar,$rid,$beenhere,$showtypes)=@_; + my $further=$sofar; + #$Apache::lonxml::debug=1; + &Apache::lonxml::debug("$rid ; $sofar ; $beenhere"); + if ($beenhere=~/\&$rid\&/) { + return $further; + } + $beenhere.=$rid.'&'; + + if (defined($hash{'is_map_'.$rid})) { + $sofar++; + my $tprefix=''; + if ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} + eq 'sequence') { + $tprefix='h'; + } elsif ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} + eq 'page') { + $tprefix='i'; + $showtypes='problems'; + } + if (defined($rows[$sofar])) { + $rows[$sofar].='&'.$tprefix.$rid; } else { - $sofar++; - if ($hash{'src_'.$rid}) { - my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid}); - if (($brepriv eq '2') || ($brepriv eq 'F')) { - my $pprefix=''; - if ($hash{'src_'.$rid}=~ - /\.(problem|exam|quiz|assess|survey|form)$/) { - $pprefix=&astatus($rid); - } - if (defined($rows[$sofar])) { - $rows[$sofar].='&'.$pprefix.$rid; - } else { - $rows[$sofar]=$pprefix.$rid; - } - } - } + $rows[$sofar]=$tprefix.$rid; } - - if (defined($hash{'to_'.$rid})) { - my $mincond=1; - my $next=''; - foreach (split(/\,/,$hash{'to_'.$rid})) { - my $thiscond= - &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}}); - if ($thiscond>=$mincond) { - if ($next) { - $next.=','.$_.':'.$thiscond; - } else { - $next=$_.':'.$thiscond; - } - if ($thiscond>$mincond) { $mincond=$thiscond; } - } - } - foreach (split(/\,/,$next)) { - my ($linkid,$condval)=split(/\:/,$_); - if ($condval>=$mincond) { - my $now=&tracetable($sofar,$hash{'goesto_'.$linkid},$beenhere); - if ($now>$further) { $further=$now; } - } - } + if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) && + (defined($hash{'map_finish_'.$hash{'src_'.$rid}}))) { + my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}}; + $sofar=&tracetable($sofar, + $hash{'map_start_'.$hash{'src_'.$rid}}, + '&'.$frid.'&',$showtypes); + $sofar++; + &addresource($hash{'src_'.$frid},$sofar,$frid,$showtypes); + if ($tprefix eq 'i') { $showtypes=''; } } + } else { + $sofar++; + &addresource($hash{'src_'.$rid},$sofar,$rid,$showtypes); } + + if (defined($hash{'to_'.$rid})) { + $further=&followlinks($rid,$sofar,$beenhere,$further,$showtypes); + } + return $further; } @@ -475,6 +492,7 @@ sub handler { for ($i=0;$i<=$#rows;$i++) { if ($rows[$i]) { + &Apache::lonxml::debug($rows[$i]); $contents++; my @colcont=split(/\&/,$rows[$i]); $lcm*=($#colcont+1)/euclid($lcm,($#colcont+1)); @@ -585,6 +603,7 @@ sub handler { $add=''; $adde=''; } + if ($rid=~/^i(.+)/) { $rid=$1; } if ($rid=~/^p(\d)(\d)\"([\w\: \(\)\/\,]*)\"(.+)/) { # sub astatus describes what code/tcode mean my $code=$1; @@ -596,6 +615,8 @@ sub handler { } if ($code eq '3') { $add=''; + } elsif ($code eq '4') { + $add=''; } else { $add=''; if ($tcode eq '2') { @@ -611,7 +632,7 @@ sub handler { if ($code eq '1') { $hwke=' ('.$ctext.')'; } - if ($code eq '2') { + if ($code eq '2' || $code eq '4') { $hwk=''; $hwke=' ('.$ctext.')'; }