Commits

Anonymous committed 278d178

Redesign schema and adjust html templates.

Comments (0)

Files changed (25)

detectors/nosyreaction.py

-#
-# 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
-# disclaimer are retained in their original form.
-#
-# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
-# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
-# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
-# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE.  THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
-# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
-# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
-# 
-#$Id: nosyreaction.py,v 1.4 2005/04/04 08:47:14 richard Exp $
-
 import sets
-
 from roundup import roundupdb, hyperdb
 
 def nosyreaction(db, cl, nodeid, oldvalues):
         "messages" property.
         
         When a new message is added, the detector sends it to all the users on
-        the "nosy" list for the issue that are not already on the "recipients"
+        the "nosy" list for the bug that are not already on the "recipients"
         list of the message.
         
         Those users are then appended to the "recipients" property on the
         # the action was a create, so use all the messages in the create
         messages = cl.get(nodeid, 'messages')
     elif oldvalues.has_key('messages'):
-        # the action was a set (so adding new messages to an existing issue)
+        # the action was a set (so adding new messages to an existing bug)
         m = {}
         for msgid in oldvalues['messages']:
             m[msgid] = 1
         messages = []
-        # figure which of the messages now on the issue weren't there before
+        # figure which of the messages now on the bug weren't there before
         for msgid in cl.get(nodeid, 'messages'):
             if not m.has_key(msgid):
                 messages.append(msgid)
             messages = newvalues['messages']
         else:
             ok = ('yes',)
-            # figure which of the messages now on the issue weren't
+            # figure which of the messages now on the bug weren't
             oldmessages = cl.get(nodeid, 'messages')
             messages = []
             for msgid in newvalues['messages']:
         newvalues['nosy'] = list(new_nosy)
 
 def init(db):
-    db.issue.react('create', nosyreaction)
-    db.issue.react('set', nosyreaction)
-    db.issue.audit('create', updatenosy)
-    db.issue.audit('set', updatenosy)
-
-# vim: set filetype=python ts=4 sw=4 et si
+    db.bug.react('create', nosyreaction)
+    db.bug.react('set', nosyreaction)
+    db.bug.audit('create', updatenosy)
+    db.bug.audit('set', updatenosy)

detectors/statusauditor.py

-# Copyright (c) 2002 ekit.com Inc (http://www.ekit-inc.com/)
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-#   The above copyright notice and this permission notice shall be included in
-#   all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-#
-#$Id: statusauditor.py,v 1.5 2004/03/27 00:01:48 richard Exp $
+def init_status(db, cl, nodeid, newvalues):
+    """ Make sure the status is set on new bugs"""
 
-def chatty(db, cl, nodeid, newvalues):
-    ''' If the issue is currently 'unread', 'resolved', 'done-cbb' or None,
-        then set it to 'chatting'
-    '''
-    # don't fire if there's no new message (ie. chat)
-    if not newvalues.has_key('messages'):
-        return
-    if newvalues['messages'] == cl.get(nodeid, 'messages'):
-        return
-
-    # get the chatting state ID
-    try:
-        chatting_id = db.status.lookup('chatting')
-    except KeyError:
-        # no chatting state, ignore all this stuff
-        return
-
-    # get the current value
-    current_status = cl.get(nodeid, 'status')
-
-    # see if there's an explicit change in this transaction
-    if newvalues.has_key('status'):
-        # yep, skip
-        return
-
-    # determine the id of 'unread', 'resolved' and 'chatting'
-    fromstates = []
-    for state in 'unread resolved done-cbb'.split():
-        try:
-            fromstates.append(db.status.lookup(state))
-        except KeyError:
-            pass
-
-    # ok, there's no explicit change, so check if we are in a state that
-    # should be changed
-    if current_status in fromstates + [None]:
-        # yep, we're now chatting
-        newvalues['status'] = chatting_id
-
-
-def presetunread(db, cl, nodeid, newvalues):
-    ''' Make sure the status is set on new issues
-    '''
     if newvalues.has_key('status') and newvalues['status']:
         return
 
-    # get the unread state ID
-    try:
-        unread_id = db.status.lookup('unread')
-    except KeyError:
-        # no unread state, ignore all this stuff
+    new_id = db.status.lookup('new')
+    newvalues['status'] = new_id
+
+
+def block_resolution(db, cl, nodeid, newvalues):
+    """ If the issue has blockers, don't allow it to be resolved."""
+
+    if nodeid is None:
+        dependencies = []
+    else:
+        dependencies = cl.get(nodeid, 'dependencies')
+    dependencies = newvalues.get('dependencies', dependencies)
+
+    # don't do anything if there's no blockers or the status hasn't
+    # changed
+    if not dependencies or not newvalues.has_key('status'):
         return
 
-    # ok, do it
-    newvalues['status'] = unread_id
+    # format the info
+    u = db.config.TRACKER_WEB
+    s = ', '.join(['<a href="%sbug%s">%s</a>'%(u,id,id) for id in dependencies])
+    if len(dependencies) == 1:
+        s = 'bug %s is'%s
+    else:
+        s = 'bugs %s are'%s
+
+    # ok, see if we're trying to resolve
+    if newvalues.get('status') and newvalues['status'] == db.status.lookup('closed'):
+        raise ValueError, "This bug can't be closed until %s closed."%s
+
+
+def resolve(db, cl, nodeid, newvalues):
+    """Make sure status, resolution, and superseder values match."""
+
+    status_change = newvalues.get('status')
+    status_close = status_change and newvalues['status'] == db.status.lookup('closed')
+
+    # Make sure resolution and superseder get only set when status->close
+    if not status_change or not status_close:
+        if newvalues.get('resolution') or newvalues.get('superseder'):
+            raise ValueError, "resolution and superseder must only be set when a bug is closed"
+
+    # Make sure resolution is set when status->close
+    if status_close:
+        if not newvalues.get('resolution'):
+            raise ValueError, "resolution must be set when a bug is closed"
+
+        # Make sure superseder is set when resolution->duplicate
+        if newvalues['resolution'] == db.resolution.lookup('duplicate'):
+            if not newvalues.get('superseder'):
+                raise ValueError, "please provide a superseder when closing a bug as 'duplicate'"
+
+
+
+def resolve_dependencies(db, cl, nodeid, oldvalues):
+    """ When we resolve an issue that's a blocker, remove it from the
+    blockers list of the issue(s) it blocks."""
+
+    newstatus = cl.get(nodeid,'status')
+
+    # no change?
+    if oldvalues.get('status', None) == newstatus:
+        return
+
+    closed_id = db.status.lookup('closed')
+
+    # interesting?
+    if newstatus != closed_id:
+        return
+
+    # yes - find all the dependend issues, if any, and remove me from
+    # their dependency list
+    bugs = cl.find(dependencies=nodeid)
+    for bugid in bugs:
+        dependencies = cl.get(bugid, 'dependencies')
+        if nodeid in dependencies:
+            dependencies.remove(nodeid)
+            cl.set(bugid, dependencies=dependencies)
 
 
 def init(db):
     # fire before changes are made
-    db.issue.audit('set', chatty)
-    db.issue.audit('create', presetunread)
+    db.bug.audit('create', init_status)
+    db.bug.audit('create', block_resolution)
+    db.bug.audit('set', block_resolution)
+    db.bug.audit('set', resolve)
 
-# vim: set filetype=python ts=4 sw=4 et si
+    # adjust after changes are committed
+    db.bug.react('set', resolve_dependencies)

html/_generic.index.html

-<!-- dollarId: issue.index,v 1.2 2001/07/29 04:07:37 richard Exp dollar-->
-
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title" i18n:translate=""
  ><span tal:replace="python:context._classname.capitalize()"

html/bug.index.html

+<tal:block metal:use-macro="templates/page/macros/icing">
+<title metal:fill-slot="head_title" >
+  <span tal:omit-tag="true" i18n:translate="" >List of bugs</span>
+  <span tal:condition="request/dispname"
+   tal:replace="python:' - %s '%request.dispname"
+  /> - <span tal:replace="config/TRACKER_NAME" />
+</title>
+<span metal:fill-slot="body_title" tal:omit-tag="true">
+  <span tal:omit-tag="true" i18n:translate="" >List of bugs</span>
+  <span tal:condition="request/dispname"
+   tal:replace="python:' - %s' % request.dispname" />
+</span>
+<tal:block metal:fill-slot="content">
+
+<p tal:condition="python:not (context.is_view_ok()
+ or request.user.hasRole('Anonymous'))" i18n:translate="">
+ You are not allowed to view this page.</p>
+
+<p tal:condition="python:not context.is_view_ok()
+ and request.user.hasRole('Anonymous')" i18n:translate="">
+ Please login with your username and password.</p>
+
+<tal:block tal:define="batch request/batch" tal:condition="context/is_view_ok">
+ <table class="list">
+  <tr>
+   <th tal:condition="request/show/severity" i18n:translate="">Severity</th>
+   <th tal:condition="request/show/id" i18n:translate="">ID</th>
+   <th tal:condition="request/show/creation" i18n:translate="">Creation</th>
+   <th tal:condition="request/show/activity" i18n:translate="">Activity</th>
+   <th tal:condition="request/show/actor" i18n:translate="">Actor</th>
+   <th tal:condition="request/show/title" i18n:translate="">Title</th>
+   <th tal:condition="request/show/status" i18n:translate="">Status</th>
+   <th tal:condition="request/show/creator" i18n:translate="">Creator</th>
+   <th tal:condition="request/show/assignee" i18n:translate="">Assigned&nbsp;To</th>
+  </tr>
+ <tal:block tal:repeat="i batch" condition=true>
+  <tr tal:define="group python:[r[1] for r in request.group]"
+      tal:condition="python:group and batch.propchanged(*group)">
+   <th tal:attributes="colspan python:len(request.columns)" class="group">
+    <tal:block tal:repeat="g group">
+     <tal:block tal:content="python:str(i[g]) or '(no %s set)'%g"/>
+    </tal:block>
+   </th>
+  </tr>
+
+  <tr>
+   <td tal:condition="request/show/severity"
+       tal:content="python:i.severity.plain() or default">&nbsp;</td>
+   <td tal:condition="request/show/id" tal:content="i/id">&nbsp;</td>
+   <td class="date" tal:condition="request/show/creation"
+       tal:content="i/creation/reldate">&nbsp;</td>
+   <td class="date" tal:condition="request/show/activity"
+       tal:content="i/activity/reldate">&nbsp;</td>
+   <td class="date" tal:condition="request/show/actor"
+       tal:content="python:i.actor.plain() or default">&nbsp;</td>
+   <td tal:condition="request/show/title">
+    <a tal:attributes="href string:bug${i/id}"
+		tal:content="python:str(i.title.plain(hyperlink=0)) or '[no title]'">title</a>
+   </td>
+   <td tal:condition="request/show/status"
+       tal:content="python:i.status.plain() or default">&nbsp;</td>
+   <td tal:condition="request/show/creator"
+       tal:content="python:i.creator.plain() or default">&nbsp;</td>
+   <td tal:condition="request/show/assignee"
+       tal:content="python:i.assignee.plain() or default">&nbsp;</td>
+  </tr>
+
+ </tal:block>
+
+ <metal:index define-macro="batch-footer">
+ <tr tal:condition="batch">
+  <th tal:attributes="colspan python:len(request.columns)">
+   <table width="100%">
+    <tr class="navigation">
+     <th>
+      <a tal:define="prev batch/previous" tal:condition="prev"
+         tal:attributes="href python:request.indexargs_url(request.classname,
+         {'@startwith':prev.first, '@pagesize':prev.size})"
+         i18n:translate="">&lt;&lt; previous</a>
+      &nbsp;
+     </th>
+     <th i18n:translate=""><span tal:replace="batch/start" i18n:name="start"
+     />..<span tal:replace="python: batch.start + batch.length -1" i18n:name="end"
+     /> out of <span tal:replace="batch/sequence_length" i18n:name="total"
+     /></th>
+     <th>
+      <a tal:define="next batch/next" tal:condition="next"
+         tal:attributes="href python:request.indexargs_url(request.classname,
+         {'@startwith':next.first, '@pagesize':next.size})"
+         i18n:translate="">next &gt;&gt;</a>
+      &nbsp;
+     </th>
+    </tr>
+   </table>
+  </th>
+ </tr>
+ </metal:index>
+</table>
+
+<a tal:attributes="href python:request.indexargs_url('bug',
+            {'@action':'export_csv'})" i18n:translate="">Download as CSV</a>
+
+<form method="get" class="index-controls"
+    tal:attributes="action request/classname">
+
+ <table class="form" tal:define="n_sort python:2">
+  <tal:block tal:repeat="n python:range(n_sort)" tal:condition="batch">
+  <tr tal:define="key python:len(request.sort)>n and request.sort[n]">
+   <th>
+    <tal:block tal:condition="not:n" i18n:translate="">Sort on:</tal:block>
+   </th>
+   <td>
+    <select tal:attributes="name python:'@sort%d'%n">
+     <option value="" i18n:translate="">- nothing -</option>
+     <option tal:repeat="col context/properties"
+             tal:attributes="value col/_name;
+                             selected python:key and col._name == key[1]"
+             tal:content="col/_name"
+             i18n:translate="">column</option>
+    </select>
+   </td>
+   <th i18n:translate="">Descending:</th>
+   <td><input type="checkbox" tal:attributes="name python:'@sortdir%d'%n;
+              checked python:key and key[0] == '-'"/>
+   </td>
+  </tr>
+  </tal:block>
+  <tal:block tal:repeat="n python:range(n_sort)" tal:condition="batch">
+  <tr tal:define="key python:len(request.group)>n and request.group[n]">
+   <th>
+    <tal:block tal:condition="not:n" i18n:translate="">Group on:</tal:block>
+   </th>
+   <td>
+    <select tal:attributes="name python:'@group%d'%n">
+     <option value="" i18n:translate="">- nothing -</option>
+     <option tal:repeat="col context/properties"
+             tal:attributes="value col/_name;
+                             selected python:key and col._name == key[1]"
+             tal:content="col/_name"
+             i18n:translate="">column</option>
+    </select>
+   </td>
+   <th i18n:translate="">Descending:</th>
+   <td><input type="checkbox" tal:attributes="name python:'@groupdir%d'%n;
+              checked python:key and key[0] == '-'"/>
+   </td>
+  </tr>
+  </tal:block>
+  <tr><td colspan="4">
+              <input type="submit" value="Redisplay" i18n:attributes="value"/>
+              <tal:block tal:replace="structure
+                python:request.indexargs_form(sort=0, group=0)" />
+  </td></tr>
+ </table>
+</form>
+
+</tal:block>
+</tal:block>
+</tal:block>

html/bug.item.html

+<tal:block metal:use-macro="templates/page/macros/icing">
+<title metal:fill-slot="head_title">
+<tal:block condition="context/id" i18n:translate=""
+ >Bug <span tal:replace="context/id" i18n:name="id"
+ />: <span tal:replace="context/title" i18n:name="title"
+ /> - <span tal:replace="config/TRACKER_NAME" i18n:name="tracker"
+/></tal:block>
+<tal:block condition="not:context/id" i18n:translate=""
+ >New Bug - <span tal:replace="config/TRACKER_NAME" i18n:name="tracker"
+/></tal:block>
+</title>
+<tal:block metal:fill-slot="body_title">
+ <span tal:condition="python: not (context.id or context.is_edit_ok())"
+  tal:omit-tag="python:1" i18n:translate="">New Bug</span>
+ <span tal:condition="python: not context.id and context.is_edit_ok()"
+  tal:omit-tag="python:1" i18n:translate="">New Bug Editing</span>
+ <span tal:condition="python: context.id and not context.is_edit_ok()"
+  tal:omit-tag="python:1" i18n:translate="">Bug<tal:x
+  replace="context/id" i18n:name="id" /></span>
+ <span tal:condition="python: context.id and context.is_edit_ok()"
+  tal:omit-tag="python:1" i18n:translate="">Bug<tal:x
+  replace="context/id" i18n:name="id" /> Editing</span>
+</tal:block>
+
+<td class="content" metal:fill-slot="content">
+
+<p tal:condition="python:not (context.is_view_ok()
+ or request.user.hasRole('Anonymous'))" i18n:translate="">
+ You are not allowed to view this page.</p>
+
+<p tal:condition="python:not context.is_view_ok()
+ and request.user.hasRole('Anonymous')" i18n:translate="">
+ Please login with your username and password.</p>
+
+<div tal:condition="context/is_view_ok">
+
+<form method="POST" name="itemSynopsis"
+      onSubmit="return submit_once()" enctype="multipart/form-data"
+      tal:attributes="action context/designator">
+
+<fieldset><legend>classification</legend>
+<table class="form">
+<tr>
+ <th class="required" i18n:translate="">Title:</th>
+ <td colspan="5" tal:condition="context/title/is_edit_ok"
+     tal:content="structure python:context.title.field(size=60)">title</td>
+ <td colspan="5" tal:condition="not:context/title/is_edit_ok">
+  <span tal:content="structure context/title/plain"/>
+<!--  <input type="hidden" name="title" tal:attributes="value context/title">-->
+ </td>
+</tr>
+
+<tr>
+ <th class="required" i18n:translate="">
+   <span tal:replace="structure python:db.bug_type.classhelp('id,name,description',label='Type')" />:
+ </th>
+ <td tal:content="structure context/type/menu">type</td>
+ <th i18n:translate="">
+   <span tal:replace="structure python:db.severity.classhelp('id,name,description',label='Severity')" />:
+ </th>
+ <td tal:content="structure context/severity/menu">severity</td>
+ <th></th><td></td>
+</tr>
+
+<tr>
+ <th i18n:translate="">
+   <span tal:replace="structure python:db.component.classhelp('id,name,description',label='Components')" />:
+ </th>
+ <td tal:content="structure context/components/menu">components</td>
+ <th i18n:translate="">
+   <span tal:replace="structure python:db.version.classhelp('id,name,description',label='Versions')" />:
+ </th>
+ <td tal:content="structure context/versions/menu">versions</td>
+ <th i18n:translate="">
+   <span tal:replace="structure python:db.platform.classhelp('id,name,description',label='Platforms')" />:
+ </th>
+ <td tal:content="structure context/platforms/menu">platform</td>
+</tr>
+</table>
+</fieldset>
+
+<fieldset><legend>process</legend>
+<table class="form">
+<tr tal:condition="context/id">
+ <th i18n:translate="">
+   <span tal:replace="structure python:db.status.classhelp('id,name,description',label='Status')" />:
+ </th>
+ <td tal:content="structure context/status/menu">status</td>
+ <th i18n:translate="">Resolution:</th>
+ <td tal:content="structure context/resolution/menu">resolution</td>
+</tr>
+
+<tr tal:condition="context/id">
+ <th>
+  <tal:block i18n:translate="">Dependencies</tal:block>:
+  <span tal:condition="context/dependencies/is_edit_ok"
+        tal:replace="structure python:db.bug.classhelp('id,title', filter='status=0,1', property='dependencies')" />
+ </th>
+ <td>
+  <span tal:replace="structure python:context.dependencies.field(showid=1,size=20)" />
+  <span tal:condition="context/dependencies" tal:repeat="d context/dependencies">
+   <br/>View: <a tal:attributes="href string:bug${d/id}" tal:content="d/id"></a>
+  </span>
+ </td>
+ <th i18n:translate="">
+  <tal:block i18n:translate="">Superseder</tal:block>:
+  <span tal:condition="context/superseder/is_edit_ok"
+        tal:replace="structure python:db.bug.classhelp('id,title', filter='status=0,1', property='superseder')" />
+ </th>
+ <td>
+  <span tal:replace="structure python:context.superseder.field(showid=1, size=20)" />
+  <span tal:condition="context/superseder">
+   <br><span i18n:translate="">View</span>:
+     <a tal:repeat="sup context/superseder"
+        tal:content="python:sup['id'] + ', '*(not repeat['sup'].end)"
+        tal:attributes="href string:bug${sup/id}; title sup/title;"></a>
+  </span>
+ </td>
+ </tr>
+ <tr>
+ <th><tal:block i18n:translate="">Assigned To</tal:block>:</th>
+ <td tal:condition="context/status/is_edit_ok">
+  <select name="assignee">
+   <option value="-1">nobody</option>
+   <tal:block tal:repeat="user db/user/list">
+    <option tal:condition="python:user.hasPermission('Debugger', context._classname)"
+            tal:attributes="value user/id; selected python:user.id == context.assignee"
+            tal:content="user/username"></option>
+   </tal:block>
+  </select>
+ </td>
+ <td tal:condition="not:context/assignee/is_edit_ok">
+  <span tal:replace="structure context/assignee/plain" />
+ </td>
+ <th><tal:block i18n:translate="">Nosy List</tal:block>:
+  <span tal:condition="context/nosy/is_edit_ok"
+        tal:replace="structure python:db.user.classhelp('username,realname,address', property='nosy')" />
+ </th>
+ <td>
+  <span tal:replace="structure context/nosy/field" />
+ </td>
+</tr>
+
+<tr tal:condition="context/is_edit_ok">
+ <th><tal:block i18n:translate="">Change Note</tal:block>:</th>
+ <td colspan="3">
+  <textarea tal:content="request/form/@note/value | default"
+            name="@note" wrap="hard" rows="5" cols="72"></textarea>
+ </td>
+</tr>
+
+<tr tal:condition="context/is_edit_ok">
+ <th><tal:block i18n:translate="">File</tal:block>:</th>
+ <td colspan=3><input type="file" name="@file" size="40"></td>
+</tr>
+</table>
+</fieldset>
+<table class="form">
+<tr tal:condition="context/is_edit_ok">
+ <td>
+  &nbsp;
+  <input type="hidden" name="@template" value="item">
+  <input type="hidden" name="@required" value="title">
+ </td>
+ <td colspan=3>
+  <span tal:replace="structure context/submit">submit button</span>
+  <a tal:condition="context/id" tal:attributes="href context/copy_url"
+   i18n:translate="">Make a copy</a>
+ </td>
+</tr>
+</table>
+</form>
+
+<p tal:condition="context/id" i18n:translate="">
+ Created on <b><tal:x replace="context/creation" i18n:name="creation" /></b>
+ by <b><tal:x replace="context/creator" i18n:name="creator" /></b>,
+ last changed <b><tal:x replace="context/activity" i18n:name="activity" /></b>
+ by <b><tal:x replace="context/actor" i18n:name="actor" /></b>.
+</p>
+
+<table class="files" tal:condition="context/files">
+ <tr><th colspan="5" class="header" i18n:translate="">Files</th></tr>
+ <tr>
+  <th i18n:translate="">File name</th>
+  <th i18n:translate="">Uploaded</th>
+  <th i18n:translate="">Type</th>
+  <th i18n:translate="">Edit</th>
+  <th i18n:translate="">Remove</th>
+ </tr>
+ <tr tal:repeat="file context/files">
+  <td>
+   <a tal:attributes="href file/download_url"
+      tal:content="file/name">dld link</a>
+  </td>
+  <td>
+   <span tal:content="file/creator">creator's name</span>,
+   <span tal:content="file/creation">creation date</span>
+  </td>
+  <td tal:content="file/type" />
+  <td><a tal:condition="file/is_edit_ok"
+          tal:attributes="href string:file${file/id}">edit</a>
+  </td>
+  <td>
+   <form style="padding:0" tal:condition="context/is_edit_ok"
+         tal:attributes="action string:bug${context/id}">
+    <input type="hidden" name="@remove@files" tal:attributes="value file/id">
+    <input type="hidden" name="@action" value="edit">
+    <input type="submit" value="remove" i18n:attributes="value">
+   </form>
+  </td>
+ </tr>
+</table>
+
+<table class="messages" tal:condition="context/messages">
+ <tr><th colspan="4" class="header" i18n:translate="">Messages</th></tr>
+ <tal:block tal:repeat="msg context/messages">
+  <tr>
+   <th><a tal:attributes="href string:msg${msg/id}"
+    i18n:translate="">msg<tal:x replace="msg/id" i18n:name="id" /> (view)</a></th>
+   <th i18n:translate="">Author: <tal:x replace="msg/author"
+       i18n:name="author" /></th>
+   <th i18n:translate="">Date: <tal:x replace="msg/date"
+       i18n:name="date" /></th>
+   <th>
+    <form style="padding:0" tal:condition="context/is_edit_ok"
+          tal:attributes="action string:bug${context/id}">
+     <input type="hidden" name="@remove@messages" tal:attributes="value msg/id">
+     <input type="hidden" name="@action" value="edit">
+     <input type="submit" value="remove" i18n:attributes="value">
+    </form>
+   </th>
+  </tr>
+  <tr>
+   <td colspan="4" class="content">
+    <pre tal:content="structure msg/content/hyperlinked">content</pre>
+   </td>
+  </tr>
+ </tal:block>
+</table>
+
+<tal:block tal:condition="context/id" tal:replace="structure context/history" />
+
+</div>
+
+</td>
+
+</tal:block>

html/bug.search.html

+<tal:block metal:use-macro="templates/page/macros/icing">
+<title metal:fill-slot="head_title" i18n:translate="">Issue searching - <span
+ i18n:name="tracker" tal:replace="config/TRACKER_NAME" /></title>
+<span metal:fill-slot="body_title" tal:omit-tag="python:1"
+ i18n:translate="">Issue searching</span>
+<td class="content" metal:fill-slot="content">
+
+<form method="get" name="itemSynopsis"
+      tal:attributes="action request/classname">
+      
+<table class="form" tal:define="
+   cols python:request.columns or 'id activity title status assignedto'.split();
+   sort_on python:request.sort and request.sort[0] or nothing;
+   sort_desc python:sort_on and sort_on[0] == '-';
+   sort_on python:(sort_on and sort_on[1]) or 'activity';
+   group_on python:request.group and request.group[0] or nothing;
+   group_desc python:group_on and group_on[0] == '-';
+   group_on python:(group_on and group_on[1]) or 'priority';
+
+   search_input templates/page/macros/search_input;
+   search_date templates/page/macros/search_date;
+   column_input templates/page/macros/column_input;
+   sort_input templates/page/macros/sort_input;
+   group_input templates/page/macros/group_input;
+   search_select templates/page/macros/search_select;
+   search_select_translated templates/page/macros/search_select_translated;
+   search_multiselect templates/page/macros/search_multiselect;">
+
+<tr>
+ <th class="header">&nbsp;</th>
+ <th class="header" i18n:translate="">Filter on</th>
+ <th class="header" i18n:translate="">Display</th>
+ <th class="header" i18n:translate="">Sort on</th>
+ <th class="header" i18n:translate="">Group on</th>
+</tr>
+
+<tr tal:define="name string:@search_text">
+  <th i18n:translate="">All text*:</th>
+  <td metal:use-macro="search_input"></td>
+  <td>&nbsp;</td>
+  <td>&nbsp;</td>
+  <td>&nbsp;</td>
+</tr>
+
+<tr tal:define="name string:title">
+  <th i18n:translate="">Title:</th>
+  <td metal:use-macro="search_input"></td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td>&nbsp;</td>
+</tr>
+
+<tr tal:define="name string:id">
+  <th i18n:translate="">ID:</th>
+  <td metal:use-macro="search_input"></td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td>&nbsp;</td>
+</tr>
+
+<tr tal:define="name string:creation">
+  <th i18n:translate="">Creation Date:</th>
+  <td metal:use-macro="search_date"></td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:creator;
+                db_klass string:user;
+                db_content string:username;"
+    tal:condition="db/user/is_view_ok">
+  <th i18n:translate="">Creator:</th>
+  <td metal:use-macro="search_input">
+    <option metal:fill-slot="extra_options" i18n:translate=""
+            tal:attributes="value request/user/id">created by me</option>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:activity">
+  <th i18n:translate="">Activity:</th>
+  <td metal:use-macro="search_date"></td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td>&nbsp;</td>
+</tr>
+
+<tr tal:define="name string:actor;
+                db_klass string:user;
+                db_content string:username;"
+    tal:condition="db/user/is_view_ok">
+  <th i18n:translate="">Actor:</th>
+  <td metal:use-macro="search_input">
+    <option metal:fill-slot="extra_options" i18n:translate=""
+            tal:attributes="value request/user/id">done by me</option>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td>&nbsp;</td>
+</tr>
+
+<tr tal:define="name string:type;
+                db_klass string:bug_type;
+                db_content string:name;">
+  <th i18n:translate="">Type:</th>
+  <td metal:use-macro="search_select_translated">
+    <option metal:fill-slot="extra_options" value="-1" i18n:translate=""
+            tal:attributes="selected python:value == '-1'">not selected</option>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:component;
+                db_klass string:component;
+                db_content string:name;">
+  <th i18n:translate="">Components:</th>
+  <td metal:use-macro="search_select_translated">
+    <option metal:fill-slot="extra_options" value="-1" i18n:translate=""
+            tal:attributes="selected python:value == '-1'">not selected</option>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:platform;
+                db_klass string:platform;
+                db_content string:name;">
+  <th i18n:translate="">Platforms:</th>
+  <td metal:use-macro="search_select_translated">
+    <option metal:fill-slot="extra_options" value="-1" i18n:translate=""
+            tal:attributes="selected python:value == '-1'">not selected</option>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:version;
+                db_klass string:version;
+                db_content string:name;">
+  <th i18n:translate="">Versions:</th>
+  <td metal:use-macro="search_select_translated">
+    <option metal:fill-slot="extra_options" value="-1" i18n:translate=""
+            tal:attributes="selected python:value == '-1'">not selected</option>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:severity;
+                db_klass string:severity;
+                db_content string:name;">
+  <th i18n:translate="">Severity:</th>
+  <td metal:use-macro="search_select_translated">
+    <option metal:fill-slot="extra_options" value="-1" i18n:translate=""
+            tal:attributes="selected python:value == '-1'">not selected</option>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:dependencies;
+                db_klass string:bug;
+                db_content string:id;">
+  <th i18n:translate="">Depends on:</th>
+  <td metal:use-macro="search_select_translated">
+    <option metal:fill-slot="extra_options" value="-1" i18n:translate=""
+            tal:attributes="selected python:value == '-1'">not selected</option>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:assignee;
+                db_klass string:user;
+                db_content string:username;"
+    tal:condition="db/user/is_view_ok">
+  <th i18n:translate="">Assigned to:</th>
+  <td metal:use-macro="search_input">
+    <tal:block metal:fill-slot="extra_options">
+      <option tal:attributes="value request/user/id"
+       i18n:translate="">assigned to me</option>
+      <option value="-1" tal:attributes="selected python:value == '-1'"
+       i18n:translate="">unassigned</option>
+    </tal:block>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr tal:define="name string:status;
+                db_klass string:status;
+                db_content string:name;">
+  <th i18n:translate="">Status:</th>
+  <td metal:use-macro="search_select_translated">
+    <tal:block metal:fill-slot="extra_options">
+      <option value="-1,1,2" i18n:translate=""
+              tal:attributes="selected python:value == '-1,1,2'">not closed</option>
+      <option value="-1" i18n:translate=""
+              tal:attributes="selected python:value == '-1'">not selected</option>
+    </tal:block>
+  </td>
+  <td metal:use-macro="column_input"></td>
+  <td metal:use-macro="sort_input"></td>
+  <td metal:use-macro="group_input"></td>
+</tr>
+
+<tr>
+ <th i18n:translate="">No Sort or group:</th>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td><input type="radio" name="@sort" value=""/></td>
+ <td><input type="radio" name="@group" value=""/></td>
+</tr>
+
+<tr>
+<th i18n:translate="">Pagesize:</th>
+<td><input name="@pagesize" size="3" value="50"
+           tal:attributes="value request/form/@pagesize/value | default"/></td>
+</tr>
+
+<tr>
+<th i18n:translate="">Start With:</th>
+<td><input name="@startwith" size="3" value="0"
+           tal:attributes="value request/form/@startwith/value | default"/></td>
+</tr>
+
+<tr>
+<th i18n:translate="">Sort Descending:</th>
+<td><input type="checkbox" name="@sortdir"
+           tal:attributes="checked sort_desc"/>
+</td>
+</tr>
+
+<tr>
+<th i18n:translate="">Group Descending:</th>
+<td><input type="checkbox" name="@groupdir"
+           tal:attributes="checked group_desc"/>
+</td>
+</tr>
+
+<tr tal:condition="python:request.user.hasPermission('Edit', 'query')">
+ <th i18n:translate="">Query name**:</th>
+ <td tal:define="value request/form/@queryname/value | nothing">
+  <input name="@queryname" tal:attributes="value value"/>
+  <input type="hidden" name="@old-queryname" tal:attributes="value value"/>
+ </td>
+</tr>
+
+<tr>
+  <td>
+   &nbsp;
+   <input type="hidden" name="@action" value="search"/>
+  </td>
+  <td><input type="submit" value="Search" i18n:attributes="value"/></td>
+</tr>
+
+<tr><td>&nbsp;</td>
+ <td colspan="4" class="help">
+  <span i18n:translate="" tal:omit-tag="true">
+   *: The "all text" field will look in message bodies and bug titles
+  </span><br>
+  <span tal:condition="python:request.user.hasPermission('Edit', 'query')"
+   i18n:translate="" tal:omit-tag="true"
+  >
+   **: If you supply a name, the query will be saved off and available as a
+       link in the sidebar
+  </span>
+ </td>
+</tr>
+</table>
+
+</form>
+</td>
+
+</tal:block>

html/file.index.html

-<!-- dollarId: file.index,v 1.4 2002/01/23 05:10:27 richard Exp dollar-->
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title" i18n:translate=""
  >List of files - <span tal:replace="config/TRACKER_NAME" i18n:name="tracker" /></title>
   <td tal:content="file/creation">creation date</td>
  </tr>
 
- <metal:block use-macro="templates/issue.index/macros/batch-footer" />
+ <metal:block use-macro="templates/bug.index/macros/batch-footer" />
 
 </table>
 
 <!--
  This is the default body that is displayed when people visit the
- tracker. The tag below lists the currently open issues. You may
+ tracker. The tag below lists the currently open bugs. You may
  replace it with a greeting message, or a different list of issues or
  whatever. It's a good idea to have the issues on the front page though
 -->
-<span tal:replace="structure python:db.issue.renderWith('index',
-    sort=[('-', 'activity')], group=[('+', 'priority')], filter=['status'],
-    columns=['id','activity','title','creator','assignedto', 'status'],
+<span tal:replace="structure python:db.bug.renderWith('index',
+    sort=[('-', 'activity')], group=[('+', 'severity')], filter=['status'],
+    columns=['id','activity','title','creator','assignee', 'status'],
     filterspec={'status':['1','2']})" />
-<!-- SHA: 1fdaa3238149b4381d19a45a81deb6075de7d0e9 -->

html/issue.index.html

-<!-- $Id: issue.index.html,v 1.27 2006/11/09 01:26:28 richard Exp $ -->
-<tal:block metal:use-macro="templates/page/macros/icing">
-<title metal:fill-slot="head_title" >
-  <span tal:omit-tag="true" i18n:translate="" >List of issues</span>
-  <span tal:condition="request/dispname"
-   tal:replace="python:' - %s '%request.dispname"
-  /> - <span tal:replace="config/TRACKER_NAME" />
-</title>
-<span metal:fill-slot="body_title" tal:omit-tag="true">
-  <span tal:omit-tag="true" i18n:translate="" >List of issues</span>
-  <span tal:condition="request/dispname"
-   tal:replace="python:' - %s' % request.dispname" />
-</span>
-<td class="content" metal:fill-slot="content">
-
-<p tal:condition="python:not (context.is_view_ok()
- or request.user.hasRole('Anonymous'))" i18n:translate="">
- You are not allowed to view this page.</p>
-
-<p tal:condition="python:not context.is_view_ok()
- and request.user.hasRole('Anonymous')" i18n:translate="">
- Please login with your username and password.</p>
-
-<tal:block tal:define="batch request/batch" tal:condition="context/is_view_ok">
- <table class="list">
-  <tr>
-   <th tal:condition="request/show/priority" i18n:translate="">Priority</th>
-   <th tal:condition="request/show/id" i18n:translate="">ID</th>
-   <th tal:condition="request/show/creation" i18n:translate="">Creation</th>
-   <th tal:condition="request/show/activity" i18n:translate="">Activity</th>
-   <th tal:condition="request/show/actor" i18n:translate="">Actor</th>
-   <th tal:condition="request/show/topic" i18n:translate="">Topic</th>
-   <th tal:condition="request/show/title" i18n:translate="">Title</th>
-   <th tal:condition="request/show/status" i18n:translate="">Status</th>
-   <th tal:condition="request/show/creator" i18n:translate="">Creator</th>
-   <th tal:condition="request/show/assignedto" i18n:translate="">Assigned&nbsp;To</th>
-  </tr>
- <tal:block tal:repeat="i batch" condition=true>
-  <tr tal:define="group python:[r[1] for r in request.group]"
-      tal:condition="python:group and batch.propchanged(*group)">
-   <th tal:attributes="colspan python:len(request.columns)" class="group">
-    <tal:block tal:repeat="g group">
-     <tal:block tal:content="python:str(i[g]) or '(no %s set)'%g"/>
-    </tal:block>
-   </th>
-  </tr>
-
-  <tr>
-   <td tal:condition="request/show/priority"
-       tal:content="python:i.priority.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/id" tal:content="i/id">&nbsp;</td>
-   <td class="date" tal:condition="request/show/creation"
-       tal:content="i/creation/reldate">&nbsp;</td>
-   <td class="date" tal:condition="request/show/activity"
-       tal:content="i/activity/reldate">&nbsp;</td>
-   <td class="date" tal:condition="request/show/actor"
-       tal:content="python:i.actor.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/topic"
-       tal:content="python:i.topic.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/title">
-    <a tal:attributes="href string:issue${i/id}"
-		tal:content="python:str(i.title.plain(hyperlink=0)) or '[no title]'">title</a>
-   </td>
-   <td tal:condition="request/show/status"
-       tal:content="python:i.status.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/creator"
-       tal:content="python:i.creator.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/assignedto"
-       tal:content="python:i.assignedto.plain() or default">&nbsp;</td>
-  </tr>
-
- </tal:block>
-
- <metal:index define-macro="batch-footer">
- <tr tal:condition="batch">
-  <th tal:attributes="colspan python:len(request.columns)">
-   <table width="100%">
-    <tr class="navigation">
-     <th>
-      <a tal:define="prev batch/previous" tal:condition="prev"
-         tal:attributes="href python:request.indexargs_url(request.classname,
-         {'@startwith':prev.first, '@pagesize':prev.size})"
-         i18n:translate="">&lt;&lt; previous</a>
-      &nbsp;
-     </th>
-     <th i18n:translate=""><span tal:replace="batch/start" i18n:name="start"
-     />..<span tal:replace="python: batch.start + batch.length -1" i18n:name="end"
-     /> out of <span tal:replace="batch/sequence_length" i18n:name="total"
-     /></th>
-     <th>
-      <a tal:define="next batch/next" tal:condition="next"
-         tal:attributes="href python:request.indexargs_url(request.classname,
-         {'@startwith':next.first, '@pagesize':next.size})"
-         i18n:translate="">next &gt;&gt;</a>
-      &nbsp;
-     </th>
-    </tr>
-   </table>
-  </th>
- </tr>
- </metal:index>
-</table>
-
-<a tal:attributes="href python:request.indexargs_url('issue',
-            {'@action':'export_csv'})" i18n:translate="">Download as CSV</a>
-
-<form method="GET" class="index-controls"
-    tal:attributes="action request/classname">
-
- <table class="form" tal:define="n_sort python:2">
-  <tal:block tal:repeat="n python:range(n_sort)" tal:condition="batch">
-  <tr tal:define="key python:len(request.sort)>n and request.sort[n]">
-   <th>
-    <tal:block tal:condition="not:n" i18n:translate="">Sort on:</tal:block>
-   </th>
-   <td>
-    <select tal:attributes="name python:'@sort%d'%n">
-     <option value="" i18n:translate="">- nothing -</option>
-     <option tal:repeat="col context/properties"
-             tal:attributes="value col/_name;
-                             selected python:key and col._name == key[1]"
-             tal:content="col/_name"
-             i18n:translate="">column</option>
-    </select>
-   </td>
-   <th i18n:translate="">Descending:</th>
-   <td><input type="checkbox" tal:attributes="name python:'@sortdir%d'%n;
-              checked python:key and key[0] == '-'">
-   </td>
-  </tr>
-  </tal:block>
-  <tal:block tal:repeat="n python:range(n_sort)" tal:condition="batch">
-  <tr tal:define="key python:len(request.group)>n and request.group[n]">
-   <th>
-    <tal:block tal:condition="not:n" i18n:translate="">Group on:</tal:block>
-   </th>
-   <td>
-    <select tal:attributes="name python:'@group%d'%n">
-     <option value="" i18n:translate="">- nothing -</option>
-     <option tal:repeat="col context/properties"
-             tal:attributes="value col/_name;
-                             selected python:key and col._name == key[1]"
-             tal:content="col/_name"
-             i18n:translate="">column</option>
-    </select>
-   </td>
-   <th i18n:translate="">Descending:</th>
-   <td><input type="checkbox" tal:attributes="name python:'@groupdir%d'%n;
-              checked python:key and key[0] == '-'">
-   </td>
-  </tr>
-  </tal:block>
-  <tr><td colspan="4">
-              <input type="submit" value="Redisplay" i18n:attributes="value"/>
-              <tal:block tal:replace="structure
-                python:request.indexargs_form(sort=0, group=0)" />
-  </td></tr>
- </table>
-</form>
-
-</tal:block>
-
-</td>
-</tal:block>

html/issue.item.html

-<!-- dollarId: issue.item,v 1.4 2001/08/03 01:19:43 richard Exp dollar-->
-<tal:block metal:use-macro="templates/page/macros/icing">
-<title metal:fill-slot="head_title">
-<tal:block condition="context/id" i18n:translate=""
- >Issue <span tal:replace="context/id" i18n:name="id"
- />: <span tal:replace="context/title" i18n:name="title"
- /> - <span tal:replace="config/TRACKER_NAME" i18n:name="tracker"
-/></tal:block>
-<tal:block condition="not:context/id" i18n:translate=""
- >New Issue - <span tal:replace="config/TRACKER_NAME" i18n:name="tracker"
-/></tal:block>
-</title>
-<tal:block metal:fill-slot="body_title">
- <span tal:condition="python: not (context.id or context.is_edit_ok())"
-  tal:omit-tag="python:1" i18n:translate="">New Issue</span>
- <span tal:condition="python: not context.id and context.is_edit_ok()"
-  tal:omit-tag="python:1" i18n:translate="">New Issue Editing</span>
- <span tal:condition="python: context.id and not context.is_edit_ok()"
-  tal:omit-tag="python:1" i18n:translate="">Issue<tal:x
-  replace="context/id" i18n:name="id" /></span>
- <span tal:condition="python: context.id and context.is_edit_ok()"
-  tal:omit-tag="python:1" i18n:translate="">Issue<tal:x
-  replace="context/id" i18n:name="id" /> Editing</span>
-</tal:block>
-
-<td class="content" metal:fill-slot="content">
-
-<p tal:condition="python:not (context.is_view_ok()
- or request.user.hasRole('Anonymous'))" i18n:translate="">
- You are not allowed to view this page.</p>
-
-<p tal:condition="python:not context.is_view_ok()
- and request.user.hasRole('Anonymous')" i18n:translate="">
- Please login with your username and password.</p>
-
-<div tal:condition="context/is_view_ok">
-
-<p tal:condition="python: context.id and context.imported_from_sf">
-   <a tal:attributes="href
-     python:'http://sourceforge.net/support/tracker.php?aid='+context.id;">
-     Sourceforge tracker item</a> (for comparison)
-</p>
-
-<form method="POST" name="itemSynopsis"
-      onSubmit="return submit_once()" enctype="multipart/form-data"
-      tal:attributes="action context/designator">
-
-<table class="form">
-<tr>
- <th class="required" i18n:translate="">Title</th>
- <td colspan=3 tal:content="structure python:context.title.field(size=60)">title</td>
-</tr>
-
-<tr>
- <th i18n:translate="">
-   <span tal:replace="structure python:db.group.classhelp('id,name,description',label='Group')" />
- </th>
- <td tal:content="structure context/group/menu">group</td>
- <th class="required" i18n:translate="">Priority</th>
- <td tal:content="structure context/priority/menu">priority</td>
-</tr>
-
-<tr>
- <th i18n:translate="">
-   <span tal:replace="structure python:db.status.classhelp('id,name,description',label='Status')" />
- </th>
- <td tal:content="structure context/status/menu">status</td>
- <th i18n:translate="">Resolution</th>
- <td tal:content="structure context/resolution/menu">resolution</td>
-</tr>
-
-<tr>
- <th i18n:translate="">Superseder</th>
- <td>
-  <span tal:replace="structure python:context.superseder.field(showid=1, size=20)" />
-  <span tal:condition="context/is_edit_ok" tal:replace="structure python:db.issue.classhelp('id,title', property='superseder')" />
-  <span tal:condition="context/superseder">
-   <br><span i18n:translate="">View:</span>
-     <a tal:repeat="sup context/superseder"
-        tal:content="python:sup['id'] + ', '*(not repeat['sup'].end)"
-        tal:attributes="href string:issue${sup/id};
-                        title sup/title;"></a>
-  </span>
- </td>
- <th i18n:translate="">Nosy List</th>
- <td>
-  <span tal:replace="structure context/nosy/field" />
-  <span tal:condition="context/is_edit_ok" tal:replace="structure
-python:db.user.classhelp('username,realname,address', property='nosy', width='600')" /><br>
- </td>
-</tr>
-
-<tr>
- <th i18n:translate="">Assigned To</th>
- <td tal:content="structure context/assignedto/menu">assignedto field</td>
- <th i18n:translate="">Topics</th>
- <td>
-  <span tal:replace="structure context/topic/field" />
-  <span tal:condition="context/is_edit_ok" tal:replace="structure python:db.keyword.classhelp(property='topic')" />
- </td>
-</tr>
-
-<tr tal:condition="context/is_edit_ok">
- <th i18n:translate="">Change Note</th>
- <td colspan=3>
-  <textarea tal:content="request/form/@note/value | default"
-            name="@note" wrap="hard" rows="5" cols="72"></textarea>
- </td>
-</tr>
-
-<tr tal:condition="context/is_edit_ok">
- <th i18n:translate="">File</th>
- <td colspan=3><input type="file" name="@file" size="40"></td>
-</tr>
-
-<tr tal:condition="context/is_edit_ok">
- <td>
-  &nbsp;
-  <input type="hidden" name="@template" value="item">
-  <input type="hidden" name="@required" value="title,priority">
- </td>
- <td colspan=3>
-  <span tal:replace="structure context/submit">submit button</span>
-  <a tal:condition="context/id" tal:attributes="href context/copy_url"
-   i18n:translate="">Make a copy</a>
- </td>
-</tr>
-
-</table>
-</form>
-
-<tal:block tal:condition="not:context/id" i18n:translate="">
-<table class="form">
-<tr>
- <td>Note:&nbsp;</td>
- <th class="required">highlighted</th>
- <td>&nbsp;fields are required.</td>
-</tr>
-</table>
-</tal:block>
-
-<p tal:condition="context/id" i18n:translate="">
- Created on <b><tal:x replace="context/creation" i18n:name="creation" /></b>
- by <b><tal:x replace="context/creator" i18n:name="creator" /></b>,
- last changed <b><tal:x replace="context/activity" i18n:name="activity" /></b>
- by <b><tal:x replace="context/actor" i18n:name="actor" /></b>.
-</p>
-
-<table class="files" tal:condition="context/files">
- <tr><th colspan="5" class="header" i18n:translate="">Files</th></tr>
- <tr>
-  <th i18n:translate="">File name</th>
-  <th i18n:translate="">Uploaded</th>
-  <th i18n:translate="">Type</th>
-  <th i18n:translate="">Edit</th>
-  <th i18n:translate="">Remove</th>
- </tr>
- <tr tal:repeat="file context/files">
-  <td>
-   <a tal:attributes="href file/download_url"
-      tal:content="file/name">dld link</a>
-  </td>
-  <td>
-   <span tal:content="file/creator">creator's name</span>,
-   <span tal:content="file/creation">creation date</span>
-  </td>
-  <td tal:content="file/type" />
-  <td><a tal:condition="file/is_edit_ok"
-          tal:attributes="href string:file${file/id}">edit</a>
-  </td>
-  <td>
-   <form style="padding:0" tal:condition="context/is_edit_ok"
-         tal:attributes="action string:issue${context/id}">
-    <input type="hidden" name="@remove@files" tal:attributes="value file/id">
-    <input type="hidden" name="@action" value="edit">
-    <input type="submit" value="remove" i18n:attributes="value">
-   </form>
-  </td>
- </tr>
-</table>
-
-<table class="messages" tal:condition="context/messages">
- <tr><th colspan="4" class="header" i18n:translate="">Messages</th></tr>
- <tal:block tal:repeat="msg context/messages">
-  <tr>
-   <th><a tal:attributes="href string:msg${msg/id}"
-    i18n:translate="">msg<tal:x replace="msg/id" i18n:name="id" /> (view)</a></th>
-   <th i18n:translate="">Author: <tal:x replace="msg/author"
-       i18n:name="author" /></th>
-   <th i18n:translate="">Date: <tal:x replace="msg/date"
-       i18n:name="date" /></th>
-   <th>
-    <form style="padding:0" tal:condition="context/is_edit_ok"
-          tal:attributes="action string:issue${context/id}">
-     <input type="hidden" name="@remove@messages" tal:attributes="value msg/id">
-     <input type="hidden" name="@action" value="edit">
-     <input type="submit" value="remove" i18n:attributes="value">
-    </form>
-   </th>
-  </tr>
-  <tr>
-   <td colspan="4" class="content">
-    <pre tal:content="structure msg/content/hyperlinked">content</pre>
-   </td>
-  </tr>
- </tal:block>
-</table>
-
-<tal:block tal:condition="context/id" tal:replace="structure context/history" />
-
-</div>
-
-</td>
-
-</tal:block>
-<!-- SHA: 52e1c51e8d17b8e8dd4ff54055b4f87ef0aa13bc -->

html/issue.search.html

-<tal:block metal:use-macro="templates/page/macros/icing">
-<title metal:fill-slot="head_title" i18n:translate="">Issue searching - <span
- i18n:name="tracker" tal:replace="config/TRACKER_NAME" /></title>
-<span metal:fill-slot="body_title" tal:omit-tag="python:1"
- i18n:translate="">Issue searching</span>
-<td class="content" metal:fill-slot="content">
-
-<form method="get" name="itemSynopsis"
-      tal:attributes="action request/classname">
-      
-<table class="form" tal:define="
-   cols python:request.columns or 'id activity title status assignedto'.split();
-   sort_on python:request.sort and request.sort[0] or nothing;
-   sort_desc python:sort_on and sort_on[0] == '-';
-   sort_on python:(sort_on and sort_on[1]) or 'activity';
-   group_on python:request.group and request.group[0] or nothing;
-   group_desc python:group_on and group_on[0] == '-';
-   group_on python:(group_on and group_on[1]) or 'priority';
-
-   search_input templates/page/macros/search_input;
-   search_date templates/page/macros/search_date;
-   column_input templates/page/macros/column_input;
-   sort_input templates/page/macros/sort_input;
-   group_input templates/page/macros/group_input;
-   search_select templates/page/macros/search_select;
-   search_select_translated templates/page/macros/search_select_translated;
-   search_multiselect templates/page/macros/search_multiselect;">
-
-<tr>
- <th class="header">&nbsp;</th>
- <th class="header" i18n:translate="">Filter on</th>
- <th class="header" i18n:translate="">Display</th>
- <th class="header" i18n:translate="">Sort on</th>
- <th class="header" i18n:translate="">Group on</th>
-</tr>
-
-<tr tal:define="name string:@search_text">
-  <th i18n:translate="">All text*:</th>
-  <td metal:use-macro="search_input"></td>
-  <td>&nbsp;</td>
-  <td>&nbsp;</td>
-  <td>&nbsp;</td>
-</tr>
-
-<tr tal:define="name string:title">
-  <th i18n:translate="">Title:</th>
-  <td metal:use-macro="search_input"></td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td>&nbsp;</td>
-</tr>
-
-<tr tal:define="name string:topic;
-                db_klass string:keyword;
-                db_content string:name;">
-  <th i18n:translate="">Topic:</th>
-  <td metal:use-macro="search_select"></td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td metal:use-macro="group_input"></td>
-</tr>
-
-<tr tal:define="name string:id">
-  <th i18n:translate="">ID:</th>
-  <td metal:use-macro="search_input"></td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td>&nbsp;</td>
-</tr>
-
-<tr tal:define="name string:creation">
-  <th i18n:translate="">Creation Date:</th>
-  <td metal:use-macro="search_date"></td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td metal:use-macro="group_input"></td>
-</tr>
-
-<tr tal:define="name string:creator;
-                db_klass string:user;
-                db_content string:username;"
-    tal:condition="db/user/is_view_ok">
-  <th i18n:translate="">Creator:</th>
-  <td metal:use-macro="search_input">
-    <option metal:fill-slot="extra_options" i18n:translate=""
-            tal:attributes="value request/user/id">created by me</option>
-  </td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td metal:use-macro="group_input"></td>
-</tr>
-
-<tr tal:define="name string:activity">
-  <th i18n:translate="">Activity:</th>
-  <td metal:use-macro="search_date"></td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td>&nbsp;</td>
-</tr>
-
-<tr tal:define="name string:actor;
-                db_klass string:user;
-                db_content string:username;"
-    tal:condition="db/user/is_view_ok">
-  <th i18n:translate="">Actor:</th>
-  <td metal:use-macro="search_input">
-    <option metal:fill-slot="extra_options" i18n:translate=""
-            tal:attributes="value request/user/id">done by me</option>
-  </td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td>&nbsp;</td>
-</tr>
-
-<tr tal:define="name string:priority;
-                db_klass string:priority;
-                db_content string:name;">
-  <th i18n:translate="">Priority:</th>
-  <td metal:use-macro="search_select_translated">
-    <option metal:fill-slot="extra_options" value="-1" i18n:translate=""
-            tal:attributes="selected python:value == '-1'">not selected</option>
-  </td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td metal:use-macro="group_input"></td>
-</tr>
-
-<tr tal:define="name string:status;
-                db_klass string:status;
-                db_content string:name;">
-  <th i18n:translate="">Status:</th>
-  <td metal:use-macro="search_select_translated">
-    <tal:block metal:fill-slot="extra_options">
-      <option value="-1,1,2" i18n:translate=""
-              tal:attributes="selected python:value == '-1,1,2'">not closed</option>
-      <option value="-1" i18n:translate=""
-              tal:attributes="selected python:value == '-1'">not selected</option>
-    </tal:block>
-  </td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td metal:use-macro="group_input"></td>
-</tr>
-
-<tr tal:define="name string:assignedto;
-                db_klass string:user;
-                db_content string:username;"
-    tal:condition="db/user/is_view_ok">
-  <th i18n:translate="">Assigned to:</th>
-  <td metal:use-macro="search_input">
-    <tal:block metal:fill-slot="extra_options">
-      <option tal:attributes="value request/user/id"
-       i18n:translate="">assigned to me</option>
-      <option value="-1" tal:attributes="selected python:value == '-1'"
-       i18n:translate="">unassigned</option>
-    </tal:block>
-  </td>
-  <td metal:use-macro="column_input"></td>
-  <td metal:use-macro="sort_input"></td>
-  <td metal:use-macro="group_input"></td>
-</tr>
-
-<tr>
- <th i18n:translate="">No Sort or group:</th>
- <td>&nbsp;</td>
- <td>&nbsp;</td>
- <td><input type="radio" name="@sort" value=""/></td>
- <td><input type="radio" name="@group" value=""/></td>
-</tr>
-
-<tr>
-<th i18n:translate="">Pagesize:</th>
-<td><input name="@pagesize" size="3" value="50"
-           tal:attributes="value request/form/@pagesize/value | default"/></td>
-</tr>
-
-<tr>
-<th i18n:translate="">Start With:</th>
-<td><input name="@startwith" size="3" value="0"
-           tal:attributes="value request/form/@startwith/value | default"/></td>
-</tr>
-
-<tr>
-<th i18n:translate="">Sort Descending:</th>
-<td><input type="checkbox" name="@sortdir"
-           tal:attributes="checked sort_desc">
-</td>
-</tr>
-
-<tr>
-<th i18n:translate="">Group Descending:</th>
-<td><input type="checkbox" name="@groupdir"
-           tal:attributes="checked group_desc">
-</td>
-</tr>
-
-<tr tal:condition="python:request.user.hasPermission('Edit', 'query')">
- <th i18n:translate="">Query name**:</th>
- <td tal:define="value request/form/@queryname/value | nothing">
-  <input name="@queryname" tal:attributes="value value"/>
-  <input type="hidden" name="@old-queryname" tal:attributes="value value"/>
- </td>
-</tr>
-
-<tr>
-  <td>
-   &nbsp;
-   <input type="hidden" name="@action" value="search"/>
-  </td>
-  <td><input type="submit" value="Search" i18n:attributes="value"/></td>
-</tr>
-
-<tr><td>&nbsp;</td>
- <td colspan="4" class="help">
-  <span i18n:translate="" tal:omit-tag="true">
-   *: The "all text" field will look in message bodies and issue titles
-  </span><br>
-  <span tal:condition="python:request.user.hasPermission('Edit', 'query')"
-   i18n:translate="" tal:omit-tag="true"
-  >
-   **: If you supply a name, the query will be saved off and available as a
-       link in the sidebar
-  </span>
- </td>
-</tr>
-</table>
-
-</form>
-</td>
-
-</tal:block>
-<!-- SHA: f0c86e97d4e43a1e3cc5f9e08ec4b918719ab6b8 -->

html/keyword.item.html

-<!-- dollarId: keyword.item,v 1.3 2002/05/22 00:32:34 richard Exp dollar-->
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title" i18n:translate="">Keyword editing - <span
  i18n:name="tracker" tal:replace="config/TRACKER_NAME" /></title>

html/msg.index.html

   </tr>
  </tal:block>
 
- <metal:block use-macro="templates/issue.index/macros/batch-footer" />
+ <metal:block use-macro="templates/bug.index/macros/batch-footer" />
 
 </table>
 </td>

html/msg.item.html

-<!-- dollarId: msg.item,v 1.3 2002/05/22 00:32:34 richard Exp dollar-->
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title">
 <tal:block condition="context/id" i18n:translate=""
   <!--  Logo  -->
   <h1 id="logoheader">
 <a accesskey="1" href="." id="logolink"><img src="http://python.org/images/python-logo.gif" alt="homepage" border="0" id="logo" /></a></h1>
-<div id="searchbox">
- <form method="get" action="issue">
-   <input type="hidden" name="@columns"
-          value="id,activity,title,creator,assignedto,status"/>
-   <input type="hidden" name="@sort" value="activity"/>
-   <input type="hidden" name="@group" value="priority"/>
-   <input id="search-text" name="@search_text" size="10"
-          tal:attributes="value request/search_text"/>
-   <input type="submit" id="submit" name="submit" value="Search" i18n:attributes="value"/>
- </form>
-</div>
-
 <div id="left-hand-navigation">
   
     <!--  Main Menu NEED LEVEL TWO HEADER AND FOOTER -->
    <li class=""><a href="http://python.org/psf" class="" title="Python Software Foundation">PSF</a></li>
    <li class=""><a href="http://python.org/links" class="" title="">Links</a></li>
    <li class=""><a href="http://python.org/dev" class="" title="Python Core Language Development">Core Development</a></li>
-   <li class="selected"><a href="." class="selected" title="Python Issue Tracker">Issue Tracker</a>
+   <li class="selected"><a href="." class="selected" title="Python Bug Tracker">Bug Tracker</a>
     <ul class="level-two">
-     <li tal:condition="python:request.user.hasPermission('View', 'issue')">
-      <b i18n:translate="">Issues</b>
+     <li tal:condition="python:request.user.hasPermission('View', 'bug')">
+      <b i18n:translate="">Bugs</b>
        <ul class="level-three">
-        <li tal:condition="python:request.user.hasPermission('Create', 'issue')">
-         <a href="issue?@template=item" i18n:translate="">Create New</a>
+        <li tal:condition="python:request.user.hasPermission('Create', 'bug')">
+         <a href="bug?@template=item" i18n:translate="">Create New</a>
         </li>
         <li>
     <li><a href="#"
-       tal:attributes="href python:request.indexargs_url('issue', {
+       tal:attributes="href python:request.indexargs_url('bug', {
       '@sort': '-activity',
-      '@group': 'priority',
+      '@group': 'severity',
       '@filter': 'status,assignedto',
       '@columns': columns,
       '@search_text': '',
      })"
        i18n:translate="">Show Unassigned</a></li>
     <li><a href="#"
-       tal:attributes="href python:request.indexargs_url('issue', {
+       tal:attributes="href python:request.indexargs_url('bug', {
       '@sort': '-activity',
-      '@group': 'priority',
+      '@group': 'severity',
       '@filter': 'status',
       '@columns': columns_showall,
       '@search_text': '',
      })"
        i18n:translate="">Show All</a></li>
         <li>
-         <a href="issue?@template=search" i18n:translate="">Search</a>
+         <a href="bug?@template=search" i18n:translate="">Search</a>
         </li>
         <li>
          <form method="post" tal:attributes="action request/base">
-          <input type="submit" class="form-small" value="Show issue:"
+          <input type="submit" class="form-small" value="Show bug:"
                  i18n:attributes="value"/>
           <input class="form-small" size="4"
                  type="text" name="@number"/>
-          <input type="hidden" name="@type" value="issue"/>
+          <input type="hidden" name="@type" value="bug"/>
           <input type="hidden" name="@action" value="show"/>
          </form>
         </li>
        </ul>
      </li>
-     <li tal:condition="python:request.user.hasPermission('Edit', 'keyword')
-                        or request.user.hasPermission('Create', 'keyword')">
-      <tal:block i18n:translate="">Keywords</tal:block>
-      <ul class="level-three">
-       <li tal:condition="python:request.user.hasPermission('Create', 'keyword')">
-        <a href="keyword?@template=item" i18n:translate="">Create New</a>
-       </li>
-       <li tal:condition="python:db.keyword.list() and
-           request.user.hasPermission('Edit', 'keyword')">
-        <a href="keyword?@template=item" i18n:translate="">Edit Existing</a>
-       </li>
-      </ul>
-     </li>
      <li tal:condition="python:request.user.username=='anonymous'">
+      <b i18n:translate="">User</b>
       <form method="post" tal:attributes="action request/base">
-       <b i18n:translate="">Login</b><br/>
        <ul class="level-three">
       <li>
+       <tal:span i18n:translate="">Login</tal:span><br/>
        <input size="10" name="__login_name"/><br/>
        <input size="10" type="password" name="__login_password"/><br/>
        <input type="hidden" name="@action" value="Login"/>
        </ul>
       </form>
      </li>
-     <li class="" 
-         tal:condition="python:request.user.username != 'anonymous'">
+     <li tal:condition="python:request.user.username != 'anonymous'">
    <b i18n:translate="">Hello, <span i18n:name="user"
     tal:replace="request/user/username">username</span></b><br/>
     <ul class="level-three">
     <li>
     <a href="#"
-       tal:attributes="href python:request.indexargs_url('issue', {
+       tal:attributes="href python:request.indexargs_url('bug', {
       '@sort': '-activity',
-      '@group': 'priority',
+      '@group': 'severity',
       '@filter': 'status,assignedto',
       '@columns': 'id,activity,title,creator,status',
       '@search_text': '',
       'status': status_notresolved,
       'assignedto': request.user.id,
-      '@dispname': i18n.gettext('Your Issues'),
+      '@dispname': i18n.gettext('Your Bugs'),
      })"
-    i18n:translate="">Your Issues</a>
+    i18n:translate="">Your Bugs</a>
     </li>
     <li>
        <a tal:attributes="href string:user${request/user/id}"
 The invoking context must define a "name" variable which names the
 property being searched.
 
-See issue.search.html in the classic template for examples.
+See bug.search.html in the classic template for examples.
 -->
 
 <!-- creates a th and a label: -->
 <td metal:define-macro="search_input">
   <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                          name name;
-                         id name">
+                         id name"/>
 </td>
 
 <td metal:define-macro="search_date">
   <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                          name name;
-                         id name">
+                         id name"/>
   <a class="classhelp"
-	 tal:attributes="href python:'''javascript:help_window('issue?@template=calendar&property=%s&form=itemSynopsis', 300, 200)'''%name">(cal)</a>
+	 tal:attributes="href python:'''javascript:help_window('bug?@template=calendar&property=%s&form=itemSynopsis', 300, 200)'''%name">(cal)</a>
 </td>
 
 <td metal:define-macro="search_popup">
   -->
   <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                          name name;
-                         id name">
-  <span tal:replace="structure python:db.issue.classhelp(columns,
+                         id name"/>
+  <span tal:replace="structure python:db.bug.classhelp(columns,
                                       property=name)" />
 </td>
 
 <td metal:define-macro="search_multiselect">
   <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                          name name;
-                         id name">
+                         id name"/>
   <span tal:replace="structure python:db[db_klass].classhelp(db_content,
                                         property=name, width='600')" />
 </td>
 <input metal:define-macro="user_src_input"
     type="text" tal:attributes="onblur python:edit_ok and 'split_name(this)';
     id name; name name; value value; readonly not:edit_ok"
-    value="heinz.kunz">
+    value="heinz.kunz"/>
 <!-- normal: no re-using -->
 <input metal:define-macro="user_normal_input" type="text"
     tal:attributes="id name; name name; value value; readonly not:edit_ok"
-    value="heinz">
+    value="heinz"/>
 <!-- password: type; no initial value -->
     <input metal:define-macro="user_pw_input" type="password"
-    tal:attributes="id name; name name; readonly not:edit_ok" value="">
+    tal:attributes="id name; name name; readonly not:edit_ok" value=""/>
     <input metal:define-macro="user_confirm_input" type="password"
-    tal:attributes="id name; name string:@confirm@$name; readonly not:edit_ok" value="">
+    tal:attributes="id name; name string:@confirm@$name; readonly not:edit_ok" value=""/>
 

html/query.edit.html

-<!-- dollarId: user.item,v 1.7 2002/08/16 04:29:04 richard Exp dollar-->
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title" i18n:translate=""
  >"Your Queries" Editing - <span tal:replace="config/TRACKER_NAME"
   text-transform: none;
 }
 
+#menu ul.level-three form
+{
+  display: block;
+  border: 0;
+  padding: 0.1em;
+  margin: 0 3em 0px 1.8em;
+  padding-left:1em;
+  color: #5E72A5;
+  background-image: none;
+  width: 10em !important;
+  width /**/: 11.4em;  
+  font-family: Arial, Verdana, Geneva, "Bitstream Vera Sans", Helvetica, sans-serif;
+  font-size: 95%;
+}
+
 #menu ul.level-three li
 {
     margin: 0px;
 
 /* style for forms */
 table.form {
-  border: #ddd solid 1px;
+/*  border: #ddd solid 1px;*/
   padding: 2px;
-  border-spacing: 0;
+  border-spacing: 5px;
   border-collapse: collapse;
-  background-color: #f5f5f5;
+/* background-color: #f5f5f5; */  
+  margin: 5px;
 }
 
 table.form th {
-  border: #ddd solid 1px;
+  border-left: #ddd solid 1px;
+  border-top: #ddd solid 1px;
+  border-bottom: #ddd solid 1px;
   color: #338;
   text-align: right;
   vertical-align: top;
 }
 
 table.form td {
+  border-right: #ddd solid 1px;
+  border-top: #ddd solid 1px;
+  border-bottom: #ddd solid 1px;
   color: #333;
   empty-cells: show;
   vertical-align: top;
+  padding: 5px;
 }
 
 table.form td.optional {

html/user.forgotten.html

-<!-- dollarId: user.item,v 1.7 2002/08/16 04:29:04 richard Exp dollar-->
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title" i18n:translate="">Password reset request - <span
  i18n:name="tracker" tal:replace="config/TRACKER_NAME" /></title>
 </td>
 
 </tal:block>
-<!-- SHA: 6fdb58c55fd854904ae98906d5935549a221fabf -->

html/user.help-search.html

 qs python:'&'.join([a for a in qs.split('&') if not a.startswith('@template=')])"
 >
     <pre tal:content="request/env/QUERY_STRING" tal:condition=false />
-    <form method="GET" name="itemSynopsis"
+    <form method="get" name="itemSynopsis"
       target="list"
       tal:attributes="action request/classname"
       tal:define="

html/user.index.html

-<!-- dollarId: user.index,v 1.3 2002/07/09 05:29:51 richard Exp dollar-->
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title" i18n:translate="">User listing - <span
  i18n:name="tracker" tal:replace="config/TRACKER_NAME" /></title>
 
 
 </tal:block>
-<!-- SHA: 3082bd8529e95365779a65d32993bc5f39abe1ca -->

html/user.item.html

-<!-- dollarId: user.item,v 1.7 2002/08/16 04:29:04 richard Exp dollar-->
 <tal:doc metal:use-macro="templates/page/macros/icing"
 define="edit_ok context/is_edit_ok"
 >

html/user.register.html

-<!-- dollarId: user.item,v 1.7 2002/08/16 04:29:04 richard Exp dollar-->
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title"
  i18n:translate="">Registering with <span i18n:name="tracker"

html/user.rego_progress.html

-<!-- dollarId: issue.index,v 1.2 2001/07/29 04:07:37 richard Exp dollar-->
 <tal:block metal:use-macro="templates/page/macros/icing">
 <title metal:fill-slot="head_title"
  i18n:translate="">Registration in progress - <span i18n:name="tracker"
 # TRACKER INITIAL PRIORITY AND STATUS VALUES
 #
 
-pri = db.getclass('priority')
-pri.create(name='9', order='1')
-pri.create(name='8', order='2')
-pri.create(name='7', order='3')
-pri.create(name='6', order='4')
-pri.create(name='5', order='5')
-pri.create(name='4', order='6')
-pri.create(name='3', order='7')
-pri.create(name='2', order='8')
-pri.create(name='1', order='9')
+bug_type = db.getclass('bug_type')
+bug_type.create(name='crash', order='1')
+bug_type.create(name='compile error', order='2')
+bug_type.create(name='resource usage', order='3')
+bug_type.create(name='security', order='4')
+bug_type.create(name='behavior', order='5')
+bug_type.create(name='rfe', order='6')
 
-stat = db.getclass('status')
-stat.create(name='Open', order='1')
-stat.create(name='Pending', order='2')
-stat.create(name='Closed', order='3')
-stat.create(name='Deleted', order='4')
+component = db.getclass('component')
+component.create(name='core', order='1')
+component.create(name='distutils', order='2')
+component.create(name='stdlib', order='3')
 
-group = db.getclass('group')
-group.create(name='third_party', order='1')
-group.create(name='AST', order='2')
-group.create(name='feature_request', order='3')
-group.create(name='irreproducible', order='4')
-group.create(name='python3k', description='This bug relates to python 3000', order='5')
+platform = db.getclass('platform')
+platform.create(name='GNU/Linux', order='1')
+platform.create(name='Solaris', order='2')
+platform.create(name='WinXP', order='3')
 
+version = db.getclass('version')
+version.create(name='2.5', order='1')
+version.create(name='3k', order='2')
 
+severity = db.getclass('severity')
+severity.create(name='critical', order='1')
+severity.create(name='urgent', order='2')
+severity.create(name='major', order='2')
+severity.create(name='normal', order='2')
+severity.create(name='minor', order='2')
+
+status = db.getclass('status')
+status.create(name='new', order='1')
+status.create(name='open', order='2')
+status.create(name='pending', description='user feedback required', order='3')
+status.create(name='closed', order='4')
+
+resolution = db.getclass('resolution')
+resolution.create(name='fixed', order='1')
+resolution.create(name='invalid', order='2')
+resolution.create(name='duplicate', order='3')
 
 #
 # create the two default users
 user = db.getclass('user')
-user.create(username="admin", password=adminpw,
-    address=admin_email, roles='Admin')
+user.create(username="admin", password=adminpw, address=admin_email, roles='Admin')
 user.create(username="anonymous", roles='Anonymous')
-
-# add any additional database creation steps here - but only if you
-# haven't initialised the database with the admin "initialise" command
-
 user.create(username="user", password=Password("user"), roles="User")
-
-# vim: set filetype=python sts=4 sw=4 et si
+user.create(username="devel", password=Password("devel"), roles="Developer")
+user.create(username="coord", password=Password("coord"), roles="Coordinator")
 #   creator = Link('user')
 #   actor = Link('user')
 
-# Priorities
-pri = Class(db, "priority",
-            name=String(),
-            description=String(),
-            order=Number())
-pri.setkey("name")
+# Bug Type
+bug_type = Class(db, 'bug_type',
+                 name=String(),
+                 description=String(),
+                 order=Number())
+bug_type.setkey('name')
 
-# Statuses
-stat = Class(db, "status",
-             name=String(),
-             description=String(),
-             order=Number())
-stat.setkey("name")
+# Component
+component = Class(db, 'component',
+                  name=String(),
+                  description=String(),
+                  order=Number())
+component.setkey('name')
+
+