Code

instance_config -> config, and other related cleanups
authorrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Mon, 9 Sep 2002 23:55:29 +0000 (23:55 +0000)
committerrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Mon, 9 Sep 2002 23:55:29 +0000 (23:55 +0000)
git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@1104 57a73879-2fb5-44c3-a270-3262357dd7e2

roundup/admin.py
roundup/cgi/client.py
roundup/hyperdb.py
roundup/init.py
roundup/mailgw.py
roundup/templates/classic/__init__.py
roundup/templates/classic/dbinit.py
roundup/templates/classic/interfaces.py
test/test_mailgw.py

index 08fc092ddeed0f8877979e22234db22fefc2478b..440b0971f6f4e9fae84cb987d8f04bf22dd0473d 100644 (file)
@@ -16,7 +16,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: admin.py,v 1.23 2002-08-19 02:53:27 richard Exp $
+# $Id: admin.py,v 1.24 2002-09-09 23:55:18 richard Exp $
 
 import sys, os, getpass, getopt, re, UserDict, shlex, shutil
 try:
@@ -301,7 +301,7 @@ Command help:
 
         print _('''
  You should now edit the instance configuration file:
-   %(instance_config_file)s
+   %(config_file)s
  ... at a minimum, you must set MAILHOST, MAIL_DOMAIN and ADMIN_EMAIL.
 
  If you wish to modify the default schema, you should also edit the database
@@ -309,7 +309,7 @@ Command help:
    %(database_config_file)s
  ... see the documentation on customizing for more information.
 ''')%{
-    'instance_config_file': os.path.join(instance_home, 'instance_config.py'),
+    'config_file': os.path.join(instance_home, 'config.py'),
     'database_config_file': os.path.join(instance_home, 'dbinit.py')
 }
         return 0
@@ -1146,6 +1146,9 @@ if __name__ == '__main__':
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.23  2002/08/19 02:53:27  richard
+# full database export and import is done
+#
 # Revision 1.22  2002/08/16 04:26:42  richard
 # moving towards full database export
 #
index f4485b1cbf299e2463f5f7e0e3f6d8fabe7c47a4..264814442e6a51e150a21c929dd5eea6815d35c8 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: client.py,v 1.24 2002-09-09 23:38:41 richard Exp $
+# $Id: client.py,v 1.25 2002-09-09 23:55:19 richard Exp $
 
 __doc__ = """
 WWW request handler (also used in the stand-alone server).
@@ -310,12 +310,13 @@ class Client:
         # we just want to serve up the file named
         mt = mimetypes.guess_type(str(file))[0]
         self.header({'Content-Type': mt})
-        self.write(open(os.path.join(self.instance.TEMPLATES, file)).read())
+        self.write(open(os.path.join(self.instance.config.TEMPLATES,
+            file)).read())
 
     def renderTemplate(self, name, extension, **kwargs):
         ''' Return a PageTemplate for the named page
         '''
-        pt = getTemplate(self.instance.TEMPLATES, name, extension)
+        pt = getTemplate(self.instance.config.TEMPLATES, name, extension)
         # XXX handle PT rendering errors here more nicely
         try:
             # let the template render figure stuff out
@@ -563,7 +564,7 @@ class Client:
         cl = self.db.user
         try:
             props = parsePropsFromForm(self.db, cl, self.form)
-            props['roles'] = self.instance.NEW_WEB_USER_ROLES
+            props['roles'] = self.instance.config.NEW_WEB_USER_ROLES
             self.userid = cl.create(**props)
             self.db.commit()
         except ValueError, message:
@@ -1010,7 +1011,7 @@ class Client:
         # handle the messageid
         # TODO: handle inreplyto
         messageid = "<%s.%s.%s@%s>"%(time.time(), random.random(),
-            self.classname, self.instance.MAIL_DOMAIN)
+            self.classname, self.instance.config.MAIL_DOMAIN)
 
         # now create the message, attaching the files
         content = '\n'.join(m)
index a301d7cd3fa04ac7bdc0fae34681d709171e47b2..65d07e9170c74153ab84809f6574bec920c5d604 100644 (file)
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: hyperdb.py,v 1.81 2002-08-30 08:37:16 richard Exp $
+# $Id: hyperdb.py,v 1.82 2002-09-09 23:55:19 richard Exp $
 
 __doc__ = """
 Hyperdatabase implementation, especially field types.
@@ -607,399 +607,4 @@ def Choice(name, db, *options):
         cl.create(name=options[i], order=i)
     return hyperdb.Link(name)
 
-#
-# $Log: not supported by cvs2svn $
-# Revision 1.80  2002/08/16 04:28:13  richard
-# added is_retired query to Class
-#
-# Revision 1.79  2002/07/29 23:30:14  richard
-# documentation reorg post-new-security
-#
-# Revision 1.78  2002/07/21 03:26:37  richard
-# Gordon, does this help?
-#
-# Revision 1.77  2002/07/18 11:27:47  richard
-# ws
-#
-# Revision 1.76  2002/07/18 11:17:30  gmcm
-# Add Number and Boolean types to hyperdb.
-# Add conversion cases to web, mail & admin interfaces.
-# Add storage/serialization cases to back_anydbm & back_metakit.
-#
-# Revision 1.75  2002/07/14 02:05:53  richard
-# . all storage-specific code (ie. backend) is now implemented by the backends
-#
-# Revision 1.74  2002/07/10 00:24:10  richard
-# braino
-#
-# Revision 1.73  2002/07/10 00:19:48  richard
-# Added explicit closing of backend database handles.
-#
-# Revision 1.72  2002/07/09 21:53:38  gmcm
-# Optimize Class.find so that the propspec can contain a set of ids to match.
-# This is used by indexer.search so it can do just one find for all the index matches.
-# This was already confusing code, but for common terms (lots of index matches),
-# it is enormously faster.
-#
-# Revision 1.71  2002/07/09 03:02:52  richard
-# More indexer work:
-# - all String properties may now be indexed too. Currently there's a bit of
-#   "issue" specific code in the actual searching which needs to be
-#   addressed. In a nutshell:
-#   + pass 'indexme="yes"' as a String() property initialisation arg, eg:
-#         file = FileClass(db, "file", name=String(), type=String(),
-#             comment=String(indexme="yes"))
-#   + the comment will then be indexed and be searchable, with the results
-#     related back to the issue that the file is linked to
-# - as a result of this work, the FileClass has a default MIME type that may
-#   be overridden in a subclass, or by the use of a "type" property as is
-#   done in the default templates.
-# - the regeneration of the indexes (if necessary) is done once the schema is
-#   set up in the dbinit.
-#
-# Revision 1.70  2002/06/27 12:06:20  gmcm
-# Improve an error message.
-#
-# Revision 1.69  2002/06/17 23:15:29  richard
-# Can debug to stdout now
-#
-# Revision 1.68  2002/06/11 06:52:03  richard
-#  . #564271 ] find() and new properties
-#
-# Revision 1.67  2002/06/11 05:02:37  richard
-#  . #565979 ] code error in hyperdb.Class.find
-#
-# Revision 1.66  2002/05/25 07:16:24  rochecompaan
-# Merged search_indexing-branch with HEAD
-#
-# Revision 1.65  2002/05/22 04:12:05  richard
-#  . applied patch #558876 ] cgi client customization
-#    ... with significant additions and modifications ;)
-#    - extended handling of ML assignedto to all places it's handled
-#    - added more NotFound info
-#
-# Revision 1.64  2002/05/15 06:21:21  richard
-#  . node caching now works, and gives a small boost in performance
-#
-# As a part of this, I cleaned up the DEBUG output and implemented TRACE
-# output (HYPERDBTRACE='file to trace to') with checkpoints at the start of
-# CGI requests. Run roundup with python -O to skip all the DEBUG/TRACE stuff
-# (using if __debug__ which is compiled out with -O)
-#
-# Revision 1.63  2002/04/15 23:25:15  richard
-# . node ids are now generated from a lockable store - no more race conditions
-#
-# We're using the portalocker code by Jonathan Feinberg that was contributed
-# to the ASPN Python cookbook. This gives us locking across Unix and Windows.
-#
-# Revision 1.62  2002/04/03 07:05:50  richard
-# d'oh! killed retirement of nodes :(
-# all better now...
-#
-# Revision 1.61  2002/04/03 06:11:51  richard
-# Fix for old databases that contain properties that don't exist any more.
-#
-# Revision 1.60  2002/04/03 05:54:31  richard
-# Fixed serialisation problem by moving the serialisation step out of the
-# hyperdb.Class (get, set) into the hyperdb.Database.
-#
-# Also fixed htmltemplate after the showid changes I made yesterday.
-#
-# Unit tests for all of the above written.
-#
-# Revision 1.59.2.2  2002/04/20 13:23:33  rochecompaan
-# We now have a separate search page for nodes.  Search links for
-# different classes can be customized in instance_config similar to
-# index links.
-#
-# Revision 1.59.2.1  2002/04/19 19:54:42  rochecompaan
-# cgi_client.py
-#     removed search link for the time being
-#     moved rendering of matches to htmltemplate
-# hyperdb.py
-#     filtering of nodes on full text search incorporated in filter method
-# roundupdb.py
-#     added paramater to call of filter method
-# roundup_indexer.py
-#     added search method to RoundupIndexer class
-#
-# Revision 1.59  2002/03/12 22:52:26  richard
-# more pychecker warnings removed
-#
-# Revision 1.58  2002/02/27 03:23:16  richard
-# Ran it through pychecker, made fixes
-#
-# Revision 1.57  2002/02/20 05:23:24  richard
-# Didn't accomodate new values for new properties
-#
-# Revision 1.56  2002/02/20 05:05:28  richard
-#  . Added simple editing for classes that don't define a templated interface.
-#    - access using the admin "class list" interface
-#    - limited to admin-only
-#    - requires the csv module from object-craft (url given if it's missing)
-#
-# Revision 1.55  2002/02/15 07:27:12  richard
-# Oops, precedences around the way w0rng.
-#
-# Revision 1.54  2002/02/15 07:08:44  richard
-#  . Alternate email addresses are now available for users. See the MIGRATION
-#    file for info on how to activate the feature.
-#
-# Revision 1.53  2002/01/22 07:21:13  richard
-# . fixed back_bsddb so it passed the journal tests
-#
-# ... it didn't seem happy using the back_anydbm _open method, which is odd.
-# Yet another occurrance of whichdb not being able to recognise older bsddb
-# databases. Yadda yadda. Made the HYPERDBDEBUG stuff more sane in the
-# process.
-#
-# Revision 1.52  2002/01/21 16:33:19  rochecompaan
-# You can now use the roundup-admin tool to pack the database
-#
-# Revision 1.51  2002/01/21 03:01:29  richard
-# brief docco on the do_journal argument
-#
-# Revision 1.50  2002/01/19 13:16:04  rochecompaan
-# Journal entries for link and multilink properties can now be switched on
-# or off.
-#
-# Revision 1.49  2002/01/16 07:02:57  richard
-#  . lots of date/interval related changes:
-#    - more relaxed date format for input
-#
-# Revision 1.48  2002/01/14 06:32:34  richard
-#  . #502951 ] adding new properties to old database
-#
-# Revision 1.47  2002/01/14 02:20:15  richard
-#  . changed all config accesses so they access either the instance or the
-#    config attriubute on the db. This means that all config is obtained from
-#    instance_config instead of the mish-mash of classes. This will make
-#    switching to a ConfigParser setup easier too, I hope.
-#
-# At a minimum, this makes migration a _little_ easier (a lot easier in the
-# 0.5.0 switch, I hope!)
-#
-# Revision 1.46  2002/01/07 10:42:23  richard
-# oops
-#
-# Revision 1.45  2002/01/02 04:18:17  richard
-# hyperdb docstrings
-#
-# Revision 1.44  2002/01/02 02:31:38  richard
-# Sorry for the huge checkin message - I was only intending to implement #496356
-# but I found a number of places where things had been broken by transactions:
-#  . modified ROUNDUPDBSENDMAILDEBUG to be SENDMAILDEBUG and hold a filename
-#    for _all_ roundup-generated smtp messages to be sent to.
-#  . the transaction cache had broken the roundupdb.Class set() reactors
-#  . newly-created author users in the mailgw weren't being committed to the db
-#
-# Stuff that made it into CHANGES.txt (ie. the stuff I was actually working
-# on when I found that stuff :):
-#  . #496356 ] Use threading in messages
-#  . detectors were being registered multiple times
-#  . added tests for mailgw
-#  . much better attaching of erroneous messages in the mail gateway
-#
-# Revision 1.43  2001/12/20 06:13:24  rochecompaan
-# Bugs fixed:
-#   . Exception handling in hyperdb for strings-that-look-like numbers got
-#     lost somewhere
-#   . Internet Explorer submits full path for filename - we now strip away
-#     the path
-# Features added:
-#   . Link and multilink properties are now displayed sorted in the cgi
-#     interface
-#
-# Revision 1.42  2001/12/16 10:53:37  richard
-# take a copy of the node dict so that the subsequent set
-# operation doesn't modify the oldvalues structure
-#
-# Revision 1.41  2001/12/15 23:47:47  richard
-# Cleaned up some bare except statements
-#
-# Revision 1.40  2001/12/14 23:42:57  richard
-# yuck, a gdbm instance tests false :(
-# I've left the debugging code in - it should be removed one day if we're ever
-# _really_ anal about performace :)
-#
-# Revision 1.39  2001/12/02 05:06:16  richard
-# . We now use weakrefs in the Classes to keep the database reference, so
-#   the close() method on the database is no longer needed.
-#   I bumped the minimum python requirement up to 2.1 accordingly.
-# . #487480 ] roundup-server
-# . #487476 ] INSTALL.txt
-#
-# I also cleaned up the change message / post-edit stuff in the cgi client.
-# There's now a clearly marked "TODO: append the change note" where I believe
-# the change note should be added there. The "changes" list will obviously
-# have to be modified to be a dict of the changes, or somesuch.
-#
-# More testing needed.
-#
-# Revision 1.38  2001/12/01 07:17:50  richard
-# . We now have basic transaction support! Information is only written to
-#   the database when the commit() method is called. Only the anydbm
-#   backend is modified in this way - neither of the bsddb backends have been.
-#   The mail, admin and cgi interfaces all use commit (except the admin tool
-#   doesn't have a commit command, so interactive users can't commit...)
-# . Fixed login/registration forwarding the user to the right page (or not,
-#   on a failure)
-#
-# Revision 1.37  2001/11/28 21:55:35  richard
-#  . login_action and newuser_action return values were being ignored
-#  . Woohoo! Found that bloody re-login bug that was killing the mail
-#    gateway.
-#  (also a minor cleanup in hyperdb)
-#
-# Revision 1.36  2001/11/27 03:16:09  richard
-# Another place that wasn't handling missing properties.
-#
-# Revision 1.35  2001/11/22 15:46:42  jhermann
-# Added module docstrings to all modules.
-#
-# Revision 1.34  2001/11/21 04:04:43  richard
-# *sigh* more missing value handling
-#
-# Revision 1.33  2001/11/21 03:40:54  richard
-# more new property handling
-#
-# Revision 1.32  2001/11/21 03:11:28  richard
-# Better handling of new properties.
-#
-# Revision 1.31  2001/11/12 22:01:06  richard
-# Fixed issues with nosy reaction and author copies.
-#
-# Revision 1.30  2001/11/09 10:11:08  richard
-#  . roundup-admin now handles all hyperdb exceptions
-#
-# Revision 1.29  2001/10/27 00:17:41  richard
-# Made Class.stringFind() do caseless matching.
-#
-# Revision 1.28  2001/10/21 04:44:50  richard
-# bug #473124: UI inconsistency with Link fields.
-#    This also prompted me to fix a fairly long-standing usability issue -
-#    that of being able to turn off certain filters.
-#
-# Revision 1.27  2001/10/20 23:44:27  richard
-# Hyperdatabase sorts strings-that-look-like-numbers as numbers now.
-#
-# Revision 1.26  2001/10/16 03:48:01  richard
-# admin tool now complains if a "find" is attempted with a non-link property.
-#
-# Revision 1.25  2001/10/11 00:17:51  richard
-# Reverted a change in hyperdb so the default value for missing property
-# values in a create() is None and not '' (the empty string.) This obviously
-# breaks CSV import/export - the string 'None' will be created in an
-# export/import operation.
-#
-# Revision 1.24  2001/10/10 03:54:57  richard
-# Added database importing and exporting through CSV files.
-# Uses the csv module from object-craft for exporting if it's available.
-# Requires the csv module for importing.
-#
-# Revision 1.23  2001/10/09 23:58:10  richard
-# Moved the data stringification up into the hyperdb.Class class' get, set
-# and create methods. This means that the data is also stringified for the
-# journal call, and removes duplication of code from the backends. The
-# backend code now only sees strings.
-#
-# Revision 1.22  2001/10/09 07:25:59  richard
-# Added the Password property type. See "pydoc roundup.password" for
-# implementation details. Have updated some of the documentation too.
-#
-# Revision 1.21  2001/10/05 02:23:24  richard
-#  . roundup-admin create now prompts for property info if none is supplied
-#    on the command-line.
-#  . hyperdb Class getprops() method may now return only the mutable
-#    properties.
-#  . Login now uses cookies, which makes it a whole lot more flexible. We can
-#    now support anonymous user access (read-only, unless there's an
-#    "anonymous" user, in which case write access is permitted). Login
-#    handling has been moved into cgi_client.Client.main()
-#  . The "extended" schema is now the default in roundup init.
-#  . The schemas have had their page headings modified to cope with the new
-#    login handling. Existing installations should copy the interfaces.py
-#    file from the roundup lib directory to their instance home.
-#  . Incorrectly had a Bizar Software copyright on the cgitb.py module from
-#    Ping - has been removed.
-#  . Fixed a whole bunch of places in the CGI interface where we should have
-#    been returning Not Found instead of throwing an exception.
-#  . Fixed a deviation from the spec: trying to modify the 'id' property of
-#    an item now throws an exception.
-#
-# Revision 1.20  2001/10/04 02:12:42  richard
-# Added nicer command-line item adding: passing no arguments will enter an
-# interactive more which asks for each property in turn. While I was at it, I
-# fixed an implementation problem WRT the spec - I wasn't raising a
-# ValueError if the key property was missing from a create(). Also added a
-# protected=boolean argument to getprops() so we can list only the mutable
-# properties (defaults to yes, which lists the immutables).
-#
-# Revision 1.19  2001/08/29 04:47:18  richard
-# Fixed CGI client change messages so they actually include the properties
-# changed (again).
-#
-# Revision 1.18  2001/08/16 07:34:59  richard
-# better CGI text searching - but hidden filter fields are disappearing...
-#
-# Revision 1.17  2001/08/16 06:59:58  richard
-# all searches use re now - and they're all case insensitive
-#
-# Revision 1.16  2001/08/15 23:43:18  richard
-# Fixed some isFooTypes that I missed.
-# Refactored some code in the CGI code.
-#
-# Revision 1.15  2001/08/12 06:32:36  richard
-# using isinstance(blah, Foo) now instead of isFooType
-#
-# Revision 1.14  2001/08/07 00:24:42  richard
-# stupid typo
-#
-# Revision 1.13  2001/08/07 00:15:51  richard
-# Added the copyright/license notice to (nearly) all files at request of
-# Bizar Software.
-#
-# Revision 1.12  2001/08/02 06:38:17  richard
-# Roundupdb now appends "mailing list" information to its messages which
-# include the e-mail address and web interface address. Templates may
-# override this in their db classes to include specific information (support
-# instructions, etc).
-#
-# Revision 1.11  2001/08/01 04:24:21  richard
-# mailgw was assuming certain properties existed on the issues being created.
-#
-# Revision 1.10  2001/07/30 02:38:31  richard
-# get() now has a default arg - for migration only.
-#
-# Revision 1.9  2001/07/29 09:28:23  richard
-# Fixed sorting by clicking on column headings.
-#
-# Revision 1.8  2001/07/29 08:27:40  richard
-# Fixed handling of passed-in values in form elements (ie. during a
-# drill-down)
-#
-# Revision 1.7  2001/07/29 07:01:39  richard
-# Added vim command to all source so that we don't get no steenkin' tabs :)
-#
-# Revision 1.6  2001/07/29 05:36:14  richard
-# Cleanup of the link label generation.
-#
-# Revision 1.5  2001/07/29 04:05:37  richard
-# Added the fabricated property "id".
-#
-# Revision 1.4  2001/07/27 06:25:35  richard
-# Fixed some of the exceptions so they're the right type.
-# Removed the str()-ification of node ids so we don't mask oopsy errors any
-# more.
-#
-# Revision 1.3  2001/07/27 05:17:14  richard
-# just some comments
-#
-# Revision 1.2  2001/07/22 12:09:32  richard
-# Final commit of Grande Splite
-#
-# Revision 1.1  2001/07/22 11:58:35  richard
-# More Grande Splite
-#
-#
 # vim: set filetype=python ts=4 sw=4 et si
index 0ede7b06f0c697539bb75a2bd9d651e838605628..0fb1e5c9961e8368bc312beb870d93daa50d2c04 100644 (file)
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: init.py,v 1.22 2002-09-05 23:39:12 richard Exp $
+# $Id: init.py,v 1.23 2002-09-09 23:55:19 richard Exp $
 
 __doc__ = """
 Init (create) a roundup instance.
@@ -65,7 +65,7 @@ def install(instance_home, template, backend):
     The instance_home directory will be created using the files found in
     the named template (roundup.templates.<name>). A standard instance_home
     contains:
-        . instance_config.py
+        . config.py
           - simple configuration of things like the email address for the
             mail gateway, the mail domain, the mail host, ...
         . dbinit.py and select_db.py
@@ -113,81 +113,4 @@ def initialise(instance_home, adminpw):
     instance = roundup.instance.open(instance_home)
     instance.init(password.Password(adminpw))
 
-#
-# $Log: not supported by cvs2svn $
-# Revision 1.21  2002/08/16 04:25:03  richard
-# cleanup: moved templatebuilder into templates.builder
-#
-# Revision 1.20  2002/07/14 02:05:53  richard
-# . all storage-specific code (ie. backend) is now implemented by the backends
-#
-# Revision 1.19  2002/05/23 01:14:20  richard
-#  . split instance initialisation into two steps, allowing config changes
-#    before the database is initialised.
-#
-# Revision 1.18  2001/11/22 15:46:42  jhermann
-# Added module docstrings to all modules.
-#
-# Revision 1.17  2001/11/12 23:17:38  jhermann
-# Code using copyDigestedFile() that passes unit tests
-#
-# Revision 1.16  2001/10/09 07:25:59  richard
-# Added the Password property type. See "pydoc roundup.password" for
-# implementation details. Have updated some of the documentation too.
-#
-# Revision 1.15  2001/08/07 00:24:42  richard
-# stupid typo
-#
-# Revision 1.14  2001/08/07 00:15:51  richard
-# Added the copyright/license notice to (nearly) all files at request of
-# Bizar Software.
-#
-# Revision 1.13  2001/08/06 01:20:00  richard
-# Added documentaion.
-#
-# Revision 1.12  2001/08/05 07:43:52  richard
-# Instances are now opened by a special function that generates a unique
-# module name for the instances on import time.
-#
-# Revision 1.11  2001/08/04 22:42:43  richard
-# Fixed sf.net bug #447671 - typo
-#
-# Revision 1.10  2001/08/03 01:28:33  richard
-# Used the much nicer load_package, pointed out by Steve Majewski.
-#
-# Revision 1.9  2001/08/03 00:59:34  richard
-# Instance import now imports the instance using imp.load_module so that
-# we can have instance homes of "roundup" or other existing python package
-# names.
-#
-# Revision 1.8  2001/07/29 07:01:39  richard
-# Added vim command to all source so that we don't get no steenkin' tabs :)
-#
-# Revision 1.7  2001/07/28 07:59:53  richard
-# Replaced errno integers with their module values.
-# De-tabbed templatebuilder.py
-#
-# Revision 1.6  2001/07/24 11:18:25  anthonybaxter
-# oops. left a print in
-#
-# Revision 1.5  2001/07/24 10:54:11  anthonybaxter
-# oops. Html.
-#
-# Revision 1.4  2001/07/24 10:46:22  anthonybaxter
-# Added templatebuilder module. two functions - one to pack up the html base,
-# one to unpack it. Packed up the two standard templates into htmlbases.
-# Modified __init__ to install them.
-#
-# __init__.py magic was needed for the rather high levels of wierd import magic.
-# Reducing level of import magic == (good, future)
-#
-# Revision 1.3  2001/07/23 08:45:28  richard
-# ok, so now "./roundup-admin init" will ask questions in an attempt to get a
-# workable instance_home set up :)
-# _and_ anydbm has had its first test :)
-#
-# Revision 1.2  2001/07/22 12:09:32  richard
-# Final commit of Grande Splite
-#
-#
 # vim: set filetype=python ts=4 sw=4 et si
index edbfb89254cb66621090fc246985b0dd8fb93583..dc2117426410786731182c34b1bd6386e6680087 100644 (file)
@@ -73,7 +73,7 @@ are calling the create() method to create a new node). If an auditor raises
 an exception, the original message is bounced back to the sender with the
 explanatory message given in the exception. 
 
-$Id: mailgw.py,v 1.81 2002-08-19 00:21:56 richard Exp $
+$Id: mailgw.py,v 1.82 2002-09-09 23:55:19 richard Exp $
 '''
 
 
@@ -192,7 +192,7 @@ class MailGW:
                 m = self.bounce_message(message, sendto, m)
             except:
                 # bounce the message back to the sender with the error message
-                sendto = [sendto[0][1], self.instance.ADMIN_EMAIL]
+                sendto = [sendto[0][1], self.instance.config.ADMIN_EMAIL]
                 m = ['']
                 m.append('An unexpected error occurred during the processing')
                 m.append('of your message. The tracker administrator is being')
@@ -205,7 +205,7 @@ class MailGW:
                 m = self.bounce_message(message, sendto, m)
         else:
             # very bad-looking message - we don't even know who sent it
-            sendto = [self.instance.ADMIN_EMAIL]
+            sendto = [self.instance.config.ADMIN_EMAIL]
             m = ['Subject: badly formed message from mail gateway']
             m.append('')
             m.append('The mail gateway retrieved a message which has no From:')
@@ -218,11 +218,13 @@ class MailGW:
         # now send the message
         if SENDMAILDEBUG:
             open(SENDMAILDEBUG, 'w').write('From: %s\nTo: %s\n%s\n'%(
-                self.instance.ADMIN_EMAIL, ', '.join(sendto), m.getvalue()))
+                self.instance.config.ADMIN_EMAIL, ', '.join(sendto),
+                    m.getvalue()))
         else:
             try:
-                smtp = smtplib.SMTP(self.instance.MAILHOST)
-                smtp.sendmail(self.instance.ADMIN_EMAIL, sendto, m.getvalue())
+                smtp = smtplib.SMTP(self.instance.config.MAILHOST)
+                smtp.sendmail(self.instance.config.ADMIN_EMAIL, sendto,
+                    m.getvalue())
             except socket.error, value:
                 raise MailGWError, "Couldn't send error email: "\
                     "mailhost %s"%value
@@ -238,8 +240,8 @@ class MailGW:
         msg = cStringIO.StringIO()
         writer = MimeWriter.MimeWriter(msg)
         writer.addheader('Subject', subject)
-        writer.addheader('From', '%s <%s>'% (self.instance.INSTANCE_NAME,
-                                            self.instance.ISSUE_TRACKER_EMAIL))
+        writer.addheader('From', '%s <%s>'% (self.instance.config.INSTANCE_NAME,
+            self.instance.config.ISSUE_TRACKER_EMAIL))
         writer.addheader('To', ','.join(sendto))
         writer.addheader('MIME-Version', '1.0')
         part = writer.startmultipartbody('mixed')
@@ -318,8 +320,8 @@ class MailGW:
             if classname is None:
                 # no classname, fallback on the default
                 if hasattr(self.instance, 'MAIL_DEFAULT_CLASS') and \
-                        self.instance.MAIL_DEFAULT_CLASS:
-                    classname = self.instance.MAIL_DEFAULT_CLASS
+                        self.instance.config.MAIL_DEFAULT_CLASS:
+                    classname = self.instance.config.MAIL_DEFAULT_CLASS
                 else:
                     # fail
                     m = None
@@ -560,7 +562,7 @@ Unknown address: %s
 
         # now update the recipients list
         recipients = []
-        tracker_email = self.instance.ISSUE_TRACKER_EMAIL.lower()
+        tracker_email = self.instance.config.ISSUE_TRACKER_EMAIL.lower()
         for recipient in message.getaddrlist('to') + message.getaddrlist('cc'):
             r = recipient[1].strip().lower()
             if r == tracker_email or not r:
@@ -582,7 +584,7 @@ Unknown address: %s
         # generate a messageid if there isn't one
         if not messageid:
             messageid = "<%s.%s.%s%s@%s>"%(time.time(), random.random(),
-                classname, nodeid, self.instance.MAIL_DOMAIN)
+                classname, nodeid, self.instance.config.MAIL_DOMAIN)
 
         #
         # now handle the body - find the message
@@ -854,6 +856,9 @@ def parseContent(content, keep_citations, keep_body,
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.81  2002/08/19 00:21:56  richard
+# grant email access to admin too ;)
+#
 # Revision 1.80  2002/08/01 00:56:22  richard
 # Added the web access and email access permissions, so people can restrict
 # access to users who register through the email interface (for example).
index de8c855886db7cc95569da7234832ef77bc7402e..a64f168ab79f21496d771bf000725c1952b076b7 100644 (file)
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: __init__.py,v 1.6 2002-09-05 23:39:14 richard Exp $
+# $Id: __init__.py,v 1.7 2002-09-09 23:55:19 richard Exp $
 
-import sys
-from instance_config import *
-from dbinit import *
-from interfaces import *
+import config
+from dbinit import open, init
+from interfaces import Client, MailGW
 
-# 
-# $Log: not supported by cvs2svn $
-# Revision 1.5  2001/08/07 00:24:43  richard
-# stupid typo
-#
-# Revision 1.4  2001/08/07 00:15:51  richard
-# Added the copyright/license notice to (nearly) all files at request of
-# Bizar Software.
-#
-# Revision 1.3  2001/07/29 07:01:39  richard
-# Added vim command to all source so that we don't get no steenkin' tabs :)
-#
-# Revision 1.2  2001/07/24 10:46:22  anthonybaxter
-# Added templatebuilder module. two functions - one to pack up the html base,
-# one to unpack it. Packed up the two standard templates into htmlbases.
-# Modified __init__ to install them.
-#
-# __init__.py magic was needed for the rather high levels of wierd import magic.
-# Reducing level of import magic == (good, future)
-#
-# Revision 1.1  2001/07/23 23:28:43  richard
-# Adding the classic template
-#
-# Revision 1.3  2001/07/23 23:16:01  richard
-# Split off the interfaces (CGI, mailgw) into a separate file from the DB stuff.
-#
-# Revision 1.2  2001/07/23 04:33:21  anthonybaxter
-# split __init__.py into 2. dbinit and instance_config.
-#
-#
 # vim: set filetype=python ts=4 sw=4 et si
index 6e3878ab1b1a928aebe285def98fb03c532b2862..237320ae9d3e0c3b66c16421d46525e6f91e96aa 100644 (file)
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: dbinit.py,v 1.25 2002-09-02 07:00:22 richard Exp $
+# $Id: dbinit.py,v 1.26 2002-09-09 23:55:19 richard Exp $
 
 import os
 
-import instance_config
+import config
 from select_db import Database, Class, FileClass, IssueClass
 
 def open(name=None):
@@ -28,7 +28,7 @@ def open(name=None):
     from roundup.hyperdb import String, Password, Date, Link, Multilink
 
     # open the database
-    db = Database(instance_config, name)
+    db = Database(config, name)
 
     #
     # Now initialise the schema. Must do this each time the database is
@@ -66,7 +66,7 @@ def open(name=None):
     user.setkey("username")
 
     # FileClass automatically gets these properties:
-    #   content = String()    [saved to disk in <instance home>/db/files/]
+    #   content = String()    [saved to disk in <tracker home>/db/files/]
     #   (it also gets the Class properties creation, activity and creator)
     msg = FileClass(db, "msg", 
                     author=Link("user", do_journal='no'),
@@ -154,7 +154,7 @@ def init(adminpw):
     can edit this before running the "roundup-admin initialise" command to
     change the initial database entries.
     ''' 
-    dbdir = os.path.join(instance_config.DATABASE, 'files')
+    dbdir = os.path.join(config.DATABASE, 'files')
     if not os.path.isdir(dbdir):
         os.makedirs(dbdir)
 
@@ -184,188 +184,10 @@ def init(adminpw):
     # create the two default users
     user = db.getclass('user')
     user.create(username="admin", password=adminpw,
-        address=instance_config.ADMIN_EMAIL, roles='Admin')
+        address=config.ADMIN_EMAIL, roles='Admin')
     user.create(username="anonymous", roles='Anonymous')
 
     db.commit()
 
-#
-# $Log: not supported by cvs2svn $
-# Revision 1.24  2002/09/01 04:32:30  richard
-# . Lots of cleanup in the classic html (stylesheet, search page, index page, ...)
-# . Reinstated searching, but not query saving yet
-# . Filtering only allows sorting and grouping by one property - all backends
-#   now implement this behaviour.
-# . Nosy list journalling turned off by default, everything else is on.
-# . Added some convenience methods (reverse, propchanged, [item] accesses, ...)
-# . Did I mention the stylesheet is much cleaner now? :)
-#
-# Revision 1.23  2002/08/30 08:30:45  richard
-# allow perms on user class
-#
-# Revision 1.22  2002/08/01 00:56:22  richard
-# Added the web access and email access permissions, so people can restrict
-# access to users who register through the email interface (for example).
-# Also added "security" command to the roundup-admin interface to display the
-# Role/Permission config for an instance.
-#
-# Revision 1.21  2002/07/26 08:26:59  richard
-# Very close now. The cgi and mailgw now use the new security API. The two
-# templates have been migrated to that setup. Lots of unit tests. Still some
-# issue in the web form for editing Roles assigned to users.
-#
-# Revision 1.20  2002/07/17 12:39:10  gmcm
-# Saving, running & editing queries.
-#
-# Revision 1.19  2002/07/14 02:05:54  richard
-# . all storage-specific code (ie. backend) is now implemented by the backends
-#
-# Revision 1.18  2002/07/09 03:02:53  richard
-# More indexer work:
-# - all String properties may now be indexed too. Currently there's a bit of
-#   "issue" specific code in the actual searching which needs to be
-#   addressed. In a nutshell:
-#   + pass 'indexme="yes"' as a String() property initialisation arg, eg:
-#         file = FileClass(db, "file", name=String(), type=String(),
-#             comment=String(indexme="yes"))
-#   + the comment will then be indexed and be searchable, with the results
-#     related back to the issue that the file is linked to
-# - as a result of this work, the FileClass has a default MIME type that may
-#   be overridden in a subclass, or by the use of a "type" property as is
-#   done in the default templates.
-# - the regeneration of the indexes (if necessary) is done once the schema is
-#   set up in the dbinit.
-#
-# Revision 1.17  2002/05/24 04:03:23  richard
-# Added commentage to the dbinit files to help people with their
-# customisation.
-#
-# Revision 1.16  2002/02/16 08:06:14  richard
-# Removed the key property restriction on title of the classic issue class.
-#
-# Revision 1.15  2002/02/15 07:08:44  richard
-#  . Alternate email addresses are now available for users. See the MIGRATION
-#    file for info on how to activate the feature.
-#
-# Revision 1.14  2002/01/14 02:20:15  richard
-#  . changed all config accesses so they access either the instance or the
-#    config attriubute on the db. This means that all config is obtained from
-#    instance_config instead of the mish-mash of classes. This will make
-#    switching to a ConfigParser setup easier too, I hope.
-#
-# At a minimum, this makes migration a _little_ easier (a lot easier in the
-# 0.5.0 switch, I hope!)
-#
-# Revision 1.13  2002/01/02 02:31:38  richard
-# Sorry for the huge checkin message - I was only intending to implement #496356
-# but I found a number of places where things had been broken by transactions:
-#  . modified ROUNDUPDBSENDMAILDEBUG to be SENDMAILDEBUG and hold a filename
-#    for _all_ roundup-generated smtp messages to be sent to.
-#  . the transaction cache had broken the roundupdb.Class set() reactors
-#  . newly-created author users in the mailgw weren't being committed to the db
-#
-# Stuff that made it into CHANGES.txt (ie. the stuff I was actually working
-# on when I found that stuff :):
-#  . #496356 ] Use threading in messages
-#  . detectors were being registered multiple times
-#  . added tests for mailgw
-#  . much better attaching of erroneous messages in the mail gateway
-#
-# Revision 1.12  2001/12/02 05:06:16  richard
-# . We now use weakrefs in the Classes to keep the database reference, so
-#   the close() method on the database is no longer needed.
-#   I bumped the minimum python requirement up to 2.1 accordingly.
-# . #487480 ] roundup-server
-# . #487476 ] INSTALL.txt
-#
-# I also cleaned up the change message / post-edit stuff in the cgi client.
-# There's now a clearly marked "TODO: append the change note" where I believe
-# the change note should be added there. The "changes" list will obviously
-# have to be modified to be a dict of the changes, or somesuch.
-#
-# More testing needed.
-#
-# Revision 1.11  2001/12/01 07:17:50  richard
-# . We now have basic transaction support! Information is only written to
-#   the database when the commit() method is called. Only the anydbm
-#   backend is modified in this way - neither of the bsddb backends have been.
-#   The mail, admin and cgi interfaces all use commit (except the admin tool
-#   doesn't have a commit command, so interactive users can't commit...)
-# . Fixed login/registration forwarding the user to the right page (or not,
-#   on a failure)
-#
-# Revision 1.10  2001/11/26 22:55:56  richard
-# Feature:
-#  . Added INSTANCE_NAME to configuration - used in web and email to identify
-#    the instance.
-#  . Added EMAIL_SIGNATURE_POSITION to indicate where to place the roundup
-#    signature info in e-mails.
-#  . Some more flexibility in the mail gateway and more error handling.
-#  . Login now takes you to the page you back to the were denied access to.
-#
-# Fixed:
-#  . Lots of bugs, thanks Roché and others on the devel mailing list!
-#
-# Revision 1.9  2001/10/30 00:54:45  richard
-# Features:
-#  . #467129 ] Lossage when username=e-mail-address
-#  . #473123 ] Change message generation for author
-#  . MailGW now moves 'resolved' to 'chatting' on receiving e-mail for an issue.
-#
-# Revision 1.8  2001/10/09 07:25:59  richard
-# Added the Password property type. See "pydoc roundup.password" for
-# implementation details. Have updated some of the documentation too.
-#
-# Revision 1.7  2001/08/07 00:24:43  richard
-# stupid typo
-#
-# Revision 1.6  2001/08/07 00:15:51  richard
-# Added the copyright/license notice to (nearly) all files at request of
-# Bizar Software.
-#
-# Revision 1.5  2001/08/02 06:38:17  richard
-# Roundupdb now appends "mailing list" information to its messages which
-# include the e-mail address and web interface address. Templates may
-# override this in their db classes to include specific information (support
-# instructions, etc).
-#
-# Revision 1.4  2001/07/29 07:01:39  richard
-# Added vim command to all source so that we don't get no steenkin' tabs :)
-#
-# Revision 1.3  2001/07/24 10:46:22  anthonybaxter
-# Added templatebuilder module. two functions - one to pack up the html base,
-# one to unpack it. Packed up the two standard templates into htmlbases.
-# Modified __init__ to install them.
-#
-# __init__.py magic was needed for the rather high levels of wierd import magic.
-# Reducing level of import magic == (good, future)
-#
-# Revision 1.2  2001/07/24 01:06:43  richard
-# Oops - accidentally duped the keywords class
-#
-# Revision 1.1  2001/07/23 23:28:43  richard
-# Adding the classic template
-#
-# Revision 1.4  2001/07/23 08:45:28  richard
-# ok, so now "./roundup-admin init" will ask questions in an attempt to get a
-# workable instance_home set up :)
-# _and_ anydbm has had its first test :)
-#
-# Revision 1.3  2001/07/23 07:14:41  richard
-# Moved the database backends off into backends.
-#
-# Revision 1.2  2001/07/23 06:25:50  richard
-# relfected the move to roundup/backends
-#
-# Revision 1.1  2001/07/23 04:33:21  anthonybaxter
-# split __init__.py into 2. dbinit and instance_config.
-#
-# Revision 1.1  2001/07/23 03:50:46  anthonybaxter
-# moved templates to proper location
-#
-# Revision 1.2  2001/07/22 12:09:32  richard
-# Final commit of Grande Splite
-#
-#
 # vim: set filetype=python ts=4 sw=4 et si
 
index fa605ee843597e008f2b0da80750402e8b2642ad..40f944bd98ac65f4e1f20a9537b9c18ea9fd2d72 100644 (file)
@@ -15,9 +15,8 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: interfaces.py,v 1.14 2002-08-30 08:31:01 richard Exp $
+# $Id: interfaces.py,v 1.15 2002-09-09 23:55:19 richard Exp $
 
-import instance_config
 from roundup import mailgw 
 from roundup.cgi import client
 
@@ -33,68 +32,4 @@ class MailGW(mailgw.MailGW):
     ''' 
     pass
 
-#
-# $Log: not supported by cvs2svn $
-# Revision 1.13  2002/08/16 04:26:00  richard
-# preparation for moving cgi modules around
-#
-# Revision 1.12  2002/01/14 02:20:15  richard
-#  . changed all config accesses so they access either the instance or the
-#    config attriubute on the db. This means that all config is obtained from
-#    instance_config instead of the mish-mash of classes. This will make
-#    switching to a ConfigParser setup easier too, I hope.
-#
-# At a minimum, this makes migration a _little_ easier (a lot easier in the
-# 0.5.0 switch, I hope!)
-#
-# Revision 1.11  2002/01/02 02:32:38  richard
-# ANONYMOUS_ACCESS -> ANONYMOUS_REGISTER
-#
-# Revision 1.10  2001/12/20 15:43:01  rochecompaan
-# Features added:
-#  .  Multilink properties are now displayed as comma separated values in
-#     a textbox
-#  .  The add user link is now only visible to the admin user
-#  .  Modified the mail gateway to reject submissions from unknown
-#     addresses if ANONYMOUS_ACCESS is denied
-#
-# Revision 1.9  2001/11/26 23:00:53  richard
-# This config stuff is getting to be a real mess...
-#
-# Revision 1.8  2001/10/22 03:25:01  richard
-# Added configuration for:
-#  . anonymous user access and registration (deny/allow)
-#  . filter "widget" location on index page (top, bottom, both)
-# Updated some documentation.
-#
-# Revision 1.7  2001/10/09 07:38:58  richard
-# Pushed the base code for the extended schema CGI interface back into the
-# code cgi_client module so that future updates will be less painful.
-# Also removed a debugging print statement from cgi_client.
-#
-# Revision 1.6  2001/08/07 00:24:43  richard
-# stupid typo
-#
-# Revision 1.5  2001/08/07 00:15:51  richard
-# Added the copyright/license notice to (nearly) all files at request of
-# Bizar Software.
-#
-# Revision 1.4  2001/07/30 01:25:57  richard
-# Changes to reflect cgi_client now implementing this template by default,
-# and not "extended".
-#
-# Revision 1.3  2001/07/29 07:01:39  richard
-# Added vim command to all source so that we don't get no steenkin' tabs :)
-#
-# Revision 1.2  2001/07/29 04:07:37  richard
-# Fixed the classic template so it's more like the "advertised" Roundup
-# template.
-#
-# Revision 1.1  2001/07/23 23:28:43  richard
-# Adding the classic template
-#
-# Revision 1.1  2001/07/23 23:16:01  richard
-# Split off the interfaces (CGI, mailgw) into a separate file from the DB stuff.
-#
-#
 # vim: set filetype=python ts=4 sw=4 et si
index 6d531977479a332e96b65d867b3148df37480f8d..b757c243e4be8b49931460ab8cacb6cab121082c 100644 (file)
@@ -8,7 +8,7 @@
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 #
-# $Id: test_mailgw.py,v 1.25 2002-07-29 00:56:06 richard Exp $
+# $Id: test_mailgw.py,v 1.26 2002-09-09 23:55:29 richard Exp $
 
 import unittest, cStringIO, tempfile, os, shutil, errno, imp, sys, difflib
 
@@ -119,7 +119,7 @@ This is a test submission of a new issue.
         self.doNewIssue()
 
     def testNewIssueNosy(self):
-        self.instance.ADD_AUTHOR_TO_NOSY = 'yes'
+        self.instance.config.ADD_AUTHOR_TO_NOSY = 'yes'
         message = cStringIO.StringIO('''Content-Type: text/plain;
   charset="iso-8859-1"
 From: Chef <chef@bork.bork.bork>
@@ -375,7 +375,7 @@ _________________________________________________________________________
 
     def testFollowupNosyAuthor(self):
         self.doNewIssue()
-        self.db.config.ADD_AUTHOR_TO_NOSY = self.instance.ADD_AUTHOR_TO_NOSY = 'yes'
+        self.db.config.ADD_AUTHOR_TO_NOSY = 'yes'
         message = cStringIO.StringIO('''Content-Type: text/plain;
   charset="iso-8859-1"
 From: john@test
@@ -422,7 +422,7 @@ _________________________________________________________________________
 
     def testFollowupNosyRecipients(self):
         self.doNewIssue()
-        self.db.config.ADD_RECIPIENTS_TO_NOSY = self.instance.ADD_RECIPIENTS_TO_NOSY = 'yes'
+        self.db.config.ADD_RECIPIENTS_TO_NOSY = 'yes'
         message = cStringIO.StringIO('''Content-Type: text/plain;
   charset="iso-8859-1"
 From: richard@test
@@ -470,7 +470,7 @@ _________________________________________________________________________
 
     def testFollowupNosyAuthorAndCopy(self):
         self.doNewIssue()
-        self.db.config.ADD_AUTHOR_TO_NOSY = self.instance.ADD_AUTHOR_TO_NOSY = 'yes'
+        self.db.config.ADD_AUTHOR_TO_NOSY = 'yes'
         self.db.config.MESSAGES_TO_AUTHOR = 'yes'
         message = cStringIO.StringIO('''Content-Type: text/plain;
   charset="iso-8859-1"
@@ -518,7 +518,7 @@ _________________________________________________________________________
 
     def testFollowupNoNosyAuthor(self):
         self.doNewIssue()
-        self.instance.ADD_AUTHOR_TO_NOSY = 'no'
+        self.instance.config.ADD_AUTHOR_TO_NOSY = 'no'
         message = cStringIO.StringIO('''Content-Type: text/plain;
   charset="iso-8859-1"
 From: john@test
@@ -564,7 +564,7 @@ _________________________________________________________________________
 
     def testFollowupNoNosyRecipients(self):
         self.doNewIssue()
-        self.instance.ADD_RECIPIENTS_TO_NOSY = 'no'
+        self.instance.config.ADD_RECIPIENTS_TO_NOSY = 'no'
         message = cStringIO.StringIO('''Content-Type: text/plain;
   charset="iso-8859-1"
 From: richard@test
@@ -781,6 +781,10 @@ def suite():
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.25  2002/07/29 00:56:06  richard
+# Removed the unnecessary volatiledb and the related complications. Security
+# much simpler and self-contained now.
+#
 # Revision 1.24  2002/07/26 08:27:00  richard
 # Very close now. The cgi and mailgw now use the new security API. The two
 # templates have been migrated to that setup. Lots of unit tests. Still some