Code

. #517734 ] web header customisation is obscure
authorrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Thu, 14 Mar 2002 23:59:24 +0000 (23:59 +0000)
committerrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Thu, 14 Mar 2002 23:59:24 +0000 (23:59 +0000)
git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@673 57a73879-2fb5-44c3-a270-3262357dd7e2

CHANGES.txt
roundup/cgi_client.py
roundup/mailgw.py
roundup/scripts/roundup_admin.py
roundup/scripts/roundup_mailgw.py
roundup/scripts/roundup_server.py
roundup/templates/classic/instance_config.py
roundup/templates/extended/instance_config.py

index 7713218a472ba59eab7b3c9c003a51bc85a13009..0800add9b7db09005e42c71d0f25685398630530 100644 (file)
@@ -25,6 +25,7 @@ Feature:
      the id, name and description for the priority class. The description
      field won't exist in most installations, but it will be added to the
      default templates.
+ . #517734 ] web header customisation is obscure
 
 Fixed:
  . Clean up mail handling, multipart handling.
index a79f86a32adff3421795bbc63c4fb6e7f7bb51f0..e6a69c27a0d26db47350001f7068b83b5d8014ed 100644 (file)
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: cgi_client.py,v 1.112 2002-03-12 22:52:26 richard Exp $
+# $Id: cgi_client.py,v 1.113 2002-03-14 23:59:24 richard Exp $
 
 __doc__ = """
 WWW request handler (also used in the stand-alone server).
 """
 
-import os, cgi, StringIO, urlparse, re, traceback, mimetypes
+import os, cgi, StringIO, urlparse, re, traceback, mimetypes, urllib
 import binascii, Cookie, time, random
 
 import roundupdb, htmltemplate, date, hyperdb, password
@@ -58,7 +58,7 @@ class Client:
         port = self.env['SERVER_PORT']
         if port != '80': machine = machine + ':' + port
         self.base = urlparse.urlunparse(('http', env['HTTP_HOST'], url,
-           None, None, None))
+            None, None, None))
 
         if form is None:
             self.form = cgi.FieldStorage(environ=env)
@@ -77,8 +77,8 @@ class Client:
     def header(self, headers=None):
         '''Put up the appropriate header.
         '''
-       if headers is None:
-           headers = {'Content-Type':'text/html'}
+        if headers is None:
+            headers = {'Content-Type':'text/html'}
         if not headers.has_key('Content-Type'):
             headers['Content-Type'] = 'text/html'
         self.request.send_response(200)
@@ -107,36 +107,114 @@ function help_window(helpurl, width, height) {
 
 </script>
 '''
+    def make_index_link(self, name):
+        '''Turn a configuration entry into a hyperlink...
+        '''
+        # get the link label and spec
+        spec = getattr(self.instance, name+'_INDEX')
+
+        d = {}
+        d[':sort'] = ','.join(map(urllib.quote, spec['SORT']))
+        d[':group'] = ','.join(map(urllib.quote, spec['GROUP']))
+        d[':filter'] = ','.join(map(urllib.quote, spec['FILTER']))
+        d[':columns'] = ','.join(map(urllib.quote, spec['COLUMNS']))
+
+        # snarf the filterspec
+        filterspec = spec['FILTERSPEC'].copy()
+
+        # now format the filterspec
+        for k, l in filterspec.items():
+            # fix up the assignedto if needed
+            if k == 'assignedto' and l is None:
+                l = [self.db.user.lookup(self.user)]
+
+            # add
+            d[urllib.quote(k)] = ','.join(map(urllib.quote, l))
+
+        # finally, format the URL
+        return '<a href="%s?%s">%s</a>'%(spec['CLASS'],
+            '&'.join([k+'='+v for k,v in d.items()]), spec['LABEL'])
+
 
     def pagehead(self, title, message=None):
+        '''Display the page heading, with information about the tracker and
+            links to more information
+        '''
+
+        # include any important message
         if message is not None:
             message = _('<div class="system-msg">%(message)s</div>')%locals()
         else:
             message = ''
+
+        # style sheet (CSS)
         style = open(os.path.join(self.instance.TEMPLATES, 'style.css')).read()
+
+        # figure who the user is
         user_name = self.user or ''
-        if self.user == 'admin':
-            admin_links = _(' | <a href="list_classes">Class List</a>' \
-                          ' | <a href="user">User List</a>' \
-                          ' | <a href="newuser">Add User</a>')
-        else:
-            admin_links = ''
-        if self.user not in (None, 'anonymous'):
+        if user_name not in ('', 'anonymous'):
             userid = self.db.user.lookup(self.user)
+        else:
+            userid = None
+
+        # figure all the header links
+        if hasattr(self.instance, 'HEADER_INDEX_LINKS'):
+            links = []
+            for name in self.instance.HEADER_INDEX_LINKS:
+                spec = getattr(self.instance, name + '_INDEX')
+                # skip if we need to fill in the logged-in user id there's
+                # no user logged in
+                if (spec['FILTERSPEC'].has_key('assignedto') and
+                        spec['FILTERSPEC']['assignedto'] is None and
+                        userid is None):
+                    continue
+                links.append(self.make_index_link(name))
+        else:
+            # no config spec - hard-code
+            links = [
+                _('All <a href="issue?status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=-activity&:filter=status&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">Issues</a>'),
+                _('Unassigned <a href="issue?assignedto=-1&status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=-activity&:filter=status,assignedto&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">Issues</a>')
+            ]
+
+        # if they're logged in, include links to their information, and the
+        # ability to add an issue
+        if user_name not in ('', 'anonymous'):
             user_info = _('''
-<a href="issue?assignedto=%(userid)s&status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:filter=status,assignedto&:sort=-activity&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">My Issues</a> |
 <a href="user%(userid)s">My Details</a> | <a href="logout">Logout</a>
 ''')%locals()
+
+            # figure the "add class" links
+            if hasattr(self.instance, 'HEADER_ADD_LINKS'):
+                classes = self.instance.HEADER_ADD_LINKS
+            else:
+                classes = ['issue']
+            l = []
+            for class_name in classes:
+                cap_class = class_name.capitalize()
+                links.append(_('Add <a href="new%(class_name)s">'
+                    '%(cap_class)s</a>')%locals())
+
+            # if there's no config header link spec, force a user link here
+            if not hasattr(self.instance, 'HEADER_INDEX_LINKS'):
+                links.append(_('<a href="issue?assignedto=%(userid)s&status=-1,unread,chatting,open,pending&:filter=status,resolution,assignedto&:sort=-activity&:columns=id,activity,status,resolution,title,creator&:group=type&show_customization=1">My Issues</a>')%locals())
         else:
             user_info = _('<a href="login">Login</a>')
-        if self.user is not None:
-            add_links = _('''
-| Add
-<a href="newissue">Issue</a>
-''')
-        else:
             add_links = ''
+
+        # if the user is admin, include admin links
+        admin_links = ''
+        if user_name == 'admin':
+            links.append(_('<a href="list_classes">Class List</a>'))
+            links.append(_('<a href="user">User List</a>'))
+            links.append(_('<a href="newuser">Add User</a>'))
+
+        # now we have all the links, join 'em
+        links = '\n | '.join(links)
+
+        # include the javascript bit
         global_javascript = self.global_javascript%self.__dict__
+
+        # finally, format the header
         self.write(_('''<html><head>
 <title>%(title)s</title>
 <style type="text/css">%(style)s</style>
@@ -148,12 +226,7 @@ function help_window(helpurl, width, height) {
 <tr class="location-bar"><td><big><strong>%(title)s</strong></big></td>
 <td align=right valign=bottom>%(user_name)s</td></tr>
 <tr class="location-bar">
-<td align=left>All
-<a href="issue?status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=-activity&:filter=status&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">Issues</a>
-| Unassigned
-<a href="issue?assignedto=-1&status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=-activity&:filter=status,assignedto&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">Issues</a>
-%(add_links)s
-%(admin_links)s</td>
+<td align=left>%(links)s</td>
 <td align=right>%(user_info)s</td>
 </table>
 ''')%locals())
@@ -247,15 +320,16 @@ function help_window(helpurl, width, height) {
             
         return visible
 
+    # TODO: make this go away some day...
     default_index_sort = ['-activity']
     default_index_group = ['priority']
     default_index_filter = ['status']
     default_index_columns = ['id','activity','title','status','assignedto']
     default_index_filterspec = {'status': ['1', '2', '3', '4', '5', '6', '7']}
+
     def index(self):
-        ''' put up an index
+        ''' put up an index - no class specified
         '''
-        self.classname = 'issue'
         # see if the web has supplied us with any customisation info
         defaults = 1
         for key in ':sort', ':group', ':filter', ':columns':
@@ -263,18 +337,27 @@ function help_window(helpurl, width, height) {
                 defaults = 0
                 break
         if defaults:
-            # no info supplied - use the defaults
-            sort = self.default_index_sort
-            group = self.default_index_group
-            filter = self.default_index_filter
-            columns = self.default_index_columns
-            filterspec = self.default_index_filterspec
+            # try the instance config first
+            if hasattr(self.instance, 'DEFAULT_INDEX_CLASS'):
+                self.classname = self.instance.DEFAULT_INDEX_CLASS
+                sort = self.instance.DEFAULT_INDEX_SORT
+                group = self.instance.DEFAULT_INDEX_GROUP
+                filter = self.instance.DEFAULT_INDEX_FILTER
+                columns = self.instance.DEFAULT_INDEX_COLUMNS
+                filterspec = self.instance.DEFAULT_INDEX_FILTERSPEC
+
+            else:
+                # nope - fall back on the old way of doing it
+                self.classname = 'issue'
+                sort = self.default_index_sort
+                group = self.default_index_group
+                filter = self.default_index_filter
+                columns = self.default_index_columns
+                filterspec = self.default_index_filterspec
         else:
-            sort = self.index_arg(':sort')
-            group = self.index_arg(':group')
-            filter = self.index_arg(':filter')
-            columns = self.index_arg(':columns')
-            filterspec = self.index_filterspec(filter)
+            # make list() extract the info from the CGI environ
+            self.classname = 'issue'
+            sort = group = filter = columns = filterspec = None
         return self.list(columns=columns, filter=filter, group=group,
             sort=sort, filterspec=filterspec)
 
@@ -536,7 +619,7 @@ function help_window(helpurl, width, height) {
 
         # set status to 'unread' if not specified - a status of '- no
         # selection -' doesn't make sense
-        if not props.has_key('status'):
+        if not props.has_key('status') and cl.getprops().has_key('status'):
             try:
                 unread_id = self.db.status.lookup('unread')
             except KeyError:
@@ -1192,60 +1275,6 @@ class ExtendedClient(Client):
     default_index_columns = ['activity','status','title','assignedto']
     default_index_filterspec = {'status': ['1', '2', '3', '4', '5', '6', '7']}
 
-    def pagehead(self, title, message=None):
-        if message is not None:
-            message = _('<div class="system-msg">%(message)s</div>')%locals()
-        else:
-            message = ''
-        style = open(os.path.join(self.instance.TEMPLATES, 'style.css')).read()
-        user_name = self.user or ''
-        if self.user == 'admin':
-            admin_links = _(' | <a href="list_classes">Class List</a>' \
-                          ' | <a href="user">User List</a>' \
-                          ' | <a href="newuser">Add User</a>')
-        else:
-            admin_links = ''
-        if self.user not in (None, 'anonymous'):
-            userid = self.db.user.lookup(self.user)
-            user_info = _('''
-<a href="issue?assignedto=%(userid)s&status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:filter=status,assignedto&:sort=-activity&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">My Issues</a> |
-<a href="support?assignedto=%(userid)s&status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:filter=status,assignedto&:sort=-activity&:columns=id,activity,status,title,assignedto&:group=customername&show_customization=1">My Support</a> |
-<a href="user%(userid)s">My Details</a> | <a href="logout">Logout</a>
-''')%locals()
-        else:
-            user_info = _('<a href="login">Login</a>')
-        if self.user is not None:
-            add_links = _('''
-| Add
-<a href="newissue">Issue</a>,
-<a href="newsupport">Support</a>,
-''')
-        else:
-            add_links = ''
-        global_javascript = self.global_javascript%self.__dict__
-        self.write(_('''<html><head>
-<title>%(title)s</title>
-<style type="text/css">%(style)s</style>
-</head>
-%(global_javascript)s
-<body bgcolor=#ffffff>
-%(message)s
-<table width=100%% border=0 cellspacing=0 cellpadding=2>
-<tr class="location-bar"><td><big><strong>%(title)s</strong></big></td>
-<td align=right valign=bottom>%(user_name)s</td></tr>
-<tr class="location-bar">
-<td align=left>All
-<a href="issue?status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=activity&:filter=status&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">Issues</a>,
-<a href="support?status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=activity&:filter=status&:columns=id,activity,status,title,assignedto&:group=customername&show_customization=1">Support</a>
-| Unassigned
-<a href="issue?assignedto=-1&status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=-activity&:filter=status,assignedto&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">Issues</a>,
-<a href="support?assignedto=-1&status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=-activity&:filter=status,assignedto&:columns=id,activity,status,title,assignedto&:group=customername&show_customization=1">Support</a>
-%(add_links)s
-%(admin_links)s</td>
-<td align=right>%(user_info)s</td>
-</table>
-''')%locals())
-
 def parsePropsFromForm(db, cl, form, nodeid=0):
     '''Pull properties for the given class out of the form.
     '''
@@ -1327,6 +1356,9 @@ def parsePropsFromForm(db, cl, form, nodeid=0):
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.112  2002/03/12 22:52:26  richard
+# more pychecker warnings removed
+#
 # Revision 1.111  2002/02/25 04:32:21  richard
 # ahem
 #
index 3898051e4aa5b30229f4f77611126b3d190e9aa5..3dbf229ab3294a828e4e87c2f2e7781bfc1db127 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.65 2002-02-15 00:13:38 richard Exp $
+$Id: mailgw.py,v 1.66 2002-03-14 23:59:24 richard Exp $
 '''
 
 
@@ -523,8 +523,8 @@ Unknown address: %s
         #   required body parts.
         #   ACTION: Not handleable as the content is encrypted.
         # multipart/related (rfc 1872, 2112, 2387):
-        #   The Multipart/Related content-type addresses the MIME representation         
-        #   of compound objects.
+        #   The Multipart/Related content-type addresses the MIME
+        #   representation of compound objects.
         #   ACTION: Default. If we are lucky there is a text/plain.
         #   TODO: One should use the start part and look for an Alternative
         #   that is text/plain.
@@ -803,6 +803,11 @@ def parseContent(content, blank_line=re.compile(r'[\r\n]+\s*[\r\n]+'),
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.65  2002/02/15 00:13:38  richard
+#  . #503204 ] mailgw needs a default class
+#     - partially done - the setting of additional properties can wait for a
+#       better configuration system.
+#
 # Revision 1.64  2002/02/14 23:46:02  richard
 # . #516883 ] mail interface + ANONYMOUS_REGISTER
 #
index 9596fe048dd182e7a38a9e809f241d5c42f3c2ac..92d97951df35a97acedf6614d4b662c2f5d9a04f 100644 (file)
@@ -1,5 +1,3 @@
-#! /usr/bin/env python
-#
 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
 # This module is free software, and you may redistribute it and/or modify
 # under the same terms as Python, so long as this copyright message and
@@ -16,7 +14,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: roundup_admin.py,v 1.2 2002-01-29 20:07:15 jhermann Exp $
+# $Id: roundup_admin.py,v 1.3 2002-03-14 23:59:24 richard Exp $
 
 # python version check
 from roundup import version_check
@@ -36,6 +34,9 @@ if __name__ == '__main__':
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.2  2002/01/29 20:07:15  jhermann
+# Conversion to generated script stubs
+#
 # Revision 1.1  2002/01/29 19:53:08  jhermann
 # Moved scripts from top-level dir to roundup.scripts subpackage
 #
index faec3d997cd1b5053957d540ee3b70bb7860971f..65f8a000ac09387b5fad6e734ba3f49eff2d2e54 100644 (file)
@@ -1,5 +1,3 @@
-#! /usr/bin/python
-#
 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
 # This module is free software, and you may redistribute it and/or modify
 # under the same terms as Python, so long as this copyright message and
@@ -16,7 +14,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: roundup_mailgw.py,v 1.2 2002-01-29 20:07:15 jhermann Exp $
+# $Id: roundup_mailgw.py,v 1.3 2002-03-14 23:59:24 richard Exp $
 
 # python version check
 from roundup import version_check
@@ -181,6 +179,9 @@ if __name__ == '__main__':
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.2  2002/01/29 20:07:15  jhermann
+# Conversion to generated script stubs
+#
 # Revision 1.1  2002/01/29 19:53:08  jhermann
 # Moved scripts from top-level dir to roundup.scripts subpackage
 #
index 8cf27047b61eb5fff436e9e48891c153840c5257..cd18a80a28a30c9cbb5cfd3d343feddbe658258e 100644 (file)
@@ -1,5 +1,3 @@
-#!/usr/bin/python
-#
 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
 # This module is free software, and you may redistribute it and/or modify
 # under the same terms as Python, so long as this copyright message and
@@ -18,7 +16,7 @@
 # 
 """ HTTP Server that serves roundup.
 
-$Id: roundup_server.py,v 1.4 2002-02-21 07:02:54 richard Exp $
+$Id: roundup_server.py,v 1.5 2002-03-14 23:59:24 richard Exp $
 """
 
 # python version check
@@ -249,6 +247,9 @@ if __name__ == '__main__':
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.4  2002/02/21 07:02:54  richard
+# The correct var is "HTTP_HOST"
+#
 # Revision 1.3  2002/02/21 06:57:39  richard
 #  . Added popup help for classes using the classhelp html template function.
 #    - add <display call="classhelp('priority', 'id,name,description')">
index 0fe747d99657c30b71e4491309a1c67c5dbe7cd3..d6e76221cd0a66a83b5eb7b65567673d883b40c0 100644 (file)
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: instance_config.py,v 1.12 2002-02-15 00:13:38 richard Exp $
+# $Id: instance_config.py,v 1.13 2002-03-14 23:59:24 richard Exp $
 
 MAIL_DOMAIN=MAILHOST=HTTP_HOST=None
 HTTP_PORT=0
@@ -89,8 +89,66 @@ EMAIL_SIGNATURE_POSITION = 'bottom'
 MAIL_DEFAULT_CLASS = 'issue'   # use "issue" class by default
 #MAIL_DEFAULT_CLASS = ''        # disable (or just comment the var out)
 
+# Define what index links are available in the header, and what their
+# labels are. Each key is used to look up one of the index specifications
+# below - so 'DEFAULT' will use 'DEFAULT_INDEX'.
+# Where the FILTERSPEC has 'assignedto' with a value of None, it will be
+# replaced by the id of the logged-in user.
+HEADER_INDEX_LINKS = ['DEFAULT', 'UNASSIGNED', 'USER']
+
+# list the classes that users are able to add nodes to
+HEADER_ADD_LINKS = ['issue']
+
+# Now the DEFAULT display specification. TODO: describe format
+DEFAULT_INDEX = {
+  'LABEL': 'All Issues',
+  'CLASS': 'issue',
+  'SORT': ['-activity'],
+  'GROUP': ['priority'],
+  'FILTER': ['status'],
+  'COLUMNS': ['id','activity','title','creator','assignedto'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+  },
+}
+
+# The "unsassigned issues" index
+UNASSIGNED_INDEX = {
+  'LABEL': 'Unassigned Issues',
+  'CLASS': 'issue',
+  'SORT': ['-activity'],
+  'GROUP': ['priority'],
+  'FILTER': ['status', 'assignedto'],
+  'COLUMNS': ['id','activity','title','creator','status'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+    'assignedto': ['-1'],
+  },
+}
+
+# The "my issues" index -- note that the user's id will replace the None
+# valud of the "assignedto" filterspec
+USER_INDEX = {
+  'LABEL': 'My Issues',
+  'CLASS': 'issue',
+  'SORT': ['-activity'],
+  'GROUP': ['priority'],
+  'FILTER': ['status', 'assignedto'],
+  'COLUMNS': ['id','activity','title','creator','status'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+    'assignedto': None,
+  },
+}
+
+
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.12  2002/02/15 00:13:38  richard
+#  . #503204 ] mailgw needs a default class
+#     - partially done - the setting of additional properties can wait for a
+#       better configuration system.
+#
 # Revision 1.11  2002/02/14 23:46:02  richard
 # . #516883 ] mail interface + ANONYMOUS_REGISTER
 #
index 89f3268cdc3ed525634b9fdf787a27ee914fa673..b737312cd17dc0b3a139d49934273308e821b9d5 100644 (file)
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: instance_config.py,v 1.12 2002-02-15 00:13:38 richard Exp $
+# $Id: instance_config.py,v 1.13 2002-03-14 23:59:24 richard Exp $
 
 MAIL_DOMAIN=MAILHOST=HTTP_HOST=None
 HTTP_PORT=0
@@ -89,8 +89,103 @@ EMAIL_SIGNATURE_POSITION = 'bottom'
 MAIL_DEFAULT_CLASS = 'issue'   # use "issue" class by default
 #MAIL_DEFAULT_CLASS = ''        # disable (or just comment the var out)
 
+# Define what index links are available in the header, and what their
+# labels are. Each key is used to look up one of the index specifications
+# below - so 'DEFAULT' will use 'DEFAULT_INDEX'.
+# Where the FILTERSPEC has 'assignedto' with a value of None, it will be
+# replaced by the id of the logged-in user.
+HEADER_INDEX_LINKS = ['DEFAULT', 'ALL_SUPPORT', 'UNASSIGNED_ISSUE',
+        'UNASSIGNED_SUPPORT', 'MY_ISSUE', 'MY_SUPPORT']
+
+# list the classes that users are able to add nodes to
+HEADER_ADD_LINKS = ['issue', 'support']
+
+# Now the DEFAULT display specifications. TODO: describe format
+DEFAULT_INDEX = {
+  'LABEL': 'All Issues',
+  'CLASS': 'issue',
+  'SORT': ['-activity'],
+  'GROUP': ['priority'],
+  'FILTER': ['status'],
+  'COLUMNS': ['id','activity','title','creator','assignedto'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+  },
+}
+
+ALL_SUPPORT_INDEX = {
+  'LABEL': 'All Support',
+  'CLASS': 'support',
+  'SORT': ['-activity'],
+  'GROUP': ['customername'],
+  'FILTER': ['status'],
+  'COLUMNS': ['id','activity','title','creator','assignedto'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+  },
+}
+
+# The "unsassigned issues" indexes
+UNASSIGNED_ISSUE_INDEX = {
+  'LABEL': 'Unassigned Issues',
+  'CLASS': 'issue',
+  'SORT': ['-activity'],
+  'GROUP': ['priority'],
+  'FILTER': ['status', 'assignedto'],
+  'COLUMNS': ['id','activity','title','creator','status'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+    'assignedto': ['-1'],
+  },
+}
+UNASSIGNED_SUPPORT_INDEX = {
+  'LABEL': 'Unassigned Support',
+  'CLASS': 'support',
+  'SORT': ['-activity'],
+  'GROUP': ['customername'],
+  'FILTER': ['status', 'assignedto'],
+  'COLUMNS': ['id','activity','title','creator','status'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+    'assignedto': ['-1'],
+  },
+}
+
+# The "my issues" indexes -- note that the user's id will replace the None
+# valud of the "assignedto" filterspec
+MY_ISSUE_INDEX = {
+  'LABEL': 'My Issues',
+  'CLASS': 'issue',
+  'SORT': ['-activity'],
+  'GROUP': ['priority'],
+  'FILTER': ['status', 'assignedto'],
+  'COLUMNS': ['id','activity','title','creator','status'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+    'assignedto': None,
+  },
+}
+
+MY_SUPPORT_INDEX = {
+  'LABEL': 'My Support',
+  'CLASS': 'support',
+  'SORT': ['-activity'],
+  'GROUP': ['customername'],
+  'FILTER': ['status', 'assignedto'],
+  'COLUMNS': ['id','activity','title','creator','status'],
+  'FILTERSPEC': {
+    'status': ['-1', '1', '2', '3', '4', '5', '6', '7'],
+    'assignedto': None,
+  },
+}
+
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.12  2002/02/15 00:13:38  richard
+#  . #503204 ] mailgw needs a default class
+#     - partially done - the setting of additional properties can wait for a
+#       better configuration system.
+#
 # Revision 1.11  2002/02/14 23:46:02  richard
 # . #516883 ] mail interface + ANONYMOUS_REGISTER
 #