--- loncom/homework/bridgetask.pm 2006/05/23 19:55:40 1.153
+++ loncom/homework/bridgetask.pm 2006/11/09 17:50:51 1.197
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: bridgetask.pm,v 1.153 2006/05/23 19:55:40 albertel Exp $
+# $Id: bridgetask.pm,v 1.197 2006/11/09 17:50:51 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -38,25 +38,28 @@ use Apache::lonlocal;
use Apache::lonxml;
use Apache::slotrequest();
use Time::HiRes qw( gettimeofday tv_interval );
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
+
BEGIN {
- &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','Instance','InstanceText','Criteria','ClosingParagraph'));
+ &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','QuestionText','Setup','Instance','InstanceText','Criteria','GraderNote','ClosingParagraph'));
}
+my %dimension;
+my $top = 'top';
+
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=();
+ @Apache::bridgetask::dimension=();
# list of all current Instance ids
- @Apache::bridgetask::instance=();
+ %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='';
+ undef(%dimension);
}
sub proctor_check_auth {
@@ -80,7 +83,7 @@ sub proctor_check_auth {
}
}
if ($authenticated) {
- &create_new_version($type,$user,$domain,$slot_name);
+ &check_in($type,$user,$domain,$slot_name);
return 1;
}
}
@@ -88,8 +91,43 @@ sub proctor_check_auth {
return 0;
}
+sub check_in {
+ my ($type,$user,$domain,$slot_name) = @_;
+ my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
+ if ( $useslots eq 'map_map') {
+ &check_in_sequence($user,$domain,$slot_name);
+ } else {
+ &create_new_version($type,$user,$domain,$slot_name);
+ }
+ return 1;
+}
+
+sub check_in_sequence {
+ my ($user,$domain,$slot_name) = @_;
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my ($symb) = &Apache::lonnet::whichuser();
+ my ($map) = &Apache::lonnet::decode_symb($symb);
+ my @resources =
+ $navmap->retrieveResources($map, sub { $_[0]->is_problem() },0,0);
+ my %old_history = %Apache::lonhomework::history;
+ my %old_results = %Apache::lonhomework::results;
+
+ foreach my $res (@resources) {
+ &Apache::lonxml::debug("doing ".$res->src);
+ &Apache::structuretags::initialize_storage($res->symb);
+ my $type = ($res->is_task()) ? 'Task' : 'problem';
+ &create_new_version($type,$user,$domain,$slot_name);
+ &Apache::structuretags::finalize_storage($res->symb);
+ }
+
+ %Apache::lonhomework::history = %old_history;
+ %Apache::lonhomework::results = %old_results;
+}
+
sub create_new_version {
my ($type,$user,$domain,$slot_name) = @_;
+
+ my $id = '0';
if ($type eq 'Task') {
# increment version
my $version=
@@ -104,28 +142,27 @@ sub create_new_version {
}
#setup new version and who did it
- $Apache::lonhomework::results{'resource.0.version'}=$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"}=
- $slot_name;
+ $Apache::lonhomework::results{'resource.0.version'}=$version;
+ $id = "$version.0";
+ if (!defined($user) || !defined($domain)) {
+ $user = $env{'user.name'};
+ $domain = $env{'user.domain'};
}
+
} elsif ($type eq 'problem') {
&Apache::lonxml::debug("authed $slot_name");
- if (defined($user) && defined($domain)) {
- $Apache::lonhomework::results{"resource.0.checkedin"}=
- $user.':'.$domain;
- }
- if (defined($slot_name)) {
- $Apache::lonhomework::results{"resource.0.checkedin.slot"}=
- $slot_name;
- }
+ }
+ if (!defined($user) || !defined($domain)) {
+ $user = $env{'user.name'};
+ $domain = $env{'user.domain'};
+ }
+
+ $Apache::lonhomework::results{"resource.$id.checkedin"}=
+ $user.':'.$domain;
+
+ if (defined($slot_name)) {
+ $Apache::lonhomework::results{"resource.$id.checkedin.slot"}=
+ $slot_name;
}
}
@@ -188,7 +225,7 @@ sub add_previous_version_button {
}
sub add_grading_button {
- my (undef,$cid)=&Apache::lonxml::whichuser();
+ my (undef,$cid)=&Apache::lonnet::whichuser();
my $cnum=$env{'course.'.$cid.'.num'};
my $cdom=$env{'course.'.$cid.'.domain'};
my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
@@ -263,7 +300,7 @@ STUFF
}
if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }
- $symb=&Apache::lonnet::escape($symb);
+ $symb=&escape($symb);
$result.='
';
if ($status_code eq 'stop') {
$result.=''.&mt("Stopped grading.").''.$back;
+ } elsif ($status_code eq 'cancel') {
+ $result.=''.&mt("Cancelled grading.").''.$back;
+ } elsif ($status_code eq 'never_versioned') {
+ $result.=''.
+ &mt("Requested user has never accessed the task.").
+ ''.$back;
+ } elsif ($status_code =~ /still_open:(.*)/) {
+ my $date = &Apache::lonlocal::locallocaltime($1);
+ $result.=''.
+ &mt("Task is still open, will close at [_1].",$date).
+ ''.$back;
} elsif ($status_code eq 'lock_failed') {
$result.=''.&mt("Failed to lock the requested record.")
.''.$back;
@@ -609,6 +753,8 @@ DONESCREEN
}
}
$webgrade='no';
+ }
+ if (!$todo || $env{'form.cancel'}) {
my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);
}
if ($target eq 'webgrade' && defined($env{'form.queue'})) {
@@ -636,6 +782,7 @@ DONESCREEN
}
if ($target eq 'webgrade') {
$result.="\n".'
';
+ &Apache::lonxml::startredirection();
}
} elsif ($target eq 'edit') {
$result.=$form_tag_start.
@@ -651,6 +798,20 @@ DONESCREEN
return $result;
}
+sub get_task_end_time {
+ my ($queue_entry,$symb,$udom,$uname) = @_;
+
+ my $end_time;
+ if (my $slot = &slotted_access($queue_entry)) {
+ my %slot_data=&Apache::lonnet::get_slot($slot);
+ $end_time = $slot_data{'endtime'};
+ } else {
+ $end_time = &Apache::lonhomework::due_date('0',$symb,
+ $udom,$uname);
+ }
+ return $end_time;
+}
+
sub get_key_todo {
my ($target)=@_;
my $todo;
@@ -680,7 +841,7 @@ sub get_key_todo {
if (defined($env{'form.regradeaspecificsubmission'}) &&
defined($env{'form.gradinguser'}) &&
defined($env{'form.gradingdomain'}) ) {
- my ($symb,$cid)=&Apache::lonxml::whichuser();
+ my ($symb,$cid)=&Apache::lonnet::whichuser();
my $cnum = $env{'course.'.$cid.'.num'};
my $cdom = $env{'course.'.$cid.'.domain'};
my $uname = $env{'form.gradinguser'};
@@ -699,18 +860,34 @@ sub get_key_todo {
if (!$queue) {
$env{'form.queue'} = $queue = 'none';
#not queued so doing either a re or pre grade
+ my %status = &Apache::lonnet::restore($symb,$cid,$udom,$uname);
+ if ($status{'resource.0.version'} < 1) {
+ return (undef,'never_versioned');
+ }
return ($gradingkey);
}
+ if ($queue) {
+ my $queue_entry = &get_queue_data($queue,$udom,$uname);
+
+ my $end_time = &get_task_end_time($queue_entry,$symb,
+ $udom,$uname);
+ if ($end_time > time) {
+ return (undef,"still_open:$end_time");
+ }
+ }
+
my $who=&queue_key_locked($queue,$gradingkey);
if ($who eq $me) {
#already have the lock
- $env{'form.gradingkey'}=&Apache::lonnet::escape($gradingkey);
+ $env{'form.gradingkey'}=&escape($gradingkey);
+ &Apache::lonxml::debug("already locked");
return ($gradingkey);
}
if (!defined($who)) {
if (&lock_key($queue,$gradingkey)) {
+ &Apache::lonxml::debug("newly locked");
return ($gradingkey);
} else {
return (undef,'lock_failed');
@@ -730,13 +907,15 @@ sub get_key_todo {
$env{'form.queue'}=$queue='gradingqueue';
}
- my $gradingkey=&Apache::lonnet::unescape($env{'form.gradingkey'});
+ my $gradingkey=&unescape($env{'form.gradingkey'});
if ($env{'form.queue'} eq 'none') {
if (defined($env{'form.gradingkey'})) {
if ($target eq 'webgrade') {
if ($env{'form.stop'}) {
return (undef,'stop');
+ } elsif ($env{'form.cancel'}) {
+ return (undef,'cancel');
} elsif ($env{'form.next'}) {
return (undef,'select_user');
}
@@ -782,7 +961,8 @@ sub get_key_todo {
if ($env{'form.queuemode'} ne 'selected') {
# don't get something new from the queue if they hit the stop button
- if (!($env{'form.stop'} && $target eq 'webgrade')
+ if (!(($env{'form.cancel'} || $env{'form.stop'})
+ && $target eq 'webgrade')
&& !$env{'form.gradingaction'}) {
&Apache::lonxml::debug("Getting anew $queue");
return (&get_from_queue($queue));
@@ -870,25 +1050,28 @@ DONEBUTTON
$status.=&add_request_another_attempt_button();
}
}
- my $man_count=0;
- my $opt_count=0;
- my $opt_passed=0;
- foreach my $dim_id (@Apache::bridgetask::dimensionlist) {
- if ($Apache::bridgetask::dimensionmandatory{$dim_id}
- eq 'N') {
- $opt_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim_id.status"} eq 'pass') {
- $opt_passed++;
- }
- } else {
- $man_count++;
+ $status.='
';
+ my $dim = $top;
+ my %counts = &get_counts($dim,undef,$parstack,
+ $safeeval);
+ $status.="\n
".
+ &mt('You needed to pass all of the [_1] mandatory components and [_2] of the [_3] optional components, of which you passed [_4].',
+ $counts{'man'},$counts{'opt_req'},
+ $counts{'opt'},$counts{'opt_passed'}).
+ "
\n";
+
+
+ foreach my $id (@{$dimension{$dim}{'criterias'}}) {
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ if ($type eq 'dimension') {
+ $result.=$dimension{$id}{'result'};
+ next;
}
+ my $criteria =
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_]);
+ $status .= &layout_web_Criteria($dim,$id,$criteria);
}
-
- my $opt_req=&Apache::lonxml::get_param('OptionalRequired',
- $parstack,$safeeval);
- if ($opt_req !~ /\S/) { $opt_req='0'; }
- $status.="\n
".&mt('You needed to pass all of the [_1] mandatory components and [_2] of the [_3] optional components, of which you passed [_4].',$man_count,$opt_req,$opt_count,$opt_passed)."
\n";
my $internal_location=&internal_location();
$result=~s/\Q$internal_location\E/$status/;
@@ -897,6 +1080,17 @@ DONEBUTTON
&Apache::loncommon::end_page({'discussion' => 1});
}
}
+
+ my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
+ my %queue_data = ('type' => 'Task',
+ 'time' => time,);
+ if (defined($Apache::inputtags::slot_name)) {
+ $queue_data{'slot'} = $Apache::inputtags::slot_name;
+ } elsif (defined($Apache::lonhomework::history{"resource.$version.0.checkedin.slot"})) {
+ $queue_data{'slot'} = $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};
+ }
+
+
if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {
my $award='SUBMITTED';
&Apache::essayresponse::file_submission("$version.0",'bridgetask',
@@ -919,22 +1113,15 @@ DONEBUTTON
&Apache::lonhomework::showhash(%Apache::lonhomework::results);
&Apache::structuretags::finalize_storage();
if ($award eq 'SUBMITTED') {
- my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
- if ($useslots =~ /^\s*no\s*$/i) {
- &add_to_queue('gradingqueue',
- {'type' => 'Task',
- 'time' => time});
- } elsif (defined($Apache::inputtags::slot_name)) {
- &add_to_queue('gradingqueue',
- {'type' => 'Task',
- 'time' => time,
- 'slot' => $Apache::inputtags::slot_name});
- }
+ &add_to_queue('gradingqueue',\%queue_data);
}
- } 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'
+ && exists($env{'form.cancel'})) {
+ &check_queue_unlock($env{'form.queue'});
+ &Apache::lonxml::debug(" cancelled grading .".$env{'form.queue'});
+ } elsif ($target eq 'grade' && $env{'form.webgrade'} eq 'yes'
+ && !exists($env{'form.cancel'})) {
my $optional_required=
&Apache::lonxml::get_param('OptionalRequired',$parstack,
$safeeval);
@@ -943,19 +1130,29 @@ DONEBUTTON
my $ungraded=0;
my $review=0;
&Apache::lonhomework::showhash(%Apache::lonhomework::results);
- foreach my $dim_id (@Apache::bridgetask::dimensionlist) {
+ my $dim = $top;
+ foreach my $id (@{$dimension{$dim}{'criterias'}}) {
+ my $link=&link($id);
+
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+
+ if ($type eq 'criteria') {
+ # dimensional 'criteria' don't get assigned grades
+ $Apache::lonhomework::results{"resource.$version.0.$id.status"}=$env{'form.HWVAL_'.$link};
+ $Apache::lonhomework::results{"resource.$version.0.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
+ }
my $status=
- $Apache::lonhomework::results{"resource.$version.0.$dim_id.status"};
- my $mandatory=
- ($Apache::bridgetask::dimensionmandatory{$dim_id} ne 'N');
+ $Apache::lonhomework::results{"resource.$version.0.$id.status"};
+ my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} 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++;
+ } elsif ($status eq 'ungraded') {
+ $ungraded++;
} else {
$ungraded++;
}
@@ -963,34 +1160,19 @@ DONEBUTTON
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::lonxml::debug(" task results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
$Apache::lonhomework::results{'resource.0.regrader'}=
$env{'user.name'}.':'.$env{'user.domain'};
if ($review) {
$Apache::lonhomework::results{"resource.$version.0.status"}='review';
- if ($env{'form.queue'} eq 'reviewqueue') {
- &check_queue_unlock($env{'form.queue'});
- &Apache::lonxml::debug(" still needs review not changing status.");
- } else {
- &move_between_queues($env{'form.queue'},'reviewqueue');
- }
} elsif ($ungraded) {
$Apache::lonhomework::results{"resource.$version.0.status"}='ungraded';
- if ($env{'form.queue'} eq 'reviewqueue' ||
- $env{'form.queue'} eq 'none' ) {
- &Apache::lonxml::debug("moving back.");
- &move_between_queues($env{'form.queue'},'gradingqueue');
- } else {
- &check_queue_unlock($env{'form.queue'});
- }
} elsif ($mandatory_failed) {
$Apache::lonhomework::results{"resource.$version.0.status"}='fail';
$Apache::lonhomework::results{"resource.$version.0.solved"}='incorrect_by_override';
$Apache::lonhomework::results{"resource.$version.0.award"}='INCORRECT';
$Apache::lonhomework::results{"resource.$version.0.awarded"}='0';
- &remove_from_queue($env{'form.queue'});
-
- my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();
if ($env{'form.regrade'} ne 'yes') {
$Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}=
@@ -1006,9 +1188,7 @@ DONEBUTTON
$Apache::lonhomework::results{"resource.$version.0.solved"}='correct_by_override';
$Apache::lonhomework::results{"resource.$version.0.award"}='EXACT_ANS';
$Apache::lonhomework::results{"resource.$version.0.awarded"}='1';
- &remove_from_queue($env{'form.queue'});
-
- my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();
if ($env{'form.regrade'} ne 'yes') {
$Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}=
$Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"};
@@ -1031,9 +1211,56 @@ DONEBUTTON
}
&minimize_storage();
&Apache::structuretags::finalize_storage();
+
+ # data stored, now handle queue
+ if ($review) {
+ if ($env{'form.queue'} eq 'reviewqueue') {
+ &check_queue_unlock($env{'form.queue'});
+ &Apache::lonxml::debug(" still needs review not changing status.");
+ } else {
+ if ($env{'form.queue'} ne 'none') {
+ &move_between_queues($env{'form.queue'},'reviewqueue');
+ } else {
+ &add_to_queue('reviewqueue',\%queue_data);
+ }
+ }
+ } elsif ($ungraded) {
+ if ($env{'form.queue'} eq 'reviewqueue') {
+ &Apache::lonxml::debug("moving back.");
+ &move_between_queues($env{'form.queue'},
+ 'gradingqueue');
+ } elsif ($env{'form.queue'} eq 'none' ) {
+ &add_to_queue('gradingqueue',\%queue_data);
+ } else {
+ &check_queue_unlock($env{'form.queue'});
+ }
+ } elsif ($mandatory_failed) {
+ &remove_from_queue($env{'form.queue'});
+ } else {
+ &remove_from_queue($env{'form.queue'});
+ }
+ }
+ if (exists($Apache::lonhomework::results{'INTERNAL_store'})) {
+ # instance generation occured and hasn't yet been stored
+ &Apache::structuretags::finalize_storage();
}
} elsif ($target eq 'webgrade') {
- $result.="";
+ $result.=&Apache::lonxml::endredirection();
+ my $dim = $top;
+ foreach my $id (@{$dimension{$dim}{'criterias'}} ) {
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ if ($type eq 'dimension') {
+ # dimensional 'criteria' don't get assigned grades
+ next;
+ } else {
+ my $criteria =&nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_]);
+ $criteria = &layout_webgrade_Criteria($dim,$id,$criteria);
+ my $internal_location=&internal_location($id);
+ $result=~s/\Q$internal_location\E/$criteria/;
+ }
+ }
+ $result.="";
#$result.=' ';
#$result.='{$student}[&Apache::loncoursedata::CL_STATUS()]
+ ne 'Active') {
+ delete($classlist->{$student});
+ }
+ }
+
+ if (ref($sections) && !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;
- my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
my $cnum=$env{'course.'.$cid.'.num'};
my $cdom=$env{'course.'.$cid.'.domain'};
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;
if ($tmp=~/^error: 2 /) {
- return "\n
";
+ $result.= &Apache::loncommon::start_data_table_row();
my ($end_time,$slot_text);
if (my $slot=&slotted_access($queue{$key})) {
my %slot_data=&Apache::lonnet::get_slot($slot);
@@ -1247,7 +1538,7 @@ sub show_queue {
$slot_text = '';
}
if ($with_selects) {
- my $ekey=&Apache::lonnet::escape($key);
+ my $ekey=&escape($key);
my ($action,$description,$status)=('select',&mt('Select'));
if (exists($queue{"$key\0locked"})) {
my $me=$env{'user.name'}.':'.$env{'user.domain'};
@@ -1263,7 +1554,7 @@ sub show_queue {
$seclist.='';
}
- if ($end_time ne '' && time > $end_time) {
+ if ($can_view && ($end_time ne '' && time > $end_time)) {
$result.=(<
\n";
+ $result.= &Apache::loncommon::end_data_table()."\n";
return $result;
}
sub get_queue_counts {
my ($queue)=@_;
my $result;
- my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
my $cnum=$env{'course.'.$cid.'.num'};
my $cdom=$env{'course.'.$cid.'.domain'};
+
+ my $classlist=&get_limited_classlist();
+
my $regexp="^$symb\0";
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
my ($tmp)=%queue;
@@ -1309,12 +1604,13 @@ 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})) {
@@ -1350,7 +1646,7 @@ sub decode_queue_key {
sub queue_key_locked {
my ($queue,$key,$cdom,$cnum)=@_;
if (!defined($cdom) || !defined($cnum)) {
- my (undef,$cid)=&Apache::lonxml::whichuser();
+ my (undef,$cid)=&Apache::lonnet::whichuser();
$cnum=$env{'course.'.$cid.'.num'};
$cdom=$env{'course.'.$cid.'.domain'};
}
@@ -1379,14 +1675,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;
@@ -1394,20 +1694,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.");
@@ -1433,7 +1736,7 @@ sub pick_from_queue_data {
sub find_mid_grade {
my ($queue,$symb,$cdom,$cnum)=@_;
- my $todo=&Apache::lonnet::unescape($env{'form.gradingkey'});
+ my $todo=&unescape($env{'form.gradingkey'});
my $me=$env{'user.name'}.':'.$env{'user.domain'};
if ($todo) {
my $who=&queue_key_locked($queue,$todo,$cdom,$cnum);
@@ -1455,7 +1758,7 @@ sub find_mid_grade {
sub lock_key {
my ($queue,$todo)=@_;
my $me=$env{'user.name'}.':'.$env{'user.domain'};
- my (undef,$cid)=&Apache::lonxml::whichuser();
+ 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},
@@ -1470,10 +1773,12 @@ sub lock_key {
sub get_queue_symb_status {
my ($queue,$symb,$cdom,$cnum) = @_;
if (!defined($cdom) || !defined($cnum)) {
- my (undef,$cid)=&Apache::lonxml::whichuser();
+ my (undef,$cid)=&Apache::lonnet::whichuser();
$cnum=$env{'course.'.$cid.'.num'};
$cdom=$env{'course.'.$cid.'.domain'};
}
+ my $classlist=&get_limited_classlist();
+
my $regexp="^$symb\0";
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
my ($tmp)=%queue;
@@ -1483,6 +1788,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;
@@ -1491,13 +1797,16 @@ sub get_queue_symb_status {
sub get_from_queue {
my ($queue)=@_;
my $result;
- my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
my $cnum=$env{'course.'.$cid.'.num'};
my $cdom=$env{'course.'.$cid.'.domain'};
my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum);
&Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));
if ($todo) { return $todo; }
my $attempts=0;
+
+ my $classlist=&get_limited_classlist();
+
while (1) {
if ($attempts > 2) {
# tried twice to get a queue entry, giving up
@@ -1508,21 +1817,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
@@ -1563,22 +1873,21 @@ sub get_from_queue {
}
sub select_user {
- my ($symb,$cid)=&Apache::lonxml::whichuser();
+ my ($symb,$cid)=&Apache::lonnet::whichuser();
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))) {
$result.='
Showing only sections '.join(', ',@chosen_sections).
'.
'."\n";
}
- $result.='
';
+ $result.=&Apache::loncommon::start_data_table();
- 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'};
@@ -1599,9 +1908,10 @@ sub select_user {
}
}
my $todo =
- &Apache::lonnet::escape(&encode_queue_key($symb,$udom,$uname));
+ &escape(&encode_queue_key($symb,$udom,$uname));
if ($cannot_grade) {
- $result.='
Question : you did not pass this '.$mandatory.' question
';
- }
- my $man_count=0;
- my $man_passed=0;
- my $opt_count=0;
- my $opt_passed=0;
- foreach my $id ( @{$dimension{$instance.'.criterias'}},
- @{$dimension{'criterias'}} ) {
- if ($dimension{'criteria.'.$id.'.mandatory'}
- eq 'N') {
- $opt_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"} eq 'pass') {
- $opt_passed++;
- }
- } else {
- $man_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
- $man_passed++;
- }
- }
- }
- if ($man_passed eq $man_count) { $man_passed='all'; }
-
- my $opt_req=$dimension{$instance.'.optionalrequired'};
- if ($opt_req !~ /\S/) {
- $opt_req=
- &Apache::lonxml::get_param('OptionalRequired',
- $parstack,$safeeval);
- if ($opt_req !~ /\S/) { $opt_req = 0; }
- }
- $dim_info.="\n
".&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)."
\n
";
-
- my $internal_location=&internal_location($dim);
- $result=~s/\Q$internal_location\E/$dim_info/;
-
- foreach my $id (@{$dimension{$instance.'.criterias'}},
- @{$dimension{'criterias'}}) {
- my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
- my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"};
- my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N');
- if ($mandatory) {
- $mandatory='Mandatory';
- } else {
- $mandatory='Optional';
- }
- if ($status eq 'fail') {
- } elsif ($status eq 'pass') {
- } else {
- &Apache::lonxml::error("Student viewing a graded bridgetask was shown a status of $status");
- }
- my $status_display=$status;
- $status_display=~s/^([a-z])/uc($1)/e;
+ my $instance=&get_instance($dim);
+ my $version=&get_version();
+ if ($target eq 'web') {
+ $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
+ my @instances = $instance;
+ if (&Apache::response::showallfoils()) {
+ @instances = @{$dimension{$dim}{'instances'}};
+ }
+ my $shown_question_text;
+ foreach my $instance (@instances) {
+ $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
+ [@_]);
+ $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
+ [@_],{'set_dim_id' => undef});
+ my $task_status =
+ $Apache::lonhomework::history{"resource.$version.0.status"};
+ if ($task_status ne 'pass' && $task_status ne 'fail') {
+
+ foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+ @{$dimension{$dim}{'criterias'}}) {
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ &Apache::lonxml::debug("$id is $type");
+ if ($type eq 'dimension') {
$result.=
- '
'."\n".
+ &grading_history($version,$dim,$id);
+ return $result;
}
sub end_Criteria {
}
+sub start_GraderNote {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+
+ if ($target eq 'webgrade') {
+ return '
'.
+ &mt('Note to graders:').'';
+ }
+ my $note=&Apache::lonxml::get_all_text('/gradernote',$parser,$style);
+ return;
+}
+
+sub end_GraderNote {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+
+ if ($target eq 'webgrade') {
+ return '
';
+ }
+ return;
+}
+
+
+
sub proctor_validation_screen {
my ($slot) = @_;
- my (undef,undef,$domain,$user) = &Apache::lonxml::whichuser();
+ my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser();
my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');
my $name=&Apache::loncommon::plainname($user,$domain);