--- loncom/homework/bridgetask.pm 2006/05/16 21:21:31 1.152 +++ loncom/homework/bridgetask.pm 2006/06/09 22:31:36 1.163 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.152 2006/05/16 21:21:31 albertel Exp $ +# $Id: bridgetask.pm,v 1.163 2006/06/09 22:31:36 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,9 +38,12 @@ 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','ClosingParagraph')); } sub initialize_bridgetask { @@ -263,7 +266,7 @@ STUFF } if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); } - $symb=&Apache::lonnet::escape($symb); + $symb=&escape($symb); $result.='
'. ''. ''. @@ -362,26 +365,44 @@ sub file_list { my $file=$file_url.$partial_file; $file=~s|/+|/|g; &Apache::lonnet::allowuploaded('/adm/bridgetask',$file); - $file_list.='
  • '.$file. - '
  • '."\n"; + $file_list.='
  • file icon '.$file. + '
  • '."\n"; } $file_list.="\n"; return $file_list; } +sub grade_mode { + if ($env{'form.regrade'} || $env{'form.regradeaspecificsubmission'}) { + return 'regrade'; + } + return 'queue_grade'; +} + sub webgrade_standard_info { my ($version)=&get_version(); my $file_list = &file_list($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"}); - my %lt=&Apache::lonlocal::texthash('done' => 'Next Item', - 'stop' => 'Quit Grading', - 'fail' => 'Fail Rest', - ); - + my %lt=('done' => 'Next Item', + 'stop' => 'Quit Grading', + 'fail' => 'Fail Rest', + 'cancel' => 'Cancel', + ); + my %lt=&Apache::lonlocal::texthash(%lt); + my $result=< +INFO + + if (&grade_mode() eq 'regrade') { + $result.=< +INFO + } + + $result.=< '; $form_tag_start.= ''; + &escape($todo).'" />'; $Apache::bridgetask::queue_key=$todo; &Apache::structuretags::initialize_storage(); &Apache::lonhomework::showhash(%Apache::lonhomework::history); @@ -589,6 +612,8 @@ DONESCREEN &mt('Return to resource').'

    '; if ($status_code eq 'stop') { $result.=''.&mt("Stopped grading.").''.$back; + } elsif ($status_code eq 'cancel') { + $result.=''.&mt("Cancelled grading.").''.$back; } elsif ($status_code eq 'lock_failed') { $result.=''.&mt("Failed to lock the requested record.") .''.$back; @@ -609,6 +634,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'})) { @@ -699,18 +726,22 @@ sub get_key_todo { if (!$queue) { $env{'form.queue'} = $queue = 'none'; #not queued so doing either a re or pre grade + #FIXME don't allow pregrade + &Apache::lonxml::debug("not in queue no lock"); return ($gradingkey); } 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 +761,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 +815,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)); @@ -934,7 +968,12 @@ DONEBUTTON } 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); @@ -1088,6 +1127,7 @@ sub check_queue_unlock { my $me=$env{'user.name'}.':'.$env{'user.domain'}; my $who=&queue_key_locked($queue,$key,$cdom,$cnum); if ($who eq $me) { + &Apache::lonxml::debug("unlocking my own $who"); return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum); } elsif ($allow_not_me) { &Apache::lonxml::debug("unlocking $who by $me"); @@ -1198,6 +1238,30 @@ 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; @@ -1207,36 +1271,66 @@ 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; if ($tmp=~/^error: 2 /) { - return "\n

    Current Queue - $queue

    Empty
    "; + return "\n

    Current 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.="\n

    Current Queue - $title $queue

    "; + $result.="\n

    Current Queue - $title $queue

    ". + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(); if ($with_selects) { $result.=""; } - $result.=""; + $result.="". + &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.=""; + $result.= &Apache::loncommon::start_data_table_row(). + ""; $result.=''; } elsif ($key=~/timestamp$/ && !$with_selects) { - $result.=""; + $result.=&Apache::loncommon::start_data_table_row().""; $result.='"; } elsif ($key!~/(timestamp|locked)$/) { - $result.=""; + $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 +1341,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 +1357,7 @@ sub show_queue { $seclist.=''; } - if ($end_time ne '' && time > $end_time) { + if ($can_view && ($end_time ne '' && time > $end_time)) { $result.=(<$status FORM - + } elsif (!$can_view && ($end_time ne '' && time > $end_time)) { + $result.='' } else { $result.='' } } - $result.= ""; $result.='"; + "".&Apache::loncommon::end_data_table_row(); } } - $result.="
    Statususerdata
    userdata
    $uname$uname'.$queue{$key}.'
    '. &Apache::lonlocal::locallocaltime($queue{$key})."
    @@ -1278,19 +1372,20 @@ sub show_queue { '.&mt("Not gradable").' '.&mt("In Progress").' ".$fullname->{$uname.':'.$udom}. + $result.= "".$classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_FULLNAME()]. " ($uname:$udom) '.$slot_text.' End time: '. &Apache::lonlocal::locallocaltime($end_time). - "

    \n"; + $result.= &Apache::loncommon::end_data_table()."
    \n"; return $result; } @@ -1300,6 +1395,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; @@ -1309,12 +1407,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})) { @@ -1379,14 +1479,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 +1498,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 +1540,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); @@ -1474,6 +1581,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; @@ -1483,6 +1592,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; @@ -1498,6 +1608,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 @@ -1508,21 +1621,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 @@ -1567,18 +1681,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'}; @@ -1599,9 +1712,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_row(); } - $result.='
     '.$fullname->{$student}. + $result.=&Apache::loncommon::start_data_table_row(). + ' '.$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()]. ''; } else { my $seclist; @@ -1609,10 +1723,8 @@ sub select_user { $seclist.=''; } - my $studentdis = $student; - $studentdis =~ tr/:/@/; + $result.=&Apache::loncommon::start_data_table_row(); $result.=<
    @@ -1622,7 +1734,7 @@ sub select_user { $seclist
    -
    $fullname->{$student} ($studentdis)$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] ($student) RESULT } @@ -1661,9 +1773,9 @@ RESULT } else { $result.=" "; } - $result.= '
    '; + $result.=&Apache::loncommon::end_data_table(); return $result; } @@ -1716,6 +1828,15 @@ sub get_id { } my %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; + undef(@Apache::bridgetask::instance); + &Apache::lonxml::startredirection(); + return &internal_location($dim_id); +} sub start_Question { return &start_Dimension(@_); } sub start_Dimension { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; @@ -1730,6 +1851,20 @@ sub start_Dimension { return &internal_location($dim_id); } +sub start_QuestionText { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $dim_id=$Apache::bridgetask::dimension; + my $text=&Apache::lonxml::get_all_text('/questiontext',$parser,$style); + if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') { + $dimension{'questiontext'}=$text; + } + return ''; +} + +sub end_QuestionText { + return ''; +} + sub get_instance { my ($dim)=@_; my $rand_alg=&Apache::lonnet::get_rand_alg(); @@ -1790,9 +1925,12 @@ sub get_instance { if (&Apache::response::showallfoils()) { @instances = @{$dimension{'instances'}}; } + my $shown_question_text; foreach my $instance (@instances) { @Apache::scripttag::parser_env = @_; $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'}); + @Apache::scripttag::parser_env = @_; + $result.=&Apache::scripttag::xmlparse($dimension{'questiontext'}); if ($Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass' || $Apache::lonhomework::history{"resource.$version.0.status"} eq 'fail') { @@ -1877,6 +2015,8 @@ sub get_instance { &Apache::scripttag::xmlparse($dimension{'intro'}); @Apache::scripttag::parser_env = @_; &Apache::scripttag::xmlparse($dimension{$instance.'.text'}); + @Apache::scripttag::parser_env = @_; + &Apache::scripttag::xmlparse($dimension{'questiontext'}); foreach my $id (@{$dimension{$instance.'.criterias'}}, @{$dimension{'criterias'}} ) { my $link=&link($id); @@ -1909,6 +2049,14 @@ sub get_instance { my $mandatory_failed=0; my $ungraded=0; my $review=0; + + @Apache::scripttag::parser_env = @_; + $result.=&Apache::scripttag::xmlparse($dimension{'intro'}); + @Apache::scripttag::parser_env = @_; + $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'}); + @Apache::scripttag::parser_env = @_; + &Apache::scripttag::xmlparse($dimension{'questiontext'}); + foreach my $id (@{$dimension{$instance.'.criterias'}}, @{$dimension{'criterias'}}) { my $link=&link($id); @@ -1958,6 +2106,41 @@ sub get_instance { } 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{'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'}); + @Apache::scripttag::parser_env = @_; + $result.=&Apache::scripttag::xmlparse($dimension{'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{'intro'}); + @Apache::scripttag::parser_env = @_; + &Apache::scripttag::xmlparse($dimension{$instance.'.text'}); + @Apache::scripttag::parser_env = @_; + &Apache::scripttag::xmlparse($dimension{'questiontext'}); + } else { + # any other targets no output + undef($result); + } + return $result; + } } sub grading_history { @@ -1995,7 +2178,7 @@ sub grading_history { sub start_IntroParagraph { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; - if ($target eq 'web' || $target eq 'webgrade') { + if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') { if ($tagstack->[-2] eq 'Dimension' || $tagstack->[-2] eq 'Question' ) { $dimension{'intro'}= &Apache::lonxml::get_all_text('/introparagraph', @@ -2037,7 +2220,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 '';