--- loncom/homework/bridgetask.pm 2005/03/16 19:09:44 1.1 +++ loncom/homework/bridgetask.pm 2005/05/13 15:34:50 1.24 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.1 2005/03/16 19:09:44 albertel Exp $ +# $Id: bridgetask.pm,v 1.24 2005/05/13 15:34:50 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,40 +37,126 @@ use Apache::lonmenu; use Apache::lonlocal; use Apache::lonxml; use Time::HiRes qw( gettimeofday tv_interval ); + BEGIN { &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Instance','InstanceText','Criteria','ClosingParagraph')); } +sub initialize_bridgetask { + # id of current Dimension, 0 means that no dimension is current + # (inside only) + $Apache::bridgetask::dimension=''; + # list of all Dimension ids seen + @Apache::bridgetask::dimensionlist=(); + # mandatory attribute of all Dimensions seen + %Apache::bridgetask::dimensionmandatory=(); + # list of all current Instance ids + @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=''; +} + +sub proctor_check_auth { + my ($slot_name,$slot)=@_; + my $user=$env{'form.proctorname'}; + my $domain=$env{'form.proctordomain'}; + + my @allowed=split(",",$slot->{'proctor'}); + 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 $version= + $Apache::lonhomework::results{'resource.version'}= + $Apache::lonhomework::history{'resource.version'}++; + $Apache::lonhomework::results{"resource.$version.checkedin"}= + $user.'@'.$domain; + $Apache::lonhomework::results{"resource.$version.checkedin.slot"}= + $slot_name; + return 1; + } + } + } + return 0; +} + +sub add_previous_version_button { + my $result; + $result.=&mt(' Show a previously done version: [_1]',''); + return $result; +} + +sub add_grading_button { + my $result; + $result.=' '; + $result.=''; + return $result; +} + +sub add_request_another_attempt_button { + +} + sub start_Task { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - #&initialize_storage(); - - my $status; - my $accessmsg; + my ($status,$accessmsg,$slot); + if ($target ne 'webgrade') { + &Apache::structuretags::initialize_storage(); + &Apache::lonhomework::showhash(%Apache::lonhomework::history); + } + $Apache::lonhomework::parsing_a_task=1; #should get back a or the neccesary stuff to start XML/MathML my ($result,$head_tag_start,$body_tag_start,$form_tag_start)= &Apache::structuretags::page_start($target,$token,$tagstack,$parstack,$parser,$safeeval); - - if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || + + if ($target eq 'web') { + $body_tag_start.=&add_previous_version_button(); + if ($Apache::lonhomework::modifygrades) { + $body_tag_start.='
'.&add_grading_button()."
"; + } + } + if ($target eq 'web' || ($target eq 'grade' && !$env{'form.webgrade'}) || $target eq 'answer' || $target eq 'tex') { - ($status,$accessmsg) = &Apache::lonhomework::check_task_access('0'); - push (@Apache::inputtags::status,$status); + my $version=$Apache::lonhomework::history{'resource.version'}; + ($status,$accessmsg,my $slot_name,$slot) = + &Apache::lonhomework::check_task_access('0'); + push(@Apache::inputtags::status,$status); + $Apache::inputtags::slot_name=$slot_name; my $expression='$external::datestatus="'.$status.'";'; - $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";'; + $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$version.solved"}.'";'; &Apache::run::run($expression,$safeeval); &Apache::lonxml::debug("Got $status"); if (( $status eq 'CLOSED' ) || ( $status eq 'BANNED') || ( $status eq 'UNAVAILABLE') || + ( $status eq 'NOT_IN_A_SLOT') || + ( $status eq 'NEEDS_CHECKIN') || + ( $status eq 'WAITING_FOR_GRADE') || ( $status eq 'INVALID_ACCESS')) { my $bodytext=&Apache::lonxml::get_all_text("/task",$parser); if ( $target eq "web" ) { - $result.= $head_tag_start.''; - my $msg=$body_tag_start; + $result.= $head_tag_start.''.$body_tag_start; + my $msg; if ($status eq 'UNAVAILABLE') { $msg.='

'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'

'; + } elsif ($status eq 'NOT_IN_A_SLOT') { + $msg.='

'.&mt('You are not currently signed up to work at this time and/or place.').'

'; + } elsif ($status eq 'NEEDS_CHECKIN') { + $msg.='

'.&mt('You need the Proctor to validate you.'). + '

'.&proctor_validation_screen($slot); + } elsif ($status eq 'WAITING_FOR_GRADE') { + $msg.='

'.&mt('Your submission is in the grading queue.').'

'; } elsif ($status ne 'NOT_YET_VIEWED') { $msg.='

'.&mt('Not open to be viewed').'

'; } @@ -85,6 +171,17 @@ sub start_Task { } else { $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm "; } + } elsif ($target eq 'grade' && !$env{'form.webgrade'}) { + if ($status eq 'NEEDS_CHECKIN') { + if (&proctor_check_auth($slot_name,$slot)) { + #FIXME immeadiatly add this to the grading queue + # with slot->{'endtime'} for when grading can + # begin on this resource + # FIXME I think the above is done by default, + # need to check that + # failure doesn't do this. + } + } } } elsif ($target eq 'web') { my $name= &Apache::structuretags::get_resource_name($parstack,$safeeval); @@ -92,12 +189,45 @@ sub start_Task { $body_tag_start \n $form_tag_start". ''; # if we are viewing someone else preserve that info - if (defined $ENV{'form.grade_symb'}) { + if (defined $env{'form.grade_symb'}) { foreach my $field ('symb','courseid','domain','username') { $result .= ''."\n"; + '" value="'.$env{"form.grade_$field"}.'" />'."\n"; } } + if ($Apache::lonhomework::history{'resource.status'} eq 'fail') { + $result.='

'.&mt('Did not pass').'

'; + $result.=&request_another_attempt_button(); + } + if ($Apache::lonhomework::history{'resource.status'} eq 'pass') { + $result.='

'.&mt('Passed').'

'; + } + } + } elsif ( ($target eq 'grade' && $env{'form.webgrade'}) || + $target eq 'webgrade') { + if ($target eq 'webgrade') { + $result.=$head_tag_start.$body_tag_start.$form_tag_start; + $result.=''; + $result.=&show_queue(); + } + my $todo=&get_from_queue(); + if ($todo) { + &setup_env_for_other_user($todo,$safeeval); + my ($symb,$uname,$udom)=&decode_queue_key($todo); + $result.="\n".'
Found '. + &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'
'; + $result.=''; + $Apache::bridgetask::queue_key=$todo; + &Apache::structuretags::initialize_storage(); + &Apache::lonhomework::showhash(%Apache::lonhomework::history); + $result.="\n".''; + } else { + if ($target eq 'webgrade') { + $result.="\n". + '
No user to be graded.
'; + } + my $bodytext=&Apache::lonxml::get_all_text("/task",$parser); } } else { # page_start returned a starting result, delete it if we don't need it @@ -110,33 +240,316 @@ sub end_Task { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $result=''; my $status=$Apache::inputtags::status['-1']; + my $version=$Apache::lonhomework::history{'resource.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 'web') && ($env{'request.state'} ne 'construct')) || ($target eq 'answer') || ($target eq 'tex') ) { if ($target eq 'web') { + if ($status eq 'CAN_ANSWER') { + $result.="\n".''. + &Apache::inputtags::file_selector($version, + "bridgetask","*", + 'portfolioonly'). + "
"; + $result.=&Apache::inputtags::gradestatus('0'); + } + } + if ($target eq 'web' || $target eq 'webgrade') { $result.=&Apache::lonxml::xmlend().''; } } - if ($target eq 'grade') { - #&Apache::lonhomework::showhash(%Apache::lonhomework::results); - #&finalize_storage(); + if ($target eq 'grade' && !$env{'form.webgrade'}) { + my $award='SUBMITTED'; + &Apache::essayresponse::file_submission('0','bridgetask', + 'portfiles',\$award); + if ($award eq 'SUBMITTED' && + $Apache::lonhomework::results{"resource.$version.bridgetask.portfiles"}) { + $Apache::lonhomework::results{"resource.$version.tries"}= + 1+$Apache::lonhomework::history{"resource.$version.tries"}; + } + $Apache::lonhomework::results{"resource.$version.award"}=$award; + &Apache::lonhomework::showhash(%Apache::lonhomework::results); + &Apache::structuretags::finalize_storage(); + if ($award eq 'SUBMITTED') { + &add_to_queue(); + } } + if ($target eq 'grade' && $env{'form.webgrade'}) { + my $optional_required= + &Apache::lonxml::get_param('OptionalRequired',$parstack, + $safeeval); + my $optional_passed=0; + my $mandatory_failed=0; + my $ungraded=0; + my $review=0; + &Apache::lonhomework::showhash(%Apache::lonhomework::results); + foreach my $dim_id (@Apache::bridgetask::dimensionlist) { + my $status= + $Apache::lonhomework::results{"resource.$dim_id.status"}; + my $mandatory= + ($Apache::bridgetask::dimensionmandatory{$dim_id} ne 'N'); + if ($status eq 'pass') { + if (!$mandatory) { $optional_passed++; } + } elsif ($status eq 'fail') { + if ($mandatory) { $mandatory_failed++; } + } elsif ($status eq 'ungraded') { + $ungraded++; + } elsif ($status eq 'review') { + $review++; + } + } + 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::lonhomework::results{'resource.grader'}= + $env{'user.name'}.'@'.$env{'user.domain'}; + if ($review) { + $Apache::lonhomework::results{'resource.status'}='review'; + &move_to_review_queue(); + } elsif ($ungraded) { + $Apache::lonhomework::results{'resource.status'}='ungraded'; + &check_queue_unlock(); + } elsif ($mandatory_failed) { + $Apache::lonhomework::results{'resource.status'}='fail'; + $Apache::lonhomework::results{"resource.$version.award"}='EXACT_ANS'; + &remove_from_queue(); + } else { + $Apache::lonhomework::results{'resource.status'}='pass'; + $Apache::lonhomework::results{"resource.$version.award"}='INCORRECT'; + &remove_from_queue(); + } + &Apache::structuretags::finalize_storage(); + } + } elsif ($target eq 'webgrade') { + $result.="\n
"; + #$result.=' '; + #$result.=' '; + #$result.=' '; + #$result.=' '; + $result.=''.&Apache::loncommon::endbodytag().''; } elsif ($target eq 'meta') { - #$result=&Apache::response::mandatory_part_meta; + $result.=''."\n"; #$result.=&Apache::response::meta_part_order(); #$result.=&Apache::response::meta_response_order(); } + undef($Apache::lonhomework::parsing_a_task); return $result; } +sub move_to_review_queue { + &Apache::lonxml::debug("Want to move"); +} + +sub check_queue_unlock { + &Apache::lonxml::debug("Want to unlock?"); +} + +sub remove_from_queue { + &Apache::lonxml::debug("Want to remove. Done?"); +} + +sub setup_env_for_other_user { + my ($queue_key,$safeeval)=@_; + my ($symb,$uname,$udom)=&decode_queue_key($queue_key); + $env{'form.grade_symb'}=$symb; + $env{'form.grade_domain'}=$udom; + $env{'form.grade_username'}=$uname; + $env{'form.grade_courseid'}=$env{'request.course.id'}; + &Apache::lonxml::initialize_rndseed($safeeval); +} + +sub add_to_queue { + my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser(); + my $cnum=$env{'course.'.$cid.'.num'}; + my $cdom=$env{'course.'.$cid.'.domain'}; + my %data; + $data{"$symb\0queue\0$uname\@$udom"}=[$Apache::inputtags::slot_name]; + &Apache::lonnet::put('gradingqueue',\%data,$cdom,$cnum); +} + +sub show_queue { + my $result; + my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser(); + my $cnum=$env{'course.'.$cid.'.num'}; + my $cdom=$env{'course.'.$cid.'.domain'}; + my $regexp="^$symb\0"; + my %queue=&Apache::lonnet::dump('gradingqueue',$cdom,$cnum,$regexp); + $result.="\n

Current Queue

". + ""; + foreach my $key (sort(keys(%queue))) { + if ($key=~/locked$/) { + my ($symb,$uname,$udom) = &decode_queue_key($key); + my $title=&Apache::lonnet::gettitle($symb); + $result.="'; + } elsif ($key=~/timestamp$/) { + my ($symb,undef) = split("\0",$key); + my $title=&Apache::lonnet::gettitle($symb); + $result.=""; + } else { + my ($symb,$uname,$udom) = &decode_queue_key($key); + my $title=&Apache::lonnet::gettitle($symb); + $result.=""; + } + } + $result.="
resourceusertypedata
$title$uname"; + $result.='lock'.$queue{$key}.'
$title"; + $result.='last queue modification time'. + &Apache::lonlocal::locallocaltime($queue{$key})."
$title$uname"; + my $slot=$queue{$key}->[0]; + my %slot_data=&Apache::lonnet::get_slot($slot); + $result.='queue entryEnd time: '. + &Apache::lonlocal::locallocaltime($slot_data{'endtime'}). + "

\n"; + return $result; +} + +sub decode_queue_key { + my ($key)=@_; + my ($symb,undef,$user) = split("\0",$key); + my ($uname,$udom) = split('@',$user); + return ($symb,$uname,$udom); +} + +sub queue_key_locked { + my ($key,$cdom,$cnum)=@_; + my ($key_locked,$value)= + &Apache::lonnet::get('gradingqueue',["$key\0locked"],$cdom,$cnum); + if ($key_locked eq "$key\0locked") { + return $value; + } + return undef; +} + +sub pick_from_queue_data { + my ($check_section,$queue,$cdom,$cnum)=@_; + foreach my $key (keys(%$queue)) { + my ($symb,$uname,$udom)=&decode_queue_key($key); + if ($check_section) { + my $section=&Apache::lonnet::getsection($uname,$udom); + if ($section eq $check_section) { + &Apache::lonnet::logthis("my sec"); + next; + } + } + my $slot=$queue->{$key}[0]; + my %slot_data=&Apache::lonnet::get_slot($slot); + if ($slot_data{'endtime'} > time) { + &Apache::lonnet::logthis("not time"); + next; + } + if (&queue_key_locked($key,$cdom,$cnum)) { + &Apache::lonnet::logthis("someone already has um."); + next; + } + return $key; + } + return undef; +} + +sub find_mid_grade { + my ($symb,$cdom,$cnum)=@_; + my $todo=&Apache::lonnet::unescape($env{'form.gradingkey'}); + my $me=$env{'user.name'}.'@'.$env{'user.domain'}; + if ($todo) { + my $who=&queue_key_locked($todo,$cdom,$cnum); + if ($who eq $me) { return $todo; } + } + my $regexp="^$symb\0.*\0locked\$"; + my %locks=&Apache::lonnet::dump('gradingqueue',$cdom,$cnum,$regexp); + foreach my $key (keys(%locks)) { + my $who=$locks{$key}; + if ($who eq $me) { + $todo=$key; + $todo=~s/\0locked$//; + return $todo; + } + } + return undef; +} + +sub get_from_queue { + my $result; + my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser(); + my $cnum=$env{'course.'.$cid.'.num'}; + my $cdom=$env{'course.'.$cid.'.domain'}; + my $todo; + # FIXME need to find if I am 'mid grading' + $todo=&find_mid_grade($symb,$cdom,$cnum); + &Apache::lonnet::logthis("found ".join(':',&decode_queue_key($todo))); + if ($todo) { return $todo; } + while (1) { + my $starttime=time; + &Apache::lonnet::put('gradingqueue',{"$symb\0timestamp"=>$starttime}, + $cdom,$cnum); + &Apache::lonnet::logthis("$starttime"); + my $regexp="^$symb\0queue\0"; + my %queue=&Apache::lonnet::dump('gradingqueue',$cdom,$cnum,$regexp); + #make a pass looking for a user in my section + if ($env{'request.course.sec'}) { + &Apache::lonnet::logthis("sce"); + $todo=&pick_from_queue_data($env{'request.course.sec'},\%queue, + $cdom,$cnum); + &Apache::lonnet::logthis("sce $todo"); + } + # no one in our section so look for any user that is ready for grading + if (!$todo) { + &Apache::lonnet::logthis("no sce"); + $todo=&pick_from_queue_data($env{'request.course.sec'},\%queue, + $cdom,$cnum); + &Apache::lonnet::logthis("no sce $todo"); + } + # no user to grade + if (!$todo) { last; } + &Apache::lonnet::logthis("got $todo"); + # otherwise found someone so lets try to lock them + my $success=&Apache::lonnet::newput('gradingqueue', + {"$todo\0locked"=> + $env{'user.name'}.'@'.$env{'user.domain'}}, + $cdom,$cnum); + # someone else already picked them + &Apache::lonnet::logthis("success $todo"); + if ($success ne 'ok') { next; } + my (undef,$endtime)= + &Apache::lonnet::get('gradingqueue',["$symb\0timestamp"], + $cdom,$cnum); + &Apache::lonnet::logthis("emd $endtime"); + # someone else already modified the queue, + # perhaps our picked user wass already fully graded between + # when we picked him and when we locked his record? so lets + # double check. + if ($endtime != $starttime) { + my ($key,$value)= + &Apache::lonnet::get('gradingqueue',["$todo"], + $cdom,$cnum); + &Apache::lonnet::logthis("check $key .. $value"); + if ($key eq $todo && ref($value)) { + } else { + &Apache::lonnet::del('gradingqueue',["$todo\0locked"], + $cdom,$cnum); + &Apache::lonnet::logthis("del"); + next; + } + } + &Apache::lonnet::logthis("last $todo"); + last; + } + return $todo; +} + sub start_ClosingParagraph { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $result; if ($target eq 'web') { - $result='
Closing
'; + } elsif ($target eq 'webgrade') { + &Apache::lonxml::startredirection(); } return $result; } @@ -145,49 +558,159 @@ sub end_ClosingParagraph { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $result; if ($target eq 'web') { - $result='
'; + } elsif ($target eq 'webgrade') { + &Apache::lonxml::endredirection(); } return $result; } +sub get_id { + my ($parstack,$safeeval)=@_; + my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval); + if (!$id) { $id=$Apache::lonxml::curdepth; } + return $id; +} + my %dimension; -my $dim_id; sub start_Dimension { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; undef(%dimension); - $dim_id=$Apache::lonxml::curdepth; + 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); return ''; } -sub end_Dimension { - my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - my $result; - if ($target eq 'web') { - #FIXME just grabbing the first one for now, need - #to randomly pick one until all have been seen - #then start repicking - my $instance=$dimension{'instances'}->[0]; - my $result=$dimension{'intro'}. - $dimension{$instance.'.text'}. - ''. + ''. + ''. + ''; + $result.=''; + $last_link=$link; + } + } elsif ($target eq 'grade' && $env{'form.webgrade'}) { + my $optional_passed=0; + my $mandatory_failed=0; + my $ungraded=0; + my $review=0; + foreach my $id (@{$dimension{$instance.'.criterias'}}) { + my $status=$Apache::lonhomework::results{"resource.$dim_id.$instance.$id.status"}=$env{'form.HWVAL_criteria_'.$instance.'_'.$id}; + $Apache::lonhomework::results{"resource.$dim_id.$instance.$id.comment"}=$env{'form.HWVAL_comment_criteria_'.$instance.'_'.$id}; + my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N'); + if ($status eq 'pass') { + if (!$mandatory) { $optional_passed++; } + } elsif ($status eq 'fail') { + if ($mandatory) { $mandatory_failed++; } + } elsif ($status eq 'review') { + $review++; + } elsif ($status eq 'ungraded') { + $ungraded++; + } else { + &Apache::lonxml::error("got weird status --$status--"); + } + } + if ($optional_passed < $dimension{$instance.'.optionalrequired'}) { + $mandatory_failed++; + } + &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review"); + if ($review) { + $Apache::lonhomework::results{"resource.$dim_id.status"}= + 'review'; + } elsif ($ungraded) { + $Apache::lonhomework::results{"resource.$dim_id.status"}= + 'ungraded'; + } elsif ($mandatory_failed) { + $Apache::lonhomework::results{"resource.$dim_id.status"}= + 'fail'; + } else { + $Apache::lonhomework::results{"resource.$dim_id.status"}= + 'pass'; + } } - $result=~s/
Criteria
'; - foreach my $id (@{$dimension{$instance.'.criterias'}}) { - $result.=$dimension{$instance.'.criteria.'.$id}. - '
'; +sub get_instance { + #FIXME just grabbing the first one for now, need + #to randomly pick one until all have been seen + #then start repicking + &Apache::response::pushrandomnumber(); + my @order=&Math::Random::random_permutation(@{$dimension{'instances'}}); + return $order[0]; +} + +{ + my $last_link; + sub end_Dimension { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; + my $result; + my $dim_id=&get_id($parstack,$safeeval); + my $instance=&get_instance(); + if ($target eq 'web') { + $result=$dimension{'intro'}.$dimension{$instance.'.text'}; + if ($Apache::lonhomework::history{'resource.status'} eq 'pass' || + $Apache::lonhomework::history{'resource.status'} eq 'fail') { + foreach my $id (@{$dimension{$instance.'.criterias'}}) { + my $status=$Apache::lonhomework::history{"resource.$dim_id.$instance.$id.status"}; + my $comment=$Apache::lonhomework::history{"resource.$dim_id.$instance.$id.comment"}; + $result.='
'; + if ($status eq 'fail') { + $result.=''.&mt('Did not pass').''; + } elsif ($status eq 'pass') { + $result.=''.&mt('Passed').''; + } else { + &Apache::lonxml::error("Student viewing a graded bridgetask was show a status of $status"); + } + $result.='
'; + if ($Apache::lonhomework::history{"resource.$dim_id.$instance.$id.comment"}) { + $result.=&mt('Comment from grader: ').$Apache::lonhomework::history{"resource.$dim_id.$instance.$id.comment"}.'
'; + } + $result.=$dimension{$instance.'.criteria.'.$id}. + '
'; + } + } + } elsif ($target eq 'webgrade') { + my $version=$Apache::lonhomework::history{'resource.version'}; + foreach my $id (@{$dimension{$instance.'.criterias'}}) { + my $link='criteria_'.$instance.'_'.$id; + my $status=$Apache::lonhomework::history{"resource.$dim_id.$instance.$id.status"}; + $result.='
'. + ''. + ''. + '
'. + #$dimension{$instance.'.criteria.'.$id}. + '
Additional Comment for Student
'. + ''. + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + 'Prev
'. + 'Next


'. + ' '. + '
'; + 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.bridgetask.portfiles"})) { + my $file=$file_url.$partial_file; + &Apache::lonnet::allowuploaded('/adm/bridgetask',$file); + $result.=' '.$file. + ''; + } + $result.='
$//; - $result.='
'; + return $result; } - return $result; } sub start_IntroParagraph { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $result; - if ($target eq 'web') { - if ($tagstack->[-2] eq 'Dimension') { + if ($target eq 'web' || $target eq 'webgrade') { + if ($tagstack->[-2] eq 'Dimension' || $target eq 'webgrade') { &Apache::lonxml::startredirection(); - } else { - $result='
Intro
'; } } return $result; @@ -196,21 +719,22 @@ sub start_IntroParagraph { sub end_IntroParagraph { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $result; - if ($target eq 'web') { - if ($tagstack->[-2] eq 'Dimension') { + if ($target eq 'web' || $target eq 'webgrade') { + if ($tagstack->[-2] eq 'Dimension' || $target eq 'webgrade') { $dimension{'intro'}=&Apache::lonxml::endredirection(); - } else { - $result='
'; } } return $result; } -my $instance_id; sub start_Instance { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - push(@{$dimension{'instances'}},$Apache::lonxml::curdepth); - $instance_id=$Apache::lonxml::curdepth; + my $id=&get_id($parstack,$safeeval); + push(@{$dimension{'instances'}},$id); + push(@Apache::bridgetask::instance,$id); + push(@Apache::bridgetask::instancelist,$id); + $dimension{$id.'.optionalrequired'}= + &Apache::lonxml::get_param('OptionalRequired',$parstack,$safeeval); return ''; } @@ -221,7 +745,7 @@ sub end_Instance { sub start_InstanceText { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'webgrade') { &Apache::lonxml::startredirection(); } return ''; @@ -229,7 +753,8 @@ sub start_InstanceText { sub end_InstanceText { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - if ($target eq 'web') { + my $instance_id=$Apache::bridgetask::instance[-1]; + if ($target eq 'web' || $target eq 'webgrade') { $dimension{$instance_id.'.text'}=&Apache::lonxml::endredirection(); } return ''; @@ -237,7 +762,7 @@ sub end_InstanceText { sub start_Criteria { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') { &Apache::lonxml::startredirection(); } return ''; @@ -245,14 +770,48 @@ sub start_Criteria { sub end_Criteria { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - if ($target eq 'web') { + my $instance_id=$Apache::bridgetask::instance[-1]; + if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') { my $criteria=&Apache::lonxml::endredirection(); - my $id=$Apache::lonxml::curdepth; + my $id=&get_id($parstack,$safeeval); $dimension{$instance_id.'.criteria.'.$id}=$criteria; + $dimension{$instance_id.'.criteria.'.$id.'.mandatory'}= + &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval); push(@{$dimension{$instance_id.'.criterias'}},$id); } return ''; } +sub proctor_validation_screen { + my ($slot) = @_; + my (undef,undef,$domain,$user) = &Apache::lonxml::whichuser(); + my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg'); + $user=$env{'form.proctorname'}; + if ($env{'form.proctordomain'}) { $domain=$env{'form.proctordomain'}; } + my $msg; + if ($env{'form.proctorpassword'}) { + $msg='

'.&mt("Failed to authenticate the proctor.") + .'

'; + } + my $result= (<Proctor Validation +

Your room's proctor needs to validate your access to this resource.

+ $msg +
+ + + + + + +
Proctor's Username:
Password:
Proctor's Domain:
+
+Student who should be logged in is:
+
+
+ENDCHECKOUT + return $result; +} + 1; __END__ 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.