Revision history for Perl extension OpenInteract.

1.62  Thu Sep 30 22:43:23 EDT 2004



   - OI-6: Fix bug when specifying static files to send my filename
   (vs filehandle). Thanks to Andreas Nolte for reporting.

No packages changed.

1.61  Sun May 30 11:05:27 EDT 2004


 * Makefile.PL:

   - Added IO::Zlib as dependency since Archive::Tar requires
   it. Thanks to Teemu for the pointer.


   - Allow users to set filehandle in $R->{page}{send_file};
   previously we only allowed a filename; thanks to Teemu for the idea
   and starting patch.

 * script/oi_manage:

   - Fix bug in 'check_package' where we weren't checking the
   package_dir argument

 * template/form_select_option:

   - Add 'picked_multiple' argument so you can pass multiple chosen
   items to a multiple-item select widget.

 * Packages changed:

   OpenInteract     1.60 -> 1.61
   base:            1.73 -> 1.74
   base_box:        1.05 -> 1.05
   base_error:      1.45 -> 1.45
   base_group:      1.38 -> 1.38
   base_page:       1.28 -> 1.29
   base_security:   1.61 -> 1.61
   base_template:   2.23 -> 2.23
   base_theme:      1.36 -> 1.36
   base_user:       1.64 -> 1.64
   lookup:          1.01 -> 1.01
   object_activity: 1.04 -> 1.04
   results_manage:  1.02 -> 1.02
   system_doc:      1.33 -> 1.33
   classified:      1.38 -> 1.38
   full_text:       1.35 -> 1.35
   news:            1.54 -> 1.54

1.60  Thu Aug 14 18:39:52 EDT 2003


 * Issue quick fix to URL created when a user isn't logged in and the
   new feature requiring logins is on. Thanks to Andrew Hurst for the
   quick spot, although it was a scant 120 seconds after I'd posted
   1.59 to PAUSE...

1.59  Thu Aug 14 15:58:46 EDT 2003


 * You can now require all users to login before seeing any part of
   your site.

 * Actual HTTP redirects are available if you'd like to use them.

 * Several smaller fixes and enhancements.


 * Makefile.PL:

   - Add 'Cache::Cache' to dependency list, thanks to Teemu

 * conf/sample-server.(ini|perl)

   - Add configuration keys to 'login' and 'display_info'. See
   'UPGRADE' for listing and sample server configuration file for

 * doc/configuration.html:

   - Fix incorrect has_a/links_to configuration references thanks to
   pointers from Teemu.


   - Don't always warn about finding db handles, thanks to Andrew
   Hurst <> for pointer and patch.

   - Call ->child_terminate where appropriate (thanks to Chris
   McDaniel for report that sparked the fix)

   - Be able to set a server configuration variable to force all users
   of a site to login. (See configuration entries under 'login'.) If
   set users who aren't logged in will always get sent (internally) to
   a URL of your choosing. Thanks much to Andrew Hurst for the idea
   and implementation thoughts.

   - If '$R->{page}{http_redirect}' set to a URL then issue an HTTP
   redirect. (Thanks to Teemu)

 * OpenInteract/UI/

   - Don't do any processing if '$R->{page}{http_redirect}' set.

 * OpenInteract/Template/

   - Add 'theme_fetch()', thanks to Andrew Hurst for the idea and
   discussion on scope and parameter naming.

 * OpenInteract/UI/

   - Also pass along 'path' to the main template.

Packages updated:

   OpenInteract     1.58 -> 1.59
   base:            1.72 -> 1.73
   base_box:        1.05 -> 1.05
   base_error:      1.45 -> 1.45
   base_group:      1.38 -> 1.38
   base_page:       1.24 -> 1.28
   base_security:   1.60 -> 1.61
   base_template:   2.23 -> 2.23
   base_theme:      1.36 -> 1.36
   base_user:       1.64 -> 1.64
   lookup:          1.01 -> 1.01
   object_activity: 1.04 -> 1.04
   results_manage:  1.02 -> 1.02
   system_doc:      1.33 -> 1.33
   classified:      1.38 -> 1.38
   full_text:       1.34 -> 1.35
   news:            1.54 -> 1.54

1.58  Sun Apr 13 19:52:57 EDT 2003


 * Fixed fairly serious bug in base_page package that shipped with

Packages updated:

   OpenInteract     1.57 -> 1.58
   base_page:       1.23 -> 1.24

1.57  Mon Apr  7 21:08:38 EDT 2003


 * Small bugfixes and enhancements.



   - Modify the sample information for configuring your database
   connection as it was a little confusing. Thanks to Andrew Hurst
   <> for the pointer.

 * Makefile.PL:

   - Set the unknown version numbers to '0' instead of 'undef' -- as
   it was EU::MM wasn't picking up the dependency properly. Thanks to
   Barry Hoggard <> for pointing it out.

 * conf/sample-server.ini:

   - Make the sample configuration and description a little clearer as
   to what's required, what various items are, etc.

 * OpenInteract/

   - Force scalar context on ->id call.

 * OpenInteract/

   - Fix ->package_filename to work properly on Win32. Thanks to David
   C. Reed <> for the fix!

 * OpenInteract/

   - Fix problem with fetching/saving object keys when the object is
   using a multiple-value primary key. Thanks to damien leri
   <> for pointing out the problem.

 * OpenInteract/

   - Fix bug triggered when we cannot bring in all the action or SPOPS
   classes. (Trying to treat the hashref as an arrayref, oops.)

 * OpenInteract/Template/

   - In make_url(), use '&amp;' as a query argument separator rather
   than a bare '&'. Thanks to damien leri <> for
   the pointer and Randal for the clarification.

 * script/oi_manage:

   - Fix some typos in the docs -- thanks to Jon <> for the

Packages updated:

   OpenInteract     1.56 -> 1.57
   base:            1.72 -> 1.72
   base_box:        1.04 -> 1.05
   base_error:      1.45 -> 1.45
   base_group:      1.38 -> 1.38
   base_page:       1.17 -> 1.23
   base_security:   1.60 -> 1.60
   base_template:   2.23 -> 2.23
   base_theme:      1.36 -> 1.36
   base_user:       1.61 -> 1.64
   lookup:          1.01 -> 1.01
   object_activity: 1.03 -> 1.04
   results_manage:  1.01 -> 1.02
   system_doc:      1.33 -> 1.33
   classified:      1.38 -> 1.38
   full_text:       1.34 -> 1.34
   news:            1.54 -> 1.54

1.56  Mon Feb 17 16:55:40 EST 2003


 * Updated all relevant packages to use the '%%DATETIME%%' key in
   database schemas since different databases use different types
   ('datetime', 'timestamp', 'date', 'whenever', etc.)

 * A number of small bugfixes and enhancements. Included in this is an
   update of package documentation for most packages shipped with the
   distribution. (Fixes SF Bug #597982)


 * conf/sample-override_spops.ini

   - Add 'news_section' as object to be optionally modified for its
   database type.

 * OpenInteract/Config/

   - Fixed a few bugs in the INI read/write along with a small
   documentation note. Thanks much to Isidro Vila Verde <>
   for pointing out the errors and sending along fixes.

 * OpenInteract/

   - Update copy_modules() to return an arrayref of the full
   destination paths of the modules rather than the module files

 * OpenInteract/

   - Add routines to backup and restore from backup.

 * OpenInteract/

   - Set session key 'timestamp' on create

 * OpenInteract/

   - Add support for '%%DATETIME%%' keyword in schemas to install.

 * OpenInteract/

   - Do a chmod 0777 on all the files and directories in the templib
   directory. Fixes SF Bug #657857.

 * OpenInteract/Template/

   - Add 'page_title( $title )' method to change the page title from a

   - Be sure that boxes added via 'box_add' copy the box parameters
   (title, weight, etc.) to the right place

 * script/oi_manage:

   - Call repository backup/restore backup when appropriate. This
   should help with accidental corruption of the repository.

Packages updated:

   OpenInteract     1.55 -> 1.56
   base:            1.70 -> 1.72
   base_box:        1.01 -> 1.04
   base_error:      1.43 -> 1.45
   base_group:      1.37 -> 1.38
   base_page:       1.15 -> 1.17
   base_security:   1.58 -> 1.60
   base_template:   2.22 -> 2.23
   base_theme:      1.35 -> 1.36
   base_user:       1.59 -> 1.61
   lookup:          1.00 -> 1.01
   object_activity: 1.01 -> 1.03
   results_manage:  1.00 -> 1.01
   system_doc:      1.32 -> 1.33
   classified:      1.36 -> 1.38
   full_text:       1.33 -> 1.34
   news:            1.48 -> 1.54

1.55  Fri Dec 20 08:00:48 EST 2002


 * conf/sample-base.conf:

   - Add 'templib_dir' key which you can use to set the temporary
   library directory.

 * doc/*:

   - Number of small changes to documentation (internal consistency,
   etc.). Add sample-server-ini.html for example of recommended server
   configuration type.

 * OpenInteract/

   - Add 'object_description' which uses the method from SPOPS but
   adds 'date' if the configured object has 'description_date_field'
   defined in its configuration.

   - Catch SPOPS log actions for 'delete' and 'remove' to do the same
   thing (SPOPS for some reason uses delete/remove interchangably...)

 * OpenInteract/

   - Try to read temporary library directory from base config first
   (user can customize), otherwise use the same value as
   previous. Thanks to Andreas Nolte for the suggestion.

 * OpenInteract/UI/

   - Make choosing the main template customizable via
   subclassing. Thanks to Chris McDaniel <>
   for the idea.

Packages updated:

   OpenInteract     1.51 -> 1.55
   base:            1.70 -> 1.70
   base_box:        1.01 -> 1.01
   base_error:      1.43 -> 1.43
   base_group:      1.37 -> 1.37
   base_page:       1.00 -> 1.15
   base_security:   1.58 -> 1.58
   base_template:   2.21 -> 2.22
   base_theme:      1.35 -> 1.35
   base_user:       1.58 -> 1.59
   lookup:          1.00 -> 1.00
   object_activity: 1.00 -> 1.01
   results_manage:  1.00 -> 1.00
   system_doc:      1.32 -> 1.32
   classified:      1.36 -> 1.36
   full_text:       1.32 -> 1.33
   news:            1.40 -> 1.48

1.54  Thu Nov  7 10:12:00 EST 2002


 * OpenInteract/Handler/

   - Actually implement the bugfix from 1.53 properly...

1.53  Thu Nov  7 07:57:11 EST 2002


 * OpenInteract/Handler/

   - Don't use the cache unless it's been defined. Thanks to Raúl
   Romero <> for the bug report.

Package updates: none

1.52  Mon Sep 16 16:19:33 EDT 2002


 * doc/caching.html:

   -Add note about admin users and caching.

 * OpenInteract/

   - When cleaning up the content and TT caches, set the permissions
   on the directories to 0777 so the webserver doesn't complain about
   not being able to write to the cache.

 * OpenInteract/

   - Fix VERSION so it's newer than 1.50. (How this got downgraded is
   anyone's guess... probably a pasted VERSION converter w/o a
   commit.) Thanks to merlyn, as usual.

 * OpenInteract/Handler/

   - If the user is an admin, we neither read from nor write to the

   - If the action parameter 'skip_cache' is set, we neither read from
   nor write to the cache.

Package updates: none

1.51  Sun Sep  8 23:07:24 EDT 2002


 * conf/sample-server.ini, conf/sample-server.perl:

   - See UPGRADE for details on these:

     o Add configuration keys '' and
     o Rename keys '' and ''
     o Delete keys 'cache_info.ipc.*' and ''

 * doc/caching.html:

   - Create introduction to caching in OI.


   - Modify how we setup the cache -- what parameters are used,
   etc. (Part of caching implementation.)

 * OpenInteract/

   - Rewrite big chunks of class. Caching now uses an OI object rather
   than just class methods that can grab an cache implementation
   object from the ether.

 * OpenInteract/Cache/

   - Rewrite to reflect new caching changes, plus use Cache::FileCache
   rather than the ancient File::Cache. Get rid of old AUTOLOAD stuff.

 * OpenInteract/Cache/

   - Dump.

 * OpenInteract/Handler/

   - Create caching and cache checking methods for subclasses. You can
   use these if your module subclasses this class OR if it subclasses
   OpenInteract::CommonHandler. See intro to caching
   (doc/caching.html) and POD for this class.

 * OpenInteract/Session/(DBI|File|SQLite).pm:

   - Only return a non-empty session. (Probably unnecessary, but just
   to be sure...)

 * OpenInteract/Template/

   - Fix 'box_add' so that it passes the 'remove' parameter properly

 * OpenInteract/Template/

   - Return a better error message if we can't find a template in

 * script/oi_manage:

   - Add deprecation message for commands dealing with templates.

Packages updated:

   OpenInteract     1.50 -> 1.51
   base:            1.70 -> 1.70
   base_box:        1.00 -> 1.01
   base_error:      1.43 -> 1.43
   base_group:      1.37 -> 1.37
   base_page:       1.00 -> 1.00
   base_security:   1.58 -> 1.58
   base_template:   2.21 -> 2.21
   base_theme:      1.35 -> 1.35
   base_user:       1.58 -> 1.58
   lookup:          1.00 -> 1.00
   object_activity: 1.00 -> 1.00
   results_manage:  1.00 -> 1.00
   system_doc:      1.32 -> 1.32
   classified:      1.36 -> 1.36
   full_text:       1.32 -> 1.32
   news:            1.40 -> 1.48

1.50  Mon Aug 26 01:37:23 EDT 2002


 * Templates are now only stored in the filesystem, and browser-based
   template editing is back online. If you currently store templates
   in the filesystem you'll need to run a migration script. See docs
   in the 'base_template' package for more information.

 * Component handler has moved from the 'base_component' package to
   the main distribution. The 'base_component' package is no longer

 * Documentation updates: much of the docs from the 'base' package are
   now in HTML in the main docs.


 * conf/sample-server.ini, conf/sample-server.perl:

   - Add new mandatory keys 'system_alias.site_template' and
   'system_alias.sitetemplate' (See UPGRADE for more info)

   - Remove key 'template_info.source' as it's no longer needed

   - Change key 'system_alias.component' to
   'OpenInteract::Component'. (This is MANDATORY; see UPGRADE for more

 * doc/actions.html; doc/templates.html; doc/packages.html;
   doc/configuration.html; doc/r_contents.html;

   - Move documentation from 'base' package to sitewide doc

 * doc/components.html:

   - Move documentation from 'base_component' package to sitewide doc

 * doc/developer.html:

   - Merge changes made by Ben Avery <> to bring the
   document up-to-date.

 * OpenInteract/

   - Only change the 'class' property of action configuration files if
   it's 'OpenInteract::Handler::Foo' rather than just

   - In check(), include all files from 'template' that are not
   backups or meta files.

 * OpenInteract/, OpenInteract/Template/

   - Removed files; these have been deprecated for a long time. Adios!

 * OpenInteract/Template/

   - Ripped out all template fetching routines since this logic is now
   in OpenInteract::SiteTemplate (in the base_template package).

Packages updated:

   OpenInteract     1.41 -> 1.50
   base:            1.67 -> 1.70
   base_box:        0.45 -> 1.00
   base_error:      1.42 -> 1.43
   base_group:      1.36 -> 1.37
   base_page:       0.98 -> 1.00
   base_security:   1.57 -> 1.58
   base_template:   1.31 -> 2.21
   base_theme:      1.34 -> 1.35
   base_user:       1.57 -> 1.58
   lookup:          0.20 -> 1.00
   object_activity: 0.19 -> 1.00
   results_manage:  0.08 -> 1.00
   system_doc:      1.29 -> 1.32
   classified:      1.35 -> 1.36
   full_text:       1.31 -> 1.32
   news:            1.39 -> 1.40

1.41 Tue Aug 13 07:28:10 EDT 2002


 * Makefile.PL:

   - Changed 'Email::Valid' prereq to 'Mail::RFC822::Address', since
   the latter is available on Win32.


   - Add call to OpenInteract::Auth->custom_handler() after the other
   authentication methods have been run.

 * OpenInteract/

   - Move the custom method as declared in the server configuration to
   stand on its own rather than after the user logs in
   successfully. We also renamed a few configuration keys in the
   'login' group.

 * OpenInteract/

   - Fixed bug in wizard_search() that was not getting the search
   results back properly due to a malformed argument capture. (Thanks
   to Bill Heckel ( for spotting it.)

   - Fixed bug in _search_build_where_clause() so that we properly
   handle searches with multiple values for a single
   criterion. (Thanks to Ewald Hinrichs (
   for the bug report.)

 * OpenInteract/

   - Added documentation for connection parameter 'db_name'. Thanks to
   Drew Taylor ( for the prod.

 * OpenInteract/

   - In 'package.conf' file, allow 'Module::Foo||Module::Bar||...'
   syntax to specify alternative modules that can be used for the same
   purpose. For instance, Win32 does not have an install of
   Email::Valid, so we use 'Email::Valid||Mail::RFC822::Address' and
   allow the code that uses this module to use either of them.

 * OpenInteract/

   - Refactor some of the initialization code. Specifically, remove
   some functionality regarding the classes tracked to be required en
   masse and put it in separate methods. Also move this tracking until
   AFTER the global overrides have been processed.

 * OpenInteract/Template/

   - New parameter for date_format(): a true value for 'fill_nbsp'
   will fill all whitespace in the formatted string with '&nbsp;'

 * OpenInteract/Template/

   - Allow for package templates to be stored in sitewide template
   area. These templates should be used for customization since the
   package may get upgraded and the templates overwritten. This means
   instead of modifying the template:


   You probably want to modify:


   Since the former will be overwritten with an upgrade to 'mypkg'.

   - Allow templates with the name spec '::foo_template' to be pulled
   properly from the sitewide template directory

 * conf/sample-server.ini, conf/sample-server.perl:

   Rename configuration keys:

     'login.custom_login_handler' => 'login.custom_handler'
     'login_custom_login_method'  => 'login.custom_method'
   Add configuration key:


Packages updated:

   OpenInteract     1.40 -> 1.41
   base:            1.67 -> 1.67
   base_box:        0.45 -> 0.45
   base_component:  1.30 -> 1.30
   base_error:      1.42 -> 1.42
   base_group:      1.36 -> 1.36
   base_page:       0.98 -> 0.98
   base_security:   1.57 -> 1.57
   base_template:   1.31 -> 1.31
   base_theme:      1.33 -> 1.34
   base_user:       1.55 -> 1.57
   lookup:          0.20 -> 0.20
   object_activity: 0.18 -> 0.19
   results_manage:  0.08 -> 0.08
   system_doc:      1.29 -> 1.29
   classified:      1.35 -> 1.35
   full_text:       1.31 -> 1.31
   news:            1.39 -> 1.39

1.40  Tue May  7 08:54:49 EDT 2002


 - OpenInteract runs on Oracle! Many thanks to Ben Avery
   <> for patient debugging and installs.

 There is one caveat, at least for the time being: you need to use
 something else to store your sessions. The new
 OpenInteract::Session::File and OpenInteract::Session::SQLite
 implementations may help -- you also have the option of implementing
 with another DBI database.

 - Package configuration customization is much easier now -- you can
 centralize your modifications in a single file that doesn't get
 overwritten with package upgrades. See
 OpenInteract::Config::GlobalOverride notes below and module for

 - Different session storage is now available through
 OpenInteract::Session::File and OpenInteract::Session::SQLite. See
 more below.



   - Add note about the override_spops.ini file while discussing
   changing the SPOPS driver.

 * conf/sample-override_spops.ini:

   - Create file with sample override rules you can use. This file
   gets copied into the $WEBSITE_DIR/conf file whenever you run a
   'create_website', but upgraders can copy it manually.

 * OpenInteract/

   - Ensure we pass along parameters to the relevant method whenever
   we fail a task. This ensures that the initial security (etc.) gets
   passed along as well. This is still a little messy, but it should
   work. Thanks to Sloan Seaman for bringing up the issue.

   - Fix documentation of _edit_customize() so it's testing for the
   right thing. (Thanks to Sloan again.)

 * OpenInteract/Config/

   - Add class to process overriding rules for configuration
   directives. This enables you to make changes to lots of
   configuration items from one place, overriding the values in a
   package's 'conf/spops.perl', for example, so you don't have to run
   'oi_manage change_spops_driver' every time you upgrade the package.

   Note that if you use this along with the 'insert_alter' directives,
   you must upgrade to SPOPS 0.60, since this feature is new as of
   that version.

 * OpenInteract/

   - When running check(), stick the package dir at the head of @INC
   so there's no ambiguity about where the tested modules are coming
   from. (For instance, if you have the website templib directory in
   @INC for whatever reason.)

 * OpenInteract/Session/

   - Allow a datasource to be specified in the server
   configuration. So you could use a "heavy" database (like Oracle)
   for most of your application while using a "light" database (like
   MySQL) for your sessions.

   - Improve documentation for existing features and add docs for new

 * OpenInteract/Session/

   - Add implementation for using the filesystem as a session store.

 * OpenInteract/Session/

   - Add implementation for using a SQLite database as a session
   store. (Note that this uses the fairly new Apache::Session::SQLite
   CPAN module, YMMV.)

 * OpenInteract/

   - Modify how we store and retrieve object tracking information
   since it's now a normal SPOPS object. Previous interfaces should
   still hold, except for 'fetch_creator()' which returns a single
   object (or undef) instead of an arrayref.

 * OpenInteract/

   - Add translations for Oracle, SQLite and InterBase.

   - Change %%INCREMENT%% for Postgres from 'SERIAL' to 'INT NOT
   NULL'. Rather than relying on the Postgres auto-sequence naming
   code, we're going to create our own sequences to be consistent with
   Oracle. (See UPGRADE for upgrade notes.)

 * OpenInteract/

   - If relevant files are present, apply
   OpenInteract::Config::GlobalOverride to SPOPS and action table once
   they're generated but before they're processed.

 * script/oi_manage:

   - Fixed message returned by initialize_request() on error (Thanks
   to Sloan Seaman for the spot)

   - Copy over 'conf/sample-override_spops.ini' to website when
   'create_website' run.

Packages updated:

   OpenInteract     1.39 -> 1.40
   base:            1.63 -> 1.67
   base_box:        0.44 -> 0.45
   base_component:  1.30 -> 1.30
   base_error:      1.39 -> 1.42
   base_group:      1.32 -> 1.36
   base_page:       0.90 -> 0.98
   base_security:   1.54 -> 1.57
   base_template:   1.27 -> 1.31
   base_theme:      1.29 -> 1.33
   base_user:       1.49 -> 1.55
   lookup:          0.20 -> 0.20
   object_activity: 0.11 -> 0.18
   results_manage:  0.07 -> 0.08
   system_doc:      1.29 -> 1.29
   classified:      1.32 -> 1.35
   full_text:       1.30 -> 1.31
   news:            1.33 -> 1.39

1.39  Mon Mar  4 07:45:35 EST 2002



   - Fix typo in setup_theme() when checking to see whether we should
   cache the session object. Thanks to Andreas Nolte for pointing out.

 * OpenInteract/

   - For objects using security: add get_security_scopes() to override
   the method in SPOPS::Secure so we can return the user and groups
   without hitting the database. Big thanks to Andreas Nolte for
   pointing this out -- this can potentially be a huge savings on
   database hits.

Packages updated:

   OpenInteract     1.38 -> 1.39
   base:            1.63 -> 1.63
   base_box:        0.43 -> 0.44
   base_component:  1.30 -> 1.30
   base_error:      1.39 -> 1.39
   base_group:      1.32 -> 1.32
   base_page:       0.89 -> 0.90
   base_security:   1.54 -> 1.54
   base_template:   1.27 -> 1.27
   base_theme:      1.29 -> 1.29
   base_user:       1.49 -> 1.49
   lookup:          0.20 -> 0.20
   object_activity: 0.11 -> 0.11
   results_manage:  0.07 -> 0.07
   system_doc:      1.29 -> 1.29
   classified:      1.32 -> 1.32
   full_text:       1.30 -> 1.30
   news:            1.33 -> 1.33

1.38  Mon Feb 25 22:27:22 EST 2002


 - You can now tell OI to cache the user, group and theme objects in
 the user session. The objects will get refreshed based on the
 settings in the server config. Thanks to Andreas Nolte
 <> for the idea and a sample

 - Small changes to the CommonHandler to add more flexibility

 - The deprecated 'static_page' package is no longer distributed with


 * conf/sample-server.ini:

   - Added configuration keys session_info->cache_user,
   session_info->cache_group, session_info->cache_theme. The value for
   each key is the length of time (in minutes) the object can be
   cached in the user session.


   - If session_info->cache_theme set to a positive value, cache the
   theme in the user's session

 * OpenInteract/

   - If session_info->cache_user set to a positive value, cache the
   user object in the user session (only if logged in, etc.)

   - If session_info->cache_group set to a positive value, cache the
   group object in the user session (only if logged in, etc.)

 * OpenInteract/

   - Added _edit_post_action_customize() and
   _remove_post_action_customize() to perform actions after a
   successful edit or remove.

   - Added MY_SEARCH_ADDITIONAL_PARAMETERS to pass additional
   information to the SPOPS fetch_iterator() call. Thanks to Ewald
   Hinrichs <> for the suggestion.

 * OpenInteract/Template/

   - Changed how the $template object gets initialized: if the
   'cache_tt' directory is undefined, we ensure that the COMPILE_DIR
   and COMPILE_EXT settings in $template are also undefined so TT does
   no compiling to disk. Thanks to John Sequeira <>
   for pointing out that compiling couldn't be turned off.

 * script/oi_manage:

   - In test_db_connection(), swap the $@ check and $db check around
   after the initial connect, and instead of the simple test for
   existence of $db, check to see that it's a valid DBI handle -- that
   is, isa('DBI::db') (Thanks to John Sequeira <> for

Packages Changed:

The 'Changes' file in each package has details.

   OpenInteract     1.37 -> 1.38
   base:            1.63 -> 1.63
   base_box:        0.42 -> 0.42
   base_component:  1.30 -> 1.30
   base_error:      1.39 -> 1.39
   base_group:      1.32 -> 1.32
   base_page:       0.77 -> 0.89
   base_security:   1.54 -> 1.54
   base_template:   1.27 -> 1.27
   base_theme:      1.29 -> 1.29
   base_user:       1.47 -> 1.49
   lookup:          0.20 -> 0.20
   object_activity: 0.10 -> 0.11
   results_manage:  0.07 -> 0.07
   system_doc:      1.29 -> 1.29
   classified:      1.32 -> 1.32
   full_text:       1.30 -> 1.30
   news:            1.33 -> 1.33
   static_page:     1.53 -> removed

1.37  Fri Jan 18 17:34:59 EST 2002


 - The base_page package now includes support for directory handlers,
 which allows you to step in at a directory request and generate
 specific content for that request. (Previously, index support was
 only for setting a filename to be used, much like DirectoryIndex in

 - Time-expired sessions are now supported -- just add the key
 'session_info'->'expires_in' to your server configuration and set it
 to the number of minutes an inactive session should last. (Setting it
 to 0/undef == forever)

 - General bugfixes

Structure changes:

 - You'll need to drop the table 'content_type' and add it again if
 you upgrade a website to the newest 'base_page' package. You can add
 the table again using:

  $ oi_manage install_sql --package=base_page

 Will do it (along with issuing a number of errors, but that's ok).



   - Added notes about directory permissions

 * Makefile.PL:

   - Add Class::Accessor and dependencies

 * conf/sample-httpd*.conf:

   - Added definition for 'combined' log, thanks to suggestion from
   Bill Moseley <>

 * conf/sample-server.ini:

   - Added configuration key 'session_info'->'expires_in' so you can
   control session inactivity expiration

   - Added the key 'template_info'->'cache_size' to control how many
   templates TT will keep cached in memory

 * conf/sample-server.perl:

   - Updated default actions to refer to 'page' instead of 'basicpage'
   (Thanks to Andreas Nolte <> for
   pointing this out.)

   - Added configuration key 'session_info'->'expires_in' so you can
   control session inactivity expiration

   - Added the key 'template_info'->'cache_size' to control how many
   templates TT will keep cached in memory

 * conf/sample-spops.perl:

   - Comment out the 'increment_field' key (if you append a config to
   the bottom you'll get errors) Thanks to Sloan Seaman for the spot.


   - Clear out the stack of exceptions in SPOPS::Exception if 0.56 is
   being used.

   - Add 'check_database()' step that is called before any interaction
   with the database. This way we should be able to ensure the
   connection is up and provide a decent error message rather than the
   'Themes not functioning' one.

 * OpenInteract/

   - Win32 wasn't starting up properly due to when we were putting the
   config info in the OpenInteract package. Fixed -- thanks to John
   Sequeira <> for reporting the bug

 * OpenInteract/

   MY_REMOVE_DISPLAY_TASK so that the modules can have better control
   over what happens on success or failure.

   - create() now passes a true value for 'is_new_object' in addition
   to a true value for 'edit' so that show() can do the right thing.

   so a module can define the max number of results that can be
   returned from a search, and if too many are returned can run a
   custom task. (See docs for more info.)

   - Added MY_SEARCH_FAIL_TASK so that modules can have better control
   over what happens when a search fails.

 * OpenInteract/

   - In check() added new check to conf/spops.perl file to ensure that
   every key in the configuration points to a hashref. (Thanks to
   Sloan Seaman for the spot.)

   - Added checks to export() to check for existing
   file/directory. (Thanks to Sloan Seaman for suggesting.)

 * OpenInteract/

   - Add method 'is_session_valid()' that is called every time we
   create a new session. Currently it checks the
   'session_info'->'expires_in' key of the server configuration to see
   if the session has expired after n minutes of inactivity.

 * OpenInteract/

   - Enable an option to be passed to create_temp_lib -- we check to
   see if it's set to 'lazy' and if so, we don't try to recreate the
   temporary lib dir if it already exists.

 * OpenInteract/

   - Update _clean_attachment_filename() to first remove the website
   base directory from the filename, then go through the
   relative/absolute checks. Otherwise you wind up with something

 * script/oi_manage:

   - Fix 'list_actions' and 'list_objects' so that we create an entire
   static environment as opposed to just the configuration (sets up
   the temporary lib directory properly); also, use the newly-created
   'lazy' option so that we don't try to recreate the lib dir if it
   already exists (this might change)

   - Updated 'test_db_connection()' to ensure a database handle is
   returned and to wrap $db->disconnect() in eval {} to trap any
   errors (and report them in the status)

 * template/label_form_upload_row:

   - Widget for displaying a file upload in a row

 * template/table_bordered_begin:

   - Added support for setting the border in the inner table (Thanks
   to Bill Heckel <> for the patch.)

Packages changed. The 'Changes' file in each package has details.

   OpenInteract     1.36 -> 1.37
   base:            1.63 -> 1.63
   base_box:        0.41 -> 0.42
   base_component:  1.30 -> 1.30
   base_error:      1.37 -> 1.39
   base_group:      1.30 -> 1.32
   base_page:       0.40 -> 0.77
   base_security:   1.53 -> 1.54
   base_template:   1.27 -> 1.27
   base_theme:      1.29 -> 1.29
   base_user:       1.45 -> 1.47
   lookup:          0.18 -> 0.20
   object_activity: 0.10 -> 0.10
   results_manage:  0.06 -> 0.07
   system_doc:      1.28 -> 1.29
   classified:      1.32 -> 1.32
   full_text:       1.30 -> 1.30
   news:            1.33 -> 1.33
   static_page:     1.52 -> 1.53

1.36  Sat Dec  1 12:55:16 EST 2001


 * Two bugfixes in core modules -- no package changes.


 * OpenInteract/

   - Fixed call in remove() which made the id_field() call against the
   wrong class, and added a stub for _remove_customize() (Thanks to
   Andreas Nolte <> for pointing these

 * OpenInteract/

   - Added MASK argument to mkdir() (optional in 5.6.1, not in 5.5.x;
   thanks to Randal for pointing this out)

1.35  Thu Nov 29 00:46:51 EST 2001


 - Lots of configuration file changes. (PLEASE read the 'UPGRADE' file
 to ensure you get all the changes.) You can now use a .ini-style
 configuration file instead of the perl data structure file. (Hint:
 one is a lot easier to read.) The perl-structure config file was also
 modified quite a bit, and many files throughout OI modified to
 accommodate the changes. The changes included backward compatibility
 where possible, so it should be transparent to use an old-style
 (perl) configuration file with the newer releases.

 - Added 'object_activity' package to browse object activity
 logs. Hopefully this won't encourage any latent bigbrotherish
 tendencies you might have...

 - The new package 'base_page' replaces 'static_page'. The new package
 allows you to edit files in the filesystem and keep the metadata
 (title, authors, boxes, etc.) in the database while keeping the
 content elsewhere. Not only can you can also use it to
 manage non-HTML files (PDFs, Excel spreadsheets, tarballs, etc.), but
 you can also use its aliasing and URL-mapping features to link to or
 bring in content from other locations on your site or anywhere on the
 web. (The URL-mapping is still crude, but it works.)  A migration
 script is provided.

 - Modified the Apache startup procedures so we have a single, non
 anonymous child initialization subroutine. This requires small
 modifications to your Apache configuration -- see 'UPGRADE' for

 - Get rid of the monster @INC, re-creating a temporary library
 directory on every server restart.


 * conf/sample-server.perl:

   - Moved 'template_ext' ==> 

   - Moved 'default_connection_db' ==>

   - Moved 'default_connection_ldap' ==>

   - Moved 'error_object_class' ==>

   - Moved 'default_error_handler' ==>

   - Moved 'smtp_host' ==>

   - Moved 'admin_email' ==>

   - Moved 'content_email' ==>

   - Reverse and flatten the 'system_alias' hashref. For instance:

        OpenInteract::Auth => [ qw/ auth auth_user auth_group / ]


        auth       => 'OpenInteract::Auth',
        auth_user  => 'OpenInteract::Auth',
        auth_group => 'OpenInteract::Auth',

   - Moved 'action'->'_default_action_info' ==>

   - Moved 'action'->'_notfound' ==>

   - Moved 'action'->"''" ==>

   - Moved 'stash_class' ==>

   - Moved 'request_class' ==>

   - Moved 'website_name' ==>

   - Added 'login'->'always_remember' to give sites the option of
   always remembering logins

 * doc/admin.html: 

   - Fixed html bug noticed by Drew Taylor <>

 * doc/fruit-0.09.tar.gz:

   - Updated the simple example package to version 0.09. This version
   works with OI 1.30+ and includes the new template widgets. Thanks to
   Steven Devijver <> for prompting its revision.


   - Renamed 'setup_apache' to 'setup_server_interface' but kept old
   method for backward compatibility

   - Set the content-length in send_static_file()

 * OpenInteract/

   - Rewrote much of this so that we do all SPOPS initialization in
   the ChildInit handler rather than the server handler, since we were
   in some cases asking for a database handle in the server and never
   letting it go. (This can be bad.) See 'UPGRADE' for simple but
   necessary changes to your Apache config.

   - Also modified the startup procedure to read and the child init
   handler to write information to a package variable in lieu of using
   PerlSetVar in the configuration file. (Encountered some nastiness
   on Solaris under 5.005_03/1.3.22/1.26 and the PerlSetVar items not
   being there. Whatever.)

   - Tell OI::Startup to copy all the relevant package files on
   *server* startup, since it modifies @INC

 * OpenInteract/

   - Added 'is_admin()' which checks to see if the user is an
   administrator. By default this is defined as being the superuser or
   being a member of the 'site admin' group. You can subclass this
   class, override the method and specify the class in the server
   configuration to provide your own criteria for who is an

   - Broke the 'user()' method down into pieces so it can be
   overridden more easily. (See docs for details.) Thanks to Stefano
   di Sandro <> for suggesting it.

   - Honor the new 'login'->'always_remember' setting in the server

 * OpenInteract/

   - Reorganized documentation and added lots of it, documenting every
   configuration key and customization method.

   - Added the 'notify()' task to send objects in human-readable
   format over email

   - Added the 'create()' task which is just a wrapper around the
   'show()' task with certain parameters checked beforehand and set.

 * OpenInteract/UI/

   - Don't assume that the template will be a fully-qualified name, or
   that a non-qualified name will be in the base_theme package. Also
   add/clarify some docs.

 * OpenInteract/

   - Files copied from a base_installation package to the website
   check the contents of a file in the directory (.no_overwrite)
   before doing so. This way your /index.html file won't get
   overwritten with each new base_page upgrade.

   - Add copy_modules() method, which copies all the modules from both
   a website pkg directory and its base pkg directory to a temporary
   library location.

 * OpenInteract/

   - Removed the html_encode and html_decode methods; they're in the
   template plugin, and if you really need them elsewhere you can call
   the HTML::Entities methods by hand.

   - rename 'ruleset_add' -> 'ruleset_factory'

 * OpenInteract/SPOPS/

   - Added 'discover_fields' SPOPS::ClassFactory behavior, which
   allows you to leave the 'field' key in your object configuration
   blank and have it filled at run-time. To use it you must set the
   'field_discover' key to 'yes' in your object configuration.

 * OpenInteract/

   - Add create_temp_lib() method to create a temporary library
   directory, asking each of the packages to copy their relevant
   module files there.

   - Remove code that relied on putting all the package directories in
   @INC, and add an extra call to setup_static_environment() to copy
   the modules for all packages in a website to a temporary library,
   which is also put in @INC. (For Apache the call to copy is in

 * OpenInteract/Template/

   - Fixed dumb POD error that prevented 'perldoc' from working
   (identified itself as OI::Template::Provider in the head - doh!)

   - Add 'is_admin' property to the template plugin that returns
   whether the current user is an administrator. (See
   OpenInteract/ for what this means.)

   - Add 'server_config' property which returns the results of
   $R->CONFIG to a template.

 * OpenInteract/Template/

   - Properly catch when we weren't passed content.

 * script/oi_manage:

   - Enable a file in the $WEBSITE_DIR/template directory to specify
   which templates oi_manage should never overwrite during a
   'refresh_widget' command. (This file is created when you create a
   website to include the base_main and base_simple templates.)

   - Don't test for 'VERSION' anymore when doing an upgrade, since the
   version is now pulled from

  - When creating a new website, mark in .no_overwrite the
  html/index.html file so it won't be overwritten by package
  upgrades. Also mark the template/base_main and template/base_simple

  - When installing SQL, call OI::Startup->create_temp_lib() directly;
  other actions that use the full OI environment don't have to do this
  because it's called in setup_static_environment(), which we can't do
  when installing SQL due to bootstrapping issues.

 * template/base_(main|simple):

   - Moved the base template and the base 'simple' template (for
   popups and such) from the 'base_theme' package to the server
   root. That way they will not get overwritten every time you update
   the package.

 * template/error_(not_found|task_forbidden|task_no_default):

   - Moved these error messages from the base_error package to the
   global template directory so they're easier to customize for your

 * template/*:

   - Other widget template files had changes too minor to note here.

Packages changed:

   OpenInteract     1.30 -> 1.35
   base:            1.62 -> 1.63
   base_box:        0.33 -> 0.41
   base_component:  1.30 -> 1.30
   base_error:      1.32 -> 1.37
   base_group:      1.26 -> 1.30
   base_page:        n/a -> 0.40
   base_security:   1.51 -> 1.53
   base_template:   1.27 -> 1.27
   base_theme:      1.27 -> 1.29
   base_user:       1.37 -> 1.45
   lookup:          0.15 -> 0.18
   object_activity:  n/a -> 0.10
   results_manage:  0.05 -> 0.06
   system_doc:      1.25 -> 1.28
   classified:      1.28 -> 1.32
   full_text:       1.27 -> 1.30
   news:            1.33 -> 1.33
   static_page:     1.51 -> 1.52

1.30  Mon Oct 15 01:35:03 EDT 2001


 * New Class: OpenInteract::CommonHandler

   - Common web apps (search form, search, display, edit, remove) can
   now be reduced to a series of configuration steps and templates
   while still allowing for custom behavior. This makes for very
   maintainable code and rapid development. See the 'classified'
   package for an example that uses it.

 * Custom template behaviors:

   - It's now simple to define custom template behaviors across all
   templates in a website. A package can define plugins or blocks via
   its configuration. And a website can also step in make variables
   available to every template.

 * Template performace:

   - Templates are now cached properly, and by default they're
   compiled as well. This can provide a dramatic performance
   boost. Also, OpenInteract works flawlessly with the new
   Template::Stash::XS module, which itself makes templates run up to
   twice as fast. (Be sure to use version 2.05b or higher of TT.)

 * Template widgets:

   - You can now use common simple widgets to represent display
   elements. They are entirely optional and use the existing Template
   Toolkit framework (e.g., 'PROCESS form_text( ... )') for
   implementation, including being compiled and cached. See
   'doc/template_widgets.html' for initial documentation on this.

 * New Package: lookup

   - New package 'lookup' allows you to specify parameters for a
   particular object in your action table and have that object be
   editable in a table format. This is intended for easily editing
   lookup tables, since you normally want to be able to edit many
   values at one time.


 * conf/sample-server.perl:

   - Added 'no_promotion' -- if you set it to true we don't send a
   'X-Powered-By' header.

   - Added 'content_email' - address for a content administrator

   - Added 'template_info'->'custom_variable_class' and
   'template_info'->'custom_variable_method'. Allows each website to
   define a handler that can step in just before every template is
   processed and modify the variables sent to the template. (See

   - Added 'template_info'->'custom_init_class' and
   'template_info'->'custom_init_method'. Allows each website to
   define a handler that can step in just before the template object
   is initialized and modify its configuration.(See

   - Added 'dir'->'cache_tt' key (Template Toolkit caching directory)

   - Added 'template_info'->'compile_cleanup' -- set to true if you want
   the compile directory cleaned up on server restart

   - Added 'template_info'->'compile_ext' -- set the extension for
   compiled TT files -- only real propeller-heads might want to do
   this :-)

   - Added a three fields ('login'->'custom_login_method',
   'box'->'system_box_method', 'box'->'custom_box_method') so you can
   control the method used with
   a custom class; this is completely backward compatible, since the
   default is always 'handler'

 * conf/sample-spops.perl:

   - updated sample to use 'OpenInteract::SPOPS::DBI' instead of

 * conf/

   - updated sample handler with slightly modified comments; modified
   how the template is called


   - Added self-promoting 'X-Powered-By' header. Set 'no_promotion' in
   server configuration file to true value to override.

   - Changed content handler to an object handler (with '($$)'
   declaration), changed all methods to class methods (with
   non-private names) and added documentation about the method names
   used in case anyone wants to subclass the handler with their own

 * OpenInteract/

    - Jochen Lillich <> noticed that we weren't
    making the first connection (in ApacheStartup) properly; it didn't
    really hurt anything, but it left a nasty warning message. Fixed.

    - Cleanup the Template Toolkit compile directory on server restart
    if new configration key 'template_info'->'compile_cleanup' is true

 * OpenInteract/

    - Fixed subtle bug when using CGI::Cookie -- setting a cookie
    expiration to the empty string ('') results in CGI::Cookie issuing
    an expired cookie; setting it to undef results in a transient
    (browser-session-based) cookie.

    - Added a 'not-logged-in' user -- it's created automatically when
    there's no user saved via the session and no login information
    found. It's a transient rather than saved user and has no access

    - Custom login handler can now have a custom method, so you don't
    have to use 'handler' (see config addition for this as well).

 * OpenInteract/

   - Created base handler for most tasks (search form, search,
   display, edit, remove) so that many actual handlers will just need
   to specify configuration options. This is extremely cool -- see
   docs for implementation.

 * OpenInteract/

   - Option 'trace_level' now avaialble to initialize the database
    handle using the 'trace()' method.

    - Updated docs to include all options that are processed.

 * OpenInteract/

   - You can now specify 'template_plugin', 'module' and (to be used
   soon) 'filter' in the package.conf file; 'module' will be checked
   when the package is installed to the base installation directory --
   if you do not have a module the package won't get installed;
   'template_plugin' and 'filter' are (or will be) used later in OI
   process (see OI/Template/

   - In 'check()', TT complains (rightly) if we do a syntax check and
   a particular plugin isn't loaded; capture these errors and don't
   complain if they pop up.

   - In 'check()', TT complains (rightly) if we do a syntax check and
   a particular file isn't accessible when you have an INCLUDE or
   PROCESS; since these are frequently used with the new widgets,
   capture these errors and don't complain if they pop up.

   - In 'check()', perform syntax check on all files in 'widget/'

   - When creating an archive with 'export()', die if the archive
   already exists.

   - In 'install_to_website()', install all the 'widget/*' files to
   the $WEBSITE_DIR/template directory

   - In '_copy_spops_config_file()' (called when you apply or upgrade a
   package), check the website configuration when copying over the
   'creation_security' hashref for each SPOPS object so we can modify
   the public and site admin group IDs used. (Thanks to Andreas Nolte
   <> for pointing this out and putting it
   higher on the TODO list...)

   - Files copied during package-to-website should not be read-only

 * OpenInteract/

   - Added new transformation activated by 'transform_to_now' in your
   data file. (Thanks to Jochen Lillich <> for

 * OpenInteract/

   - Create $R during main_initialize() and put the stash class in
   there so we have normal access to the datasource during SPOPS
   configuration, which is needed if you're using the 'DiscoverField'
   behavior. (Hopefully it won't screw anything up with parent/child
   sharing issues, particular wrt DBI handles.)

   - Modify create_config() and read_base_config() so that we can just
   pass in a website_dir and get back a configuration.

 * OpenInteract/Template/

   - Added strftime reference for date_format() template behavior

   - Added 'use_main_template()' so that templates can modify the main
   template used

 * OpenInteract/Template/

   - initialize() (called from OpenInteract::Request on the first
   request for the template object) now asks each package in the
   website if it has any template plugins (specified in
   'template_plugin' of each 'package.conf' file) and installs them.

   - initialize() also asks each package if it has any BLOCKs to be
   defined (specified in 'template_block' of each 'package.conf' file)
   and installs them.

   - You can define a handler in your server configuration which sets
   options passed to 'Template->new()'. This allows you to define a
   global set of BLOCKs and have them always be available.

   - In addition you can define custom behavior that can be called
   just before a template is processed. This includes adding
   behaviors, plugins, or whatnot to the variables available to a

   - Fixed OpenInteract::Template::Provider initialization so it's
   actually getting the right values. (Duh!) This means caching
   works now.

   - Use $CONFIG->get_dir( 'cache_tt' ) for the default Template
   Toolkit compiling directory.

 * OpenInteract/Template/

   - Process file globs properly; clean up the code a bit to make more

   - Clean up the compiled filename a little to not have odd ('::')

 * OpenInteract/

   - Enable 'send_mail()' to take and process attachments that are
   located underneath the website directory; add documentation for
   this option as well as more examples of usage.

 * script/oi_manage:

  - Add 'template', 'mail' and 'uploads' to list of directories
  created when you run 'create_website'; removed 'email'

  - Add 'cache' and 'cache/tt' to list of directories created when
  you run 'create_website'

  - Modify how/when install_sql creates database handles. (This still
  needs some work, but it should be ok for now.)

  - Create a $CONFIG object when doing apply_package or
  upgrade_package and pass it to the install_to_website() method of

Packages changed:

   OpenInteract    1.21 -> 1.30
   base:           1.60 -> 1.62
   base_box:       0.30 -> 0.33
   base_component: 1.25 -> 1.30
   base_error:     1.30 -> 1.32
   base_group:     1.25 -> 1.26
   base_security:  1.46 -> 1.51
   base_template:  1.27 -> 1.27
   base_theme:     1.26 -> 1.27
   base_user:      1.34 -> 1.37
   lookup:          n/a -> 0.15
   results_manage: 0.02 -> 0.05
   static_page:    1.49 -> 1.51
   system_doc:     1.24 -> 1.25
   classified:     1.28 -> 1.28
   full_text:      1.26 -> 1.27
   news:           1.33 -> 1.33

1.21  Wed Aug 29 15:10:27 EDT 2001


Quick bugfix release: browser-based security editing doesn't work with
the package base_security-1.45, which was shipped with OI 1.2. Bug
fixed and this version ships with base_security-1.46.


 * conf/sample-server.perl:

   - Added {login}->{custom_login_handler} key

 * OpenInteract/

   - Added ability to define custom login behavior by specifying a
   custom login handler in the configuration. Thanks to Stefano
   <> for the idea.

Packages changed:

   OpenInteract    1.2  -> 1.21
   base_security:  1.45 -> 1.46

1.2  Tue Aug 28 17:20:44 EDT 2001


This release has a number of substantial changes. If you're upgrading,
please read 'UPGRADE' in the distribution directory.

 * Multiple datastore handles:

   - You can now setup and use multiple datastore (including DBI)
   handles for objects, so your data can be in as many databases as
   you require. This entails changes to your server configuration file
   even if you're not using this feature, please see the entry for
   'conf/sample-server.perl' below.

 * Tighter Template Toolkit support:

   - OpenInteract now includes a Template Toolkit provider to deliver
   templates from the filesystem or database, as well as a TT Plugin
   to provide more consistent (and extensible) template behavior
   functions. If you're upgrading you need to run a script to
   translate old templates to new.

 * LDAP support:

   - LDAP can now be used as a datastore. Thanks to MSN Marketing
   Service Nordwest GmbH for funding development! See doc/LDAP.html
   for more information about setting up and using LDAP.

 * DBI session support consolidated:

   - All DBI session management uses one class now; if you're
   upgrading, see the entry for 'conf/sample-server.perl' below for a
   configuration modification


 * conf/sample-httpd_static.conf:

   - Allow the front-end proxy server to deal with '/robots.txt'
   requests. (Also with '/default.ida' Code Red requests...)

 * conf/sample-httpd_modperl.conf:

   - Add pointer to the standalone mod_perl configuration file

 * conf/sample-httpd_modperl_solo.conf:

   - Create new configuration file for running OpenInteract in a
   standalone mod_perl environment (no proxy frontend). Thanks to
   Stephen Adkins <> for pointing out
   the usefulness of this.

 * conf/sample-server.perl:

   - Overall: Lots of changes were made to the sample
   configuration. If you're upgrading it might be a good idea to open
   the sample configuration and your existing configuration
   side-by-side, copying values from your existing configuration to
   the sample as appropriate.

   - See UPGRADE for specific changes.

 * eg/

   - Added standalone script to translate old templates to new
   templates. This only works on files in the filesystem, and you
   shouldn't need to run it for system packages.


   - allow users to put OI under different location root -- note that
   we DO NOT rewrite outbound URLs yet; this just ensures that if OI
   is under <Location /oi> that a request for '/oi/User/' gets mapped
   to the '/User/' action

   - paranoid inclusion of stash/other module 'require' calls

   - removed method _connect_to_database(). Datastore (DBI and LDAP)
   connections are now made on demand (in OpenInteract::Request)
   rather than all at the beginning of a request. The first time a
   handle is needed the connection is made, thereafter it's kept in
   the stash class.

   - removed method _setup_context() since it was a relic of a
   group_context scheme attempted a while ago. We might bring it back
   but there's no reason to have it around now.

 * OpenInteract/

   - Set the result of $user->id rather than $user->{user_id} into the
   session after a successful login. (Thanks to Andreas Nolte <>)

 * OpenInteract/Error/

   - Put 'package' with all templates being called.

 * OpenInteract/

   - Created central class to connect/bind to LDAP directories

 * OpenInteract/

   - Updated 'check()' -- called from 'oi_manage check_package' -- to
   determine if data import files are valid Perl data structures (also
   added 'read_data_file()' for this purpose)

   - Modified 'check()' to pass the right directory to read the
   package configuration

   - Updated 'check()' -- called from 'oi_manage check_package' -- to
   determine if the templates in a package are syntactically
   valid. This doesn't mean they'll do what you want, only that
   they'll parse.

 * OpenInteract/

   - Updated to enable both DBI and LDAP handles to be requested (and
   stored in the stash) by a connection key.

   - Moved connection logic from to here so we can
   return DBI and LDAP connections on demand rather than creating them
   all at once.

 * OpenInteract/Session/

   - Added functionality to detect when we're using MySQL as a session
   store and put the extra parameter ('LockHandle') in.

 * OpenInteract/Session/

   - Removed. Use 'OpenInteract::Session::DBI' for all DBI session
   management now.

 * OpenInteract/

   - Removed 'global_db_handle()' and moved to OI/SPOPS/ Note
   that ALL objects previously using 'OpenInteract::SPOPS' should now
   use 'OpenInteract::SPOPS::DBI'.

 * OpenInteract/SPOPS/

   - Created subclass of OI::SPOPS specifically for objects using

 * OpenInteract/SPOPS/

   - Created subclass of OI::SPOPS specifically for objects using

 * OpenInteract/

   - Created new data transformation 'transform_default_to_id' that
   allows you to tag fields in your data import and specify values for
   these fields that are keys in the 'default_objects' hash in your
   server configuration. See
   pkg/base_group-x.xx/data/install_security.dat for an example.

 * OpenInteract/

   - Added deprecation warnings (will remove the class soon).

 * OpenInteract/Template/

   - Added deprecation warnings (will remove the class soon).

 * OpenInteract/Template/

   - Added new class: Added custom context so we can avoid the TT
   template naming syntax of 'prefix::thingy'

 * OpenInteract/Template/

   - Added new class: Take all the behaviors out of OI::T::Toolkit,
   add some new ones, revisit the old ones, add lots of documentation.

 * OpenInteract/Template/

   - Added new class: Port the 'handler()' and 'initialize()' methods
   from OI::T::Toolkit

 * OpenInteract/Template/

   - Added new class: Move all the file-or-object finding stuff from
   OI::Template here, plus take advantage of TT caching, compiling,

 * OpenInteract/UI/

   - Updated to use base template name in 'package::name' format. This
   way your base template doesn't need to be in the 'base_theme'

 * script/oi_manage

   - Added (and documented!) new action 'update_object', which simply
   fetches all instances of a particular object class and saves
   them. This is useful if you've implemented a schema change that
   needs a 'save()' to activate a trigger which fills data. For
   instance, a 'last_update' field gets triggered by a save -- by
   running this action you automatically set all objects to a known
   value. Another example would be if your objects use the indexing
   feature of the full_text package -- just run this action and the
   index will be automatically updated.

   - Modified 'test_db' action to check multiple datasources

   - Added (and documented!) new action 'test_ldap' which tests all
   LDAP connections configured for a particular website.

   - Ensure that 'check_package' can check multiple packages at once
   (using the '--package_dir' parameter to specify the root of a
   series of packages)

   - You can now run separate actions with 'install_sql' using the new
   '--sql_action' parameter. This allows people who need to do so to
   run the 'structure', 'data' and 'security' steps
   individually. (Docs added for this too!)

   - Added (and documented!) new action 'list_objects' which lists all
   the objects that can be created in a website.

 * script/

   - Created script to translate old templates (using
   OpenInteract::Template and OpenInteract::Template::Toolkit) to new
   templates (OpenInteract::Template::Plugin). You must run this to
   make your templates work properly.

   Many packages have changed between versions 1.1 and 1.2. Please see
   the 'Changes' file in each to find out what was modified.

   OpenInteract    1.1  -> 1.2
   base:           1.52 -> 1.60
   base_box:       0.23 -> 0.30
   base_component: 1.23 -> 1.25
   base_error:     1.22 -> 1.30
   base_group:     1.16 -> 1.25
   base_security:  1.33 -> 1.45
   base_template:  1.18 -> 1.27
   base_theme:     1.18 -> 1.26
   base_user:      1.23 -> 1.34
   results_manage: 0.02 -> 0.02
   static_page:    1.40 -> 1.49
   system_doc:     1.19 -> 1.24
   classified:     1.19 -> 1.28
   full_text:      1.25 -> 1.26
   news:           1.27 -> 1.33

1.1  Fri Jul 20 07:00:48 EDT 2001

 * Shuffled lots of modules out of the 'base' package and into the
   core distribution:


   As a result, also moved OpenInteract.pod to OpenInteract/Intro.pod
   since 'perldoc OpenInteract' will bring up the Apache content
   handler class now.

 * New package: 'results_manage'

   - A new package 'results_manage' has been added to the
   distribution. This package makes it simple to persist different
   types of search results from request to request to produce paged
   output, exportable output, etc. The package is still quite young,
   so if you have feedback please email

 * doc/*:

   - Updated all docs -- mostly small changes, but added patch from
   Christian Lemburg ( to doc/developer.html
   specifying the recommended method of package development.

 * OpenInteract/

  - Added a debugging line so we can know when a PerlChildInitHandler
  is getting run (and for what child).

 * OpenInteract/

   - Thanks to a spot by Reinier Post <>, you can now
   have multilevel handlers (e.g.,
   'OpenInteract::Handler::Entity1::Handler1') in a package --
   modified the _copy_handler_files() subroutine to use the new
   _create_full_path() subroutine.

   - Create a _clean_package_name() subroutine that ensures a package
   name can be used as a Perl namespace.

 * OpenInteract/

   - Added two methods and ruleset to accommodate new way of referring
   to objects. The new method uses a table 'object_keys' (found in the
   'base' package) and associates a 32-character key with an object
   and class.

   Currently this is only used in the modified 'full_text' package,
   but we expect to change other modules that use a class and object
   ID (object tracking, object security, etc.) to use this scheme
   simply because it saves space and should speed up searches.

 * OpenInteract/

   - die in setup_static_environment() if we cannot read the base
   configuration information properly. (Generally indicates that the
   directory given wasn't a valid website directory.)

   - add functionality to setup_static_environment() to create the
   superuser if given the password to check against.

   - add method 'setup_static_environment_options()' to check for log
   option '--website_dir' and environment variable OIWEBSITE to pass
   to 'setup_static_environment()', thus saving lots of copy-n-paste
   operations around the globe.

 * OpenInteract/

   - Fixed Sourceforge bug 406291, enabling templates to be read from
   the filesystem. (Paper bag fix -- just made the wrong call to fetch
   the package information from the repository, and it was never
   tested. Doh!)

 * script/oi_manage:

   - Check the return value from $PACKAGE->create_skeleton() to see
   whether the name of the package created differs from the name we
   wanted to create, and let the user know if they're different.

   - Add the directory 'overflow' to that created by the
   'create_website' process.

   - Add the package 'results_manage' to the list of core packages

 * Packages

   Many packages have changed. One of the common additions has been
   the use of the SPOPS::Iterator (or subclass) object to display
   results, as opposed to retrieving a (potentially long) list of
   objects to pass to the template. See the 'Changes' file of each
   package for change details.

   Here are the different versions:

   OpenInteract    1.07 -> 1.1
   base:           1.42 -> 1.52
   base_box:       0.20 -> 0.23
   base_component: 1.18 -> 1.23
   base_error:     1.21 -> 1.22
   base_group:     1.16 -> 1.16
   base_security:  1.30 -> 1.33
   base_template:  1.17 -> 1.18
   base_theme:     1.17 -> 1.18
   base_user:      1.21 -> 1.23
   results_manage:  n/a -> 0.02
   static_page:    1.36 -> 1.40
   system_doc:     1.19 -> 1.19
   classified:     1.18 -> 1.19
   full_text:      1.16 -> 1.25
   news:           1.26 -> 1.27

1.07  Sun Jun 10 14:31:36 EDT 2001

 * Overall

   - This version runs on mod_perl/Win32 with a supported database.

   - This version now runs on PostgreSQL (version dependencies
   unknown) along with Sybase ASE, Sybase ASA, and MS SQL
   Server. (This is in addition to MySQL from previously.)

   - This version requires SPOPS 0.40, since it's the first version
   which supports PostgreSQL, along with a few other items.

   - Hopefully debugging is more efficient -- at least when you want
   to turn debugging off. All files have been changed to use the
   following construction:

     $R->DEBUG && $R->scrib( 1, "..." );

   so that (the relatively expensive) scrib() method doesn't even get
   called if debugging isn't turned on for your app.

 * script/oi_manage:

   - fixed typo in method call in remove_template() (thanks to Olaf
   Stauffer <> for spotting)

   - tiny change so that you can call use the action name
   'install-template' and 'install_template' synonymously (anyplace
   you see a '_' you can also use a '-'. Note that this ONLY APPLIES
   TO COMMANDS, not to parameters.

   - added the command 'change_spops_driver' so you can modify the
   drivers (e.g., 'SPOPS::DBI::MySQL' -> 'SPOPS::DBI::Sybase') for
   many objects at once.

   - when you run the 'upgrade_package' command, a file named
   'UPGRADE' will be displayed in the status. You should put any
   package-specific upgrading notes here.

   - ensure that the 'website_name' parameter fits our naming
   conventions (thanks to Nimrod Levy <> for the catch)

   - the 'test_db' command now tries to create a table, which tests
   whether the given user has such permissions.

   - ensure the user running 'install_package' has permission to write
   to the base installation directory and to the base package

 * conf/sample-package.pod:

   - Added more headers to the skeleton documentation generated for a

 * conf/sample-server.perl: 

   - Changed the default cookie processing class to
   (change from {system_alias}->{'OpenInteract::Cookies'} to
   {system_alias}->{'OpenInteract::Cookies::Apache'}), since right now
   everyone is required to have Apache::Request for parameters
   anyway. Unless you're running Win32, then use
   {system_alias}->{'OpenInteract::Cookies::CGI'} since
   Apache::Request had a few hiccups running there.

   - Added 'long_read_len' and 'long_trunc_ok' in the db_info key.

   - Added 'remember_field' to the 'login' key

 * OpenInteract/

   - Added {LongReadLen} and {LongTruncOk} as database handle
   properties. **NOTE** If you're upgrading, please add something like
   the following to your conf/server.perl file:

     db_info => {
      long_read_len => 65536,
      long_trunc_ok => 0,

   There are defaults defined for these but it's better to make them
   explicit in your configuration. 

 * OpenInteract/ 

   - Make various modifications to work under Win32. Primarily to
   check directory specifications and to accommodate the version of
   Archive::Tar that is distributed with ActivePerl.

   - Fix _copy_handler_files() to not replace ALL 'OpenInteract'
   instances in the file/path, just the relevant one (thanks to Olaf
   Stauffer <> for the spot)

   - Small fixes to error reporting (primarily in

   - Small fix so we don't copy over coderefs from the
   conf/action.perl and conf/spops.perl files when installing a
   package from the base installation to a website

 * OpenInteract/

   - Fixed docs for the 'find_file' method to match the

   - Pass the package name from 'find_file' to 'fetch_package_by_name'
   in a hashref rather than by itself (duh)

 * OpenInteract/ added 'DEBUG()' method to get (if
   available) application-level debugging and if not, to use the class
   variable 'DEBUG'. This allows '$R->DEBUG && $R->scrib( ... )' so
   that scrib() won't get called if you're not using debugging in your
   app. Cool.

 * OpenInteract/ Updated the object tracking save/retrieval
   so that it's not using the 'oid' field any longer.

 * OpenInteract/

   - Fixed Sybase IDENTITY specification (thanks to Harry Danilevsky
   <> for pointing it out)

   - Allow user to specify a different database type than the driver
   name (useful if you're using DBD::ODBC with MS SQL Server, which
   uses the SPOPS driver 'Sybase' and the DBD driver 'ODBC')

   - Document the 'field_type' parameter when you're specifying SQL
   statements (rather than SPOPS objects) to be built with the data
   files (thanks to Harry Danilevsky
   <> for pointing it out)

   - New key in struct files: %%INCREMENT_TYPE%%. This allows you to
   specify linking fields to be the same type -- for instance, an
   IDENTITY field in T-SQL is NUMERIC( x, y ) while an AUTO_INCREMENT
   field in MySQL is an INTEGER, as is a SERIAL (sequence) field in
   PostgreSQL. (Example: 'pkg/base_group/struct/group_table.sql' and
   'pkg/base_user/struct/user.sql' for the increment, then
   'pkg/base_group/struct/link_table.sql' for the increment type.)

 * OpenInteract/ require_module() can now take either an
   arrayref of classes to include or a single class to
   include. (Previously only an arrayref.)

 * doc/database.html: Added some preliminary instructions for creating
   a new database and user to work with OpenInteract -- currently only
   with MySQL and PostgreSQL.

 * Packages

   Many packages have changed. One of the larger-scale changes
   resulted from renaming the 'level' field in the security object to
   'security_level'. See the each individual package's 'Changes' file
   for more details.

   Here are the different versions:

   OpenInteract    1.06 -> 1.07
   base:           1.30 -> 1.42
   base_box:       0.14 -> 0.20
   base_component: 1.14 -> 1.18
   base_error:     1.14 -> 1.21
   base_group:     1.11 -> 1.16
   base_security:  1.20 -> 1.30
   base_template:  1.11 -> 1.17
   base_theme:     1.11 -> 1.17
   base_user:      1.15 -> 1.21
   static_page:    1.24 -> 1.36
   system_doc:     1.15 -> 1.19
   classified:     1.12 -> 1.18
   full_text:      1.11 -> 1.16
   news:           1.15 -> 1.26

1.06  Sun Feb 25 15:16:43 EST 2001

 * OpenInteract/Package*: Split out previous OpenInteract/
   into OpenInteract/ (SPOPS::HashFile object
   representing a package respository) and OpenInteract/
   (class methods operating on simple hashrefs representing individual
   packages). In certain ways both are simpler and easier to
   understand, and this allows you to think of and work with a package
   repository as a single item rather than solely on individual packages.

   This has a couple of effects:

     1) GDBM is no longer used by OpenInteract. This was the primary
     motivator behind the change.

     2) You MUST modify all repositories from the old GDBM format to
     the new format. If you run the new 'upgrade' command from
     oi_manage when you download and install this distribution the base
     installation repository will be translated for you. Here's a
     list of commands for a manual upgrade:

       > tar -zxvf OpenInteract-1.06.tar.gz
       > cd OpenInteract-1.06
       > perl Makefile.PL
       > make
       > make test
       > make install
       > oi_manage upgrade --base_dir=/opt/OpenInteract 

     And if you're using CPAN:

       > perl -MCPAN -e shell
       cpan> install OpenInteract::Package
       cpan> exit
       > cd ~/.cpan/build/OpenInteract-1.06
       > oi_manage upgrade --base_dir=/opt/OpenInteract 

     However, after you do this you also need to translate the website
     repositories like this:

       oi_manage upgrade_repository --website_dir=<website-directory>

     If you want to do things the hard way, there's also a script in
     the 'eg/' directory called '' which will
     translate a package repository from GDBM to the new format.

     3) Any code you've written that operates on packages must be
     redone. Sorry about this, but hopefully not too many people have
     gone scouting around the package repositories in the first place,
     and the benefits outweigh the costs at this relatively early
     stage of OI development.

     Here's a simple example:

        my $pkg = OpenInteract::Package->fetch_by_name( 
                                          { name => 'blah',
                                            directory => '/blah/blah' });

        my $repository = OpenInteract::PackageRepository->fetch( 
                                          undef, { directory => '/blah/blah });
        my $info = $repository->fetch_package_by_name({ name => 'blah' });

     If you've actually done work with packages and need some help,
     email Chris <> for more detailed guidelines.
 * script/oi_manage, OpenInteract/,
   OpenInteract/, OpenInteract/ Modified
   all functions dealing with packages to work with new system.
 * OpenInteract/ 

   -- Fixed file handling bug in revised module method
   install_distribution() which checked $_ (empty) rather than
   $p->{package_file}. Thanks to Takanori Ugai <>
   for the catch and patch.

   -- Fixed new behavior of remove() which removed the directory in
   addition to the entry from the repository. You can pass in 'remove'
   as the third argument to have it remove the directory, otherwise
   the directory is kept, which was the default behavior before the
   new stuff was written.

   -- Added 'script/' as set of files to be copied over when applying
   a package from the base installation to a website.

 * conf/sample-server.perl: new keys: 

     {session_info}->{expiration} = '+3M',

     (allows you to set a default expiration time for the session

     {system_alias}->{'OpenInteract::PackageRepository'} = 'repository',

     (alias used to reference the repository class)

     {box}->{custom_box_handler} = '',

     (allows you to define a handler to be called on every request to
     create/inspect/modify boxes)

   You'll probably want to copy the items over into your server
   configuration, although this brings up the interesting point as to
   how to insert new configuration options into existing
   websites. Perhaps we need a utility like that used in Win32
   environments with the registry -- you can distribute a simple file
   which is used by oi_manage to insert new keys into a website's
   server.perl file.

 * script/oi_manage:

   -- Modified format to be more readable; added more documentation.

   -- Mdified all calls to 'open_base_config()' to call the routine in

   -- Added checks for 'website_name' in the 'create_website' command,
   since the parameter must refer to a valid Perl package identifier.

   -- Added new action 'upgrade' (just like 'install' but we don't
   create a new directory)

   -- Added new action 'refresh_doc' (allow a website to get the
   latest version of the documentation in the base installation

 * OpenInteract/ Modified name of parameter passed into
   'read_base_config()' (shouldn't affect anyone); added
   'create_base_config_filename()' so we have one place to generate

 * OpenInteract/ added the URL to view the object to the
   email sent by notify()

 * doc/admin.html: Cleaned up and added some more information

 * Several packages were also modified, but each of these has its own
   changelog for the specific changes. Many of the changes were quite
   small, including conf/spops.perl modifications to accommodate
   changes in SPOPS key generation (add an 'increment_field => 1' for
   those classes using a MySQL AUTO_INCREMENT field).

   base:           1.20 -> 1.30
   base_box:       0.13 -> 0.14
   base_component: 1.11 -> 1.14
   base_error:     1.13 -> 1.14
   base_group:     1.10 -> 1.11
   base_security:  1.18 -> 1.20
   base_template:  1.09 -> 1.11
   base_theme:     1.09 -> 1.11
   base_user:      1.14 -> 1.15
   static_page:    1.21 -> 1.24
   classified:     1.07 -> 1.12
   full_text:      1.09 -> 1.11
   news:           1.13 -> 1.15

1.05  Thu Feb  1 00:26:14 EST 2001

  Added 'setup_static_environment' to OpenInteract/ -- this
  makes it *incredibly* easy to setup an OI environment outside of
  Apache/CGI/Web-whatever, allowing you to do data reporting, import,
  export, etc. 

  Refactored (not 100%, but still pretty well) OpenInteract/
  to be easier to understand, including breaking up longer 'meaty'
  subroutines into easier-to-digest versions. Added lots of POD
  documentation as well.

  Added website installation message to 'oi_manage' and modified it to
  display an 'INSTALL' file whenever the package is installed to a
  website (either via 'upgrade' or 'apply'). This means that package
  authors can alert users to potential schema change or other API
  modifications and be sure that users will see this when the package
  is applied/upgraded -- minimize potential user excuses :-)

  The basic OpenInteract documentation (included with the Perl
  distributed in 'doc/') is now copied over to the OpenInteract base
  installation directory (when you do 'oi_manage install') and is
  copied from there to a website's HTML directory when you create a
  new one. This means that the HTML OI documentation is available when
  you first fire up your browser to see your website.

  Lots of modifications to many packages, including the addition of a
  new package to the core OpenInteract family: base_box. Let's give
  him a big hand!

1.04  Thu Dec 21 01:01:14 EST 2000

  Modified OpenInteract/ to accommodate earlier versions of
  Archive::Tar, which had very different interfaces. Added some more
  items to the PREREQ piece of Makefile.PL and scrapped the
  'INSTALLSCRIPT' option to let MakeMaker put the bin files in the
  "right" place. 

  **NOTE -- this means you should remove all older versions of
  'oi_manage' that might be someplace like '/usr/local/bin'**

  We now require version 2.00 of the Template Toolkit. Version 1.06+
  might still work, but it's no longer actively supported.

  Modified scripts/oi_manage to implement a 'list_actions' command,
  which reads in all your website action.perl files and then tells you
  all the actions programmed in the system and which package the
  action comes from.

  Many changes to various packages -- see the changelogs for
  'base', 'base_security', 'base_theme', 'static_page' and several

1.03  Nov 30 2000

  Added some modifications to when you install OpenInteract and when
  you create a new package (OpenInteract/;
  script/oi_manage). Modified documentation in the Developer and Admin
  guides as well as the two INSTALL documents; got that bulky .GIF out
  of the distribution, replacing it with a slightly lame Visio
  drawing (to PNG).

  Relatively minor fixes to the packages news, base_error, base and
  system_doc. See their 'Changes' files for more info.

  Modified scripts/oi_manage to have the same semantics for
  'check_package' as for 'export_package' -- that is, you can chdir to
  the working directory for a package and run the command without any
  parameters and have a check properly performed.

  (minor) Superficial change in just about every file to modify email
  '' to ''. Also changed all RCS
  '$Header' tags to '$Id'.

1.02  Nov 10 2000

  Package management and oi_manage routines are pretty much rock-solid
  as done from informal testing. We've made new installs and websites
  by the handful and everything has gone well. Added lots of overall
  documentation (in the 'doc/' directory) including targeted guides
  for managers, administrators and developers, plus a glossary, all in
  HTML format. Eliminated a pretty evil bug in the
  'OpenInteract/' file of the 'base' package which only
  manifested itself when running more than one website. SQL
  installation has also been smoothed out and tested in numerous
  ways. Lots of other little changes (structure, format, etc.).

  Also made some changes to terminology and enforced it throughout. A
  'base installation' is where you first install OpenInteract (using
  'oi_manage') and a 'server' is the Apache/mod_perl process. A
  'website' is a particular instantiation of OpenInteract with its own
  packages, namespace, etc. The definition for 'package' hasn't really
  changed, but we've made a package kindasorta synonymous with 'tool',
  even though a package can contain more than one tool. 

1.01  Nov 3 2000

  Lots of new things -- massively overhauled package management
  (oi_manage and OpenInteract::Package) including scads of
  documentation and the functions for package removal and upgrade
  capabilities, you can check a package, get a listing of packages
  installed to an application or to the base installation, and can now
  create a 'skeleton' package, which should help out a little bit with
  development; more documentation in the packages distributed with the
  system. You can also add or dump a package's templates, test a
  database connection given the configuration parameters for an
  application, and (more below) install the SQL structures and data
  for a package.

  Added the class 'OpenInteract::DBI' which gives us a central
  location for connecting to a database. Also modified how the
  configuration file is setup wrt database info.

  All 'module.perl' files will hereafter be known as 'action.perl' --
  this is so we can better communicate the concept of the 'Action
  Table' and what it means when you're developing packages and

  Added lots of configuration documentation -- see all the files in
  'conf/'. The 'spops.perl' and 'action.perl' files are now
  well-documented and OpenInteract::Package was modified to copy these
  sample files into a new package when a skeleton is created.

  Also modified the 'full_text' scripts for doing certain actions from
  the command-line -- these are good scripts to review if you want to
  create an OpenInteract 'environment' (all the classes created and
  linked, database handle and config object created, etc.) from a
  script rather than from mod_perl.

  Added 'OpenInteract::SQLInstall' and modified all of the packages to
  use its methods as well as translated their incoming structures and
  data to its format. (This was much more work than it sounds like :)

  Numerous other small-to-medium fixes here and there.

1.00  Sep 28 2000

  First public version. Everything is new!