--- loncom/homework/bridgetask.pm 2005/10/01 04:01:14 1.61 +++ loncom/homework/bridgetask.pm 2005/10/24 18:40:21 1.73 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.61 2005/10/01 04:01:14 albertel Exp $ +# $Id: bridgetask.pm,v 1.73 2005/10/24 18:40:21 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -68,8 +68,18 @@ sub proctor_check_auth { foreach my $possible (@allowed) { my ($puser,$pdom)=(split('@',$possible)); if ($puser eq $user && $pdom eq $domain) { - my $authhost=&Apache::lonnet::authenticate($puser,$env{'form.proctorpassword'},$pdom); - if ($authhost ne 'no_host') { + my $authenticated=0; + if ( $slot->{'secret'} =~ /\S/ && + $env{'form.proctorpassword'} eq $slot->{'secret'} ) { + $authenticated=1; + } else { + + my $authhost=&Apache::lonnet::authenticate($puser,$env{'form.proctorpassword'},$pdom); + if ($authhost ne 'no_host') { + $authenticated=1; + } + } + if ($authenticated) { my $version= $Apache::lonhomework::results{'resource.version'}= ++$Apache::lonhomework::history{'resource.version'}; @@ -294,6 +304,7 @@ sub show_task { ( $status eq 'INVALID_ACCESS') )) { return 0; } + if ($env{'form.donescreen'}) { return 0; } return 1; } @@ -316,8 +327,8 @@ sub submission_time_stamp { my $slot_name=$Apache::lonhomework::history{'resource.'.$version.'.checkedin.slot'}; my %slot=&Apache::lonnet::get_slot($slot_name); my $diff = $slot{'endtime'} - $submissiontime; - my ($color,$when)=('red','after'); - if ($diff > 0) { ($color,$when)=('green','before'); } + my ($color,$when)=('#FF6666','after'); + if ($diff > 0) { ($color,$when)=('#336600','before'); } my $info; if ($diff%60) { $info=($diff%60).' seconds'; } $diff=int($diff/60); @@ -334,11 +345,41 @@ sub submission_time_stamp { return $result; } +sub webgrade_standard_info { + my ($version)=&get_version(); + my (undef,undef,$udom,$uname) = &Apache::lonxml::whichuser(); + my $file_url = '/uploaded/'.$udom.'/'.$uname.'/portfolio/'; + my $file_list="<ul>\n"; + foreach my $partial_file (split(',',$Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"})) { + my $file=$file_url.$partial_file; + $file=~s|/+|/|g; + &Apache::lonnet::allowuploaded('/adm/bridgetask',$file); + $file_list.='<li><nobr><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'. + &Apache::loncommon::icon($file).'" border=0"> '.$file. + '</a></nobr></li>'."\n"; + } + $file_list.="</ul>\n"; + + my %lt=&Apache::lonlocal::texthash('done' => 'Done', + 'stop' => 'Stop', + ); + + my $result=<<INFO; +<div class="handininfo"> + <input type="submit" name="next" value="$lt{'done'}" /> + <input type="submit" name="stop" value="$lt{'stop'}" /> + $file_list +</div> +INFO + return $result; +} + sub start_Task { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my ($status,$accessmsg,$slot); if ($target ne 'webgrade') { + &Apache::structuretags::init_problem_globals('Task'); &Apache::structuretags::initialize_storage(); &Apache::lonhomework::showhash(%Apache::lonhomework::history); } @@ -392,6 +433,18 @@ sub start_Task { '</h1>'.&proctor_validation_screen($slot); } elsif ($status eq 'WAITING_FOR_GRADE') { $msg.='<h1>'.&mt('Your submission is in the grading queue.').'</h1>'; + } elsif ($env{'form.donescreen'}) { + my $title=&Apache::lonnet::gettitle(); + my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'}); + my $files='<ul><li>'.join('</li><li>',@files).'</li></ul>'; + $result.=<<DONESCREEN; +<h2>$title</h2> +<p> Files submitted: $files </p> +<p> You are now done with this Bridge Task </p> +<hr /> +<p> <a href="/adm/logout">Logout</a> </p> +<p> <a href="/adm/roles">Change to a different course</a> </p> +DONESCREEN } elsif ($status ne 'NOT_YET_VIEWED') { $msg.='<h1>'.&mt('Not open to be viewed').'</h1>'; } @@ -490,6 +543,15 @@ sub start_Task { $result.='<input type="hidden" name="regrade" value="'. $env{'form.regrade'}.'" />'; } + if ($env{'form.chosensections'}) { + my @chosen_sections= + &Apache::loncommon::get_env_multiple('form.chosensections'); + foreach my $sec (@chosen_sections) { + $result.='<input type="hidden" name="chosensections" + value="'.$sec.'" />'; + } + } + if ($webgrade eq 'yes') { $result.=&webgrade_standard_info(); } } } else { # page_start returned a starting result, delete it if we don't need it @@ -597,15 +659,13 @@ sub end_Task { my ($version,$previous)=&get_version(); if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex') { - if ( - (($target eq 'web') && ($env{'request.state'} ne 'construct')) || - ($target eq 'answer') || ($target eq 'tex') - ) { + if ($target eq 'web' || $target eq 'answer' || $target eq 'tex') { if ($target eq 'web') { if (&show_task($status,$previous)) { $result.=&Apache::lonxml::endredirection(); } - if ($status eq 'CAN_ANSWER' && !$previous) { + if ($status eq 'CAN_ANSWER' && !$previous && + !$env{'form.donescreen'}) { $result.="\n".'<table border="1">'. &Apache::inputtags::file_selector("$version.0", "bridgetask","*", @@ -615,6 +675,13 @@ sub end_Task { <p>'.&mt('Indicate the files from your portfolio to be evaluated in grading this task.').'</p>'). "</table>"; $result.=&Apache::inputtags::gradestatus('0'); + $result.='</form>'; + $result.=<<DONEBUTTON; +<form method="POST"> + <input type="hidden" name="donescreen" value="1" /> + <input type="submit" value="Done" /> +</form> +DONEBUTTON } if (&show_task($status,$previous) && $Apache::lonhomework::history{"resource.$version.status"} =~ /^(pass|fail)$/) { @@ -680,6 +747,8 @@ sub end_Task { $award; $Apache::lonhomework::results{"resource.0.submission"}= $Apache::lonhomework::results{"resource.$version.0.submission"}=''; + } else { + delete($Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}); } &Apache::lonhomework::showhash(%Apache::lonhomework::results); &Apache::structuretags::finalize_storage(); @@ -796,9 +865,14 @@ sub end_Task { # &mt('Save Partial Grade and Continue Grading').'" /> '; $result.='</form>'.&Apache::loncommon::endbodytag().'</html>'; } elsif ($target eq 'meta') { - $result.='<parameter part="0" package="Task"></parameter>'."\n"; - #$result.=&Apache::response::meta_part_order(); - #$result.=&Apache::response::meta_response_order(); + $result.=&Apache::response::meta_package_write('Task'); + $result.=&meta_stores_write('solved','string','Problem Status'); + $result.=&meta_stores_write('tries','int_zeropos', + 'Number of Attempts'); + $result.=&meta_stores_write('awarded','float', + 'Partial Credit Factor'); + $result.=&meta_stores_write('status','string', + 'Bridge Task Status'); } undef($Apache::lonhomework::parsing_a_task); return $result; @@ -920,6 +994,10 @@ sub show_queue { &Apache::grades::init_perm(); my ($classlist,$section,$fullname)=&Apache::grades::getclasslist(\@chosen_sections,); &Apache::grades::reset_perm(); + if (!(grep(/^all$/,@chosen_sections))) { + $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections). + '</tt>.</p> '."\n"; + } my $regexp="^$symb\0"; my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); @@ -959,6 +1037,11 @@ sub show_queue { ($action,$description)=('unlock',&mt('Unlock')); } } + my $seclist; + foreach my $sec (@chosen_sections) { + $seclist.='<input type="hidden" name="chosensections" + value="'.$sec.'" />'; + } if (time > $slot_data{'endtime'}) { $result.=(<<FORM); <td> @@ -969,6 +1052,7 @@ sub show_queue { <input type="hidden" name="webgrade" value="no" /> <input type="hidden" name="queuemode" value="selected" /> <input type="submit" name="submit" value="$description" /> + $seclist </form> </td> FORM @@ -1048,6 +1132,8 @@ sub queue_key_locked { sub pick_from_queue_data { my ($queue,$check_section,$queuedata,$cdom,$cnum)=@_; foreach my $key (keys(%$queuedata)) { + if ($key =~ /\0locked$/) { next; } + if ($key =~ /\0timestamp$/) { next; } my ($symb,$uname,$udom)=&decode_queue_key($key); if ($check_section) { my $section=&Apache::lonnet::getsection($uname,$udom); @@ -1173,13 +1259,19 @@ sub get_from_queue { sub select_user { my ($symb,$cid)=&Apache::lonxml::whichuser(); - my $result.='<table border="1">'; my @chosen_sections= &Apache::loncommon::get_env_multiple('form.chosensections'); &Apache::grades::init_perm(); my ($classlist,$section,$fullname)=&Apache::grades::getclasslist(\@chosen_sections,); &Apache::grades::reset_perm(); + + my $result; + if (!(grep(/^all$/,@chosen_sections))) { + $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections). + '</tt>.</p> '."\n"; + } + $result.='<table border="1">'; foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) { my ($uname,$udom) = split(/:/,$student); @@ -1204,6 +1296,11 @@ sub select_user { $result.='<tr><td> </td><td>'.$fullname->{$student}. '</td><td>'; } else { + my $seclist; + foreach my $sec (@chosen_sections) { + $seclist.='<input type="hidden" name="chosensections" + value="'.$sec.'" />'; + } $result.=<<RESULT; <tr> <td> @@ -1212,7 +1309,8 @@ sub select_user { <input type="hidden" name="queue" value="$queue" /> <input type="hidden" name="webgrade" value="no" /> <input type="hidden" name="regrade" value="yes" /> - <input type="submit" name="submit" value="Regrade" /> + <input type="submit" name="submit" value="Regrade" /> + $seclist </form> <td>$fullname->{$student}</td> <td> @@ -1350,6 +1448,7 @@ sub get_instance { $dim_info.='<h3>Question : you did not pass this '.$mandatory.' question</h3>'; } my $man_count=0; + my $man_passed=0; my $opt_count=0; my $opt_passed=0; foreach my $id (@{$dimension{$instance.'.criterias'}}) { @@ -1361,12 +1460,15 @@ sub get_instance { } } else { $man_count++; + if ($Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.status"} eq 'pass') { + $man_passed++; + } } } - my $opt_req=&Apache::lonxml::get_param('OptionalRequired', - $parstack,$safeeval); + if ($man_passed eq $man_count) { $man_passed='all'; } + my $opt_req=$dimension{$instance.'.optionalrequired'}; if ($opt_req !~ /\S/) { $opt_req='0'; } - $dim_info.="\n<p>".&mt('You passed all of the mandatory components and [_1] of the [_2] optional components, of which you were required to pass [_3].',$opt_passed,$opt_count,$opt_req)."</p>\n</div>"; + $dim_info.="\n<p>".&mt('You passed [_1] of the [_2] mandatory components and [_3] of the [_4] optional components, of which you were required to pass [_5].',$man_passed,$man_count,$opt_passed,$opt_count,$opt_req)."</p>\n</div>"; my $internal_location=&internal_location($dim); $result=~s/\Q$internal_location\E/$dim_info/; @@ -1429,23 +1531,7 @@ sub get_instance { '<td>'. '<a href="#'.$last_link.'">Prev</a><br />'. '<a href="#next_'.$link.'">Next</a><br /><br /><br />'. - '<input type="submit" name="next" value="'. - &mt('Done').'" /> '. - '<input type="submit" name="stop" value="'. - &mt('Stop').'" /> '. '</td></tr>'; - $result.='<tr><td colspan="4">'; - my (undef,undef,$udom,$uname) = &Apache::lonxml::whichuser(); - my $file_url = '/uploaded/'.$udom.'/'.$uname.'/portfolio/'; - foreach my $partial_file (split(',',$Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"})) { - my $file=$file_url.$partial_file; - $file=~s|/+|/|g; - &Apache::lonnet::allowuploaded('/adm/bridgetask',$file); - $result.='<nobr><a href="'.$file.'" target="lonGRDs"><img src="'. - &Apache::loncommon::icon($file).'" border=0"> '.$file. - '</a></nobr> '; - } - $result.='</td></tr>'; $last_link=$link; } } elsif ($target eq 'grade' && $env{'form.webgrade'}) { @@ -1486,6 +1572,9 @@ sub get_instance { $Apache::lonhomework::results{"resource.$version.$dim.status"}= 'pass'; } + } else { + # any other targets no output + undef($result); } return $result; }