--- loncom/homework/bridgetask.pm 2006/04/20 07:00:20 1.143 +++ 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.143 2006/04/20 07:00:20 albertel Exp $ +# $Id: bridgetask.pm,v 1.156 2006/05/25 19:55:10 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,7 +40,7 @@ use Apache::slotrequest(); use Time::HiRes qw( gettimeofday tv_interval ); BEGIN { - &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Instance','InstanceText','Criteria','ClosingParagraph')); + &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','Instance','InstanceText','Criteria','ClosingParagraph')); } sub initialize_bridgetask { @@ -79,39 +79,56 @@ sub proctor_check_auth { $authenticated=1; } } - if ($authenticated && $type eq 'Task') { - # increment version - my $version= - $Apache::lonhomework::history{'resource.0.version'}; - $version++; - - #clean out all current results - foreach my $key (keys(%Apache::lonhomework::history)) { - if ($key=~/^resource\.0\./) { - $Apache::lonhomework::results{$key}=''; - } - } - - #setup new version and who did it - $Apache::lonhomework::results{'resource.0.version'}=$version; - $Apache::lonhomework::results{"resource.$version.0.checkedin"}= - $user.':'.$domain; - $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}= - $slot_name; - + if ($authenticated) { + &create_new_version($type,$user,$domain,$slot_name); return 1; - } elsif ($authenticated && $type eq 'problem') { - &Apache::lonxml::debug("authed $slot_name"); - $Apache::lonhomework::results{"resource.0.checkedin"}= - $user.':'.$domain; - $Apache::lonhomework::results{"resource.0.checkedin.slot"}= - $slot_name; } } } return 0; } +sub create_new_version { + my ($type,$user,$domain,$slot_name) = @_; + if ($type eq 'Task') { + # increment 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\./) { + $Apache::lonhomework::results{$key}=''; + } + } + + #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; + } + } 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; + } + } +} + sub get_version { my ($version,$previous); if ($env{'form.previousversion'} && @@ -120,7 +137,11 @@ sub get_version { $version=$env{'form.previousversion'}; $previous=1; } else { - $version=$Apache::lonhomework::history{'resource.0.version'}; + if (defined($Apache::lonhomework::results{'resource.0.version'})) { + $version=$Apache::lonhomework::results{'resource.0.version'}; + } elsif (defined($Apache::lonhomework::history{'resource.0.version'})) { + $version=$Apache::lonhomework::history{'resource.0.version'}; + } $previous=0; } if (wantarray) { @@ -170,8 +191,8 @@ sub add_grading_button { my (undef,$cid)=&Apache::lonxml::whichuser(); my $cnum=$env{'course.'.$cid.'.num'}; my $cdom=$env{'course.'.$cid.'.domain'}; - my %sections; - my $numsections=&Apache::loncommon::get_sections($cdom,$cnum,\%sections); + my %sections = &Apache::loncommon::get_sections($cdom,$cnum); + my $size=5; if (scalar(keys(%sections)) < 3) { $size=scalar(keys(%sections))+2; @@ -214,7 +235,7 @@ sub add_grading_button { 'gradingdomain'); $result.=&Apache::loncommon::studentbrowser_javascript(); $result.= '

'; - } + } return $result; } @@ -223,6 +244,12 @@ sub add_request_another_attempt_button { if (!$text) { $text="Request another attempt"; } my $result; my $symb=&Apache::lonnet::symbread(); + # not a slot access based resource + my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb); + if ($useslots =~ /^\s*no\s*$/i) { + return ''; + } + my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb); my $action='get_reservation'; if ($slot_name) { @@ -278,7 +305,8 @@ sub show_task { ( $status eq 'NOT_IN_A_SLOT') || ( $status eq 'NEEDS_CHECKIN') || ( $status eq 'WAITING_FOR_GRADE') || - ( $status eq 'INVALID_ACCESS') )) { + ( $status eq 'INVALID_ACCESS') || + ( &get_version() eq ''))) { return 0; } if ($env{'form.donescreen'}) { return 0; } @@ -384,15 +412,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.='
'Task', + 'time' => time, + 'slot' => + $Apache::inputtags::slot_name}); &Apache::lonxml::debug("add_to_queue said $result"); } } @@ -799,11 +843,19 @@ DONEBUTTON my $bt_status=$Apache::lonhomework::history{"resource.$version.0.status"}; my $title=&Apache::lonnet::gettitle(); + my $start_time; + my $slot_name= $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"}; - my %slot=&Apache::lonnet::get_slot($slot_name); - my $start_time= - &Apache::lonlocal::locallocaltime($slot{'starttime'}); + if ($slot_name) { + my %slot=&Apache::lonnet::get_slot($slot_name); + + $start_time=$slot{'starttime'} + } else { + $start_time= + &Apache::lonnet::EXT('resource.0.opendate'); + } + $start_time=&Apache::lonlocal::locallocaltime($start_time); my $status = "\n
\n"; @@ -832,6 +884,7 @@ DONEBUTTON $man_count++; } } + my $opt_req=&Apache::lonxml::get_param('OptionalRequired', $parstack,$safeeval); if ($opt_req !~ /\S/) { $opt_req='0'; } @@ -840,8 +893,6 @@ DONEBUTTON my $internal_location=&internal_location(); $result=~s/\Q$internal_location\E/$status/; } - } - if ($target eq 'web') { $result.="\n
\n". &Apache::loncommon::end_page({'discussion' => 1}); } @@ -867,9 +918,18 @@ 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') { + 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}); + } } } elsif ($Apache::lonhomework::results{'INTERNAL_store'}) { &Apache::structuretags::finalize_storage(); @@ -1008,7 +1068,7 @@ sub move_between_queues { } else { $cur_data = ['none']; } - my $result=&add_to_queue($dest_queue,[$cur_data->[0]]); + my $result=&add_to_queue($dest_queue,$cur_data); if ($result ne 'ok') { return $result; } @@ -1107,17 +1167,17 @@ sub check_queue_for_key { if (defined($results{"$todo\0locked"})) { return 'locked'; } - my $slot; - if (ref($results{$todo}) eq 'ARRAY') { - $slot = $results{$todo}[0]; - } elsif (ref($results{$todo}) eq 'HASH') { - $slot = $results{$todo}{'slot'}; - } - if (defined($slot)) { + if (my $slot=&slotted_access($results{$todo})) { my %slot_data=&Apache::lonnet::get_slot($slot); if ($slot_data{'endtime'} > 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'; } @@ -1138,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; @@ -1147,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; @@ -1168,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}.''; @@ -1177,8 +1276,15 @@ sub show_queue { &Apache::lonlocal::locallocaltime($queue{$key}).""; } elsif ($key!~/(timestamp|locked)$/) { $result.=""; - my $slot=$queue{$key}->[0]; - my %slot_data=&Apache::lonnet::get_slot($slot); + 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 ($action,$description,$status)=('select',&mt('Select')); @@ -1196,7 +1302,7 @@ sub show_queue { $seclist.=''; } - if (time > $slot_data{'endtime'}) { + if ($can_view && ($end_time ne '' && time > $end_time)) { $result.=(<$status @@ -1211,15 +1317,16 @@ sub show_queue { FORM - + } elsif (!$can_view && ($end_time ne '' && time > $end_time)) { + $result.=''.&mt("Not gradable").' ' } else { - $result.=''.&mt("In Progress").'' + $result.=''.&mt("In Progress").' ' } } - $result.= "".$fullname->{$uname.':'.$udom}. + $result.= "".$classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_FULLNAME()]. " ($uname:$udom) "; - $result.='Slot: '.$slot.' End time: '. - &Apache::lonlocal::locallocaltime($slot_data{'endtime'}). + $result.=''.$slot_text.' End time: '. + &Apache::lonlocal::locallocaltime($end_time). ""; } } @@ -1233,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; @@ -1242,20 +1352,28 @@ 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++; + } } } } @@ -1289,31 +1407,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 @@ -1374,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; @@ -1383,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; @@ -1398,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 @@ -1408,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 @@ -1467,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))) { @@ -1478,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'}; @@ -1501,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; @@ -1509,8 +1667,6 @@ sub select_user { $seclist.=''; } - my $studentdis = $student; - $studentdis =~ tr/:/@/; $result.=< @@ -1522,7 +1678,7 @@ sub select_user { $seclist - $fullname->{$student} ($studentdis)$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] ($student) RESULT } @@ -1616,6 +1772,7 @@ sub get_id { } my %dimension; +sub start_Question { return &start_Dimension(@_); } sub start_Dimension { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; undef(%dimension); @@ -1658,9 +1815,11 @@ sub get_instance { } @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; + if ($version =~ /^\d$/) { + $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} = + $instance; + $Apache::lonhomework::results{'INTERNAL_store'} = 1; + } &Apache::response::poprandomnumber(); return $instance; } @@ -1669,9 +1828,11 @@ sub get_instance { { 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(); @@ -1707,11 +1868,12 @@ 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{$instance.'.criterias'}}, + @{$dimension{'criterias'}} ) { + if ($dimension{'criteria.'.$id.'.mandatory'} eq 'N') { $opt_count++; - if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') { + if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"} eq 'pass') { $opt_passed++; } } else { @@ -1722,17 +1884,24 @@ sub get_instance { } } if ($man_passed eq $man_count) { $man_passed='all'; } + my $opt_req=$dimension{$instance.'.optionalrequired'}; - if ($opt_req !~ /\S/) { $opt_req='0'; } + 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{$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 { @@ -1745,15 +1914,14 @@ sub get_instance { } my $status_display=$status; $status_display=~s/^([a-z])/uc($1)/e; - @Apache::scripttag::parser_env = @_; $result.= '

' .$mandatory.' Criteria

'; @Apache::scripttag::parser_env = @_; - $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id}); + $result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id}); $result.='

'.$status_display.'

'; - if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}) { - $result.='

'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}).'

'; + if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}) { + $result.='

'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'

'; } $result.='
'; } @@ -1765,15 +1933,16 @@ sub get_instance { &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"}; + foreach my $id (@{$dimension{$instance.'.criterias'}}, + @{$dimension{'criterias'}} ) { + my $link=&link($id); + my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"}; $result.='
'."\n". '
'."\n"; @Apache::scripttag::parser_env = @_; - $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id}); + $result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id}); $result.='
'."\n". - #$dimension{$instance.'.criteria.'.$id}. + #$dimension{'criteria.'.$id}. '
'."\n". ''."\n". ''."\n". @@ -1781,14 +1950,14 @@ sub get_instance { ''."\n". '
'."\n". ''."\n". ''."\n". '
'."\n"; - $result.=&grading_history($version,$dim,$instance,$id); + $result.=&grading_history($version,$dim,$id); $last_link=$link; } } elsif ($target eq 'grade' && $env{'form.webgrade'}) { @@ -1796,11 +1965,17 @@ sub get_instance { 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'); + + @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'); if ($status eq 'pass') { if (!$mandatory) { $optional_passed++; } } elsif ($status eq 'fail') { @@ -1813,7 +1988,15 @@ sub get_instance { $ungraded++; } } - if ($optional_passed < $dimension{$instance.'.optionalrequired'}) { + # FIXME optional required can apply to only right now... + 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; } + } + if ($optional_passed < $opt_req) { $mandatory_failed++; } &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review"); @@ -1839,12 +2022,12 @@ sub get_instance { } 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.$dim.$id"; foreach my $t (1..$Apache::lonhomework::history{'version'}) { if (exists($Apache::lonhomework::history{$t.':resource.0.regrader'})) { my ($gname,$gdom) = @@ -1873,11 +2056,12 @@ 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') { + 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', + $parser,$style); + } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') { &Apache::lonxml::startredirection(); } @@ -1914,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 ''; @@ -1926,14 +2110,21 @@ 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); if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') { 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 (&Apache::londefdef::is_inside_of($tagstack,'Instance')) { + my $instance_id=$Apache::bridgetask::instance[-1]; + $dimension{"criteria.$instance_id.$id"}=$criteria; + $dimension{"criteria.$instance_id.$id.mandatory"}= + &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval); + push(@{$dimension{$instance_id.'.criterias'}},"$instance_id.$id"); + } else { + $dimension{'criteria.'.$id}=$criteria; + $dimension{'criteria.'.$id.'.mandatory'}= + &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval); + push(@{$dimension{'criterias'}},$id); + } } return ''; }