--- loncom/homework/bridgetask.pm 2006/05/16 06:43:42 1.151 +++ loncom/homework/bridgetask.pm 2006/05/25 19:55:10 1.156 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.151 2006/05/16 06:43:42 albertel Exp $ +# $Id: bridgetask.pm,v 1.156 2006/05/25 19:55:10 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -95,7 +95,7 @@ sub create_new_version { my $version= $Apache::lonhomework::history{'resource.0.version'}; $version++; - + &Apache::lonxml::debug("Making version $version"); #clean out all current results foreach my $key (keys(%Apache::lonhomework::history)) { if ($key=~/^resource\.0\./) { @@ -108,6 +108,9 @@ sub create_new_version { if (defined($user) && defined($domain)) { $Apache::lonhomework::results{"resource.$version.0.checkedin"}= $user.':'.$domain; + } else { + $Apache::lonhomework::results{"resource.$version.0.checkedin"}= + $env{'user.name'}.':'.$env{'user.domain'}; } if (defined($slot_name)) { $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}= @@ -454,8 +457,11 @@ sub start_Task { my ($version,$previous)=&get_version(); ($status,$accessmsg,my $slot_name,$slot) = &Apache::lonhomework::check_slot_access('0','Task'); - if ($status eq 'CAN_ANSWER' && $version eq '' && $slot_name eq '') { - &create_new_version('Task'); + if ($status eq 'CAN_ANSWER' && $version eq '') { + &create_new_version('Task',undef,undef,$slot_name); + &add_to_queue('gradingqueue',{'type' => 'Task', + 'time' => time, + 'slot' => $slot_name}); ($version,$previous)=&get_version(); } @@ -528,7 +534,7 @@ DONESCREEN && defined($Apache::inputtags::slot_name)) { my $result= &add_to_queue('gradingqueue', - {'type' => 'task', + {'type' => 'Task', 'time' => time, 'slot' => $Apache::inputtags::slot_name}); @@ -916,11 +922,11 @@ DONEBUTTON my $useslots = &Apache::lonnet::EXT("resource.0.useslots"); if ($useslots =~ /^\s*no\s*$/i) { &add_to_queue('gradingqueue', - {'type' => 'task', + {'type' => 'Task', 'time' => time}); } elsif (defined($Apache::inputtags::slot_name)) { &add_to_queue('gradingqueue', - {'type' => 'task', + {'type' => 'Task', 'time' => time, 'slot' => $Apache::inputtags::slot_name}); } @@ -1192,6 +1198,24 @@ sub add_to_queue { return &Apache::lonnet::cput($queue,\%data,$cdom,$cnum); } +sub get_limited_classlist { + my ($sections) = @_; + + my $classlist = &Apache::loncoursedata::get_classlist(); + + if (!grep('all',@{ $sections })) { + foreach my $student (keys(%$classlist)) { + my $section = + $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()]; + if (! grep($section,@{ $sections })) { + delete($classlist->{$student}); + } + } + } + return $classlist; +} + + sub show_queue { my ($queue,$with_selects)=@_; my $result; @@ -1201,14 +1225,25 @@ sub show_queue { 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 $classlist = &get_limited_classlist(\@chosen_sections); + if (!(grep(/^all$/,@chosen_sections))) { $result.='

Showing only sections '.join(', ',@chosen_sections). '.

'."\n"; } + my ($view,$view_section); + my $scope = $env{'request.course.id'}; + if (!($view=&Apache::lonnet::allowed('vgr',$scope))) { + $scope .= '/'.$env{'request.course.sec'}; + if ( $view = &Apache::lonnet::allowed('vgr',$scope)) { + $view_section=$env{'request.course.sec'}; + } else { + undef($view); + } + } + my $regexp="^$symb\0"; my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); my ($tmp)=%queue; @@ -1222,6 +1257,16 @@ sub show_queue { foreach my $key (sort(keys(%queue))) { my ($symb,$uname,$udom) = &decode_queue_key($key); if (!defined($classlist->{$uname.':'.$udom})) { next; } + + my $section = $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()]; + + my $can_view=1; + if (!$view + || ($view_section && !$section) + || ($view_section && $section && ($view_section ne $section))) { + $can_view=0; + } + if ($key=~/locked$/ && !$with_selects) { $result.="$uname"; $result.=''.$queue{$key}.''; @@ -1257,7 +1302,7 @@ sub show_queue { $seclist.=''; } - if ($end_time ne '' && time > $end_time) { + if ($can_view && ($end_time ne '' && time > $end_time)) { $result.=(<$status @@ -1272,12 +1317,13 @@ sub show_queue { FORM - + } elsif (!$can_view && ($end_time ne '' && time > $end_time)) { + $result.=''.&mt("Not gradable").' ' } else { $result.=''.&mt("In Progress").' ' } } - $result.= "".$fullname->{$uname.':'.$udom}. + $result.= "".$classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_FULLNAME()]. " ($uname:$udom) "; $result.=''.$slot_text.' End time: '. &Apache::lonlocal::locallocaltime($end_time). @@ -1294,6 +1340,9 @@ sub get_queue_counts { my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser(); my $cnum=$env{'course.'.$cid.'.num'}; my $cdom=$env{'course.'.$cid.'.domain'}; + + my $classlist=&Apache::loncoursedata::get_classlist(); + my $regexp="^$symb\0"; my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); my ($tmp)=%queue; @@ -1303,12 +1352,14 @@ sub get_queue_counts { my ($entries,$ready_to_grade,$locks)=(0,0,0); my %slot_cache; foreach my $key (sort(keys(%queue))) { + my ($symb,$uname,$udom) = &decode_queue_key($key); + if (!defined($classlist->{$uname.':'.$udom})) { next; } + if ($key=~/locked$/) { $locks++; } elsif ($key=~/timestamp$/) { #ignore } elsif ($key!~/(timestamp|locked)$/) { - my ($symb,$uname,$udom) = &decode_queue_key($key); $entries++; if (my $slot=&slotted_access($queue{$key})) { if (!exists($slot_cache{$slot})) { @@ -1373,14 +1424,18 @@ sub slotted_access { } sub pick_from_queue_data { - my ($queue,$check_section,$queuedata,$cdom,$cnum)=@_; + my ($queue,$check_section,$queuedata,$cdom,$cnum,$classlist)=@_; my @possible; # will hold queue entries that are valid to be selected foreach my $key (keys(%$queuedata)) { if ($key =~ /\0locked$/) { next; } if ($key =~ /\0timestamp$/) { next; } + my ($symb,$uname,$udom)=&decode_queue_key($key); + if (!defined($classlist->{$uname.':'.$udom})) { next; } + if ($check_section) { - my $section=&Apache::lonnet::getsection($uname,$udom); + my $section = + $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()]; if ($section eq $check_section) { &Apache::lonxml::debug("my sec"); next; @@ -1388,20 +1443,23 @@ sub pick_from_queue_data { } my $end_time; if (my $slot=&slotted_access($queuedata->{$key})) { + &Apache::lonxml::debug("looking at slot $slot"); my %slot_data=&Apache::lonnet::get_slot($slot); if ($slot_data{'endtime'} < time) { $end_time = $slot_data{'endtime'}; + } else { + &Apache::lonxml::debug("not time ".$slot_data{'endtime'}); + next; } } else { my $due_date = &Apache::lonhomework::due_date('0',$symb); - if ($due_date > time) { + if ($due_date < time) { $end_time = $due_date; + } else { + &Apache::lonxml::debug("not time $due_date"); + next; } } - if ($end_time ne '') { - &Apache::lonxml::debug("not time"); - next; - } if (exists($queuedata->{"$key\0locked"})) { &Apache::lonxml::debug("someone already has um."); @@ -1468,6 +1526,8 @@ sub get_queue_symb_status { $cnum=$env{'course.'.$cid.'.num'}; $cdom=$env{'course.'.$cid.'.domain'}; } + my $classlist=&Apache::loncoursedata::get_classlist(); + my $regexp="^$symb\0"; my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); my ($tmp)=%queue; @@ -1477,6 +1537,7 @@ sub get_queue_symb_status { next if ($key=~/locked$/); next if ($key=~/timestamp$/); my ($symb,$uname,$udom) = &decode_queue_key($key); + next if (!defined($classlist->{$uname.':'.$udom})); push(@users,"$uname:$udom"); } return @users; @@ -1492,6 +1553,9 @@ sub get_from_queue { &Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo))); if ($todo) { return $todo; } my $attempts=0; + + my $classlist=&Apache::loncoursedata::get_classlist(); + while (1) { if ($attempts > 2) { # tried twice to get a queue entry, giving up @@ -1502,21 +1566,22 @@ sub get_from_queue { $cdom,$cnum); &Apache::lonxml::debug("$starttime"); my $regexp="^$symb\0queue\0"; - my $range= ($attempts < 1 ) ? '0-100' : '0-400'; + #my $range= ($attempts < 1 ) ? '0-100' : '0-400'; my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); #make a pass looking for a user _not_ in my section if ($env{'request.course.sec'}) { &Apache::lonxml::debug("sce"); $todo=&pick_from_queue_data($queue,$env{'request.course.sec'}, - \%queue,$cdom,$cnum); + \%queue,$cdom,$cnum,$classlist); &Apache::lonxml::debug("sce $todo"); } # no one _not_ in our section so look for any user that is # ready for grading if (!$todo) { &Apache::lonxml::debug("no sce"); - $todo=&pick_from_queue_data($queue,undef,\%queue,$cdom,$cnum); + $todo=&pick_from_queue_data($queue,undef,\%queue,$cdom,$cnum, + $classlist); &Apache::lonxml::debug("no sce $todo"); } # no user to grade @@ -1561,9 +1626,8 @@ sub select_user { 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 $classlist = &get_limited_classlist(\@chosen_sections); my $result; if (!(grep(/^all$/,@chosen_sections))) { @@ -1572,7 +1636,7 @@ sub select_user { } $result.=''; - foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) { + foreach my $student (sort {lc($classlist->{$a}[&Apache::loncoursedata::CL_FULLNAME()]) cmp lc($classlist->{$b}[&Apache::loncoursedata::CL_FULLNAME()]) } (keys(%$classlist))) { my ($uname,$udom) = split(/:/,$student); my $cnum=$env{'course.'.$cid.'.num'}; @@ -1595,7 +1659,7 @@ sub select_user { my $todo = &Apache::lonnet::escape(&encode_queue_key($symb,$udom,$uname)); if ($cannot_grade) { - $result.=' +
 '.$fullname->{$student}. + $result.='
 '.$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()]. ''; } else { my $seclist; @@ -1603,8 +1667,6 @@ sub select_user { $seclist.=''; } - my $studentdis = $student; - $studentdis =~ tr/:/@/; $result.=< @@ -1616,7 +1678,7 @@ sub select_user { $seclist - $fullname->{$student} ($studentdis)$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] ($student) RESULT } @@ -1777,8 +1839,6 @@ sub get_instance { my $dim=&get_id($parstack,$safeeval); my $instance=&get_instance($dim); my $version=&get_version(); - use Data::Dumper; - &Apache::lonxml::debug(Dumper(\%dimension)); if ($target eq 'web') { @Apache::scripttag::parser_env = @_; $result.=&Apache::scripttag::xmlparse($dimension{'intro'}); @@ -1905,9 +1965,14 @@ sub get_instance { my $mandatory_failed=0; my $ungraded=0; my $review=0; + + @Apache::scripttag::parser_env = @_; + $result.=&Apache::scripttag::xmlparse($dimension{'intro'}); foreach my $id (@{$dimension{$instance.'.criterias'}}, @{$dimension{'criterias'}}) { my $link=&link($id); + @Apache::scripttag::parser_env = @_; + $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'}); my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$id.status"}=$env{'form.HWVAL_'.$link}; $Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link}; my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N'); @@ -1991,7 +2056,7 @@ sub grading_history { sub start_IntroParagraph { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; - if ($target eq 'web' || $target eq 'webgrade') { + if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') { if ($tagstack->[-2] eq 'Dimension' || $tagstack->[-2] eq 'Question' ) { $dimension{'intro'}= &Apache::lonxml::get_all_text('/introparagraph', @@ -2033,7 +2098,7 @@ sub start_InstanceText { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $instance_id=$Apache::bridgetask::instance[-1]; my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style); - if ($target eq 'web' || $target eq 'webgrade') { + if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') { $dimension{$instance_id.'.text'}=$text; } return '';