[LON-CAPA-cvs] cvs: loncom /interface lonhelper.pm lonprintout.pm

bowersj2 lon-capa-cvs@mail.lon-capa.org
Tue, 02 Sep 2003 20:58:31 -0000


This is a MIME encoded message

--bowersj21062536311
Content-Type: text/plain

bowersj2		Tue Sep  2 16:58:31 2003 EDT

  Modified files:              
    /loncom/interface	lonhelper.pm lonprintout.pm 
  Log:
  Documentation updates for lonhelper.pm (apparently), and fixes bug 2104.
  
  
--bowersj21062536311
Content-Type: text/plain
Content-Disposition: attachment; filename="bowersj2-20030902165831.txt"

Index: loncom/interface/lonhelper.pm
diff -u loncom/interface/lonhelper.pm:1.43 loncom/interface/lonhelper.pm:1.44
--- loncom/interface/lonhelper.pm:1.43	Wed Aug 13 10:52:08 2003
+++ loncom/interface/lonhelper.pm	Tue Sep  2 16:58:31 2003
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # .helper XML handler to implement the LON-CAPA helper
 #
-# $Id: lonhelper.pm,v 1.43 2003/08/13 14:52:08 bowersj2 Exp $
+# $Id: lonhelper.pm,v 1.44 2003/09/02 20:58:31 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -32,9 +32,23 @@
 
 =pod
 
-=head1 lonhelper - HTML Helper framework for LON-CAPA
+=head1 NAME
 
-Helpers, often known as "wizards", are well-established UI widgets that users
+lonhelper - implements helper framework
+
+=head1 SYNOPSIS
+
+lonhelper implements the helper framework for LON-CAPA, and provides
+    many generally useful components for that framework.
+
+Helpers are little programs which present the user with a sequence of
+    simple choices, instead of one monolithic multi-dimensional
+    choice. They are also referred to as "wizards", "druids", and
+    other potentially trademarked or semantically-loaded words.
+
+=head1 OVERVIEWX<lonhelper>
+
+Helpers are well-established UI widgets that users
 feel comfortable with. It can take a complicated multidimensional problem the
 user has and turn it into a series of bite-sized one-dimensional questions.
 
@@ -46,7 +60,7 @@
 
 All classes are in the Apache::lonhelper namespace.
 
-=head2 lonhelper XML file format
+=head1 lonhelper XML file formatX<lonhelper, XML file format>
 
 A helper consists of a top-level <helper> tag which contains a series of states.
 Each state contains one or more state elements, which are what the user sees, like
@@ -87,7 +101,7 @@
 necessary to put actual elements into the wizard. Documentation for each
 of these elements follows.
 
-=head2 Creating a Helper With Code, Not XML
+=head1 Creating a Helper With Code, Not XML
 
 In some situations, such as the printing wizard (see lonprintout.pm), 
 writing the helper in XML would be too complicated, because of scope 
@@ -146,10 +160,10 @@
 adding states can easily be done by wrapping the state in a <condition>
 tag. This should only be used when the code dominates the XML content,
 the code is so complicated that it is difficult to get access to
-all of the information you need because of scoping issues, or so much
-of the information used is persistent because would-be <exec> or 
-<eval> blocks that using the {DATA} mechanism results in hard-to-read
-and -maintain code.
+all of the information you need because of scoping issues, or would-be <exec> or 
+<eval> blocks using the {DATA} mechanism results in hard-to-read
+and -maintain code. (See course.initialization.helper for a borderline
+case.)
 
 It is possible to do some of the work with an XML fragment parsed by
 lonxml; again, see lonprintout.pm for an example. In that case it is 
@@ -210,7 +224,9 @@
 # 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
 # helper in the helper constructor, and one referenced by the handler on the
-# "$helper->process()" line. The second was therefore never set, and was still
+# "$helper->process()" line. Using the debugger, one could actually
+# see the two different $helper variables, as hashes at completely
+# different addresses. The second was therefore never set, and was still
 # undefined when I tried to call process on it.
 # By pushing the "real handler" down into the "real scope", everybody except the 
 # actual handler function directly below this comment gets the same $helper and
@@ -748,12 +764,12 @@
 
 =pod
 
-=head2 Element Base Class
+=head1 Element Base Class
 
 The Apache::lonhelper::element base class provides support for elements
 and defines some generally useful tags for use in elements.
 
-B<finalcode tag>
+=head2 finalcode tagX<finalcode>
 
 Each element can contain a "finalcode" tag that, when the special FINAL
 helper state is used, will be executed, surrounded by "sub { my $helper = shift;"
@@ -762,7 +778,7 @@
 generally intended for helpers like the course initialization helper, which consist
 of several panels, each of which is performing some sort of bite-sized functionality.
 
-B<defaultvalue tag>
+=head2 defaultvalue tagX<defaultvalue>
 
 Each element that accepts user input can contain a "defaultvalue" tag that,
 when surrounded by "sub { my $helper = shift; my $state = shift; " and "}",
@@ -779,7 +795,7 @@
 
 Again, see the course initialization helper for examples.
 
-B<validator tag>
+=head2 validator tagX<validator>
 
 Some elements that accepts user input can contain a "validator" tag that,
 when surrounded by "sub { my $helper = shift; my $state = shift; my $element = shift; my $val = shift " 
@@ -791,7 +807,7 @@
 Consult the documentation for each element to see whether it supports this 
 tag.
 
-B<getValue method>
+=head2 getValue methodX<getValue (helper elements)>
 
 If the element stores the name of the variable in a 'variable' member, which
 the provided ones all do, you can retreive the value of the variable by calling
@@ -910,20 +926,19 @@
 
 =pod
 
-=head2 Element: message
+=head1 Element: messageX<message, helper element>
 
-Message elements display the contents of their <message_text> tags, and
-transition directly to the state in the <nextstate> tag. Example:
+Message elements display their contents, and
+transition directly to the state in the <nextstate> attribute. Example:
 
- <message>
-   <nextstate>GET_NAME</nextstate>
-   <message_text>This is the <b>message</b> the user will see, 
-                 <i>HTML allowed</i>.</message_text>
+ <message nextstate='GET_NAME'>
+   This is the <b>message</b> the user will see, 
+                 <i>HTML allowed</i>.
    </message>
 
-This will display the HTML message and transition to the <nextstate> if
+This will display the HTML message and transition to the 'nextstate' if
 given. The HTML will be directly inserted into the helper, so if you don't
-want text to run together, you'll need to manually wrap the <message_text>
+want text to run together, you'll need to manually wrap the message text
 in <p> tags, or whatever is appropriate for your HTML.
 
 Message tags do not add in whitespace, so if you want it, you'll need to add
@@ -998,7 +1013,7 @@
 
 =pod
 
-=head2 Element: choices
+=head2 Element: choicesX<choices, helper element>
 
 Choice states provide a single choice to the user as a text selection box.
 A "choice" is two pieces of text, one which will be displayed to the user
@@ -1016,15 +1031,15 @@
 value, will allow the user to select none of the choices without raising
 an error message.
 
-B<SUB-TAGS>
+=head3 SUB-TAGS
 
-<choices> can have the following subtags:
+<choices> can have the following subtags:X<choice, helper tag>
 
 =over 4
 
 =item * <nextstate>state_name</nextstate>: If given, this will cause the
-      choice element to transition to the given state after executing. If
-      this is used, do not pass nextstates to the <choice> tag.
+      choice element to transition to the given state after executing.
+      This will override the <nextstate> passed to <choices> (if any).
 
 =item * <choice />: If the choices are static,
       this element will allow you to specify them. Each choice
@@ -1033,14 +1048,15 @@
       For example,  
       <choice computer='234-12-7312'>Bobby McDormik</choice>.
 
-      <choice> can take a parameter "eval", which if set to
-      a true value, will cause the contents of the tag to be
-      evaluated as it would be in an <eval> tag; see <eval> tag
-      below.
+<choice> can take a parameter "eval", which if set to
+a true value, will cause the contents of the tag to be
+evaluated as it would be in an <eval> tag; see <eval> tag
+below.
 
 <choice> may optionally contain a 'nextstate' attribute, which
-will be the state transisitoned to if the choice is made, if
-the choice is not multichoice.
+will be the state transistioned to if the choice is made, if
+the choice is not multichoice. This will override the nextstate
+passed to the parent C<choices> tag.
 
 =back
 
@@ -1065,7 +1081,7 @@
 "push" onto the choice list, rather then wiping it out. (You can even 
 remove choices programmatically, but that would probably be bad form.)
 
-B<defaultvalue support>
+=head3 defaultvalue support
 
 Choices supports default values both in multichoice and single choice mode.
 In single choice mode, have the defaultvalue tag's function return the 
@@ -1278,7 +1294,7 @@
 
 =pod
 
-=head2 Element: dropdown
+=head2 Element: dropdownX<dropdown, helper tag>
 
 A drop-down provides a drop-down box instead of a radio button
 box. Because most people do not know how to use a multi-select
@@ -1288,12 +1304,10 @@
 <dropdown> takes an attribute "variable" to control which helper variable
 the result is stored in.
 
-B<SUB-TAGS>
+=head3 SUB-TAGS
 
 <choice>, which acts just as it does in the "choices" element.
 
-=back
-
 =cut
 
 no strict;
@@ -1426,7 +1440,7 @@
 
 =pod
 
-=head2 Element: date
+=head2 Element: dateX<date, helper element>
 
 Date elements allow the selection of a date with a drop down list.
 
@@ -1636,7 +1650,7 @@
 
 =pod
 
-=head2 Element: resource
+=head2 Element: resourceX<resource, helper element>
 
 <resource> elements allow the user to select one or multiple resources
 from the current course. You can filter out which resources they can view,
@@ -1646,7 +1660,7 @@
 the user can manipulate the folders.
 
 <resource> takes the standard variable attribute to control what helper
-variable stores the results. It also takes a "multichoice" attribute,
+variable stores the results. It also takes a "multichoice"X<multichoice> attribute,
 which controls whether the user can select more then one resource. The 
 "toponly" attribute controls whether the resource display shows just the
 resources in that sequence, or recurses into all sub-sequences, defaulting
@@ -1655,11 +1669,11 @@
 folders that have all of their contained resources filtered out to also
 be filtered out.
 
-B<SUB-TAGS>
+=head3 SUB-TAGS
 
 =over 4
 
-=item * <filterfunc>: If you want to filter what resources are displayed
+=item * <filterfunc>X<filterfunc>: If you want to filter what resources are displayed
   to the user, use a filter func. The <filterfunc> tag should contain
   Perl code that when wrapped with "sub { my $res = shift; " and "}" is 
   a function that returns true if the resource should be displayed, 
@@ -1667,20 +1681,20 @@
   (See Apache::lonnavmaps documentation for information about the 
   resource object.)
 
-=item * <choicefunc>: Same as <filterfunc>, except that controls whether
+=item * <choicefunc>X<choicefunc>: Same as <filterfunc>, except that controls whether
   the given resource can be chosen. (It is almost always a good idea to
   show the user the folders, for instance, but you do not always want to 
   let the user select them.)
 
 =item * <nextstate>: Standard nextstate behavior.
 
-=item * <valuefunc>: This function controls what is returned by the resource
+=item * <valuefunc>X<valuefunc>: This function controls what is returned by the resource
   when the user selects it. Like filterfunc and choicefunc, it should be
   a function fragment that when wrapped by "sub { my $res = shift; " and
   "}" returns a string representing what you want to have as the value. By
   default, the value will be the resource ID of the object ($res->{ID}).
 
-=item * <mapurl>: If the URL of a map is given here, only that map
+=item * <mapurl>X<mapurl>: If the URL of a map is given here, only that map
   will be displayed, instead of the whole course.
 
 =back
@@ -1917,7 +1931,7 @@
 
 =pod
 
-=head2 Element: student
+=head2 Element: studentX<student, helper element>
 
 Student elements display a choice of students enrolled in the current
 course. Currently it is primitive; this is expected to evolve later.
@@ -2102,7 +2116,7 @@
 
 =pod
 
-=head2 Element: files
+=head2 Element: filesX<files, helper element>
 
 files allows the users to choose files from a given directory on the
 server. It is always multichoice and stores the result as a triple-pipe
@@ -2118,15 +2132,33 @@
 defaulting to false, which if true will allow the user to select more
 then one choice. 
 
-<files> accepts three subtags. One is the "nextstate" sub-tag that works
-as it does with the other tags. Another is a <filechoice> sub tag that
-is Perl code that, when surrounded by "sub {" and "}" will return a
-string representing what directory on the server to allow the user to 
-choose files from. Finally, the <filefilter> subtag should contain Perl
-code that when surrounded by "sub { my $filename = shift; " and "}",
-returns a true value if the user can pick that file, or false otherwise.
-The filename passed to the function will be just the name of the file, 
-with no path info.
+<files> accepts three subtags: 
+
+=over 4
+
+=item * B<nextstate>: works as it does with the other tags. 
+
+=item * B<filechoice>: When the contents of this tag are surrounded by
+    "sub {" and "}", will return a string representing what directory
+    on the server to allow the user to choose files from. 
+
+=item * B<filefilter>: Should contain Perl code that when surrounded
+    by "sub { my $filename = shift; " and "}", returns a true value if
+    the user can pick that file, or false otherwise. The filename
+    passed to the function will be just the name of the file, with no
+    path info. By default, a filter function will be used that will
+    mask out old versions of files. This function is available as
+    Apache::lonhelper::files::not_old_version if you want to use it to
+    composite your own filters.
+
+=back
+
+B<General security note>: You should ensure the user can not somehow 
+pass something into your code that would allow them to look places 
+they should not be able to see, like the C</etc/> directory. However,
+the security impact would be minimal, since it would only expose
+the existence of files, there should be no way to parlay that into
+viewing the files. 
 
 =cut
 
@@ -2141,6 +2173,18 @@
                                  ('files', 'filechoice', 'filefilter'));
 }
 
+sub not_old_version {
+    my $file = shift;
+    
+    # Given a file name, return false if it is an "old version" of a
+    # file, or true if it is not.
+
+    if ($file =~ /^.*\.[0-9]+\.[A-Za-z]+(\.meta)?$/) {
+	return 0;
+    }
+    return 1;
+}
+
 sub new {
     my $ref = Apache::lonhelper::element->new();
     bless($ref);
@@ -2208,6 +2252,9 @@
     my $subdir = &$subdirFunc();
 
     my $filterFunc = $self->{FILTER_FUNC};
+    if (!defined($filterFunc)) {
+	$filterFunc = &not_old_version;
+    }
     my $buttons = '';
     my $type = 'radio';
     if ($self->{'multichoice'}) {
@@ -2264,6 +2311,9 @@
         @fileList = &Apache::lonnet::dirlist($subdir, $ENV{'user.domain'}, $ENV{'user.name'}, '');
     }
 
+    # Sort the fileList into order
+    @fileList = sort @fileList;
+
     $result .= $buttons;
 
     if (defined $self->{ERROR_MSG}) {
@@ -2392,7 +2442,7 @@
 
 =pod
 
-=head2 Element: section
+=head2 Element: sectionX<section, helper element>
 
 <section> allows the user to choose one or more sections from the current
 course.
@@ -2466,7 +2516,7 @@
 
 =pod
 
-=head2 Element: string
+=head2 Element: stringX<string, helper element>
 
 string elements provide a string entry field for the user. string elements
 take the usual 'variable' and 'nextstate' parameters. string elements
@@ -2575,9 +2625,9 @@
 
 =pod
 
-=head2 General-purpose tag: <exec>
+=head2 General-purpose tag: <exec>X<exec, helper tag>
 
-The contents of the exec tag are executed as Perl code, not inside a 
+The contents of the exec tag are executed as Perl code, B<not> inside a 
 safe space, so the full range of $ENV and such is available. The code
 will be executed as a subroutine wrapped with the following code:
 
@@ -2590,7 +2640,7 @@
 $helper is the helper object. Feel free to add methods to the helper
 object to support whatever manipulation you may need to do (for instance,
 overriding the form location if the state is the final state; see 
-lonparm.helper for an example).
+parameter.helper for an example).
 
 $state is the $paramHash that has currently been generated and may
 be manipulated by the code in exec. Note that the $state is not yet
@@ -2665,7 +2715,7 @@
 
 =pod
 
-=head2 General-purpose tag: <eval>
+=head2 General-purpose tag: <eval>X<eval, helper tag>
 
 The <eval> tag will be evaluated as a subroutine call passed in the
 current helper object and state hash as described in <condition> above,
@@ -2708,10 +2758,10 @@
 
 =pod
 
-=head2 Element: final
+=head2 Element: finalX<final, helper tag>
 
 <final> is a special element that works with helpers that use the <finalcode>
-tag. It goes through all the states and elements, executing the <finalcode>
+tagX<finalcode, helper tag>. It goes through all the states and elements, executing the <finalcode>
 snippets and collecting the results. Finally, it takes the user out of the
 helper, going to a provided page.
 
Index: loncom/interface/lonprintout.pm
diff -u loncom/interface/lonprintout.pm:1.224 loncom/interface/lonprintout.pm:1.225
--- loncom/interface/lonprintout.pm:1.224	Thu Aug 28 16:36:48 2003
+++ loncom/interface/lonprintout.pm	Tue Sep  2 16:58:31 2003
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.224 2003/08/28 20:36:48 sakharuk Exp $
+# $Id: lonprintout.pm,v 1.225 2003/09/02 20:58:31 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1196,8 +1196,8 @@
 CHOOSE_FROM_SUBDIR
         
         $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
-      <filefilter>return $filename =~ 
-           m/\.(problem|exam|quiz|assess|survey|form|library)$/;
+      <filefilter>return Apache::lonhelper::files::not_old_version($filename) &&
+	  $filename =~ m/\.(problem|exam|quiz|assess|survey|form|library)$/;
       </filefilter>
       </files>
     </state>

--bowersj21062536311--