--- loncom/interface/lonhelper.pm 2003/09/02 20:58:31 1.44 +++ loncom/interface/lonhelper.pm 2004/12/07 11:25:53 1.89 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # .helper XML handler to implement the LON-CAPA helper # -# $Id: lonhelper.pm,v 1.44 2003/09/02 20:58:31 bowersj2 Exp $ +# $Id: lonhelper.pm,v 1.89 2004/12/07 11:25:53 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -172,12 +172,20 @@ before parsing XML fragments and B # mod_perl connection. In this code, it was manifesting itself in the existence -# of two seperate file-scoped $helper variables, one set to the value of the +# of two separate file-scoped $helper variables, one set to the value of the # helper in the helper constructor, and one referenced by the handler on the # "$helper->process()" line. Using the debugger, one could actually # see the two different $helper variables, as hashes at completely @@ -255,21 +263,13 @@ sub real_handler { # Send header, don't cache this page - if ($r->header_only) { - if ($ENV{'browser.mathml'}) { - $r->content_type('text/xml'); - } else { - $r->content_type('text/html'); - } - $r->send_http_header; - return OK; - } if ($ENV{'browser.mathml'}) { - $r->content_type('text/xml'); + &Apache::loncommon::content_type($r,'text/xml'); } else { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); } $r->send_http_header; + return OK if $r->header_only; $r->rflush(); # Discard result, we just want the objects that get created by the @@ -359,9 +359,10 @@ sub end_state { package Apache::lonhelper::helper; use Digest::MD5 qw(md5_hex); -use HTML::Entities; +use HTML::Entities(); use Apache::loncommon; use Apache::File; +use Apache::lonlocal; sub new { my $proto = shift; @@ -453,11 +454,11 @@ sub _saveVars { my $self = shift; my $result = ""; $result .= '\n"; + HTML::Entities::encode($self->{STATE},'<>&"') . "\" />\n"; $result .= '\n"; $result .= '\n"; + HTML::Entities::encode($self->{RETURN_PAGE},'<>&"') . "\" />\n"; return $result; } @@ -523,7 +524,7 @@ sub process { # Phase 1: Post processing for state of previous screen (which is actually # the "current state" in terms of the helper variables), if it wasn't the # beginning state. - if ($self->{STATE} ne "START" || $ENV{"form.SUBMIT"} eq "Next ->") { + if ($self->{STATE} ne "START" || $ENV{"form.SUBMIT"} eq &mt("Next ->")) { my $prevState = $self->{STATES}{$self->{STATE}}; $prevState->postprocess(); } @@ -574,13 +575,19 @@ sub display { } # Phase 4: Display. - my $stateTitle = $state->title(); - my $bodytag = &Apache::loncommon::bodytag("$self->{TITLE}",'',''); + my $stateTitle=&mt($state->title()); + my $helperTitle = &mt($self->{TITLE}); + my $bodytag = &Apache::loncommon::bodytag($helperTitle,'',''); + my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"'); + my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"'); + # FIXME: This should be parameterized, not concatenated - Jeremy + my $loncapaHelper = &mt("LON-CAPA Helper:"); $result .= < - LON-CAPA Helper: $self->{TITLE} + + $loncapaHelper: $helperTitle $bodytag HEADER @@ -607,12 +614,12 @@ HEADER } if ($self->{DONE}) { my $returnPage = $self->{RETURN_PAGE}; - $result .= "End Helper"; + $result .= "" . &mt("End Helper") . ""; } else { $result .= ' '; + $result .= ''; } } @@ -626,12 +633,12 @@ HEADER } if ($self->{DONE}) { my $returnPage = $self->{RETURN_PAGE}; - $result .= "End Helper"; + $result .= "" . &mt('End Helper') . ""; } else { $result .= ' '; + $result .= ''; } } @@ -883,6 +890,7 @@ sub start_defaultvalue { sub end_defaultvalue { return ''; } +# Validators may need to take language specifications sub start_validator { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -926,7 +934,9 @@ package Apache::lonhelper::message; =pod -=head1 Element: messageX +=head1 Elements + +=head2 Element: messageX Message elements display their contents, and transition directly to the state in the attribute. Example: @@ -950,11 +960,17 @@ within each other.) This is also a good template for creating your own new states, as it has very little code beyond the state template. +=head3 Localization + +The contents of the message tag will be run through the +normalize_string function and that will be used as a call to &mt. + =cut no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonlocal; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::message', @@ -974,8 +990,8 @@ sub start_message { return ''; } - $paramHash->{MESSAGE_TEXT} = &Apache::lonxml::get_all_text('/message', - $parser); + $paramHash->{MESSAGE_TEXT} = &mtn(&Apache::lonxml::get_all_text('/message', + $parser)); if (defined($token->[2]{'nextstate'})) { $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'}; @@ -996,7 +1012,7 @@ sub end_message { sub render { my $self = shift; - return $self->{MESSAGE_TEXT}; + return &mtn($self->{MESSAGE_TEXT}); } # If a NEXTSTATE was given, switch to it sub postprocess { @@ -1098,6 +1114,7 @@ tag is stored in the {VARS} hash. no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonlocal; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::choices', @@ -1144,8 +1161,8 @@ sub start_choice { } my $computer = $token->[2]{'computer'}; - my $human = &Apache::lonxml::get_all_text('/choice', - $parser); + my $human = &mt(&Apache::lonxml::get_all_text('/choice', + $parser)); my $nextstate = $token->[2]{'nextstate'}; my $evalFlag = $token->[2]{'eval'}; push @{$paramHash->{CHOICES}}, [$human, $computer, $nextstate, @@ -1157,6 +1174,13 @@ sub end_choice { return ''; } +{ + # used to generate unique id attributes for tags. + # internal use only. + my $id = 0; + sub new_id { return $id++; } +} + sub render { my $self = shift; my $var = $self->{'variable'}; @@ -1181,10 +1205,13 @@ SCRIPT # Only print "select all" and "unselect all" if there are five or # more choices; fewer then that and it looks silly. if ($self->{'multichoice'} && scalar(@{$self->{CHOICES}}) > 4) { + my %lt=&Apache::lonlocal::texthash( + 'sa' => "Select All", + 'ua' => "Unselect All"); $buttons = < - - + +
  BUTTONS } @@ -1236,14 +1263,16 @@ BUTTONS my $type = "radio"; if ($self->{'multichoice'}) { $type = 'checkbox'; } foreach my $choice (@{$self->{CHOICES}}) { + my $id = &new_id(); $result .= "\n \n"; $result .= "[1]}) { $result .= " checked "; } + $result .= qq{id="$id"}; my $choiceLabel = $choice->[0]; if ($choice->[4]) { # if we need to evaluate this choice $choiceLabel = "sub { my $helper = shift; my $state = shift;" . @@ -1251,7 +1280,8 @@ BUTTONS $choiceLabel = eval($choiceLabel); $choiceLabel = &$choiceLabel($helper, $self); } - $result .= "/> " . $choiceLabel . "\n"; + $result .= "/> ".qq{\n"; } $result .= "\n\n\n"; $result .= $buttons; @@ -1266,8 +1296,8 @@ sub postprocess { my $chosenValue = $ENV{'form.' . $self->{'variable'} . '.forminput'}; if (!defined($chosenValue) && !$self->{'allowempty'}) { - $self->{ERROR_MSG} = "You must choose one or more choices to" . - " continue."; + $self->{ERROR_MSG} = + &mt("You must choose one or more choices to continue."); return 0; } @@ -1310,9 +1340,13 @@ the result is stored in. =cut +# This really ought to be a sibling class to "choice" which is itself +# a child of some abstract class.... *shrug* + no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonlocal; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::dropdown', @@ -1390,7 +1424,7 @@ sub render { $result .= "\n"; @@ -1471,6 +1505,7 @@ Example: no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonlocal; # A localization nightmare use Time::localtime; @@ -1535,7 +1570,7 @@ sub render { } else { $result .= "\n"; + $result .= &mt($months[$i]) . "\n"; } $result .= "\n"; @@ -1565,25 +1600,28 @@ sub render { # Display Hours and Minutes if they are called for if ($self->{'hoursminutes'}) { + # This needs parameterization for times. + my $am = &mt('a.m.'); + my $pm = &mt('p.m.'); # Build hour $result .= " - + +
  BUTTONS } @@ -1861,9 +1919,18 @@ BUTTONS my $filterFunc = $self->{FILTER_FUNC}; my $choiceFunc = $self->{CHOICE_FUNC}; my $valueFunc = $self->{VALUE_FUNC}; - my $mapUrl = $self->{MAP_URL}; my $multichoice = $self->{'multichoice'}; + # Evaluate the map url as needed + my $mapUrl; + if ($self->{EVAL_MAP_URL}) { + my $mapUrlFunc = eval('sub { my $helper = shift; my $state = shift; ' . + $self->{MAP_URL} . '}'); + $mapUrl = &$mapUrlFunc($helper, $self); + } else { + $mapUrl = $self->{MAP_URL}; + } + # Create the composite function that renders the column on the nav map # have to admit any language that lets me do this can't be all bad # - Jeremy (Pythonista) ;-) @@ -1888,19 +1955,24 @@ BUTTONS $checked = 1; } $col .= "value='" . - HTML::Entities::encode(&$valueFunc($resource)) + HTML::Entities::encode(&$valueFunc($resource),"<>&\"'") . "' />"; return $col; } }; $ENV{'form.condition'} = !$self->{'toponly'}; + my $cols = [$renderColFunc, Apache::lonnavmaps::resource()]; + if ($self->{'addstatus'}) { + push @$cols, (Apache::lonnavmaps::part_status_summary()); + + } $result .= - &Apache::lonnavmaps::render( { 'cols' => [$renderColFunc, - Apache::lonnavmaps::resource()], + &Apache::lonnavmaps::render( { 'cols' => $cols, 'showParts' => 0, 'filterFunc' => $filterFunc, 'resource_no_folder_link' => 1, + 'closeAllPages' => $self->{'closeallpages'}, 'suppressEmptySequences' => $self->{'suppressEmptySequences'}, 'iterator_map' => $mapUrl } ); @@ -1936,17 +2008,37 @@ package Apache::lonhelper::student; Student elements display a choice of students enrolled in the current course. Currently it is primitive; this is expected to evolve later. -Student elements take three attributes: "variable", which means what -it usually does, "multichoice", which if true allows the user -to select multiple students, and "coursepersonnel" which if true -adds the course personnel to the top of the student selection. +Student elements take the following attributes: + +=over 4 + +=item * B: + +Does what it usually does: declare which helper variable to put the +result in. + +=item * B: + +If true allows the user to select multiple students. Defaults to false. + +=item * B: + +If true adds the course personnel to the top of the student +selection. Defaults to false. + +=item * B: + +If true, only active students and course personnel will be +shown. Defaults to false. + +=back =cut no strict; @ISA = ("Apache::lonhelper::element"); use strict; - +use Apache::lonlocal; BEGIN { @@ -1970,6 +2062,7 @@ sub start_student { $helper->declareVar($paramHash->{'variable'}); $paramHash->{'multichoice'} = $token->[2]{'multichoice'}; $paramHash->{'coursepersonnel'} = $token->[2]{'coursepersonnel'}; + $paramHash->{'sctiveonly'} = $token->[2]{'activeonly'}; if (defined($token->[2]{'nextstate'})) { $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'}; } @@ -2002,12 +2095,50 @@ sub render { } } } + function checksec(value) { + for (i=0; i SCRIPT + + my %lt=&Apache::lonlocal::texthash( + 'ocs' => "Select Only Current Students", + 'ues' => "Unselect Expired Students", + 'sas' => "Select All Students", + 'uas' => "Unselect All Students", + 'sfsg' => "Select Current Students for Section/Group", + 'ufsg' => "Unselect for Section/Group"); + $buttons = < - - + +
+ +
+ +  +
BUTTONS } @@ -2042,6 +2173,7 @@ BUTTONS # Constants my $section = Apache::loncoursedata::CL_SECTION(); my $fullname = Apache::loncoursedata::CL_FULLNAME(); + my $status = Apache::loncoursedata::CL_STATUS(); # Load up the students my $classlist = &Apache::loncoursedata::get_classlist(); @@ -2056,17 +2188,24 @@ BUTTONS # username, fullname, section, type for (@keys) { - push @$choices, [$_, $classlist->{$_}->[$fullname], - $classlist->{$_}->[$section], 'Student']; + # Filter out inactive students if we've set "activeonly" + if (!$self->{'activeonly'} || $classlist->{$_}->[$status] eq + 'Active') { + push @$choices, [$_, $classlist->{$_}->[$fullname], + $classlist->{$_}->[$section], + $classlist->{$_}->[$status], 'Student']; + } } - my $name = $self->{'coursepersonnel'} ? 'Name' : 'Student Name'; + my $name = $self->{'coursepersonnel'} ? &mt('Name') : &mt('Student Name'); my $type = 'radio'; if ($self->{'multichoice'}) { $type = 'checkbox'; } $result .= "\n"; $result .= "". - "" . - ""; + "" . + "" . + "" . + ""; my $checked = 0; for my $choice (@$choices) { @@ -2078,13 +2217,21 @@ BUTTONS $checked = 1; } $result .= - " value='" . HTML::Entities::encode($choice->[0] . ':' . $choice->[2]) + " value='" . HTML::Entities::encode($choice->[0] . ':' + .$choice->[2] . ':' + .$choice->[1] . ':' + .$choice->[3], "<>&\"'") . "' />\n\n\n"; + . HTML::Entities::encode($choice->[4],'<>&"') + . "\n\n"; } $result .= "
$nameSectionRole
" . &mt('Section') . "".&mt('Status')."" . &mt("Role") . "".&mt('Username').":".&mt('Domain')."
" - . HTML::Entities::encode($choice->[1]) + . HTML::Entities::encode($choice->[1],'<>&"') . "" - . HTML::Entities::encode($choice->[2]) + . HTML::Entities::encode($choice->[2],'<>&"') + . "" + . HTML::Entities::encode($choice->[3],'<>&"') . "" - . HTML::Entities::encode($choice->[3]) . "
" + . HTML::Entities::encode($choice->[0],'<>&"') + . "
\n\n"; @@ -2098,8 +2245,8 @@ sub postprocess { my $result = $ENV{'form.' . $self->{'variable'} . '.forminput'}; if (!$result) { - $self->{ERROR_MSG} = 'You must choose at least one student '. - 'to continue.'; + $self->{ERROR_MSG} = + &mt('You must choose at least one student to continue.'); return 0; } @@ -2165,6 +2312,7 @@ viewing the files. no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonlocal; use Apache::lonpubdir; # for getTitleString @@ -2240,6 +2388,13 @@ sub start_filefilter { sub end_filefilter { return ''; } +{ + # used to generate unique id attributes for tags. + # internal use only. + my $id=0; + sub new_id { return $id++;} +} + sub render { my $self = shift; my $result = ''; @@ -2283,16 +2438,22 @@ sub render { } SCRIPT - $buttons = < "Select All Files", + 'uaf' => "Unselect All Files"); + $buttons = <   - - + + BUTTONS + %lt=&Apache::lonlocal::texthash( + 'sap' => "Select All Published", + 'uap' => "Unselect All Published"); if ($helper->{VARS}->{'construction'}) { - $buttons .= < - + $buttons .= < +
  BUTTONS } @@ -2302,9 +2463,17 @@ BUTTONS my @fileList; # If the subdirectory is in local CSTR space - if ($subdir =~ m|/home/([^/]+)/public_html|) { + my $metadir; + if ($subdir =~ m|/home/([^/]+)/public_html/(.*)|) { my $user = $1; my $domain = $Apache::lonnet::perlvar{'lonDefDomain'}; + $metadir='/res/'.$domain.'/'.$user.'/'.$2; + @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, ''); + } elsif ($subdir =~ m|^~([^/]+)/(.*)$|) { + $subdir='/home/'.$1.'/public_html/'.$2; + my $user = $1; + my $domain = $Apache::lonnet::perlvar{'lonDefDomain'}; + $metadir='/res/'.$domain.'/'.$user.'/'.$2; @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, ''); } else { # local library server resource space @@ -2312,7 +2481,7 @@ BUTTONS } # Sort the fileList into order - @fileList = sort @fileList; + @fileList = sort {lc($a) cmp lc($b)} @fileList; $result .= $buttons; @@ -2343,7 +2512,7 @@ BUTTONS } # Get the title - my $title = Apache::lonpubdir::getTitleString($fileName); + my $title = Apache::lonpubdir::getTitleString(($metadir?$metadir:$subdir) .'/'. $file); # Netscape 4 is stupid and there's nowhere to put the # information on the input tag that the file is Published, @@ -2364,14 +2533,16 @@ BUTTONS if ($status eq 'Published' && $helper->{VARS}->{'construction'}) { $onclick = 'onclick="a=1" '; } + my $id = &new_id(); $result .= '" . "{'multichoice'} && $choices == 0) { $result .= ' checked'; } - $result .= "/>" . $file . "" . + $result .= "/>". + qq{" . "$title" . "$status" . "\n"; $choices++; @@ -2381,7 +2552,7 @@ BUTTONS $result .= "\n"; if (!$choices) { - $result .= 'There are no files available to select in this directory. Please go back and select another option.

'; + $result .= 'There are no files available to select in this directory ('.$subdir.'). Please go back and select another option.

'; } $result .= $buttons; @@ -2399,10 +2570,14 @@ sub fileState { my $constructionSpaceDir = shift; my $file = shift; + my ($uname,$udom)=($ENV{'user.name'},$ENV{'user.domain'}); + if ($ENV{'request.role'}=~/^ca\./) { + (undef,$udom,$uname)=split(/\//,$ENV{'request.role'}); + } my $docroot = $Apache::lonnet::perlvar{'lonDocRoot'}; my $subdirpart = $constructionSpaceDir; - $subdirpart =~ s/^\/home\/$ENV{'user.name'}\/public_html//; - my $resdir = $docroot . '/res/' . $ENV{'user.domain'} . '/' . $ENV{'user.name'} . + $subdirpart =~ s/^\/home\/$uname\/public_html//; + my $resdir = $docroot . '/res/' . $udom . '/' . $uname . $subdirpart; my @constructionSpaceFileStat = stat($constructionSpaceDir . '/' . $file); @@ -2531,6 +2706,7 @@ string honors the validation function, i no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonlocal; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::string', @@ -2649,6 +2825,8 @@ be able to call methods on it. =cut +use Apache::lonlocal; + BEGIN { &Apache::lonhelper::register('Apache::lonhelper::general', 'exec', 'condition', 'clause', @@ -2775,7 +2953,7 @@ the old values taking effect. no strict; @ISA = ("Apache::lonhelper::element"); use strict; - +use Apache::lonlocal; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::final', ('final', 'exitpage')); @@ -2860,20 +3038,33 @@ sub render { } if (!@results) { - $result .= '
  • No changes were made to current settings.
  • '; + $result .= '
  • ' . + &mt('No changes were made to current settings.') . '
  • '; } $result .= ''; } if ($self->{'restartCourse'}) { + my $targetURL = '/adm/menu'; + if ($ENV{'course.'.$ENV{'request.course.id'}.'.url'}=~/^uploaded/) { + $targetURL = '/adm/coursedocs'; + } else { + $targetURL = '/adm/navmaps'; + } + if ($ENV{'course.'.$ENV{'request.course.id'}.'.clonedfrom'}) { + $targetURL = '/adm/parmset?overview=1'; + } + my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"'); + my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"'); $result .= "
    \n" . "
    \n" . - "" . - "" . + "" . + "" . "\n" . "\n\n" . + "' value='1' />\n\n" . "
    "; } @@ -2897,6 +3088,7 @@ package Apache::lonhelper::parmwizfinal; no strict; @ISA = ('Apache::lonhelper::element'); use strict; +use Apache::lonlocal; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::parmwizfinal', @@ -2927,15 +3119,17 @@ sub render { my $vars = $helper->{VARS}; # FIXME: Unify my designators with the standard ones - my %dateTypeHash = ('open_date' => "Opening Date", - 'due_date' => "Due Date", - 'answer_date' => "Answer Date", - 'tries' => 'Number of Tries' + my %dateTypeHash = ('open_date' => "opening date", + 'due_date' => "due date", + 'answer_date' => "answer date", + 'tries' => 'number of tries', + 'weight' => 'problem weight' ); my %parmTypeHash = ('open_date' => "0_opendate", 'due_date' => "0_duedate", 'answer_date' => "0_answerdate", - 'tries' => '0_maxtries' ); + 'tries' => '0_maxtries', + 'weight' => '0_weight' ); my $affectedResourceId = ""; my $parm_name = $parmTypeHash{$vars->{ACTION_TYPE}}; @@ -2946,7 +3140,7 @@ sub render { # Print the granularity, depending on the action if ($vars->{GRANULARITY} eq 'whole_course') { - $resourceString .= '
  • for all resources in the course
  • '; + $resourceString .= '
  • '.&mt('for all resources in the course').'
  • '; $level = 9; # general course, see lonparmset.pm perldoc $affectedResourceId = "0.0"; $symb = 'a'; @@ -2956,8 +3150,7 @@ sub render { my $res = $navmap->getByMapPc($vars->{RESOURCE_ID}); my $title = $res->compTitle(); $symb = $res->symb(); - $navmap->untieHashes(); - $resourceString .= "
  • for the map named $title
  • "; + $resourceString .= '
  • '.&mt('for the map named [_1]',"$title").'
  • '; $level = 8; $affectedResourceId = $vars->{RESOURCE_ID}; $paramlevel = 'map'; @@ -2966,20 +3159,29 @@ sub render { my $res = $navmap->getById($vars->{RESOURCE_ID}); $symb = $res->symb(); my $title = $res->compTitle(); - $navmap->untieHashes(); - $resourceString .= "
  • for the resource named $title
  • "; + $resourceString .= '
  • '.&mt('for the resource named [_1]',"$title").'
  • '; $level = 7; $affectedResourceId = $vars->{RESOURCE_ID}; $paramlevel = 'full'; } my $result = "
    \n"; - $result .= '

    Confirm that this information is correct, then click "Finish Wizard" to complete setting the parameter.

      '; + $result .= '

      '.&mt('Confirm that this information is correct, then click "Finish Helper" to complete setting the parameter.').'

        '; # Print the type of manipulation: - $result .= '
      • Setting the ' . $dateTypeHash{$vars->{ACTION_TYPE}} . ''; + my $extra; if ($vars->{ACTION_TYPE} eq 'tries') { - $result .= ' to ' . $vars->{TRIES} . ''; + $extra = $vars->{TRIES}; + } + if ($vars->{ACTION_TYPE} eq 'weight') { + $extra = $vars->{WEIGHT}; + } + $result .= "
      • "; + my $what = &mt($dateTypeHash{$vars->{ACTION_TYPE}}); + if ($extra) { + $result .= &mt('Setting the [_1] to [_2]',"$what",$extra); + } else { + $result .= &mt('Setting the [_1]',"$what"); } $result .= "
      • \n"; if ($vars->{ACTION_TYPE} eq 'due_date' || @@ -3001,19 +3203,22 @@ sub render { } elsif ($vars->{ACTION_TYPE} eq 'tries') { $result .= "\n"; + } elsif ($vars->{ACTION_TYPE} eq 'weight') { + $result .= "\n"; } $result .= $resourceString; # Print targets if ($vars->{TARGETS} eq 'course') { - $result .= '
      • for all students in course
      • '; + $result .= '
      • '.&mt('for all students in course').'
      • '; } elsif ($vars->{TARGETS} eq 'section') { my $section = $vars->{SECTION_NAME}; - $result .= "
      • for section $section
      • "; + $result .= '
      • '.&mt('for section [_1]',"$section").'
      • '; $level -= 3; $result .= "\n"; + HTML::Entities::encode($section,"'<>&\"") . "' />\n"; } else { # FIXME: This is probably wasteful! Store the name! my $classlist = Apache::loncoursedata::get_classlist(); @@ -3021,20 +3226,18 @@ sub render { # Chop off everything after the last colon (section) $username = substr($username, 0, rindex($username, ':')); my $name = $classlist->{$username}->[6]; - $result .= "
      • for $name
      • "; + $result .= '
      • '.&mt('for [_1]',"$name").'
      • '; $level -= 6; my ($uname, $udom) = split /:/, $vars->{USER_NAME}; $result .= "\n"; + HTML::Entities::encode($uname,"'<>&\"") . "' />\n"; $result .= "\n"; + HTML::Entities::encode($udom,"'<>&\"") . "' />\n"; } # Print value - if ($vars->{ACTION_TYPE} ne 'tries') { - $result .= "
      • to " . ctime($vars->{PARM_DATE}) . " (" . - Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}) - . ")
      • \n"; + if ($vars->{ACTION_TYPE} ne 'tries' && $vars->{ACTION_TYPE} ne 'weight') { + $result .= '
      • '.&mt('to [_1] ([_2])',"".ctime($vars->{PARM_DATE})."",Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}))."
      • \n"; } # print pres_marker @@ -3047,7 +3250,7 @@ sub render { $result .= "\n"; $result .= "\n"; - $result .= "

        \n"; + $result .= "

        \n"; return $result; }