Code

More work on the documentation - rolled in the work done by Jeff Blaine.
authorrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Fri, 8 Mar 2002 23:41:46 +0000 (23:41 +0000)
committerrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Fri, 8 Mar 2002 23:41:46 +0000 (23:41 +0000)
Use build_html.py *.stx to build the HTML. We'll move that into the setup
script when someone figures how to :)

git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@665 57a73879-2fb5-44c3-a270-3262357dd7e2

doc/build_html.py [new file with mode: 0755]
doc/default.css [new file with mode: 0644]
doc/index.html
doc/index.stx [new file with mode: 0644]
doc/installation.stx

diff --git a/doc/build_html.py b/doc/build_html.py
new file mode 100755 (executable)
index 0000000..f73ab1a
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+
+"""
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:Revision: $Revision: 1.1 $
+:Date: $Date: 2002-03-08 23:41:46 $
+:Copyright: This module has been placed in the public domain.
+
+A minimal front-end to the Docutils Publisher.
+
+This module takes advantage of the default values defined in `publish()`.
+"""
+
+import sys, os.path
+from dps.core import publish
+from dps import utils
+
+if len(sys.argv) < 2:
+    print >>sys.stderr, 'I need at least one filename'
+    sys.exit(1)
+
+reporter = utils.Reporter(2, 4)
+
+for file in sys.argv[1:]:
+    name, ext = os.path.splitext(file)
+    dest = '%s.html'%name
+    print >>sys.stderr, '%s -> %s'%(file, dest)
+    publish(writername='html', source=file, destination=dest,
+        reporter=reporter)
+
diff --git a/doc/default.css b/doc/default.css
new file mode 100644 (file)
index 0000000..1e8f2c2
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:date: $Date: 2002-03-08 23:41:46 $
+:version: $Revision: 1.1 $
+:copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+*/
+
+a.footnote-reference {
+  font-size: smaller;
+  vertical-align: super }
+
+col.docinfo-name {
+  font-weight: bold;
+  text-align: right }
+
+col.field-name {
+  font-weight: bold }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract h6 {
+  font-size: larger;
+  text-align: center }
+
+div.attention, div.caution, div.danger, div.error, div.hint,
+div.important, div.note, div.tip, div.warning {
+  margin: 2em;
+  border: medium outset;
+  padding: 1em }
+
+div.attention h3, div.caution h3, div.danger h3, div.error h3,
+div.warning h3 {
+  color: red;
+  font-weight: bold;
+  font-family: sans-serif }
+
+div.hint h3, div.important h3, div.note h3, div.tip h3 {
+  font-weight: bold;
+  font-family: sans-serif }
+
+div.field-body {
+  margin-bottom: 1em }
+
+div.field-list {
+  margin-bottom: -1em }
+
+div.figure {
+  margin-left: 2em }
+
+div.footnote {
+  border-left: solid thin black;
+  padding-left: 1em }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset;
+  padding: 1em }
+
+div.system-message h3 {
+  color: red }
+
+dt {
+  margin-bottom: -1em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr {
+  width: 75% }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.caption {
+  font-style: italic }
+
+p.field-name {
+  margin-bottom: 1em }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em }
+
+span.classifier {
+  font-family: sans-serif;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif;
+  font-weight: bold }
+
+span.field-argument {
+  font-style: italic }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option-argument {
+  font-style: italic }
+
+span.problematic {
+  color: red }
+
+table {
+  margin-top: 1em }
+
+table.docinfo {
+  margin: 2em 4em }
index 3e05a2f01f968ebb0061063f8497978d2ac83ace..0d8a20de93cf4c33b6619cf2389d53f7444d409f 100644 (file)
-<html><head>
-<title>Roundup: an Issue-Tracking System for Knowledge Workers</title>
-</head><body>
-
-<h1 align=center>Roundup (0.3.1)</h1>
-<h3 align=center>An Issue-Tracking System for Knowledge Workers</h2>
-
-<h1>Contents</h1>
-
-<ul>
-    <li><a href="overview.html">Overview</a> (Initial submission to SC Track)
-<li><a href="#installation">Installation</a>
-    <ul>
-        <li><a href="#requires">Prerequisites</a>
-        <li><a href="#getting">Getting Roundup</a>
-        <li><a href="#installing">Installing Roundup</a>
-    </ul>
-<li><a href="#starting">Getting Started</a>
-    <ul>
-        <li><a href="#instance">The Instance</a>
-        <li><a href="#startcmd">Command Line Tool</a>
-        <li><a href="#startmail">E-Mail Interface</a>
-        <li><a href="#startweb">Web Interface</a>
-        <li><a href="#users">Users and Access Control</a> (Users and permissions, Adding users)
-        <li><a href="#issues">Issues</a>
-    </ul>
-<li><a href="#guide">User Guide</a>
-    <ul>
-        <li><a href="#cmd">Command Line Tool</a>
-        <li><a href="#web">Web Interface</a>
-        <li><a href="#mail">E-Mail Gateway</a> (Message content summary, Address handling, Performing Actions)
-    </ul>
-<li><a href="#custom">Customising Roundup</a>
-    <ul>
-        <li><a href="#config">Instance Configuration</a>
-        <li><a href="#custinst">Instance Schema</a> (Creating a new information store)
-        <li><a href="#custweb">Web Interface</a> (Displaying properties, Index views, Item views)
-    </ul>
-<li><a href="spec.html">Roundup's Design Document</a> ("Implementation Guide")
-<li><a href="#ack">Acknowledgements</a>
-</ul>
-
-<p><hr>
-<h1><a name="installation">Installation</a></h1>
-
-
-<h2><a name="requires">Prerequisites</a></h2>
-
-<p>
-Python 2.1.1 is required for the correct operation of roundup.
-</p>
-
-<p>
-Download the latest version from
-<a href="http://www.python.org/">http://www.python.org/</a>.
-</p>
-
-
-
-<h2><a name="getting">Getting Roundup</a></h2>
-
-Download the latest version from
-<a href="http://roundup.sf.net/">http://roundup.sf.net/</a>.
-
-
-<h2><a name="installing">Installing Roundup</a></h2>
-
-<ol>
-    <li>Run:
-    <br><tt>python setup.py install</tt>
-    <li>If you would prefer the scripts installed in somewhere other than
-    <tt>/usr/local/bin</tt>, add <tt>"--install-scripts=&lt;dir&gt;"</tt>
-    to the command:
-    <br><tt>python setup.py install --install-scripts=&lt;dir&gt;</tt>
-    <li>The command:
-    <br><tt>python setup.py install --help</tt>
-    <br>gives all the options available for installation.
-</ol>
-
-
-<p><hr>
-<h1><a name="starting">Getting Started</a></h1>
-
-The following instructions assume that you have installed roundup. If you
-haven't, you may still proceed - just preface all commands with "./"
-ie. "./roundup-admin init".
-
-
-<h2><a name="instance">The Instance</a></h2>
-
-We'll be referring to the term <em>instance</em> a lot from now on. An
-instance is
-a directory in your filesystem that is where all the information about a
-live issue tracker database is stored. The data that is entered as issues,
-the users who access the database and the definition of the database itself
-all reside there:
-<ol>
-    <li><strong>Hyperdatabase</strong>
-    <br>This is the lowest component of Roundup and is where all the
-    issues, users, file attachments and messages are stored.
-    <li><strong>Database schema</strong>
-    <br>This describes the content of the hyperdatabase - what fields are
-    stored for issues, what user information, etc. Being stored in the
-    instance, this allows it to be customised for a particular application.
-    It also means that changes in the Roundup core code do not affect a
-    running instance.
-    <li><strong>Web Interface</strong>
-    <br>The web interface templates are defined in the instance too - and
-    the actual CGI interface class is defined (mostly using base classes in
-    the Roundup core code) so it, like the database, may be customised for
-    each instance in use.
-</ol>
-
-Instances are created using the <tt>roundup-admin</tt> tool.
-
-<h2><a name="startcmd">Command Line Tool</a></h2>
-
-To initiliase a new instance, run <tt>roundup-admin init</tt>. You will be
-asked a series of questions:
-
-<ol>
-    <li>Instance home directory
-    <li>Schema to use
-    <li>Database back-end to use
-    <li>Administration user "admin" password.
-</ol>
-
-You should also think about whether there is going to be controlled access
-to the instance on the machine the instance is running on. That is, who can
-actually make changes to the database using the roundup-admin tool. See
-the section on <a href="#users">Users and Access Control</a> for
-information on how to secure your instance from the start.
-
-<p>
-
-Roundup is configurable using an instance_config.py file in the instance home.
-It should be edited before roundup is used, and may have the following
-variable declarations:
-  
-<ol>
-    <li>MAILHOST
-    <br>The SMTP mail host that roundup will use to send mail
-    <li>MAIL_DOMAIN
-    <br>The domain name used for email addresses
-    <li>ISSUE_TRACKER_WEB
-    <br>The web address of the issue tracker's web interface
-</ol>
-
-<p>
-The email addresses used by the system by default are:
-
-<ol>
-    <li>ISSUE_TRACKER_EMAIL - issue_tracker@MAIL_DOMAIN
-    <br>submissions of issues
-    <li>ADMIN_EMAIL - roundup-admin@MAIL_DOMAIN
-    <br>roundup's internal use (problems, etc)
-</ol>
-
-<h2><a name="startmail">E-Mail Interface</a></h2>
-
-<h3>Setup 1: As a mail alias pipe process</h3>
-Set up a mail alias called "issue_tracker" as (include the quote marks):
-<blockquote>
-    <tt>"|/usr/bin/python /usr/local/bin/roundup-mailgw &lt;instance_home&gt;"</tt>
-</blockquote>
-
-In some installations (e.g. RedHat 6.2 I think) you'll need to set up smrsh
-so sendmail will accept the pipe command. In that case, symlink
-/etc/smrsh/roundup-mailgw to /usr/local/bin/roundup-mailgw and change the
-command to:
-<blockquote>
-    <tt>|roundup-mailgw &lt;instance_home&gt;</tt>
-</blockquote>
-
-To test the mail gateway on unix systems, try:
-
-<blockquote>
-    <tt>echo test |mail -s '[issue] test' issue_tracker@your.domain</tt>
-</blockquote>
-
-
-<h3>Setup 2: As a regular cron job using a mailbox source</h3>
-Set the roundup-mailgw up to run every 10 minutes or so. For example:
-<blockquote>
- <tt>10 * * * * /usr/local/bin/roundup-mailgw &lt;instance_home&gt; mailbox &lt;mail_spool_file&gt;</tt>
-</blockquote>
-Where the mail_spool_file argument is the location of the roundup
-submission user's mail spool. On most systems, the spool for a user
-"issue_tracker" will be "/var/mail/issue_tracker".
-
-<h3>Setup 3: As a regular cron job using a POP source</h3>
-To retrieve from a POP mailbox, use a similar cron entry to the mailbox
-one:
-<blockquote>
- <tt>10 * * * * /usr/local/bin/roundup-mailgw &lt;instance_home&gt; pop &lt;pop_spec&gt;</tt>
-</blockquote>
-where pop_spec is "username:password@server" that specifies the roundup
-submission user's POP account name, password and server.
-
-<h2><a name="startweb">Web Interface</a></h2>
-This software will work through apache or stand-alone.
-<p>
-<strong>Stand-alone:</strong>
-<ol>
-    <li>Edit roundup-server at the top - ROUNDUP_INSTANCE_HOMES needs to know
-    about your instance. You may also specify the values for
-    ROUNDUP_INSTANCE_HOMES on the command-line using "name=home" pairs.
-    <li><tt>roundup-server [hostname port]</tt>   (hostname may be "")
-    <li>Load up the page <tt>/&lt;instance name&gt;/index</tt> where
-     instance name is the
-     name you nominated in <tt>ROUNDUP_INSTANCE_HOMES</tt>.
-</ol>
-
-<strong>Apache:</strong>
-<ol>
-<li>The CGI script is found in the cgi-bin directory of the roundup
-    distribution.
-</li>
-<li>Make sure roundup.cgi is executable. Edit it at the top -
-    ROUNDUP_INSTANCE_HOMES needs to know about your instance.
-</li>
-<li>Edit your /etc/httpd/conf/httpd.conf and make sure that the
-    /home/httpd/html/roundup/roundup.cgi script will be treated as a CGI
-    script.
-</li>
-<li>Re-start your apache to re-load the config if necessary.
-</li>
-<li>Load up the page "/roundup/roundup.cgi/<instance name>/index" where
-    instance name is the name you nominated in ROUNDUP_INSTANCE_HOMES.
-</li>
-<li>To use the CGI script unchanged, which allows much easier updates,
-    add these directives to your "httpd.conf":
-    <pre>
-        SetEnv ROUNDUP_LOG "/var/log/roundup.log"
-        SetEnv ROUNDUP_INSTANCE_HOMES "Default=/usr/local/share/roundup/instances/Default"
-        SetEnv ROUNDUP_DEBUG "0"
-</pre>
-</li>
-<li>On Windows, write a batch file "roundup.bat" similar to the one below
-    and place it into your cgi-bin directory:
-    <pre>
-        @echo off
-        set ROUNDUP_LOG=c:\Python21\share\roundup\cgi.log
-        set ROUNDUP_INSTANCE_HOMES=Default=c:\Python21\share\roundup\instances\Default;
-        set ROUNDUP_DEBUG=0
-        c:\Python21\python.exe c:\Python21\share\roundup\cgi-bin\roundup.cgi
-</pre>
-</li>
-</ol>
-
-
-
-
-<h2><a name="users">Users</a></h2>
-
-<h3>Users and permissions</h3>
-By default, roundup automatically creates one user when the instance
-database is initialised (using roundup-admin init). The user is "admin" and
-the password is the one you supply at that time.
-<p>
-If users attempt to use roundup in any manner and are not identified to
-roundup, they will be using the database in a read-only mode. That is, if
-roundup doesn't know who they are, they can't change anything. This has the
-following repurcussions:
-<dl>
-<dt><strong>Command-line interface</strong>
-<dd>The data modification commands (create, init, retire, set) are
-performed as the "admin" user. It is therefore important that the database
-be protected by the filesystem if protection is required. On a Unix system,
-the easiest and most flexible method of doing so is:
-<ol>
-<li>Add a new user and group to your system (e.g. "issue_tracker")
-<li>When creating a new instance home, use the following commands
-(substituting instance_home for the directory you want to use):<br>
-<pre>
-mkdir instance_home
-chown issue_tracker:issue_tracker instance_home
-chmod g+rwxs instance_home
-roundup-admin -i instance_home init
-</pre>
-<li>Now, edit the /etc/group line for the issue_tracker group so it includes
-the unix logins of all the users who are going to administer your roundup
-instance. If you're running the web or mail gateways, then be sure to
-include those users in the group too (on some Linux systems, these
-users are "www" or "apache" and "mail".)
-</ol>
-
-<dt><strong>E-Mail interface</strong>
-<dd>Users are identified by e-mail address - a new user entry will be
-created for any e-mail address that is not recognised, so users are
-<em>always</em> identified by roundup.
-<dt><strong>Web interface</strong>
-<dd>Unidentified users have read-only access. If the users database has an
-entry with the username "anonymous", then unidentified users are
-automatically logged in as that user. This gives them write access.
-</dl>
-<p>
-*** anonymous access and the ANONYMOUS_* configuratins.
-
-<h3>Adding users</h3>
-To add users, use one of the following interfaces:
-
-<ol>
-    <li>On the web, access the URL <tt>.../&lt;instance name&gt;/newuser</tt>
-    to bring up a form which may be used to add a new user.
-    <li>On the command-line, use:
-    <br><tt>roundup-admin -i &lt;instance home&gt; create user
-        username=bozo password=bozo address=richard@clown.org</tt>
-    <br>Supply the admin username and password. roundup-admin will print the
-    id of the new user.
-    <li>Any e-mail sent to roundup from an address that doesn't match an
-    existing user in the database will result in a new user entry being
-    created for that user.
-</ol>
-
-
-
-<h2><a name="issues">Issues</a></h2>
-To add issues, use one of the following interfaces:
-
-<ol>
-    <li>On the web, access the URL <tt>.../&lt;instance name&gt;/newissue</tt>
-    to bring up a form which may be used to add a new issue.
-    <li>On the command-line, use:
-    <br><tt>roundup-admin -i &lt;instance home&gt; create issue
-        title="test issue"</tt>
-    <br>Supply the admin username and password. roundup-admin will print the
-    id of the new issue.
-    <li>Any e-mail sent to roundup with the subject line containing [issue]
-    will automatically created a new issue in the database using the
-    contents of the e-mail.
-</ol>
-
-<p><hr>
-<h1><a name="guide">User Guide</a></h1>
-<h2><a name="cmd">Command Line Tool</a></h2>
-
-Usage:
-<tt>roundup-admin [-i instance home] [-u login] [-c] &lt;command&gt;
-    &lt;arguments&gt;</tt>
-
-<p>
-<table><tr><th colspan=2>Options:</th></tr>
-   <tr><td>-i instance home </td><td>specify the issue tracker "home directory" to administer
-   </td></tr>
-   <tr><td>-u               </td><td>the user[:password] to use for commands
-   </td></tr>
-   <tr><td>-c               </td><td>when outputting lists of data, just comma-separate them
-    </td></tr>
-</table>
-
-<p>
-<table width=100% border=1 cellspacing=0>
-<tr><th colspan=2>Command Help</th></tr>
-
-
-<tr><td valign=top><strong>commit</strong></td>
-    <td><tt>Usage: commit</tt><p>
-<pre>
-The changes made during an interactive session are not
-automatically written to the database - they must be committed
-using this command.
-
-One-off commands on the command-line are automatically committed if
-they are successful.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>create</strong></td>
-    <td><tt>Usage: create classname property=value ...</tt><p>
-<pre>
-This creates a new entry of the given class using the property
-name=value arguments provided on the command line after the "create"
-command.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>display</strong></td>
-    <td><tt>Usage: display designator</tt><p>
-<pre>
-This lists the properties and their associated values for the given
-node.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>export</strong></td>
-    <td><tt>Usage: export class[,class] destination_dir</tt><p>
-<pre>
-This action exports the current data from the database into
-tab-separated-value files that are placed in the nominated destination
-directory. The journals are not exported.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>find</strong></td>
-    <td><tt>Usage: find classname propname=value ...</tt><p>
-<pre>
-Find the nodes of the given class with a given link property value. The
-value may be either the nodeid of the linked node, or its key value.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>get</strong></td>
-    <td><tt>Usage: get property designator[,designator]*</tt><p>
-<pre>
-Retrieves the property value of the nodes specified by the designators.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>help</strong></td>
-    <td><tt>Usage: help topic</tt><p>
-<pre>
-commands  -- list commands
-<command> -- help specific to a command
-initopts  -- init command options
-all       -- all available help
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>history</strong></td>
-    <td><tt>Usage: history designator</tt><p>
-<pre>
-Lists the journal entries for the node identified by the designator.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>import</strong></td>
-    <td><tt>Usage: import class file</tt><p>
-<pre>
-The file must define the same properties as the class (including having
-a "header" line with those property names.) The new nodes are added to
-the existing database - if you want to create a new database using the
-imported data, then create a new database (or, tediously, retire all
-the old data.)
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>initialise</strong></td>
-    <td><tt>Usage: initialise [template [backend [admin password]]]</tt><p>
-<pre>
-The command will prompt for the instance home directory (if not supplied
-through INSTANCE_HOME or the -i option. The template, backend and admin
-password may be specified on the command-line as arguments, in that
-order.
-
-See also initopts help.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>list</strong></td>
-    <td><tt>Usage: list classname [property]</tt><p>
-<pre>
-Lists all instances of the given class. If the property is not
-specified, the  "label" property is used. The label property is tried
-in order: the key, "name", "title" and then the first property,
-alphabetically.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>retire</strong></td>
-    <td><tt>Usage: retire designator[,designator]*</tt><p>
-<pre>
-This action indicates that a particular node is not to be retrieved by
-the list or find commands, and its key value may be re-used.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>rollback</strong></td>
-    <td><tt>Usage: rollback</tt><p>
-<pre>
-The changes made during an interactive session are not
-automatically written to the database - they must be committed
-manually. This command undoes all those changes, so a commit
-immediately after would make no changes to the database.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>set</strong></td>
-    <td><tt>Usage: set designator[,designator]* propname=value ...</tt><p>
-<pre>
-Sets the property to the value for all designators given.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>specification</strong></td>
-    <td><tt>Usage: specification classname</tt><p>
-<pre>
-This lists the properties for a given class.
-
-</pre></td></tr>
-
-
-<tr><td valign=top><strong>table</strong></td>
-    <td><tt>Usage: table classname [property[,property]*]</tt><p>
-<pre>
-Lists all instances of the given class. If the properties are not
-specified, all properties are displayed. By default, the column widths
-are the width of the property names. The width may be explicitly defined
-by defining the property as "name:width". For example::
-  roundup> table priority id,name:10
-  Id Name
-  1  fatal-bug 
-  2  bug       
-  3  usability 
-  4  feature   
-
-</pre></td></tr>
-
-</table>
-
-<p>
-All commands (except help) require an instance specifier. This is just the path
-to the roundup instance you're working with. A roundup instance is where 
-roundup keeps the database and configuration file that defines an issue
-tracker. It may be thought of as the issue tracker's "home directory". It may
-be specified in the environment variable ROUNDUP_INSTANCE or on the command
-line as "-i instance".
-
-<p>
-A designator is a classname and a nodeid concatenated, eg. bug1, user10, ...
-
-<p>
-Property values are represented as strings in command arguments and in the
-printed results:
-<ul>
-    <li>Strings are, well, strings.
-    <li>Password values will display as their encoded value.
-    <li>Date values are printed in the full date format in the local time zone, and
-   accepted in the full format or any of the partial formats explained below.
-<table>
-    <tr><th>Input of...</th><th>Means...</th></tr>
-    <tr><td>"2000-04-17.03:45"</td><td>2000-04-17.08:45:00</td></tr>
-    <tr><td>"2000-04-17"</td><td>2000-04-17.00:00:00</td></tr>
-    <tr><td>"01-25"</td><td>yyyy-01-25.00:00:00</td></tr>
-    <tr><td>"08-13.22:13"</td><td>yyyy-08-14.03:13:00</td></tr>
-    <tr><td>"11-07.09:32:43"</td><td>yyyy-11-07.14:32:43</td></tr>
-    <tr><td>"14:25"</td><td>yyyy-mm-dd.19:25:00</td></tr>
-    <tr><td>"8:47:11"</td><td>yyyy-mm-dd.13:47:11</td></tr>
-    <tr><td>"."</td><td>"right now"</td></tr>
-</table>
-   <li>Link values are printed as node designators. When given as an argument,
-   node designators and key strings are both accepted.
-   <li>Multilink values are printed as lists of node designators joined by commas.
-   When given as an argument, node designators and key strings are both
-   accepted; an empty string, a single node, or a list of nodes joined by
-   commas is accepted.
-</ul>
-When multiple nodes are specified to the roundup get or roundup set
-commands, the specified properties are retrieved or set on all the listed
-nodes. 
-<p>
-When multiple results are returned by the roundup get or roundup find
-commands, they are printed one per line (default) or joined by commas (with
-the -c) option. 
-<p>
-Where the command changes data, a login name/password is required. The
-login may be specified as either "name" or "name:password".
-<ul>
-    <li>ROUNDUP_LOGIN environment variable
-    <li>the -u command-line option
-</ul>
-If either the name or password is not supplied, they are obtained from the
-command-line. 
-
-<h2><a name="web">Web Interface</a></h2>
-Index views may be modified by the following arguments:
-<pre>
-    :sort    - sort by prop name, optionally preceeded with '-'
-             to give descending or nothing for ascending sorting.
-    :group   - group by prop name, optionally preceeded with '-' or
-             to sort in descending or nothing for ascending order.
-    :filter  - selects which props should be displayed in the filter
-             section. Default is all.
-    :columns - selects the columns that should be displayed.
-             Default is all.
-    propname - selects the values the node properties given by propname
-             must have (very basic search/filter).
-</pre>
-
-<strong>Not sure what to put in here...</strong>
-
-<h2><a name="mail">E-Mail Gateway</a></h2>
-
-<h3>Performing Actions</h3>
-The subject line of the incoming message is examined to determine whether
-the message is an attempt to create a new item or to discuss an existing
-item. A designator enclosed in square brackets is sought as the first thing
-on the subject line (after skipping any "Fwd:" or "Re:" prefixes). 
-<p>
-If an item designator (class name and id number) is found there, the newly
-created "msg" node is added to the "messages" property for that item, and
-any new "file" nodes are added to the "files" property for the item. 
-<p>
-If just an item class name is found there, we attempt to create a new item
-of that class with its "messages" property initialized to contain the new
-"msg" node and its "files" property initialized to contain any new "file"
-nodes. 
-
-<h3>Setting Properties</h3>
-The e-mail interface also provides a simple way to set
-properties on items.  At the end of the subject line,
-<em>propname</em><tt>=</tt><em>value</em> pairs can be
-specified in square brackets, using the same conventions
-as for the <tt>roundup&nbsp;set</tt> shell command.
-explanatory message given in the exception. 
-
-<h3>Message content</h3>
-Incoming messages are examined for multiple parts:
-<ul>
-<li>In a multipart/mixed message or part, each subpart is extracted and
-   examined. The text/plain subparts are assembled to form the textual
-   body of the message, to be stored in the file associated with a "msg"
-   class node. Any parts of other types are each stored in separate files
-   and given "file" class nodes that are linked to the "msg" node. 
-<li>In a multipart/alternative message or part, we look for a text/plain
-   subpart and ignore the other parts.
-</ul>
-
-<h4>Message summary</h4>
-The "summary" property on message nodes is taken from the first non-quoting
-section in the message body. The message body is divided into sections by
-blank lines. Sections where the second and all subsequent lines begin with
-a "&gt;" or "|" character are considered "quoting sections". The first line of
-the first non-quoting section becomes the summary of the message. 
-
-<h3>Address handling</h3>
-All of the addresses in the To: and Cc: headers of the incoming message are
-looked up among the user nodes, and the corresponding users are placed in
-the "recipients" property on the new "msg" node. The address in the From:
-header similarly determines the "author" property of the new "msg"
-node. The default handling for addresses that don't have corresponding
-users is to create new users with no passwords and a username equal to the
-address. (The web interface does not permit logins for users with no
-passwords.) If we prefer to reject mail from outside sources, we can simply
-register an auditor on the "user" class that prevents the creation of user
-nodes with no passwords. 
-
-<h3>Triggers</h3>
-Both cases may trigger detectors (in the first case we are calling the
-set() method to add the message to the item's spool; in the second case we
-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
-
-<h4>Nosy Lists</h4>
-A standard detector is provided that watches for additions
-to the "messages" property.  When a new message is added, the
-detector sends it to all the users on the "nosy" list for the
-item that are not already on the "recipients" list of the
-message.  Those users are then appended to the "recipients"
-property on the message, so multiple copies of a message
-are never sent to the same user.  The journal recorded by
-the hyperdatabase on the "recipients" property then provides
-a log of when the message was sent to whom.
-
-<p><hr>
-<h1><a name="custom">Customising Roundup</a></h1>
-
-Instances have the following structure:
-<table>
-    <tr><td valign=top><strong>instance_config.py</strong></td>
-    <td>Holds the basic <a href="#config">instance configuration</a></td></tr>
-    <tr><td valign=top><strong>dbinit.py</strong></td>
-       <td>Holds the <a href="#custinst">instance schema</a></td></tr>
-    <tr><td valign=top><strong>interfaces.py</strong></td>
-    <td>Defines the <a href="#custweb">Web</a> and E-Mail interfaces for the instance</td></tr>
-    <tr><td valign=top><strong>select_db.py</strong></td>
-        <td>Selects the database back-end for the instance</td></tr>
-    <tr><td valign=top><strong>db/</strong></td>
-        <td>Holds the instance's database</td></tr>
-    <tr><td valign=top><strong>db/files/</strong></td>
-        <td>Holds the instance's upload files and messages</td></tr>
-    <tr><td valign=top><strong>detectors/</strong></td>
-        <td>Auditors and reactors for this instance</td></tr>
-    <tr><td valign=top><strong>html/</strong></td>
-    <td>Web interface <a href="#custweb">templates</a>, images and style sheets</td></tr>
-</table>
-
-<h2><a name="config">Instance Configuration</a></h2>
-The <tt>instance_config.py</tt> located in your instance home contains the
-basic configuration for the web and e-mail components of roundup's
-interfaces. This file is a Python module. The default
-<tt>instance_config.py</tt> is given below - as you can see, the
-MAIL_DOMAIN must be edited before any interaction with the instance is
-attempted.
-
-<p>
-<pre>
-MAIL_DOMAIN=MAILHOST=HTTP_HOST=None
-HTTP_PORT=0
-
-# roundup home is this package's directory
-INSTANCE_HOME=os.path.split(__file__)[0]
-
-# The SMTP mail host that roundup will use to send mail
-if not MAILHOST:
-    MAILHOST = 'localhost'
-
-# The domain name used for email addresses.
-if not MAIL_DOMAIN:
-    MAIL_DOMAIN = 'fill.me.in.'
-
-# the next two are only used for the standalone HTTP server.
-if not HTTP_HOST:
-    HTTP_HOST = ''
-if not HTTP_PORT:
-    HTTP_PORT = 9080
-
-# This is the directory that the database is going to be stored in
-DATABASE = os.path.join(INSTANCE_HOME, 'db')
-
-# This is the directory that the HTML templates reside in
-TEMPLATES = os.path.join(INSTANCE_HOME, 'html')
-
-# The email address that mail to roundup should go to
-ISSUE_TRACKER_EMAIL = 'issue_tracker@%s'%MAIL_DOMAIN
-
-# The web address that the instance is viewable at
-ISSUE_TRACKER_WEB = 'http://some.useful.url/'
-
-# The email address that roundup will complain to if it runs into trouble
-ADMIN_EMAIL = 'roundup-admin@%s'%MAIL_DOMAIN
-
-# Somewhere for roundup to log stuff internally sent to stdout or stderr
-LOG = os.path.join(INSTANCE_HOME, 'roundup.log')
-
-# Where to place the web filtering HTML on the index page
-FILTER_POSITION = 'bottom'      # one of 'top', 'bottom', 'top and bottom'
-
-# Deny or allow anonymous access to the web interface
-ANONYMOUS_ACCESS = 'deny'
-
-# Deny or allow anonymous users to register through the web interface
-ANONYMOUS_REGISTER = 'deny'
-
-# Send nosy messages to the author of the message
-MESSAGES_TO_AUTHOR = 'no'       # either 'yes' or 'no'
-</pre>
-
-<h2><a name="custinst">Instance Schema</a></h2>
-<b>Note:</b> if you modify the schema, you'll most likely need to
-<a href="#schemarepurcussions">
-web interface to reflect your changes</a>.
-<p>
-An instance schema defines what data is stored in the instance's database.
-The two schemas shipped with Roundup turn it into a typical software bug
-tracker (the extended schema allowing for support issues as well as bugs).
-Schemas are defined using Python code. The "classic" schema looks like
-this:
-<p>
-<pre>
-    pri = Class(db, "priority", name=String(), order=String())
-    pri.setkey("name")
-    pri.create(name="critical", order="1")
-    pri.create(name="urgent", order="2")
-    pri.create(name="bug", order="3")
-    pri.create(name="feature", order="4")
-    pri.create(name="wish", order="5")
-
-    stat = Class(db, "status", name=String(), order=String())
-    stat.setkey("name")
-    stat.create(name="unread", order="1")
-    stat.create(name="deferred", order="2")
-    stat.create(name="chatting", order="3")
-    stat.create(name="need-eg", order="4")
-    stat.create(name="in-progress", order="5")
-    stat.create(name="testing", order="6")
-    stat.create(name="done-cbb", order="7")
-    stat.create(name="resolved", order="8")
-
-    keyword = Class(db, "keyword", name=String())
-    keyword.setkey("name")
-
-    user = Class(db, "user", username=String(), password=String(),
-        address=String(), realname=String(), phone=String(), organisation=String())
-    user.setkey("username")
-    user.create(username="admin", password=adminpw, address=instance_config.ADMIN_EMAIL)
-
-    msg = FileClass(db, "msg", author=Link("user"), recipients=Multilink("user"), 
-        date=Date(), summary=String(), files=Multilink("file"))
-
-    file = FileClass(db, "file", name=String(), type=String())
-
-    issue = IssueClass(db, "issue", assignedto=Link("user"),
-        topic=Multilink("keyword"), priority=Link("priority"), status=Link("status"))
-    issue.setkey('title')
-</pre>
-
-<h3>Classes and Properties - creating a new information store</h3>
-In the instance above, we've defined 7 <em>classes</em> of information:
-<dl>
-    <dt><strong>priority</strong>
-    <dd>Defines the possible levels of urgency for issues.
-    <dt><strong>status</strong>
-    <dd>Defines the possible states of processing the issue may be in.
-    <dt><strong>keyword</strong>
-    <dd>Initially empty, will hold keywords useful for searching issues.
-    <dt><strong>user</strong>
-    <dd>Initially holding the "admin" user, will eventually have an entry
-    for all users using roundup.
-    <dt><strong>msg</strong>
-    <dd>Initially empty, will all e-mail messages sent to or generated by roundup.
-    <dt><strong>file</strong>
-    <dd>Initially empty, will all files attached to issues.
-    <dt><strong>issue</strong>
-    <dd>Initially emtyp, this is where the issue information is stored.
-</dl>
-<p>
-We define the "priority" and "status" classes to allow two things: reduction
-in the amount of information stored on the issue and more powerful, accurate
-searching of issues by priority and status. By only requiring a link on
-the issue (which is stored as a single number) we reduce the chance
-that someone mis-types a priority or status - or simply makes a new one
-up.
-
-<h4>Class and Nodes</h4>
-A <em>Class</em> defines a particular class (or type) of data that will be
-stored in the database. A class comprises one or more properties, which
-given the information about the class nodes.
-<p>
-The actual data entered into the database, using <em>class</em>.create()
-are called <em>nodes</em>. They have a special immutable property called
-id. We sometimes refer to this as the <em>nodeid</em>.
-
-
-<h4>Properties</h4>
-A Class is comprised of one or more <em>properties</em> of the following types:
-
-<ul>
-<li><em>String</em> properties are for storing arbitrary-length
-strings.
-
-<li><em>Password</em> properties are for storing encoded arbitrary-length
-strings. The default encoding is defined on the roundup.password.Password
-class.
-
-<li><em>Date</em> properties store date-and-time stamps.
-Their values are Timestamp objects.
-
-<li>A <em>Link</em> property refers to a single other node
-selected from a specified class.  The class is part of the property;
-the value is an integer, the id of the chosen node.
-
-<li>A <em>Multilink</em> property refers to possibly many nodes
-in a specified class.  The value is a list of integers.
-</ul>
-
-<h4>FileClass</h4>
-FileClasses save their "content" attribute off in a separate file from the
-rest of the database. This reduces the number of large entries in the
-database, which generally makes databases more efficient, and also allows
-us to use command-line tools to operate on the files. They are stored in
-the files sub-directory of the db directory in your instance.
-
-<h4>IssueClass</h4>
-IssueClasses automatically include the "messages", "files", "nosy", and
-"superseder" properties.
-<p>
-The messages and files properties list the links to the messages and files
-related to the issue. The nosy property is a list of links to users who
-wish to be informed of changes to the issue - they get "CC'ed" e-mails when
-messages are sent to or generated by the issue. The nosy reactor (in the
-detectors directory) handles this action. The superceder link indicates an
-issue which has superceded this one.
-<p>
-They also have the dynamically generated
-"creation", "activity" and "creator" properties.
-<p>
-The value of the "creation" property is the date when a node was created,
-and the value of the "activity" property is the date when any property on
-the node was last edited (equivalently, these are the dates on the first
-and last records in the node's journal). The "creator" property holds a
-link to the user that created the issue.
-
-<h4>setkey(property)</h4>
-Select a String property of the class to be the key property. The key
-property muse be unique, and allows references to the nodes in the class by
-the content of the key property. That is, we can refer to users by their
-username, e.g. let's say that there's an issue in roundup, issue 23. There's
-also a user, richard who happens to be user 2. To assign an issue to him,
-we could do either of:
-<p>
-<blockquote><tt>roundup-admin set issue assignedto=2</tt></blockquote>
-<p>
-or
-<p>
-<blockquote><tt>roundup-admin set issue
-        assignedto=richard</tt></blockquote>
-<p>
-Note, the same thing can be done in the web and e-mail interfaces.
-
-<h4>create(information)</h4>
-Create a node in the database. This is generally used to create nodes in
-the "definitional" classes like "priority" and "status".
-
-
-<h2><a name="custweb">Web Interface</a></h2>
-
-The web interface works behind the cgi-bin/roundup.cgi or roundup-server
-scripts. In both cases, the scripts determine which instance is being
-accessed (the first part of the URL path inside the scope of the CGI
-handler) and pass control on to the instance interfaces.Client class which
-handles the rest of the access through its main() method. This means that
-you can do pretty much anything you want as a web interface to your
-instance.
-<p>
-Most customisation of the web view can be done by modifying the templates
-in the instance html directory. These are divided into index, item and
-newitem views. The newitem view is optional - the item view will be used if
-the newitem view doesn't exist.
-
-<h3><a name="schemarepurcussions">Repurcussions of changing the instance schema</a></h3>
-
-If you choose to <a href="custinst">change the instance schema</a> you will need to
-ensure the web interface knows about it:
-<ol>
-<li>Index, item and filter pages for the relevant classes may need to have properties
-added or removed,
-<li>The default page header relies on the existence of, and some values of the
-priority, status, assignedto and activity classes. If you change any of these (specifically
-if you remove any of the classes or their default values) you will need to implement your
-own pagehead() method in your instance's interfaces.py module.
-</ol>
-
-
-<h3>Displaying Properties</h3>
-
-<p>
-Properties appear in the user interface in three contexts:
-in indices, in editors, and as filters.  For each type of
-property, there are several display possibilities.  For example,
-in an index view, a string property may just be printed as
-a plain string, but in an editor view, that property should
-be displayed in an editable field.
-
-<p>
-The display of a property is handled by functions in
-the htmltemplate module.
-
-<p>
-Displayer functions are triggered by <tt>&lt;display&gt;</tt>
-tags in templates.  The <tt>call</tt> attribute of the tag
-provides a Python expression for calling the displayer
-function.  The three standard arguments are inserted in
-front of the arguments given.  For example, the occurrence of
-
-<blockquote><pre><small
->    &lt;display call="plain('status')"&gt;
-</small></pre></blockquote>
-
-in a template triggers a call the "plain" function. The displayer
-functions can accept extra arguments to further specify
-details about the widgets that should be generated.  By defining new
-displayer functions, the user interface can be highly customized.
-
-<p>
-<table border=1 cellspacing=0>
-<tr><th colspan=2>The displayer functions are</th></tr>
-
-<tr><td valign="top"><strong>plain</strong></td>
-<td>Display a String property directly.
-<p>
-Display a Date property in a specified time zone with an option
-to omit the time from the date stamp.
-<p>
-For a Link or Multilink
-property, display the key strings of the linked nodes (or the
-ids if the linked class has no key property).
-<p>
-<em>Options:</em><br>
-escape (boolean) - HTML-escape the resulting text.
-</td></tr>
-
-<tr><td valign="top"><strong>field</strong></td>
-<td>Display a property like the
-<strong>plain</strong> displayer above, but in a form field
-to be edited. Strings, Dates and Intervals use TEXT fields, Links use
-SELECT fields and Multilinks use SELECT MULTIPLE fields.
-<p>
-<em>Options:</em><br>
-size (number) - width of TEXT fields.<br>
-height (number) - number of nows in SELECT MULTIPLE tags.<br>
-showid (boolean) - true includes the id of linked nodes in the SELECT
-MULTIPLE fields.
-</td></tr>
-
-<tr><td valign="top"><strong>menu</strong></td>
-<td>For a Links and Multilinks, display the same field as would be
-generated using <strong>field</strong>.
-</td></tr>
-
-<tr><td valign="top"><strong>link</strong></td>
-<td>For a Link or Multilink property, display the names of the linked
-nodes, hyperlinked to the item views on those nodes.
-<p>
-For other properties, link to this node with the property as the text.
-<p>
-<em>Options:</em><br>
-property (property name) - the property to use in the second case.
-</td></tr>
-
-<tr><td valign="top"><strong>count</strong></td>
-<td>For a Multilink property, display
-a count of the number of links in the list.
-<p>
-<em>Arguments:</em><br>
-property (property name) - the property to use.
-
-</td></tr>
-
-<tr><td valign="top"><strong>reldate</strong></td>
-<td>Display a Date property in terms
-of an interval relative to the current date (e.g. "+ 3w", "- 2d").
-<p>
-<em>Arguments:</em><br>
-property (property name) - the property to use.
-<p>
-<em>Options:</em><br>
-pretty (boolean) - display the relative date in an English form.
-</td></tr>
-
-<tr><td valign="top"><strong>download</strong></td>
-<td>For a Link or Multilink property, display the names of the linked
-nodes, hyperlinked to the item views on those nodes.
-<p>
-For other properties, link to this node with the property as the text.
-<p>
-In all cases, append the name (key property) of the item to the path so it
-is the name of the file being downloaded.
-<p>
-<em>Arguments:</em><br>
-property (property name) - the property to use.
-</td></tr>
-
-<tr><td valign="top"><strong>checklist</strong></td>
-<td>For a Link or Multilink property,
-display checkboxes for the available choices to permit filtering.
-<p>
-<em>Arguments:</em><br>
-property (property name) - the property to use.
-</td></tr>
-
-<tr><td valign="top"><strong>note</strong></td>
-<td>Display the special notes field, which is a text area for entering a
-note to go along with a change.
-</td></tr>
-
-<tr><td valign="top"><strong>list</strong></td>
-<td>List the nodes specified by property using the standard index for
-the class.
-<p>
-<em>Arguments:</em><br>
-property (property name) - the property to use.
-</td></tr>
-
-<tr><td valign="top"><strong>history</strong></td>
-<td>List the history of the item.
-</td></tr>
-
-<tr><td valign="top"><strong>submit</strong></td>
-<td>Add a submit button for the item.
-</td></tr>
-
-</table>
-
-<h3>Index Views</h3>
-
-<p>An index view contains two sections: a filter section
-and an index section.
-The filter section provides some widgets for selecting
-which items appear in the index.  The index section is
-a table of items.
-
-<h4>Index View Specifiers</h4>
-
-<p>An index view specifier (URL fragment) looks like this (whitespace
-has been added for clarity):
-
-<blockquote><pre><small
->/issue?status=unread,in-progress,resolved&amp;
-        topic=security,ui&amp;
-        :group=+priority&amp;
-        :sort=-activity&amp;
-        :filters=status,topic&amp;
-        :columns=title,status,fixer
-</small></pre></blockquote>
-
-<p>The index view is determined by two parts of the
-specifier: the layout part and the filter part.
-The layout part consists of the query parameters that
-begin with colons, and it determines the way that the
-properties of selected nodes are displayed.
-The filter part consists of all the other query parameters,
-and it determines the criteria by which nodes 
-are selected for display.
-
-<p>The filter part is interactively manipulated with
-the form widgets displayed in the filter section.  The
-layout part is interactively manipulated by clicking
-on the column headings in the table.
-
-<p>The filter part selects the <em>union</em> of the
-sets of items with values matching any specified Link
-properties and the <em>intersection</em> of the sets
-of items with values matching any specified Multilink
-properties.
-
-<p>The example specifies an index of "issue" nodes.
-Only items with a "status" of <em>either</em>
-"unread" or "in-progres" or "resolved" are displayed,
-and only items with "topic" values including <em>both</em>
-"security" <em>and</em> "ui" are displayed.  The items
-are grouped by priority, arranged in ascending order;
-and within groups, sorted by activity, arranged in
-descending order.  The filter section shows filters
-for the "status" and "topic" properties, and the
-table includes columns for the "title", "status", and
-"fixer" properties.
-
-<p>Associated with each item class is a default
-layout specifier.  The layout specifier in the above
-example is the default layout to be provided with
-the default bug-tracker schema described above in
-section 4.4.
-
-<h4>Filter Section</h4>
-
-<p>The template for a filter section provides the
-filtering widgets at the top of the index view.
-Fragments enclosed in <tt>&lt;property&gt;</tt>...<tt>&lt;/property&gt;</tt>
-tags are included or omitted depending on whether the
-view specifier requests a filter for a particular property.
-
-<p>A property must appear in the filter template for it to be available
-as a filter.
-
-<p>Here's a simple example of a filter template.
-
-<blockquote><pre><small>&lt;property name=status&gt;
-    &lt;display call="checklist('status')"&gt;
-&lt;/property&gt;
-&lt;br&gt;
-&lt;property name=priority&gt;
-    &lt;display call="checklist('priority')"&gt;
-&lt;/property&gt;
-&lt;br&gt;
-&lt;property name=fixer&gt;
-    &lt;display call="menu('fixer')"&gt;
-&lt;/property&gt;</small></pre></blockquote>
-
-<p>
-The standard index generation code appends a section to the index pages
-which allows selection of the filters - from those which are defined in the
-filter template.
-
-<h4>Index Section</h4>
-
-<p>The template for an index section describes one row of
-the index table.
-Fragments enclosed in <tt>&lt;property&gt;</tt>...<tt>&lt;/property&gt;</tt>
-tags are included or omitted depending on whether the
-view specifier requests a column for a particular property.
-The table cells should contain <tt>&lt;display&gt;</tt> tags
-to display the values of the item's properties.
-
-<p>Here's a simple example of an index template.
-
-<blockquote><pre><small>&lt;tr&gt;
-    &lt;property name=title&gt;
-        &lt;td&gt;&lt;display call="plain('title', max=50)"&gt;&lt;/td&gt;
-    &lt;/property&gt;
-    &lt;property name=status&gt;
-        &lt;td&gt;&lt;display call="plain('status')"&gt;&lt;/td&gt;
-    &lt;/property&gt;
-    &lt;property name=fixer&gt;
-        &lt;td&gt;&lt;display call="plain('fixer')"&gt;&lt;/td&gt;
-    &lt;/property&gt;
-&lt;/tr&gt;</small></pre></blockquote>
-
-<h4>Sorting</h4>
-
-<p>String and Date values are sorted in the natural way.
-Link properties are sorted according to the value of the
-"order" property on the linked nodes if it is present; or
-otherwise on the key string of the linked nodes; or
-finally on the node ids.  Multilink properties are
-sorted according to how many links are present.
-
-<h3>Item Views</h3>
-
-<p>An item view contains an editor section and a spool section.
-At the top of an item view, links to superseding and superseded
-items are always displayed.
-
-
-
-<h4>Editor Section</h4>
-
-<p>The editor section is generated from a template
-containing <tt>&lt;display&gt;</tt> tags to insert
-the appropriate widgets for editing properties.
-
-<p>Here's an example of a basic editor template.
-
-<blockquote><pre><small>&lt;table&gt;
-&lt;tr&gt;
-    &lt;td colspan=2&gt;
-        &lt;display call="field('title', size=60)"&gt;
-    &lt;/td&gt;
-&lt;/tr&gt;
-&lt;tr&gt;
-    &lt;td&gt;
-        &lt;display call="field('fixer', size=30)"&gt;
-    &lt;/td&gt;
-    &lt;td&gt;
-        &lt;display call="menu('status')&gt;
-    &lt;/td&gt;
-&lt;/tr&gt;
-&lt;tr&gt;
-    &lt;td&gt;
-        &lt;display call="field('nosy', size=30)"&gt;
-    &lt;/td&gt;
-    &lt;td&gt;
-        &lt;display call="menu('priority')&gt;
-    &lt;/td&gt;
-&lt;/tr&gt;
-&lt;tr&gt;
-    &lt;td colspan=2&gt;
-        &lt;display call="note()"&gt;
-    &lt;/td&gt;
-&lt;/tr&gt;
-&lt;/table&gt;
-</small></pre></blockquote>
-
-<p>As shown in the example, the editor template can also
-request the display of a "note" field, which is a
-text area for entering a note to go along with a change.
-
-<p>When a change is submitted, the system automatically
-generates a message describing the changed properties.
-
-<p>If a note is given in the "note" field, the note is
-appended to the description.  The message is then added
-to the item's message spool (thus triggering the standard
-detector to react by sending out this message to the nosy list).
-
-<p>
-The message also displays all of the property values on the
-item and indicates which ones have changed.
-An example of such a message might be this:
-
-<blockquote><pre>
-Polly's taken a turn for the worse - this is now really important!
------
-title: Polly Parrot is dead
-priority: critical
-status: unread -&gt; in-progress
-fixer: terry
-keywords: parrot,plumage,perch,nailed,dead
-</pre></blockquote>
-
-<h4>Spool Section</h4>
-
-<p>The spool section lists messages in the item's "messages"
-property.  The index of messages displays the "date", "author",
-and "summary" properties on the message nodes, and selecting a
-message takes you to its content.
-
-<p>The &lt;property&gt; tag used in the index may also be used here -
-it checks to see if the nominated Multilink property has any entries.
-This can be used to eliminate sections of the spool section if the
-property has no entries.
-
-<blockquote><pre>
-&lt;property name="files"&gt;
- &lt;tr class="strong-header"&gt;
-  &lt;td&gt;&lt;b&gt;Files&lt;/b&gt;&lt;/td&gt;
- &lt;/tr&gt;
-
- &lt;tr&gt;            
-  &lt;td&gt;&lt;display call="list('files')"&gt;&lt;/td&gt;
- &lt;/tr&gt;
-&lt;/property&gt;
-</pre></blockquote>
-
-<p><hr>
-<h1><a name="ack">Acknowledgements</a></h1>
-
-Go Ping, you rock! Also, go Bizar Software for letting me implement this
-system on their time.
-
-<p>&nbsp;</p>
-<hr>
-$Id: index.html,v 1.27 2002-01-23 05:10:27 richard Exp $
-<p>&nbsp;</p>
-
-</body></html>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<HTML LANG="en">
+<HEAD>
+<LINK REL="StyleSheet" HREF="default.css" TYPE="text/css"></HEAD>
+<BODY>
+<DIV CLASS="document">
+<P><EM>Roundup: an Issue-Tracking System for Knowledge Workers</EM></P>
+<DIV CLASS="section" ID="id1">
+<H1>Contents</H1>
+<UL>
+<LI>
+<P><A CLASS="reference" HREF="overview.html">Overview</A></P>
+</LI>
+<LI>
+<P><A CLASS="reference" HREF="installation.html">Installation</A></P>
+</LI>
+<LI>
+<P><A CLASS="reference" HREF="getting_started.html">Getting Started</A></P>
+</LI>
+<LI>
+<P><A CLASS="reference" HREF="user_guide.html">User Guide</A></P>
+</LI>
+<LI>
+<P><A CLASS="reference" HREF="customizing.html">Customising Roundup</A></P>
+</LI>
+<LI>
+<P><A CLASS="reference" HREF="spec.html">Roundup's Design Document</A></P>
+</LI>
+</UL>
+</A></A></A></A></A></A></DIV>
+<DIV CLASS="section" ID="id8">
+<H1>Acknowledgements</H1>
+<P>Go Ping, you rock! Also, go Bizar Software and ekit.com for letting me
+implement this system on their time.</P>
+<P>Thanks also to the many people on the mailing list and in the sourceforge
+project: Anthony Baxter, Juergen Hermann, Roch'e Compaan, Engelbert Gruber,
+Titus Brown, Jeff Blaine and Patrick Ohly.</P>
+</DIV>
+</DIV>
+</BODY>
+</HTML>
diff --git a/doc/index.stx b/doc/index.stx
new file mode 100644 (file)
index 0000000..5734cfd
--- /dev/null
@@ -0,0 +1,30 @@
+*Roundup: an Issue-Tracking System for Knowledge Workers*
+
+Contents
+========
+
+- Overview_
+- Installation_
+- `Getting Started`_
+- `User Guide`_
+- `Customising Roundup`_
+- `Roundup's Design Document`_
+
+.. _Overview: overview.html
+.. _Installation: installation.html
+.. _`Getting Started`: getting_started.html
+.. _`User Guide`: user_guide.html
+.. _`Customising Roundup`: customizing.html
+.. _`Roundup's Design Document`: spec.html
+
+
+Acknowledgements
+================
+
+Go Ping, you rock! Also, go Bizar Software and ekit.com for letting me
+implement this system on their time.
+
+Thanks also to the many people on the mailing list and in the sourceforge
+project: Anthony Baxter, Juergen Hermann, Roch'e Compaan, Engelbert Gruber,
+Titus Brown, Jeff Blaine and Patrick Ohly.
+
index d874b5d50e583da0c12bdc8b7d0c6d5370f620ae..17b4c8ad4845fd3aecd5cef02f786fa10c99f2e7 100644 (file)
 
 `Table of contents`_
 
-1. Prerequisites_
-2. `Getting Roundup`_
-3. `Installing Roundup`_
+- Overview_
+- Prerequisites_
 
+  - `Testing your Python`_
+
+- `Getting Roundup`_
+- `Installation`_
+- `Further Reading`_
+- `Platform-Specific Notes`_
+
+Overview
+========
+
+TODO
 
 Prerequisites
--------------
+=============
 
-Python 2.1.1 is required for the correct operation of roundup.
+Python 2.1.1 or newer with a functioning anydbm or bsddb module.
 
 Download the latest version from http://www.python.org/.
 
 
+Testing your Python
+-------------------
+
+Run ``"python -c 'import test;test.go()'"`` and make sure there
+are no errors.  If there are errors, please let us know!
+
+
 Getting Roundup
----------------
+===============
 
 Download the latest version from http://roundup.sf.net/.
 
-Installing Roundup
-------------------
 
-Run:
+Installation
+============
+
+Set aside 15-30 minutes.
+
+Broken out separately, there are several conceptual pieces to a
+Roundup installation:
+
+Roundup support code
+ Installed into your Python install's lib directory
+
+Roundup scripts
+ These include the email gateway, the roundup
+ HTTP server, the roundup administration command-line interface, etc.
+
+Roundup instances
+ Instances consist of core support files, issues
+ (be they bug reports or otherwise), instance configuration file(s),
+ etc.  Roundup instances also adhere to a specific "Template" which
+ defines the fields usable/assignable on a per-issue basis.  A
+ description of the provided templates can be found under the
+ 'TODO' section.
+
+1. To install the Roundup support code into your Python tree and
+   Roundup scripts into /usr/local/bin::
+
+       python setup.py install
+
+   If you would like to place the Roundup scripts in a directory other
+   than ``/usr/local/bin``, use the ``--install-scripts`` option as follows,
+   replacing ``/opt/roundup/bin`` with the location where you would like
+   the scripts to reside::
+
+       python setup.py install --install-scripts=/opt/roundup/bin
+
+2. To create a Roundup instance (necessary to do before you can
+   use the software in any real fashion):
+
+   a. (Optional) If you intend to keep your roundup instances
+      under one top level directory which does not exist yet,
+      you should create that directory now.  Example:
+
+         mkdir /opt/roundup/instances
+
+   b. Either add the Roundup script location to your ``PATH``
+      environment variable or specify the full path to
+      the command in the next step.
+
+  c.  ``roundup-admin init``
+
+      You will be asked a series of questions.  A description of
+      the Roundup-provided templates can be found under TODO::
+
+          Enter instance home: /opt/roundup/instances/support
+          Templates: classic, extended
+          Select template [classic]: classic
+          Back ends: anydbm, bsddb
+          Select backend [anydbm]: anydbm
+          Admin Password:
+                 Confirm:
+
+3. Each instance ideally should have its own UNIX group, so create
+   a UNIX group (edit ``/etc/group`` or your appropriate NIS map if
+   you're using NIS).  To continue with my examples so far, I would
+   create the UNIX group 'support', although the name of the UNIX
+   group does not have to be the same as the instance name.  To this
+   'support' group I then add all of the UNIX usernames who will be
+   working with this Roundup instance.  In addition to 'real' users,
+   the Roundup email gateway will need to have permissions to this
+   area as well, so add the user your mail service runs as to the
+   group.  The UNIX group might then look like::
+
+        support:*:1002:jblaine,samh,geezer,mail
+
+   If you intend to use the web interface (as most people do), you
+   should also add the username your web server runs as to the group.
+   My group now looks like this::
+
+        support:*:1002:jblaine,samh,geezer,mail,apache
+
+4. Configure your new instance by editing the file ``instance_config.py``
+   located in the instance home you specified in step 2c above.  This
+   file is Python code and must adhere to Python syntax rules, but
+   don't be daunted if you do not know Python - it should look pretty
+   straightfoward if you carefully read the comments in the file.
+
+5. There are two supported ways to get emailed issues into the
+   Roundup instance.  You should pick ONE of the following, both
+   of which will continue my example setup from above:
+
+   a. Set up a mail alias called "support" as::
+
+       "|/opt/roundup/bin/roundup-mailgw /opt/roundup/instances/support"
+
+      If you use Sendmail's ``smrsh`` mechanism, please read the notes
+      under 'Platform-Specific Notes'
+
+   b. OR... Configure roundup-mailgw to run every 10 minutes or
+      so via ``cron``.  My cron job would be (these 2 lines all on one
+      line)::
+
+       10 * * * * /opt/roundup/bin/roundup-mailgw
+                /opt/roundup/instances/support /var/mail/support
+
+6. TODO (mention perms)
+
+7. Test the email gateway.  Under most flavors of UNIX, this
+   can be done by::
+
+     echo test | mail -s '[issue] test' support@YOUR_DOMAIN_HERE
+
+TODO (finish)
+
+
+Further Reading
+===============
+
+If you intend to use Roundup with anything other than the defualt
+templates, if you would like to hack on Roundup, or if you would
+like implementation details, you should read 'TODO'
+
+Platform-Specific Notes
+=======================
+
+Sendmail smrsh
+--------------
+
+If you use Sendmail's ``smrsh`` mechanism, you will need to tell
+smrsh that roundup-mailgw is a valid/trusted mail handler
+before it will work.
+
+This is usually done via the following 2 steps:
+
+1. make a symlink in ``/etc/smrsh`` called ``roundup-mailgw``
+   which points to the full path of your actual ``roundup-mailgw``
+   script.
 
-- "``python setup.py install``"
-- If you would prefer the scripts installed in somewhere other than
-  "``/usr/local/bin``", add "``--install-scripts=<dir>``" to the
-  command::
+2. change your alias to ``"|roundup-mailgw <instance_home>"``
 
-     python setup.py install --install-scripts=<dir>
 
-- This command gives all the options available for
-  installation::
+Linux
+-----
 
-      python setup.py install --help
+Python 2.1.1 as shipped with SuSE7.3 might be missing module
+``_weakref``.
 
+-------------------------------------------------------------------------------
 
 Next: `Getting Started`_
 
 .. _`table of contents`: index.html
 .. _`getting started`: getting_started.html
 
-$Id: installation.stx,v 1.1 2002-02-21 06:22:00 richard Exp $
+$Id: installation.stx,v 1.2 2002-03-08 23:41:46 richard Exp $