--- loncom/homework/bridgetask.pm 2006/11/13 21:25:21 1.203 +++ loncom/homework/bridgetask.pm 2007/01/10 21:46:24 1.216 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.203 2006/11/13 21:25:21 albertel Exp $ +# $Id: bridgetask.pm,v 1.216 2007/01/10 21:46:24 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -98,6 +98,7 @@ sub check_in { &check_in_sequence($user,$domain,$slot_name); } else { &create_new_version($type,$user,$domain,$slot_name); + &Apache::structuretags::finalize_storage($res->symb); } return 1; } @@ -380,6 +381,13 @@ sub nest { } } +sub start_delay { + push(@delay,1); +} +sub end_delay { + pop(@delay); +} + sub nested_parse { my ($str,$env,$args) = @_; my @old_env = @Apache::scripttag::parser_env; @@ -791,6 +799,9 @@ sub start_Task { if ($target eq 'webgrade') { $result.="\n".'
'; &Apache::lonxml::startredirection(); + &start_delay(); + $dimension{$top}{'result'}=$result; + undef($result); } } elsif ($target eq 'edit') { $result.=$form_tag_start. @@ -1051,27 +1062,30 @@ DONEBUTTON $start_time=&Apache::lonlocal::locallocaltime($start_time); my $status = - "\n
\n\t"; + "\n
\n\t"; + my $dim = $top; + my %counts = &get_counts($dim,undef,$parstack, + $safeeval); + my $question_status ="\n\t

". + &question_status_message(\%counts,-1). + "

\n"; + if ($bt_status eq 'pass') { $status.='

You passed the '.$title.' given on '. $start_time.'

'; + $status.=$question_status; } if ($bt_status eq 'fail') { $status.='

You did not pass the '.$title.' given on '. $start_time.'

'; + $status.=$question_status; if (!$previous) { $status.=&add_request_another_attempt_button(); } } - $status.="\n".'
'."\n"; - my $dim = $top; - my %counts = &get_counts($dim,undef,$parstack, - $safeeval); - $status.="\n
\n\t

". - &question_status_message(\%counts,-1). - "

\n
\n"; + $status.="\n".'
'."\n"; foreach my $id (@{$dimension{$dim}{'criterias'}}) { my $type = $dimension{$dim}{'criteria.'.$id.'.type'}; @@ -1103,7 +1117,8 @@ DONEBUTTON } - if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) { + if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous + && $status eq 'CAN_ANSWER') { my $award='SUBMITTED'; &Apache::essayresponse::file_submission("$version.0",'bridgetask', 'portfiles',\$award); @@ -1257,7 +1272,13 @@ DONEBUTTON &Apache::structuretags::finalize_storage(); } } elsif ($target eq 'webgrade') { - $result.=&Apache::lonxml::endredirection(); + if (&nest()) { + &Apache::lonxml::endredirection(); + &end_delay(); + $result.=$dimension{$top}{'result'}; + } else { + $result.=&Apache::lonxml::endredirection(); + } my $dim = $top; foreach my $id (@{$dimension{$dim}{'criterias'}} ) { my $type = $dimension{$dim}{'criteria.'.$id.'.type'}; @@ -1269,7 +1290,12 @@ DONEBUTTON [@_]); $criteria = &layout_webgrade_Criteria($dim,$id,$criteria); my $internal_location=&internal_location($id); - $result=~s/\Q$internal_location\E/$criteria/; + if ($result =~ m/\Q$internal_location\E/) { + $result=~s/\Q$internal_location\E/$criteria/; + } else { + $result.=$criteria; + } + } } $result.="
"; @@ -1553,8 +1579,16 @@ sub show_queue { my $ekey=&escape($key); my ($action,$description,$status)=('select',&mt('Select')); if (exists($queue{"$key\0locked"})) { + my $locker = $queue{"$key\0locked"}; + my $time; + if (ref($queue{"$key\0locked"}) eq 'ARRAY') { + ($locker, $time) = @{$queue{"$key\0locked"}}; + $time = + &Apache::lonnavmaps::timeToHumanString($time, + 'start'); + } my $me=$env{'user.name'}.':'.$env{'user.domain'}; - $status=&mt('Locked by [_1]',$queue{"$key\0locked"}); + $status=&mt('Locked by [_1] [_2]',$locker,$time); if ($me eq $queue{"$key\0locked"}) { ($action,$description)=('resume',&mt('Resume')); } else { @@ -1773,7 +1807,7 @@ sub lock_key { my (undef,$cid)=&Apache::lonnet::whichuser(); my $cnum=$env{'course.'.$cid.'.num'}; my $cdom=$env{'course.'.$cid.'.domain'}; - my $success=&Apache::lonnet::newput($queue,{"$todo\0locked"=> $me}, + my $success=&Apache::lonnet::newput($queue,{"$todo\0locked"=> [$me,time]}, $cdom,$cnum); &Apache::lonxml::debug("success $success $todo"); if ($success eq 'ok') { @@ -2049,7 +2083,7 @@ sub start_Setup { my $dim = &get_id($parstack,$safeeval); push(@Apache::bridgetask::dimension,$dim); &Apache::lonxml::startredirection(); - return &internal_location($dim); + return;# &internal_location($dim); } { @@ -2101,11 +2135,14 @@ sub start_Dimension { $dimension{$top}{'criteria.'.$dim.'.mandatory'}= &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval); push(@{$dimension{$top}{'criterias'}},$dim); + $dimension{$dim}{'nested'}=$top; } push(@Apache::bridgetask::dimension,$dim); &Apache::lonxml::startredirection(); - &enable_dimension_parsing($dim); - return &internal_location($dim); + if (!&skip_dimension_parsing($dim)) { + &enable_dimension_parsing($dim); + } + return;# &internal_location($dim); } sub start_QuestionText { @@ -2193,7 +2230,6 @@ sub end_Dimension { my $instance=&get_instance($dim); my $version=&get_version(); if ($target eq 'web') { - $result .= "\n".'
'."\n"; $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]); my @instances = $instance; if (&Apache::response::showallfoils()) { @@ -2227,13 +2263,15 @@ sub end_Dimension { } my $dim_info= "\n
\n\t"; - my $question = ('sub' x $dimension{$dim}{'depth'}).'question'; - $question =~ s/^(.)/uc($1)/e; + my $ucquestion = + my $question = + ('sub' x $dimension{$dim}{'depth'}).'question'; + $ucquestion =~ s/^(.)/uc($1)/e; if ($dim_status eq 'pass') { - $dim_info.='

'.$question.' : you passed the above '.$mandatory.' question

'; + $dim_info.='

'.$ucquestion.' : you passed the above '.$mandatory.' '.$question.'

'; } if ($dim_status eq 'fail') { - $dim_info.='

'.$question.' : you did not pass the above '.$mandatory.' question

'; + $dim_info.='

'.$ucquestion.' : you did not pass the above '.$mandatory.' '.$question.'

'; } my %counts = &get_counts($dim,$instance,$parstack, $safeeval); @@ -2247,13 +2285,20 @@ sub end_Dimension { @{$dimension{$dim}{'criterias'}}) { my $type = $dimension{$dim}{'criteria.'.$id.'.type'}; if ($type eq 'dimension') { - $result.=$dimension{$id}{'result'}; - next; + if (defined($dimension{$id}{'result'})) { + $result.=$dimension{$id}{'result'}; + next; + } else { + $dim_info .= + &nested_parse(\$dimension{$dim}{'criteria.'.$id}, + [@_],{'set_dim_id' => $id}); + } + } else { + my $criteria = + &nested_parse(\$dimension{$dim}{'criteria.'.$id}, + [@_]); + $dim_info .= &layout_web_Criteria($dim,$id,$criteria); } - my $criteria = - &nested_parse(\$dimension{$dim}{'criteria.'.$id}, - [@_]); - $dim_info .= &layout_web_Criteria($dim,$id,$criteria); } # puts the results at the end of the dimension $result .= $dim_info; @@ -2263,7 +2308,22 @@ sub end_Dimension { # $result=~s/\Q$internal_location\E/$dim_info/; } } - $result .= "\n
\n"; + if ($result !~ /^\s*$/s) { + # FIXME? this maybe unneccssary in the future, (CSE101 BT + # from Fall 2006 geenrate a div that attempts to hide some + # of the output in an odd way, this is a workaround so + # those old ones will continue to work. # It puts the + # LC_question div to come after any starting closie div + # that the dimension produces + if ($result =~ m{^\s*
}) { + $result =~ s{^(\s*)} + {$1\n
}; + } else { + $result = "\n".'
'. + "\n".$result; + } + $result .= "\n
\n"; + } } elsif ($target eq 'webgrade') { # in case of any side effects that we need &nested_parse(\$dimension{$dim}{'intro'},[@_]); @@ -2286,7 +2346,11 @@ sub end_Dimension { [@_]); $criteria = &layout_webgrade_Criteria($dim,$id,$criteria); my $internal_location=&internal_location($id); - $result=~s/\Q$internal_location\E/$criteria/; + if ($result =~ m/\Q$internal_location\E/) { + $result =~ s/\Q$internal_location\E/$criteria/; + } else { + $result.=$criteria ; + } } } if (&nest()) { @@ -2380,7 +2444,7 @@ sub question_status_message { foreach my $type ('cri','dim') { if ($counts->{$req.'_'.$type}) { push(@sections, - $counts->{$req.'_'.$type.'_passed'}.' of '. + $counts->{$req.'_'.$type.'_passed'}.' of the '. $counts->{$req.'_'.$type}.' '. $req{$req}.' '.$type{$type}); } @@ -2595,12 +2659,12 @@ sub start_Criteria { my $dim = &get_dim_id(); my $id=&get_id($parstack,$safeeval); if ($target eq 'web' || $target eq 'webgrade') { - if ($target eq 'webgrade' && $dim ne 'top') { + if ($target eq 'webgrade') { &Apache::lonxml::debug(" for $dim $id stashing results into $dim "); $dimension{$dim}{'result'} .= &internal_location($id); } else { &Apache::lonxml::debug(" not stashing $dim $id"); - $result .= &internal_location($id); + #$result .= &internal_location($id); } } &Apache::lonxml::debug("Criteria $id with $dim"); @@ -2638,7 +2702,8 @@ sub layout_web_Criteria { $status_display=~s/^([a-z])/uc($1)/e; my $criteria_info.= '
'."\n\t".'

' - .$mandatory.' Criteria

'."\n\t".'

'."\n\t".'

' + ."\n"; $criteria =~ s/^\s*//s; $criteria =~ s/\s*$//s; $criteria_info.= $criteria;