$title
+ Files submitted: $files
+ You are now done with this Bridge Task
+
+ Logout
+ Change to a different course
+$message_status
+$comment_status
+DONESCREEN
+
+}
+
sub start_Task {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my ($status,$accessmsg,$slot);
+ &Apache::structuretags::init_problem_globals('Task');
if ($target ne 'webgrade') {
- &Apache::structuretags::init_problem_globals('Task');
&Apache::structuretags::initialize_storage();
&Apache::lonhomework::showhash(%Apache::lonhomework::history);
if ($env{'request.state'} eq 'construct') {
@@ -384,15 +568,19 @@ sub start_Task {
$name = &Apache::structuretags::get_resource_name($parstack,$safeeval);
}
- my ($result,$form_tag_start)=
- &Apache::structuretags::page_start($target,$token,$tagstack,$parstack,
- $parser,$safeeval,$name,&style());
-
- $result .= ''."\n";
-
+ my ($result,$form_tag_start);
+ if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
+ || $target eq 'edit') {
+ ($result,$form_tag_start) =
+ &Apache::structuretags::page_start($target,$token,$tagstack,
+ $parstack,$parser,$safeeval,
+ $name,&style($target));
+ $result .= '
'."\n";
+ }
if ($target eq 'web' && $env{'request.state'} ne 'construct') {
- if ($Apache::lonhomework::modifygrades) {
+ if ($Apache::lonhomework::queuegrade
+ || $Apache::lonhomework::modifygrades) {
$result.='
\n".
&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',
@@ -867,14 +1129,16 @@ DONEBUTTON
}
&Apache::lonhomework::showhash(%Apache::lonhomework::results);
&Apache::structuretags::finalize_storage();
- if ($award eq 'SUBMITTED'
- && defined($Apache::inputtags::slot_name)) {
- &add_to_queue('gradingqueue',[$Apache::inputtags::slot_name]);
+ if ($award eq 'SUBMITTED') {
+ &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);
@@ -883,19 +1147,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++;
}
@@ -903,34 +1177,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"}=
@@ -946,9 +1205,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"};
@@ -971,9 +1228,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.=' time) {
return 'in_progress';
}
+ } else {
+ my ($symb) = &decode_queue_key($todo);
+ my $due_date = &Apache::lonhomework::due_date('0',$symb);
+ if ($due_date > time) {
+ return 'in_progress';
+ }
}
return 'enqueued';
}
@@ -1127,7 +1441,7 @@ sub check_queue_for_key {
sub add_to_queue {
my ($queue,$user_data)=@_;
if ($queue eq 'none') { return 'ok'; }
- my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
if (!$cid || $env{'request.state'} eq 'construct') {
return 'no_queue';
}
@@ -1138,49 +1452,110 @@ sub add_to_queue {
return &Apache::lonnet::cput($queue,\%data,$cdom,$cnum);
}
+sub get_limited_classlist {
+ my ($sections) = @_;
+
+ my $classlist = &Apache::loncoursedata::get_classlist();
+ foreach my $student (keys(%$classlist)) {
+ if ( $classlist->{$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 "\nCurrent Queue - $queue
";
+ return "\nCurrent Queue - $queue
".
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_row().
+ ''.&mt('Empty').' | '.
+ &Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::end_data_table();
}
my $title=&Apache::lonnet::gettitle($symb);
- $result.="\nCurrent Queue - $title $queue
";
+ $result.="\nCurrent Queue - $title $queue
".
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row();
if ($with_selects) { $result.="Status | | "; }
- $result.="user | data |
";
+ $result.="user | data | ".
+ &Apache::loncommon::end_data_table_header_row();
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.= &Apache::loncommon::start_data_table_row().
+ "$uname | ";
$result.=''.$queue{$key}.' |
';
} elsif ($key=~/timestamp$/ && !$with_selects) {
- $result.=" | ";
+ $result.=&Apache::loncommon::start_data_table_row()." | ";
$result.=''.
&Apache::lonlocal::locallocaltime($queue{$key})." |
";
} elsif ($key!~/(timestamp|locked)$/) {
- $result.="";
- my $slot=$queue{$key}->[0];
- my %slot_data=&Apache::lonnet::get_slot($slot);
+ $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);
+ $end_time = $slot_data{'endtime'};
+ $slot_text = &mt('Slot: [_1]',$slot);
+ } else {
+ $end_time = &Apache::lonhomework::due_date('0',$symb);
+ $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'};
@@ -1196,7 +1571,7 @@ sub show_queue {
$seclist.='';
}
- if (time > $slot_data{'endtime'}) {
+ if ($can_view && ($end_time ne '' && time > $end_time)) {
$result.=(<
";
+ $result.=''.$slot_text.' End time: '.
+ &Apache::lonlocal::locallocaltime($end_time).
+ " | ".&Apache::loncommon::end_data_table_row();
}
}
- $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;
@@ -1242,20 +1621,27 @@ 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++;
- my $slot=$queue{$key}->[0];
- if (!exists($slot_cache{$slot})) {
- my %slot_data=&Apache::lonnet::get_slot($slot);
- $slot_cache{$slot} = \%slot_data;
- }
- if (time > $slot_cache{$slot}{'endtime'}) {
- $ready_to_grade++;
+ if (my $slot=&slotted_access($queue{$key})) {
+ if (!exists($slot_cache{$slot})) {
+ my %slot_data=&Apache::lonnet::get_slot($slot);
+ $slot_cache{$slot} = \%slot_data;
+ }
+ if (time > $slot_cache{$slot}{'endtime'}) {
+ $ready_to_grade++;
+ }
+ } else {
+ my $due_date = &Apache::lonhomework::due_date('0',$symb);
+ if ($due_date ne '' && time > $due_date) {
+ $ready_to_grade++;
+ }
}
}
}
@@ -1277,7 +1663,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'};
}
@@ -1289,31 +1675,65 @@ sub queue_key_locked {
return undef;
}
+sub slotted_access {
+ my ($queue_entry) = @_;
+ if (ref($queue_entry) eq 'ARRAY') {
+ if (defined($queue_entry->[0])) {
+ return $queue_entry->[0];
+ }
+ return undef;
+ } elsif (ref($queue_entry) eq 'HASH') {
+ if (defined($queue_entry->{'slot'})) {
+ return $queue_entry->{'slot'};
+ }
+ return undef;
+ }
+ return undef;
+}
+
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;
}
}
- my $slot=$queuedata->{$key}[0];
- my %slot_data=&Apache::lonnet::get_slot($slot);
- if ($slot_data{'endtime'} > time) {
- &Apache::lonxml::debug("not time");
- next;
+ 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) {
+ $end_time = $due_date;
+ } else {
+ &Apache::lonxml::debug("not time $due_date");
+ next;
+ }
}
+
if (exists($queuedata->{"$key\0locked"})) {
&Apache::lonxml::debug("someone already has um.");
next;
}
- push(@possible,[$key,$slot_data{'endtime'}]);
+ push(@possible,[$key,$end_time]);
}
if (@possible) {
# sort entries in order by slot end time
@@ -1333,7 +1753,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);
@@ -1355,7 +1775,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},
@@ -1370,10 +1790,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;
@@ -1383,6 +1805,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;
@@ -1391,13 +1814,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
@@ -1408,21 +1834,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
@@ -1463,22 +1890,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'};
@@ -1499,9 +1925,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.=' | '.$fullname->{$student}.
+ $result.=&Apache::loncommon::start_data_table_row().
+ ' | | '.$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()].
' | ';
} else {
my $seclist;
@@ -1509,10 +1936,8 @@ sub select_user {
$seclist.='';
}
- my $studentdis = $student;
- $studentdis =~ tr/:/@/;
+ $result.=&Apache::loncommon::start_data_table_row();
$result.=<
- | $fullname->{$student} ($studentdis) |
+ $classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] ($student) |
RESULT
}
@@ -1561,9 +1986,9 @@ RESULT
} else {
$result.=" ";
}
- $result.= ' | |
';
+ $result.= ''.&Apache::loncommon::end_data_table_row();
}
- $result.='
';
+ $result.=&Apache::loncommon::end_data_table();
return $result;
}
@@ -1608,6 +2033,14 @@ sub end_ClosingParagraph {
return $result;
}
+sub get_dim_id {
+ if (@Apache::bridgetask::dimension) {
+ return $Apache::bridgetask::dimension[-1];
+ } else {
+ return $top;
+ }
+}
+
sub get_id {
my ($parstack,$safeeval)=@_;
my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval);
@@ -1615,18 +2048,80 @@ 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 {
+ $dimension{$top}{'criteria.'.$dim.'.type'}='dimension';
+ $dimension{$top}{'criteria.'.$dim.'.mandatory'}=
+ &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
+ push(@{$dimension{$top}{'criterias'}},$dim);
+ }
+ 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 {
@@ -1636,7 +2131,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;
@@ -1648,203 +2143,290 @@ 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;
}
}
-{
- my $last_link;
- sub link {
- my ($instance,$id) = @_;
- return 'LC_GRADING_criteria_'.$instance.'_'.$id;
- }
- sub end_Dimension {
- my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
- my $result=&Apache::lonxml::endredirection();
- my $dim=&get_id($parstack,$safeeval);
- my $instance=&get_instance($dim);
- my $version=&get_version();
- if ($target eq 'web') {
- @Apache::scripttag::parser_env = @_;
- $result.=&Apache::scripttag::xmlparse($dimension{'intro'});
- my @instances = $instance;
- if (&Apache::response::showallfoils()) {
- @instances = @{$dimension{'instances'}};
- }
- 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') {
-
- my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
- my $mandatory='Mandatory';
- if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {
- $mandatory='Optional';
- }
- my $dim_info="\n";
- if ($dim_status eq 'pass') {
- $dim_info.='
Question : you passed this '.$mandatory.' question
';
- }
- if ($dim_status eq 'fail') {
- $dim_info.='
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'}}) {
- if ($dimension{$instance.'.criteria.'.$id.'.mandatory'}
- eq 'N') {
- $opt_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$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='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');
- 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;
- @Apache::scripttag::parser_env = @_;
+sub get_criteria {
+ my ($what,$version,$dim,$id) = @_;
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ my $prefix = ($type eq 'criteria' && $dim ne $top) ? "$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};
+}
+
+sub link {
+ 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') {
+ $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.=
- ''
- .$mandatory.' Criteria
';
- @Apache::scripttag::parser_env = @_;
- $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});
- $result.='
'.$status_display.'
';
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}) {
- $result.='';
- }
- $result.='
';
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
}
}
- }
- } elsif ($target eq 'webgrade') {
- # in case of any side effects that we need
- @Apache::scripttag::parser_env = @_;
- &Apache::scripttag::xmlparse($dimension{'intro'});
- @Apache::scripttag::parser_env = @_;
- &Apache::scripttag::xmlparse($dimension{$instance.'.text'});
- foreach my $id (@{$dimension{$instance.'.criterias'}}) {
- my $link=&link($instance,$id);
- my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};
- $result.=''."\n";
- $result.=&grading_history($version,$dim,$instance,$id);
- $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 $link=&link($instance,$id);
- my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.status"}=$env{'form.HWVAL_'.$link};
- $Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
- 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 {
- $ungraded++;
+ } else {
+ my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
+ my $mandatory='Mandatory';
+ if (&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval) eq 'N') {
+ $mandatory='Optional';
+ }
+ my $dim_info="\n";
+ if ($dim_status eq 'pass') {
+ $dim_info.='
Question : you passed this '.$mandatory.' question
';
+ }
+ if ($dim_status eq 'fail') {
+ $dim_info.='
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{$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 ($status eq 'pass') { $opt_passed++; }
+ } else {
+ $man_count++;
+ if ($status eq 'pass') { $man_passed++; }
+ }
+ }
+ if ($man_passed eq $man_count) { $man_passed='all'; }
+
+ 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
";
+
+ 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 $criteria =
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_]);
+ $dim_info .= &layout_web_Criteria($dim,$id,$criteria);
}
+
+ my $internal_location=&internal_location($dim);
+ $result=~s/\Q$internal_location\E/$dim_info/;
}
- if ($optional_passed < $dimension{$instance.'.optionalrequired'}) {
- $mandatory_failed++;
+ }
+ } elsif ($target eq 'webgrade') {
+ # in case of any side effects that we need
+ &nested_parse(\$dimension{$dim}{'intro'},[@_]);
+ &nested_parse(\$dimension{$dim}{$instance.'.text'},[@_]);
+ $result.=
+ &nested_parse(\$dimension{$dim}{'questiontext'},[@_],
+ {'set_dim_id' => undef,
+ 'delayed_dim_results' => 1});
+ foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+ @{$dimension{$dim}{'criterias'}} ) {
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ if ($type eq 'dimension') {
+ # dimensional 'criteria' don't get assigned grades
+ $result.=
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
+ 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/;
}
- &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.$version.0.$dim.status"}=
- 'review';
- } elsif ($ungraded) {
- $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
- 'ungraded';
- } elsif ($mandatory_failed) {
- $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
- 'fail';
+ }
+ if (&nest()) {
+ &Apache::lonxml::debug(" for $dim stashing results into ".$dimension{$dim}{'nested'});
+ $dimension{$dimension{$dim}{'nested'}}{'result'}.=$result;
+ undef($result);
+ }
+ } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
+ my $optional_passed=0;
+ my $mandatory_failed=0;
+ my $ungraded=0;
+ my $review=0;
+
+ $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
+ $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
+ [@_]);
+ $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
+ [@_],{'set_dim_id' => undef});
+
+ foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+ @{$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.$dim.$id.status"}=$env{'form.HWVAL_'.$link};
+ $Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
+ } else {
+ $result .=
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
+ }
+ my $status= &get_criteria('status',$version,$dim,$id);
+
+ 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 'review') {
+ $review++;
+ } elsif ($status eq 'ungraded') {
+ $ungraded++;
} else {
- $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
- 'pass';
+ $ungraded++;
}
+ }
+
+ 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; }
+ }
+ if ($optional_passed < $opt_req) {
+ $mandatory_failed++;
+ }
+ &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$dim}{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
+ if ($review) {
+ $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
+ 'review';
+ } elsif ($ungraded) {
+ $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
+ 'ungraded';
+ } elsif ($mandatory_failed) {
+ $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
+ 'fail';
} else {
- # any other targets no output
- undef($result);
+ $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
+ 'pass';
}
- return $result;
+ } else {
+ # any other targets no output
+ undef($result);
+ }
+ &disable_dimension_parsing();
+ pop(@Apache::bridgetask::dimension);
+ return $result;
+}
+
+sub end_Setup {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+ my $result=&Apache::lonxml::endredirection();
+ my $dim=&get_id($parstack,$safeeval);
+ my $instance=&get_instance($dim);
+ my $version=&get_version();
+ if ($target eq 'web') {
+ @Apache::scripttag::parser_env = @_;
+ $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
+ my @instances = $instance;
+ if (&Apache::response::showallfoils()) {
+ @instances = @{$dimension{$dim}{'instances'}};
+ }
+ foreach my $instance (@instances) {
+ @Apache::scripttag::parser_env = @_;
+ $result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
+ @Apache::scripttag::parser_env = @_;
+ $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
+ }
+ } elsif ($target eq 'webgrade'
+ || $target eq 'grade' && $env{'form.webgrade'}) {
+ # in case of any side effects that we need
+ @Apache::scripttag::parser_env = @_;
+ &Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
+ @Apache::scripttag::parser_env = @_;
+ &Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
+ @Apache::scripttag::parser_env = @_;
+ &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
+ } else {
+ # any other targets no output
+ undef($result);
}
+ pop(@Apache::bridgetask::dimension);
+ return $result;
}
sub grading_history {
- my ($version,$dim,$instance,$criteria) = @_;
+ my ($version,$dim,$id) = @_;
if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
return '';
}
my ($result,$grader);
- my $scope="resource.$version.0.$dim.$instance.$criteria";
+ my $scope="resource.$version.0.";
+ $scope .= ($dim ne $top) ? "$dim.$id"
+ : "$id";
foreach my $t (1..$Apache::lonhomework::history{'version'}) {
if (exists($Apache::lonhomework::history{$t.':resource.0.regrader'})) {
my ($gname,$gdom) =
@@ -1873,11 +2455,13 @@ sub grading_history {
sub start_IntroParagraph {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $result;
- if ($target eq 'web' || $target eq 'webgrade') {
- if ($tagstack->[-2] eq 'Dimension') {
- $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style);
-
- } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
+ my $dim = &get_dim_id();
+ if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
+ if ($tagstack->[-2] eq 'Dimension' || $tagstack->[-2] eq 'Question' ) {
+ $dimension{$dim}{'intro'}=
+ &Apache::lonxml::get_all_text('/introparagraph',
+ $parser,$style);
+ } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
&Apache::lonxml::startredirection();
}
@@ -1894,15 +2478,16 @@ sub end_IntroParagraph {
sub start_Instance {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
- my $id=&get_id($parstack,$safeeval);
- push(@{$dimension{'instances'}},$id);
- push(@Apache::bridgetask::instance,$id);
+ my $dim = &get_dim_id();
+ my $id = &get_id($parstack,$safeeval);
+ push(@{$dimension{$dim}{'instances'}},$id);
+ push(@{$Apache::bridgetask::instance{$dim}},$id);
push(@Apache::bridgetask::instancelist,$id);
- $dimension{$id.'.optionalrequired'}=
+ $dimension{$dim}{$id.'.optionalrequired'}=
&Apache::lonxml::get_param('OptionalRequired',$parstack,$safeeval);
my $disabled = &Apache::lonxml::get_param('Disabled',$parstack,$safeeval);
if (lc($disabled) eq 'yes') {
- $dimension{$id.'.disabled'}='1';
+ $dimension{$dim}{$id.'.disabled'}='1';
}
return '';
}
@@ -1912,10 +2497,11 @@ sub end_Instance {
sub start_InstanceText {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
- my $instance_id=$Apache::bridgetask::instance[-1];
+ my $dim = &get_dim_id();
+ my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style);
- if ($target eq 'web' || $target eq 'webgrade') {
- $dimension{$instance_id.'.text'}=$text;
+ if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
+ $dimension{$dim}{$instance_id.'.text'}=$text;
}
return '';
}
@@ -1926,24 +2512,130 @@ sub end_InstanceText {
sub start_Criteria {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
- my $instance_id=$Apache::bridgetask::instance[-1];
my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser,$style);
+ my $result = '';
if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {
+ my $dim = &get_dim_id();
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);
+ if ($target eq 'web' || $target eq 'webgrade') {
+ if ($target eq 'webgrade' && $dim ne 'top') {
+ &Apache::lonxml::debug(" for $dim $id stashing results into $dim ");
+ $dimension{$dim}{'result'} .= &internal_location($id);
+ } else {
+ &Apache::lonxml::debug(" not stashing $dim $id");
+ $result .= &internal_location($id);
+ }
+ }
+ &Apache::lonxml::debug("Criteria $id with $dim");
+ if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {
+ my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
+ $dimension{$dim}{"criteria.$instance_id.$id"}=$criteria;
+ $dimension{$dim}{"criteria.$instance_id.$id.type"}='criteria';
+ $dimension{$dim}{"criteria.$instance_id.$id.mandatory"}=
+ &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
+ push(@{$dimension{$dim}{$instance_id.'.criterias'}},"$instance_id.$id");
+ } else {
+ $dimension{$dim}{'criteria.'.$id}=$criteria;
+ $dimension{$dim}{'criteria.'.$id.'.type'}='criteria';
+ $dimension{$dim}{'criteria.'.$id.'.mandatory'}=
+ &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
+ push(@{$dimension{$dim}{'criterias'}},$id);
+ }
}
- return '';
+ return $result;
+}
+
+sub layout_web_Criteria {
+ my ($dim,$id,$criteria) = @_;
+
+ my $version = &get_version();
+ 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 {
+ $mandatory='Optional';
+ }
+ my $status_display=$status;
+ $status_display=~s/^([a-z])/uc($1)/e;
+ my $criteria_info.=
+ ''
+ .$mandatory.' Criteria
';
+ $criteria_info.= $criteria;
+ $criteria_info.='
'.$status_display.'
';
+ if ($comment =~ /\w/) {
+ $criteria_info.='';
+ }
+ $criteria_info.='
';
+ return $criteria_info;
+}
+
+sub layout_webgrade_Criteria {
+ my ($dim,$id,$criteria) = @_;
+ my $link=&link($id);
+ my $version = &get_version();
+ my $status = &get_criteria('status',$version,$dim,$id);
+ my $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);