";
+ $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);
@@ -1216,7 +1492,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'};
@@ -1232,7 +1508,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;
}
@@ -1269,6 +1546,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=&get_limited_classlist();
+
my $regexp="^$symb\0";
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
my ($tmp)=%queue;
@@ -1278,12 +1558,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})) {
@@ -1348,14 +1630,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;
@@ -1363,20 +1649,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.");
@@ -1402,7 +1691,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);
@@ -1443,6 +1732,8 @@ sub get_queue_symb_status {
$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;
@@ -1452,6 +1743,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;
@@ -1467,6 +1759,9 @@ sub get_from_queue {
&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
@@ -1477,21 +1772,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
@@ -1536,18 +1832,17 @@ 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))) {
$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'};
@@ -1568,9 +1863,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.='
';
+ $result.=&Apache::loncommon::end_data_table();
return $result;
}
@@ -1677,6 +1971,10 @@ sub end_ClosingParagraph {
return $result;
}
+sub get_dim_id {
+ return $Apache::bridgetask::dimension[-1];
+}
+
sub get_id {
my ($parstack,$safeeval)=@_;
my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval);
@@ -1684,18 +1982,78 @@ sub get_id {
return $id;
}
-my %dimension;
-sub start_Dimension {
+sub start_Setup {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
- undef(%dimension);
- 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);
+ #undef(%dimension);
+ my $dim = &get_id($parstack,$safeeval);
+ push(@Apache::bridgetask::dimension,$dim);
+ &Apache::lonxml::startredirection();
+ return &internal_location($dim);
+}
+
+{
+ my @allowed;
+ sub enable_dimension_parsing {
+ my ($id) = @_;
+ push(@allowed,$id);
+ }
+ sub disable_dimension_parsing {
+ pop(@allowed);
+ }
+ sub skip_dimension_parsing {
+ my ($check) = @_;
+ if (!@allowed) { return 0;}
+ # if unspecified allow any id
+ if ($allowed[-1] eq undef) { return 0;}
+
+ return ($check ne $allowed[-1]);
+ }
+}
+
+sub start_Question { return &start_Dimension(@_); }
+sub start_Dimension {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+ my $dim = &get_id($parstack,$safeeval);
+ my $previous_dim;
+ if (@Apache::bridgetask::dimension) {
+ $previous_dim = $Apache::bridgetask::dimension[-1];
+ push(@{$Apache::bridgetask::dimension{$previous_dim}{'contains'}},
+ $dim);
+ if(&skip_dimension_parsing($dim)) {
+ $dimension{$previous_dim}{'criteria.'.$dim} =
+ $token->[4]
+ .&Apache::lonxml::get_all_text('/'.$tagstack->[-1],$parser,
+ $style)
+ .''.$tagstack->[-1].'>';
+ }
+ $dimension{$previous_dim}{'criteria.'.$dim.'.type'}='dimension';
+ $dimension{$previous_dim}{'criteria.'.$dim.'.mandatory'}=
+ &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
+ push(@{$dimension{$previous_dim}{'criterias'}},$dim);
+ $dimension{$dim}{'nested'}=$previous_dim;
+ &Apache::lonxml::debug("adding $dim as criteria to $previous_dim");
+ } else {
+ $Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'}=
+ &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
+ }
+ push(@Apache::bridgetask::dimension,$dim);
&Apache::lonxml::startredirection();
- return &internal_location($dim_id);
+ &enable_dimension_parsing($dim);
+ return &internal_location($dim);
+}
+
+sub start_QuestionText {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+ my $dim = &get_dim_id();
+ my $text=&Apache::lonxml::get_all_text('/questiontext',$parser,$style);
+ if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
+ $dimension{$dim}{'questiontext'}=$text;
+ }
+ return '';
+}
+
+sub end_QuestionText {
+ return '';
}
sub get_instance {
@@ -1705,7 +2063,7 @@ sub get_instance {
$rand_alg eq '64bit2' || $rand_alg eq '64bit3' ||
$rand_alg eq '64bit4' ) {
&Apache::response::pushrandomnumber();
- my @order=&Math::Random::random_permutation(@{$dimension{'instances'}});
+ my @order=&Math::Random::random_permutation(@{$dimension{$dim}{'instances'}});
my $num=@order;
my $version=&get_version();
my $which=($version-1)%$num;
@@ -1717,49 +2075,86 @@ sub get_instance {
if (defined($instance)) { return $instance; }
&Apache::response::pushrandomnumber();
- my @instances = @{$dimension{'instances'}};
- # remove disabled instances
- for (my $i=0; $i < $#instances; $i++) {
- if ($dimension{$instances[$i].'.disabled'}) {
- splice(@instances,$i,1);
- $i--;
+ if (ref($dimension{$dim}{'instances'}) eq 'ARRAY') {
+ my @instances = @{$dimension{$dim}{'instances'}};
+ # remove disabled instances
+ for (my $i=0; $i < $#instances; $i++) {
+ if ($dimension{$dim}{$instances[$i].'.disabled'}) {
+ splice(@instances,$i,1);
+ $i--;
+ }
+ }
+ @instances = &Math::Random::random_permutation(@instances);
+ $instance = $instances[($version-1)%scalar(@instances)];
+ if ($version =~ /^\d$/) {
+ $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} =
+ $instance;
+ $Apache::lonhomework::results{'INTERNAL_store'} = 1;
}
}
- @instances = &Math::Random::random_permutation(@instances);
- $instance = $instances[($version-1)%scalar(@instances)];
- $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} =
- $instance;
- $Apache::lonhomework::results{'INTERNAL_store'} = 1;
&Apache::response::poprandomnumber();
return $instance;
}
}
+sub get_criteria {
+ my ($what,$version,$dim,$id) = @_;
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ my $prefix = ($type eq 'criteria') ? "$dim.$id"
+ : "$id";
+ my $entry = "resource.$version.0.$prefix.$what";
+ if (exists($Apache::lonhomework::results{$entry})) {
+ return $Apache::lonhomework::results{$entry};
+ }
+ return $Apache::lonhomework::history{$entry};
+}
+
{
my $last_link;
sub link {
- my ($instance,$id) = @_;
- return 'LC_GRADING_criteria_'.$instance.'_'.$id;
+ my ($id) = @_;
+ $id =~ s/\./_/g;
+ return 'LC_GRADING_criteria_'.$id;
}
+ sub end_Question { return &end_Dimension(@_); }
sub end_Dimension {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $result=&Apache::lonxml::endredirection();
my $dim=&get_id($parstack,$safeeval);
+ if (&skip_dimension_parsing($dim)) {
+ &disable_dimension_parsing($dim);
+ pop(@Apache::bridgetask::dimension);
+ return;
+ }
my $instance=&get_instance($dim);
my $version=&get_version();
if ($target eq 'web') {
- @Apache::scripttag::parser_env = @_;
- $result.=&Apache::scripttag::xmlparse($dimension{'intro'});
+ $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
my @instances = $instance;
if (&Apache::response::showallfoils()) {
- @instances = @{$dimension{'instances'}};
+ @instances = @{$dimension{$dim}{'instances'}};
}
+ my $shown_question_text;
foreach my $instance (@instances) {
- @Apache::scripttag::parser_env = @_;
- $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});
- if ($Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass' ||
- $Apache::lonhomework::history{"resource.$version.0.status"} eq 'fail') {
-
+ $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.=
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
+ }
+ }
+ } else {
my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
my $mandatory='Mandatory';
if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {
@@ -1776,32 +2171,42 @@ sub get_instance {
my $man_passed=0;
my $opt_count=0;
my $opt_passed=0;
- foreach my $id (@{$dimension{$instance.'.criterias'}}) {
- if ($dimension{$instance.'.criteria.'.$id.'.mandatory'}
+ foreach my $id ( @{$dimension{$dim}{$instance.'.criterias'}},
+ @{$dimension{$dim}{'criterias'}} ) {
+ my $status = &get_criteria('status',$version,$dim,$id);
+ if ($dimension{$dim}{'criteria.'.$id.'.mandatory'}
eq 'N') {
$opt_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
- $opt_passed++;
- }
+ if ($status eq 'pass') { $opt_passed++; }
} else {
$man_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
- $man_passed++;
- }
+ if ($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='0'; }
+
+ my $opt_req=$dimension{$dim}{$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'}}) {
- my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};
- my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"};
- my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');
+ foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+ @{$dimension{$dim}{'criterias'}}) {
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ if ($type eq 'dimension') {
+ $result.=$dimension{$id}{'result'};
+ next;
+ }
+ my $status= &get_criteria('status', $version,$dim,$id);
+ my $comment=&get_criteria('comment',$version,$dim,$id);
+ my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
if ($mandatory) {
$mandatory='Mandatory';
} else {
@@ -1814,15 +2219,16 @@ sub get_instance {
}
my $status_display=$status;
$status_display=~s/^([a-z])/uc($1)/e;
- @Apache::scripttag::parser_env = @_;
$result.=
'