version 1.78, 2005/11/15 21:41:10
|
version 1.87, 2005/12/01 18:46:31
|
Line 60 sub initialize_bridgetask {
|
Line 60 sub initialize_bridgetask {
|
} |
} |
|
|
sub proctor_check_auth { |
sub proctor_check_auth { |
my ($slot_name,$slot)=@_; |
my ($slot_name,$slot,$type)=@_; |
my $user=$env{'form.proctorname'}; |
my $user=$env{'form.proctorname'}; |
my $domain=$env{'form.proctordomain'}; |
my $domain=$env{'form.proctordomain'}; |
|
|
Line 79 sub proctor_check_auth {
|
Line 79 sub proctor_check_auth {
|
$authenticated=1; |
$authenticated=1; |
} |
} |
} |
} |
if ($authenticated) { |
if ($authenticated && $type eq 'Task') { |
my $version= |
my $version= |
$Apache::lonhomework::results{'resource.version'}= |
$Apache::lonhomework::results{'resource.version'}= |
++$Apache::lonhomework::history{'resource.version'}; |
++$Apache::lonhomework::history{'resource.version'}; |
Line 93 sub proctor_check_auth {
|
Line 93 sub proctor_check_auth {
|
} |
} |
} |
} |
return 1; |
return 1; |
|
} elsif ($authenticated && $type eq 'problem') { |
|
&Apache::lonxml::debug("authed #slot_name"); |
|
$Apache::lonhomework::results{"resource.0.checkedin"}= |
|
$user.'@'.$domain; |
|
$Apache::lonhomework::results{"resource.0.checkedin.slot"}= |
|
$slot_name; |
} |
} |
} |
} |
} |
} |
Line 375 INFO
|
Line 381 INFO
|
} |
} |
|
|
sub start_Task { |
sub start_Task { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
|
my ($status,$accessmsg,$slot); |
my ($status,$accessmsg,$slot); |
if ($target ne 'webgrade') { |
if ($target ne 'webgrade') { |
Line 416 sub start_Task {
|
Line 422 sub start_Task {
|
$target eq 'tex') { |
$target eq 'tex') { |
my ($version,$previous)=&get_version(); |
my ($version,$previous)=&get_version(); |
($status,$accessmsg,my $slot_name,$slot) = |
($status,$accessmsg,my $slot_name,$slot) = |
&Apache::lonhomework::check_task_access('0'); |
&Apache::lonhomework::check_slot_access('0','Task'); |
push(@Apache::inputtags::status,$status); |
push(@Apache::inputtags::status,$status); |
$Apache::inputtags::slot_name=$slot_name; |
$Apache::inputtags::slot_name=$slot_name; |
my $expression='$external::datestatus="'.$status.'";'; |
my $expression='$external::datestatus="'.$status.'";'; |
Line 425 sub start_Task {
|
Line 431 sub start_Task {
|
&Apache::lonxml::debug("Got $status"); |
&Apache::lonxml::debug("Got $status"); |
$body_tag_start.=&add_previous_version_button($status); |
$body_tag_start.=&add_previous_version_button($status); |
if (!&show_task($status,$previous)) { |
if (!&show_task($status,$previous)) { |
my $bodytext=&Apache::lonxml::get_all_text("/task",$parser); |
my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style); |
if ( $target eq "web" ) { |
if ( $target eq "web" ) { |
$result.= $head_tag_start.'</head>'.$body_tag_start; |
$result.= $head_tag_start.'</head>'.$body_tag_start; |
if ($env{'request.state'} eq 'construct') { |
if ($env{'request.state'} eq 'construct') { |
Line 470 DONESCREEN
|
Line 476 DONESCREEN
|
} |
} |
} elsif ($target eq 'grade' && !$env{'form.webgrade'}) { |
} elsif ($target eq 'grade' && !$env{'form.webgrade'}) { |
if ($status eq 'NEEDS_CHECKIN') { |
if ($status eq 'NEEDS_CHECKIN') { |
if(&proctor_check_auth($slot_name,$slot)) { |
if(&proctor_check_auth($slot_name,$slot,'Task') |
|
&& defined($Apache::inputtags::slot_name)) { |
my $result=&add_to_queue('gradingqueue', |
my $result=&add_to_queue('gradingqueue', |
$Apache::inputtags::slot_name); |
[$Apache::inputtags::slot_name]); |
&Apache::lonxml::debug("add_to_queue said $result"); |
&Apache::lonxml::debug("add_to_queue said $result"); |
} |
} |
} |
} |
Line 525 DONESCREEN
|
Line 532 DONESCREEN
|
} else { |
} else { |
if ($target eq 'webgrade') { |
if ($target eq 'webgrade') { |
$result.="\n"; |
$result.="\n"; |
|
my $back='<p><a href="/adm/flip?postdata=return:">'. |
|
&mt('Return to resource').'</a></p>'; |
if ($status_code eq 'stop') { |
if ($status_code eq 'stop') { |
$result.='<b>'.&mt("Stopped grading.").'</b>'; |
$result.='<b>'.&mt("Stopped grading.").'</b>'.$back; |
} elsif ($status_code eq 'lock_failed') { |
} elsif ($status_code eq 'lock_failed') { |
$result.='<b>'.&mt("Failed to lock the request record.").'</b>'; |
$result.='<b>'.&mt("Failed to lock the request record.") |
|
.'</b>'.$back; |
} elsif ($status_code eq 'unlock') { |
} elsif ($status_code eq 'unlock') { |
$result.='<b>'.&mt("Unlocked the requested record.").'</b>'; |
$result.='<b>'.&mt("Unlocked the requested record.") |
|
.'</b>'.$back; |
$result.=&show_queue($env{'form.queue'},1); |
$result.=&show_queue($env{'form.queue'},1); |
} elsif ($status_code eq 'show_list') { |
} elsif ($status_code eq 'show_list') { |
$result.=&show_queue($env{'form.queue'},1); |
$result.=&show_queue($env{'form.queue'},1); |
} elsif ($status_code eq 'select_user') { |
} elsif ($status_code eq 'select_user') { |
$result.=&select_user(); |
$result.=&select_user(); |
} else { |
} else { |
$result.='<b>'.&mt("No user to be graded.").'</b>'; |
$result.='<b>'.&mt("No user to be graded.").'</b>'.$back; |
} |
} |
} |
} |
$webgrade='no'; |
$webgrade='no'; |
my $bodytext=&Apache::lonxml::get_all_text("/task",$parser); |
my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style); |
} |
} |
if ($target eq 'webgrade' && defined($env{'form.queue'})) { |
if ($target eq 'webgrade' && defined($env{'form.queue'})) { |
if ($webgrade eq 'yes') { |
if ($webgrade eq 'yes') { |
Line 671 sub get_key_todo {
|
Line 682 sub get_key_todo {
|
} |
} |
return (undef,undef) |
return (undef,undef) |
} |
} |
|
|
sub end_Task { |
sub end_Task { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my $result=''; |
my $result=''; |
Line 710 DONEBUTTON
|
Line 720 DONEBUTTON
|
$Apache::lonhomework::history{"resource.$version.status"} =~ /^(pass|fail)$/) { |
$Apache::lonhomework::history{"resource.$version.status"} =~ /^(pass|fail)$/) { |
my $bt_status=$Apache::lonhomework::history{"resource.$version.status"}; |
my $bt_status=$Apache::lonhomework::history{"resource.$version.status"}; |
my $title=&Apache::lonnet::gettitle(); |
my $title=&Apache::lonnet::gettitle(); |
my %slot=&Apache::lonnet::get_slot($Apache::inputtags::slot_name); |
|
|
my $slot_name= |
|
$Apache::lonhomework::history{"resource.$version.checkedin.slot"}; |
|
my %slot=&Apache::lonnet::get_slot($slot_name); |
my $start_time= |
my $start_time= |
&Apache::lonlocal::locallocaltime($slot{'starttime'}); |
&Apache::lonlocal::locallocaltime($slot{'starttime'}); |
|
|
my $status; |
my $status = "\n<div class='$bt_status'>\n"; |
$status.="\n<div class='$bt_status'>\n"; |
|
|
|
if ($bt_status eq 'pass') { |
if ($bt_status eq 'pass') { |
$status.='<h2>You passed the '.$title.' given on '. |
$status.='<h2>You passed the '.$title.' given on '. |
$start_time.'.</h2>'; |
$start_time.'</h2>'; |
} |
} |
if ($bt_status eq 'fail') { |
if ($bt_status eq 'fail') { |
$status.='<h2>You did not pass the '.$title.' given on '. |
$status.='<h2>You did not pass the '.$title.' given on '. |
$start_time.'.</h2>'; |
$start_time.'</h2>'; |
if (!$previous) { |
if (!$previous) { |
$status.=&add_request_another_attempt_button(); |
$status.=&add_request_another_attempt_button(); |
} |
} |
Line 776 DONEBUTTON
|
Line 788 DONEBUTTON
|
} |
} |
&Apache::lonhomework::showhash(%Apache::lonhomework::results); |
&Apache::lonhomework::showhash(%Apache::lonhomework::results); |
&Apache::structuretags::finalize_storage(); |
&Apache::structuretags::finalize_storage(); |
if ($award eq 'SUBMITTED') { |
if ($award eq 'SUBMITTED' |
&add_to_queue('gradingqueue',$Apache::inputtags::slot_name); |
&& defined($Apache::inputtags::slot_name)) { |
|
&add_to_queue('gradingqueue',[$Apache::inputtags::slot_name]); |
} |
} |
|
} elsif ($Apache::lonhomework::results{'INTERNAL_store'}) { |
|
&Apache::structuretags::finalize_storage(); |
} |
} |
if ($target eq 'grade' && $env{'form.webgrade'} eq 'yes') { |
if ($target eq 'grade' && $env{'form.webgrade'} eq 'yes') { |
my $optional_required= |
my $optional_required= |
Line 912 sub move_between_queues {
|
Line 927 sub move_between_queues {
|
} else { |
} else { |
$cur_data = ['none']; |
$cur_data = ['none']; |
} |
} |
my $result=&add_to_queue($dest_queue,$cur_data->[0]); |
my $result=&add_to_queue($dest_queue,[$cur_data->[0]]); |
if ($result ne 'ok') { |
if ($result ne 'ok') { |
return $result; |
return $result; |
} |
} |
Line 941 sub check_queue_unlock {
|
Line 956 sub check_queue_unlock {
|
} |
} |
|
|
sub remove_from_queue { |
sub remove_from_queue { |
my ($queue)=@_; |
my ($queue,$symb,$cdom,$cnum,$udom,$uname)=@_; |
if ($queue eq 'none') { return 'ok'; } |
if ($queue eq 'none') { return 'ok'; } |
my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser(); |
if (!defined($symb) || !defined($cdom) || !defined($cnum) |
my $cnum=$env{'course.'.$cid.'.num'}; |
|| !defined($udom) || !defined($uname)) { |
my $cdom=$env{'course.'.$cid.'.domain'}; |
($symb,my $cid,$udom,$uname)=&Apache::lonxml::whichuser(); |
my $key="$symb\0queue\0$uname\@$udom"; |
$cnum=$env{'course.'.$cid.'.num'}; |
|
$cdom=$env{'course.'.$cid.'.domain'}; |
|
} |
|
my $key=&encode_queue_key($symb,$udom,$uname); |
my @keys=($key,"$key\0locked"); |
my @keys=($key,"$key\0locked"); |
|
&Apache::lonnet::logthis("removing @keys"); |
return &Apache::lonnet::del($queue,\@keys,$cdom,$cnum); |
return &Apache::lonnet::del($queue,\@keys,$cdom,$cnum); |
} |
} |
|
|
Line 975 sub get_queue_data {
|
Line 994 sub get_queue_data {
|
return undef; |
return undef; |
} |
} |
|
|
|
|
sub check_queue_for_key { |
sub check_queue_for_key { |
my ($cid,$queue,$todo)=@_; |
my ($cdom,$cnum,$queue,$todo)=@_; |
my $cnum=$env{'course.'.$cid.'.num'}; |
|
my $cdom=$env{'course.'.$cid.'.domain'}; |
|
my %results= |
my %results= |
&Apache::lonnet::get($queue,[$todo,"$todo\0locked"],$cdom,$cnum); |
&Apache::lonnet::get($queue,[$todo,"$todo\0locked"],$cdom,$cnum); |
|
|
Line 986 sub check_queue_for_key {
|
Line 1005 sub check_queue_for_key {
|
if (defined($results{"$todo\0locked"})) { |
if (defined($results{"$todo\0locked"})) { |
return 'locked'; |
return 'locked'; |
} |
} |
my $slot=$results{$todo}->[0]; |
my $slot; |
my %slot_data=&Apache::lonnet::get_slot($slot); |
if (ref($results{$todo}) eq 'ARRAY') { |
if ($slot_data{'endtime'} > time) { |
$slot = $results{$todo}[0]; |
return 'in_progress'; |
} elsif (ref($results{$todo}) eq 'HASH') { |
|
$slot = $results{$todo}{'slot'}; |
|
} |
|
if (defined($slot)) { |
|
my %slot_data=&Apache::lonnet::get_slot($slot); |
|
if ($slot_data{'endtime'} > time) { |
|
return 'in_progress'; |
|
} |
} |
} |
return 'enqueued'; |
return 'enqueued'; |
} |
} |
Line 997 sub check_queue_for_key {
|
Line 1023 sub check_queue_for_key {
|
} |
} |
|
|
sub add_to_queue { |
sub add_to_queue { |
my ($queue,$slot_name)=@_; |
my ($queue,$user_data)=@_; |
if ($queue eq 'none') { return 'ok'; } |
if ($queue eq 'none') { return 'ok'; } |
my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser(); |
my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser(); |
|
if (!$cid || $env{'request.state'} eq 'construct') { |
|
return 'no_queue'; |
|
} |
my $cnum=$env{'course.'.$cid.'.num'}; |
my $cnum=$env{'course.'.$cid.'.num'}; |
my $cdom=$env{'course.'.$cid.'.domain'}; |
my $cdom=$env{'course.'.$cid.'.domain'}; |
my %data; |
my %data; |
$data{"$symb\0queue\0$uname\@$udom"}=[$slot_name]; |
$data{"$symb\0queue\0$uname\@$udom"}=$user_data; |
return &Apache::lonnet::newput($queue,\%data,$cdom,$cnum); |
return &Apache::lonnet::cput($queue,\%data,$cdom,$cnum); |
} |
} |
|
|
sub show_queue { |
sub show_queue { |
Line 1030 sub show_queue {
|
Line 1059 sub show_queue {
|
if ($tmp=~/^error: 2 /) { |
if ($tmp=~/^error: 2 /) { |
return "\n<h3>Current Queue - $queue</h3><table border='1'><tr><td>Empty</td></tr></table>"; |
return "\n<h3>Current Queue - $queue</h3><table border='1'><tr><td>Empty</td></tr></table>"; |
} |
} |
$result.="\n<h3>Current Queue - $queue </h3><table border='1'><tr>"; |
$result.="\n<h3>Current Queue - $symb $queue </h3><table border='1'><tr>"; |
if ($with_selects) { $result.="<th></th>"; } |
if ($with_selects) { $result.="<th></th>"; } |
$result.="<th>resource</th><th>user</th><th>type</th><th>data</th></tr>"; |
$result.="<th>resource</th><th>user</th><th>type</th><th>data</th></tr>"; |
foreach my $key (sort(keys(%queue))) { |
foreach my $key (sort(keys(%queue))) { |
Line 1218 sub lock_key {
|
Line 1247 sub lock_key {
|
return 0; |
return 0; |
} |
} |
|
|
|
sub get_queue_symb_status { |
|
my ($queue,$symb,$cdom,$cnum) = @_; |
|
if (!defined($cdom) || !defined($cnum)) { |
|
my (undef,$cid)=&Apache::lonxml::whichuser(); |
|
$cnum=$env{'course.'.$cid.'.num'}; |
|
$cdom=$env{'course.'.$cid.'.domain'}; |
|
} |
|
my $regexp="^$symb\0"; |
|
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); |
|
my ($tmp)=%queue; |
|
if ($tmp=~/^error: 2 /) { return; } |
|
my @users; |
|
foreach my $key (sort(keys(%queue))) { |
|
next if ($key=~/locked$/); |
|
next if ($key=~/timestamp$/); |
|
my ($symb,$uname,$udom) = &decode_queue_key($key); |
|
push(@users,"$uname:$udom"); |
|
} |
|
return @users; |
|
} |
|
|
sub get_from_queue { |
sub get_from_queue { |
my ($queue)=@_; |
my ($queue)=@_; |
my $result; |
my $result; |
Line 1229 sub get_from_queue {
|
Line 1279 sub get_from_queue {
|
if ($todo) { return $todo; } |
if ($todo) { return $todo; } |
while (1) { |
while (1) { |
my $starttime=time; |
my $starttime=time; |
&Apache::lonnet::put($queue,{"$symb\0timestamp"=>$starttime}, |
&Apache::lonnet::cput($queue,{"$symb\0timestamp"=>$starttime}, |
$cdom,$cnum); |
$cdom,$cnum); |
&Apache::lonxml::debug("$starttime"); |
&Apache::lonxml::debug("$starttime"); |
my $regexp="^$symb\0queue\0"; |
my $regexp="^$symb\0queue\0"; |
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); |
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); |
Line 1301 sub select_user {
|
Line 1351 sub select_user {
|
foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) { |
foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) { |
my ($uname,$udom) = split(/:/,$student); |
my ($uname,$udom) = split(/:/,$student); |
|
|
my %status = &get_student_status($symb,$cid,$udom,$uname); |
my $cnum=$env{'course.'.$cid.'.num'}; |
|
my $cdom=$env{'course.'.$cid.'.domain'}; |
|
my %status = &get_student_status($symb,$cdom,$cnum,$udom,$uname); |
my $queue = 'none'; |
my $queue = 'none'; |
my $cannot_grade; |
my $cannot_grade; |
if ($status{'reviewqueue'} =~ /^(in_progress|enqueue)$/) { |
if ($status{'reviewqueue'} =~ /^(in_progress|enqueue)$/) { |
Line 1380 RESULT
|
Line 1432 RESULT
|
} |
} |
|
|
sub get_student_status { |
sub get_student_status { |
my ($symb,$cid,$udom,$uname)=@_; |
my ($symb,$cdom,$cnum,$udom,$uname,$type)=@_; |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, |
|
$udom,$uname); |
|
my %status; |
my %status; |
$status{'status'}=$record{'resource.status'}; |
|
$status{'version'}=$record{'resource.version'}; |
if ($type eq 'Task') { |
$status{'grader'}=$record{'resource.grader'}; |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, |
$status{'reviewqueue'}=&check_queue_for_key($cid,'reviewqueue', |
$udom,$uname); |
&encode_queue_key($symb,$udom,$uname)); |
$status{'status'}=$record{'resource.status'}; |
$status{'gradingqueue'}=&check_queue_for_key($cid,'gradingqueue', |
$status{'version'}=$record{'resource.version'}; |
&encode_queue_key($symb,$udom,$uname)); |
$status{'grader'}=$record{'resource.grader'}; |
|
} |
|
$status{'reviewqueue'}= |
|
&check_queue_for_key($cdom,$cnum,'reviewqueue', |
|
&encode_queue_key($symb,$udom,$uname)); |
|
$status{'gradingqueue'}= |
|
&check_queue_for_key($cdom,$cnum,'gradingqueue', |
|
&encode_queue_key($symb,$udom,$uname)); |
return %status; |
return %status; |
} |
} |
|
|
Line 1466 sub get_instance {
|
Line 1524 sub get_instance {
|
$instance = $instances[($version-1)%scalar(@instances)]; |
$instance = $instances[($version-1)%scalar(@instances)]; |
$Apache::lonhomework::results{"resource.$version.0.$dim.instance"} = |
$Apache::lonhomework::results{"resource.$version.0.$dim.instance"} = |
$instance; |
$instance; |
|
$Apache::lonhomework::results{'INTERNAL_store'} = 1; |
&Apache::response::poprandomnumber(); |
&Apache::response::poprandomnumber(); |
return $instance; |
return $instance; |
} |
} |
Line 1639 sub get_instance {
|
Line 1698 sub get_instance {
|
} |
} |
|
|
sub start_IntroParagraph { |
sub start_IntroParagraph { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $result; |
my $result; |
if ($target eq 'web' || $target eq 'webgrade') { |
if ($target eq 'web' || $target eq 'webgrade') { |
if ($tagstack->[-2] eq 'Dimension') { |
if ($tagstack->[-2] eq 'Dimension') { |
$dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser); |
$dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style); |
|
|
} elsif ($target eq 'webgrade') { |
} elsif ($target eq 'webgrade') { |
&Apache::lonxml::get_all_text('/introparagraph',$parser); |
&Apache::lonxml::get_all_text('/introparagraph',$parser,$style); |
} |
} |
|
|
} |
} |
Line 1675 sub end_Instance {
|
Line 1734 sub end_Instance {
|
} |
} |
|
|
sub start_InstanceText { |
sub start_InstanceText { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $instance_id=$Apache::bridgetask::instance[-1]; |
my $instance_id=$Apache::bridgetask::instance[-1]; |
my $text=&Apache::lonxml::get_all_text('/instancetext',$parser); |
my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style); |
if ($target eq 'web' || $target eq 'webgrade') { |
if ($target eq 'web' || $target eq 'webgrade') { |
$dimension{$instance_id.'.text'}=$text; |
$dimension{$instance_id.'.text'}=$text; |
} |
} |
Line 1689 sub end_InstanceText {
|
Line 1748 sub end_InstanceText {
|
} |
} |
|
|
sub start_Criteria { |
sub start_Criteria { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $instance_id=$Apache::bridgetask::instance[-1]; |
my $instance_id=$Apache::bridgetask::instance[-1]; |
my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser); |
my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser,$style); |
if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') { |
if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') { |
my $id=&get_id($parstack,$safeeval); |
my $id=&get_id($parstack,$safeeval); |
$dimension{$instance_id.'.criteria.'.$id}=$criteria; |
$dimension{$instance_id.'.criteria.'.$id}=$criteria; |