--- loncom/homework/bridgetask.pm 2006/11/14 22:12:58 1.205 +++ loncom/homework/bridgetask.pm 2007/01/24 19:24:33 1.223 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.205 2006/11/14 22:12:58 albertel Exp $ +# $Id: bridgetask.pm,v 1.223 2007/01/24 19:24:33 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(); } 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; @@ -583,7 +591,6 @@ sub start_Task { &Apache::structuretags::page_start($target,$token,$tagstack, $parstack,$parser,$safeeval, $name,&style($target)); - $result .= '
'."\n"; } if ($target eq 'web' && $env{'request.state'} ne 'construct') { @@ -632,6 +639,11 @@ sub start_Task { 'slot' => $slot_name}); ($version,$previous)=&get_version(); } + + my $status_id = + ($previous || $status eq 'SHOW_ANSWER') ? 'LC_task_feedback' + : 'LC_task_take'; + $result .= '
'."\n"; push(@Apache::inputtags::status,$status); $Apache::inputtags::slot_name=$slot_name; @@ -699,6 +711,7 @@ sub start_Task { $target eq 'webgrade') { my $webgrade='yes'; if ($target eq 'webgrade') { + $result .= '
'."\n"; $result.= "\n".'
'."\n". ''; @@ -791,6 +804,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. @@ -852,8 +868,8 @@ sub get_key_todo { my ($symb,$cid)=&Apache::lonnet::whichuser(); my $cnum = $env{'course.'.$cid.'.num'}; my $cdom = $env{'course.'.$cid.'.domain'}; - my $uname = $env{'form.gradinguser'}; - my $udom = $env{'form.gradingdomain'}; + my $uname = &clean_username($env{'form.gradinguser'}); + my $udom = &clean_domain($env{'form.gradingdomain'}); my $gradingkey=&encode_queue_key($symb,$udom,$uname); @@ -1051,27 +1067,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 +1122,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 +1277,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 +1295,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,9 +1584,16 @@ sub show_queue { my $ekey=&escape($key); my ($action,$description,$status)=('select',&mt('Select')); if (exists($queue{"$key\0locked"})) { + my ($locker,$time) = + &get_lock_info($queue{"$key\0locked"}); + if ($time) { + $time = + &Apache::lonnavmaps::timeToHumanString($time, + 'start'); + } my $me=$env{'user.name'}.':'.$env{'user.domain'}; - $status=&mt('Locked by [_1]',$queue{"$key\0locked"}); - if ($me eq $queue{"$key\0locked"}) { + $status=&mt('Locked by [_1] [_2]',$locker,$time); + if ($me eq $locker) { ($action,$description)=('resume',&mt('Resume')); } else { ($action,$description)=('unlock',&mt('Unlock')); @@ -1665,7 +1703,7 @@ sub queue_key_locked { my ($key_locked,$value)= &Apache::lonnet::get($queue,["$key\0locked"],$cdom,$cnum); if ($key_locked eq "$key\0locked") { - return $value; + return &get_lock_info($value); } return undef; } @@ -1746,6 +1784,24 @@ sub pick_from_queue_data { return undef; } +sub get_lock_info { + my ($lock_info) = @_; + if (wantarray) { + if (ref($lock_info) eq 'ARRAY') { + return @{$lock_info}; + } else { + return ($lock_info); + } + } else { + if (ref($lock_info) eq 'ARRAY') { + return $lock_info->[0]; + } else { + return $lock_info; + } + } + return; +} + sub find_mid_grade { my ($queue,$symb,$cdom,$cnum)=@_; my $todo=&unescape($env{'form.gradingkey'}); @@ -1757,7 +1813,7 @@ sub find_mid_grade { my $regexp="^$symb\0.*\0locked\$"; my %locks=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); foreach my $key (keys(%locks)) { - my $who=$locks{$key}; + my $who= &get_lock_info($locks{$key}); if ($who eq $me) { $todo=$key; $todo=~s/\0locked$//; @@ -1773,7 +1829,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 +2105,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,13 +2157,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(); if (!&skip_dimension_parsing($dim)) { &enable_dimension_parsing($dim); } - return &internal_location($dim); + return;# &internal_location($dim); } sub start_QuestionText { @@ -2188,14 +2245,12 @@ sub end_Dimension { my $result=&Apache::lonxml::endredirection(); my $dim=&get_id($parstack,$safeeval); if (&skip_dimension_parsing($dim)) { - &disable_dimension_parsing($dim); pop(@Apache::bridgetask::dimension); return; } 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()) { @@ -2229,13 +2284,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 this '.$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 this '.$mandatory.' '.$question.'

'; } my %counts = &get_counts($dim,$instance,$parstack, $safeeval); @@ -2272,7 +2329,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'},[@_]); @@ -2295,7 +2367,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()) { @@ -2389,7 +2465,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}); } @@ -2409,7 +2485,15 @@ sub question_status_message { $status .= '.'; if ($counts->{'opt'}) { $status .= ' You were required to pass '.$counts->{'opt_req'}. - ' optional component'.($counts->{'opt_req'} == 1?'':'s'); + ' optional '; + if ($counts->{'opt_dim'} + $counts->{'man_dim'} < 1) { + $status .= + ($counts->{'opt_req'} == 1?'criterion':'criteria'); + } else { + $status .= + 'component'.($counts->{'opt_req'} == 1?'':'s'); + } + $status .= '.'; } return $status; } @@ -2604,12 +2688,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");