[Python-checkins] r52825 - in tracker/instances/python-dev: detectors/nosyreaction.py detectors/statusauditor.py html/_generic.index.html html/bug.index.html html/bug.item.html html/bug.search.html html/file.index.html html/home.html html/issue.index.html html/issue.item.html html/issue.search.html html/keyword.item.html html/msg.index.html html/msg.item.html html/page.html html/query.edit.html html/style.css html/user.forgotten.html html/user.help-search.html html/user.index.html html/user.item.html html/user.register.html html/user.rego_progress.html initial_data.py schema.py

stefan.seefeld python-checkins at python.org
Thu Nov 23 02:25:04 CET 2006


Author: stefan.seefeld
Date: Thu Nov 23 02:25:02 2006
New Revision: 52825

Added:
   tracker/instances/python-dev/html/bug.index.html
      - copied, changed from r52742, tracker/instances/python-dev/html/issue.index.html
   tracker/instances/python-dev/html/bug.item.html
      - copied, changed from r52779, tracker/instances/python-dev/html/issue.item.html
   tracker/instances/python-dev/html/bug.search.html
      - copied, changed from r52742, tracker/instances/python-dev/html/issue.search.html
Removed:
   tracker/instances/python-dev/html/issue.index.html
   tracker/instances/python-dev/html/issue.item.html
   tracker/instances/python-dev/html/issue.search.html
Modified:
   tracker/instances/python-dev/detectors/nosyreaction.py
   tracker/instances/python-dev/detectors/statusauditor.py
   tracker/instances/python-dev/html/_generic.index.html
   tracker/instances/python-dev/html/file.index.html
   tracker/instances/python-dev/html/home.html
   tracker/instances/python-dev/html/keyword.item.html
   tracker/instances/python-dev/html/msg.index.html
   tracker/instances/python-dev/html/msg.item.html
   tracker/instances/python-dev/html/page.html
   tracker/instances/python-dev/html/query.edit.html
   tracker/instances/python-dev/html/style.css
   tracker/instances/python-dev/html/user.forgotten.html
   tracker/instances/python-dev/html/user.help-search.html
   tracker/instances/python-dev/html/user.index.html
   tracker/instances/python-dev/html/user.item.html
   tracker/instances/python-dev/html/user.register.html
   tracker/instances/python-dev/html/user.rego_progress.html
   tracker/instances/python-dev/initial_data.py
   tracker/instances/python-dev/schema.py
Log:
Redesign schema and adjust html templates.

Modified: tracker/instances/python-dev/detectors/nosyreaction.py
==============================================================================
--- tracker/instances/python-dev/detectors/nosyreaction.py	(original)
+++ tracker/instances/python-dev/detectors/nosyreaction.py	Thu Nov 23 02:25:02 2006
@@ -1,24 +1,4 @@
-#
-# 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):
@@ -26,7 +6,7 @@
         "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
@@ -52,12 +32,12 @@
         # 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)
@@ -107,7 +87,7 @@
             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']:
@@ -135,9 +115,7 @@
         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)

Modified: tracker/instances/python-dev/detectors/statusauditor.py
==============================================================================
--- tracker/instances/python-dev/detectors/statusauditor.py	(original)
+++ tracker/instances/python-dev/detectors/statusauditor.py	Thu Nov 23 02:25:02 2006
@@ -1,85 +1,95 @@
-# 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 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
+def init_status(db, cl, nodeid, newvalues):
+    """ Make sure the status is set on new bugs"""
 
-    # get the chatting state ID
-    try:
-        chatting_id = db.status.lookup('chatting')
-    except KeyError:
-        # no chatting state, ignore all this stuff
+    if newvalues.has_key('status') and newvalues['status']:
         return
 
-    # get the current value
-    current_status = cl.get(nodeid, 'status')
+    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."""
 
-    # see if there's an explicit change in this transaction
-    if newvalues.has_key('status'):
-        # yep, skip
+    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
 
-    # 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']:
+    # 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
 
-    # get the unread state ID
-    try:
-        unread_id = db.status.lookup('unread')
-    except KeyError:
-        # no unread state, ignore all this stuff
+    closed_id = db.status.lookup('closed')
+
+    # interesting?
+    if newstatus != closed_id:
         return
 
-    # ok, do it
-    newvalues['status'] = unread_id
+    # 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)

Modified: tracker/instances/python-dev/html/_generic.index.html
==============================================================================
--- tracker/instances/python-dev/html/_generic.index.html	(original)
+++ tracker/instances/python-dev/html/_generic.index.html	Thu Nov 23 02:25:02 2006
@@ -1,5 +1,3 @@
-<!-- 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()"

Copied: tracker/instances/python-dev/html/bug.index.html (from r52742, tracker/instances/python-dev/html/issue.index.html)
==============================================================================
--- tracker/instances/python-dev/html/issue.index.html	(original)
+++ tracker/instances/python-dev/html/bug.index.html	Thu Nov 23 02:25:02 2006
@@ -1,17 +1,16 @@
-<!-- $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: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 issues</span>
+  <span tal:omit-tag="true" i18n:translate="" >List of bugs</span>
   <span tal:condition="request/dispname"
    tal:replace="python:' - %s' % request.dispname" />
 </span>
-<td class="content" metal:fill-slot="content">
+<tal:block metal:fill-slot="content">
 
 <p tal:condition="python:not (context.is_view_ok()
  or request.user.hasRole('Anonymous'))" i18n:translate="">
@@ -24,16 +23,15 @@
 <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/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/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>
+   <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]"
@@ -46,8 +44,8 @@
   </tr>
 
   <tr>
-   <td tal:condition="request/show/priority"
-       tal:content="python:i.priority.plain() or default">&nbsp;</td>
+   <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>
@@ -55,18 +53,16 @@
        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}"
+    <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/assignedto"
-       tal:content="python:i.assignedto.plain() or default">&nbsp;</td>
+   <td tal:condition="request/show/assignee"
+       tal:content="python:i.assignee.plain() or default">&nbsp;</td>
   </tr>
 
  </tal:block>
@@ -101,10 +97,10 @@
  </metal:index>
 </table>
 
-<a tal:attributes="href python:request.indexargs_url('issue',
+<a tal:attributes="href python:request.indexargs_url('bug',
             {'@action':'export_csv'})" i18n:translate="">Download as CSV</a>
 
-<form method="GET" class="index-controls"
+<form method="get" class="index-controls"
     tal:attributes="action request/classname">
 
  <table class="form" tal:define="n_sort python:2">
@@ -125,7 +121,7 @@
    </td>
    <th i18n:translate="">Descending:</th>
    <td><input type="checkbox" tal:attributes="name python:'@sortdir%d'%n;
-              checked python:key and key[0] == '-'">
+              checked python:key and key[0] == '-'"/>
    </td>
   </tr>
   </tal:block>
@@ -146,7 +142,7 @@
    </td>
    <th i18n:translate="">Descending:</th>
    <td><input type="checkbox" tal:attributes="name python:'@groupdir%d'%n;
-              checked python:key and key[0] == '-'">
+              checked python:key and key[0] == '-'"/>
    </td>
   </tr>
   </tal:block>
@@ -159,6 +155,5 @@
 </form>
 
 </tal:block>
-
-</td>
+</tal:block>
 </tal:block>

Copied: tracker/instances/python-dev/html/bug.item.html (from r52779, tracker/instances/python-dev/html/issue.item.html)
==============================================================================
--- tracker/instances/python-dev/html/issue.item.html	(original)
+++ tracker/instances/python-dev/html/bug.item.html	Thu Nov 23 02:25:02 2006
@@ -1,25 +1,24 @@
-<!-- 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"
+ >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 Issue - <span tal:replace="config/TRACKER_NAME" i18n:name="tracker"
+ >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 Issue</span>
+  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 Issue Editing</span>
+  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="">Issue<tal:x
+  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="">Issue<tal:x
+  tal:omit-tag="python:1" i18n:translate="">Bug<tal:x
   replace="context/id" i18n:name="id" /> Editing</span>
 </tal:block>
 
@@ -35,89 +34,133 @@
 
 <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">
 
+<fieldset><legend>classification</legend>
 <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>
+ <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.group.classhelp('id,name,description',label='Group')" />
+   <span tal:replace="structure python:db.severity.classhelp('id,name,description',label='Severity')" />:
  </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>
+ <td tal:content="structure context/severity/menu">severity</td>
+ <th></th><td></td>
 </tr>
 
 <tr>
  <th i18n:translate="">
-   <span tal:replace="structure python:db.status.classhelp('id,name,description',label='Status')" />
+   <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>
+ <th i18n:translate="">Resolution:</th>
  <td tal:content="structure context/resolution/menu">resolution</td>
 </tr>
 
-<tr>
- <th i18n:translate="">Superseder</th>
+<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/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>
+   <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>
+        tal:attributes="href string:bug${sup/id}; title sup/title;"></a>
   </span>
  </td>
- <th i18n:translate="">Nosy List</th>
+ </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" />
-  <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>
+ <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 i18n:translate="">File</th>
+ <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,priority">
+  <input type="hidden" name="@required" value="title">
  </td>
  <td colspan=3>
   <span tal:replace="structure context/submit">submit button</span>
@@ -125,20 +168,9 @@
    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>,
@@ -170,7 +202,7 @@
   </td>
   <td>
    <form style="padding:0" tal:condition="context/is_edit_ok"
-         tal:attributes="action string:issue${context/id}">
+         tal:attributes="action string:bug${context/id}">
     <input type="hidden" name="@remove at files" tal:attributes="value file/id">
     <input type="hidden" name="@action" value="edit">
     <input type="submit" value="remove" i18n:attributes="value">
@@ -191,7 +223,7 @@
        i18n:name="date" /></th>
    <th>
     <form style="padding:0" tal:condition="context/is_edit_ok"
-          tal:attributes="action string:issue${context/id}">
+          tal:attributes="action string:bug${context/id}">
      <input type="hidden" name="@remove at messages" tal:attributes="value msg/id">
      <input type="hidden" name="@action" value="edit">
      <input type="submit" value="remove" i18n:attributes="value">
@@ -213,4 +245,3 @@
 </td>
 
 </tal:block>
-<!-- SHA: 52e1c51e8d17b8e8dd4ff54055b4f87ef0aa13bc -->

Copied: tracker/instances/python-dev/html/bug.search.html (from r52742, tracker/instances/python-dev/html/issue.search.html)
==============================================================================
--- tracker/instances/python-dev/html/issue.search.html	(original)
+++ tracker/instances/python-dev/html/bug.search.html	Thu Nov 23 02:25:02 2006
@@ -50,16 +50,6 @@
   <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>
@@ -112,10 +102,10 @@
   <td>&nbsp;</td>
 </tr>
 
-<tr tal:define="name string:priority;
-                db_klass string:priority;
+<tr tal:define="name string:type;
+                db_klass string:bug_type;
                 db_content string:name;">
-  <th i18n:translate="">Priority:</th>
+  <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>
@@ -125,24 +115,72 @@
   <td metal:use-macro="group_input"></td>
 </tr>
 
-<tr tal:define="name string:status;
-                db_klass string:status;
+<tr tal:define="name string:component;
+                db_klass string:component;
                 db_content string:name;">
-  <th i18n:translate="">Status:</th>
+  <th i18n:translate="">Components:</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>
+    <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:assignedto;
+<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">
@@ -160,6 +198,23 @@
   <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>
@@ -183,14 +238,14 @@
 <tr>
 <th i18n:translate="">Sort Descending:</th>
 <td><input type="checkbox" name="@sortdir"
-           tal:attributes="checked sort_desc">
+           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">
+           tal:attributes="checked group_desc"/>
 </td>
 </tr>
 
@@ -213,7 +268,7 @@
 <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
+   *: 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"
@@ -229,4 +284,3 @@
 </td>
 
 </tal:block>
-<!-- SHA: f0c86e97d4e43a1e3cc5f9e08ec4b918719ab6b8 -->

Modified: tracker/instances/python-dev/html/file.index.html
==============================================================================
--- tracker/instances/python-dev/html/file.index.html	(original)
+++ tracker/instances/python-dev/html/file.index.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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>
@@ -22,7 +21,7 @@
   <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>
 

Modified: tracker/instances/python-dev/html/home.html
==============================================================================
--- tracker/instances/python-dev/html/home.html	(original)
+++ tracker/instances/python-dev/html/home.html	Thu Nov 23 02:25:02 2006
@@ -1,11 +1,10 @@
 <!--
  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 -->

Deleted: /tracker/instances/python-dev/html/issue.index.html
==============================================================================
--- /tracker/instances/python-dev/html/issue.index.html	Thu Nov 23 02:25:02 2006
+++ (empty file)
@@ -1,164 +0,0 @@
-<!-- $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>

Deleted: /tracker/instances/python-dev/html/issue.item.html
==============================================================================
--- /tracker/instances/python-dev/html/issue.item.html	Thu Nov 23 02:25:02 2006
+++ (empty file)
@@ -1,216 +0,0 @@
-<!-- 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 at 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 at 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 -->

Deleted: /tracker/instances/python-dev/html/issue.search.html
==============================================================================
--- /tracker/instances/python-dev/html/issue.search.html	Thu Nov 23 02:25:02 2006
+++ (empty file)
@@ -1,232 +0,0 @@
-<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 -->

Modified: tracker/instances/python-dev/html/keyword.item.html
==============================================================================
--- tracker/instances/python-dev/html/keyword.item.html	(original)
+++ tracker/instances/python-dev/html/keyword.item.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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>

Modified: tracker/instances/python-dev/html/msg.index.html
==============================================================================
--- tracker/instances/python-dev/html/msg.index.html	(original)
+++ tracker/instances/python-dev/html/msg.index.html	Thu Nov 23 02:25:02 2006
@@ -17,7 +17,7 @@
   </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>

Modified: tracker/instances/python-dev/html/msg.item.html
==============================================================================
--- tracker/instances/python-dev/html/msg.item.html	(original)
+++ tracker/instances/python-dev/html/msg.item.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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=""

Modified: tracker/instances/python-dev/html/page.html
==============================================================================
--- tracker/instances/python-dev/html/page.html	(original)
+++ tracker/instances/python-dev/html/page.html	Thu Nov 23 02:25:02 2006
@@ -28,18 +28,6 @@
   <!--  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 -->
@@ -53,19 +41,19 @@
    <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': '',
@@ -75,9 +63,9 @@
      })"
        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': '',
@@ -86,38 +74,26 @@
      })"
        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"/>
@@ -137,24 +113,23 @@
        </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}"
@@ -230,7 +205,7 @@
 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: -->
@@ -244,15 +219,15 @@
 <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">
@@ -262,8 +237,8 @@
   -->
   <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>
 
@@ -310,7 +285,7 @@
 <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>
@@ -366,14 +341,14 @@
 <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=""/>
 

Modified: tracker/instances/python-dev/html/query.edit.html
==============================================================================
--- tracker/instances/python-dev/html/query.edit.html	(original)
+++ tracker/instances/python-dev/html/query.edit.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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"

Modified: tracker/instances/python-dev/html/style.css
==============================================================================
--- tracker/instances/python-dev/html/style.css	(original)
+++ tracker/instances/python-dev/html/style.css	Thu Nov 23 02:25:02 2006
@@ -68,6 +68,21 @@
   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;
@@ -127,15 +142,18 @@
 
 /* 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;
@@ -153,9 +171,13 @@
 }
 
 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 {

Modified: tracker/instances/python-dev/html/user.forgotten.html
==============================================================================
--- tracker/instances/python-dev/html/user.forgotten.html	(original)
+++ tracker/instances/python-dev/html/user.forgotten.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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>
@@ -50,4 +49,3 @@
 </td>
 
 </tal:block>
-<!-- SHA: 6fdb58c55fd854904ae98906d5935549a221fabf -->

Modified: tracker/instances/python-dev/html/user.help-search.html
==============================================================================
--- tracker/instances/python-dev/html/user.help-search.html	(original)
+++ tracker/instances/python-dev/html/user.help-search.html	Thu Nov 23 02:25:02 2006
@@ -20,7 +20,7 @@
 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="

Modified: tracker/instances/python-dev/html/user.index.html
==============================================================================
--- tracker/instances/python-dev/html/user.index.html	(original)
+++ tracker/instances/python-dev/html/user.index.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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>
@@ -73,4 +72,3 @@
 
 
 </tal:block>
-<!-- SHA: 3082bd8529e95365779a65d32993bc5f39abe1ca -->

Modified: tracker/instances/python-dev/html/user.item.html
==============================================================================
--- tracker/instances/python-dev/html/user.item.html	(original)
+++ tracker/instances/python-dev/html/user.item.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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"
 >

Modified: tracker/instances/python-dev/html/user.register.html
==============================================================================
--- tracker/instances/python-dev/html/user.register.html	(original)
+++ tracker/instances/python-dev/html/user.register.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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"

Modified: tracker/instances/python-dev/html/user.rego_progress.html
==============================================================================
--- tracker/instances/python-dev/html/user.rego_progress.html	(original)
+++ tracker/instances/python-dev/html/user.rego_progress.html	Thu Nov 23 02:25:02 2006
@@ -1,4 +1,3 @@
-<!-- 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"

Modified: tracker/instances/python-dev/initial_data.py
==============================================================================
--- tracker/instances/python-dev/initial_data.py	(original)
+++ tracker/instances/python-dev/initial_data.py	Thu Nov 23 02:25:02 2006
@@ -4,42 +4,51 @@
 # 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')
-
-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')
-
-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')
-
-
+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')
+
+component = db.getclass('component')
+component.create(name='core', order='1')
+component.create(name='distutils', order='2')
+component.create(name='stdlib', order='3')
+
+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")

Modified: tracker/instances/python-dev/schema.py
==============================================================================
--- tracker/instances/python-dev/schema.py	(original)
+++ tracker/instances/python-dev/schema.py	Thu Nov 23 02:25:02 2006
@@ -9,19 +9,47 @@
 #   creator = Link('user')
 #   actor = Link('user')
 
-# Priorities
-pri = Class(db, "priority",
-            name=String(),
-            description=String(),
-            order=Number())
-pri.setkey("name")
-
-# Statuses
-stat = Class(db, "status",
-             name=String(),
-             description=String(),
-             order=Number())
-stat.setkey("name")
+# Bug Type
+bug_type = Class(db, 'bug_type',
+                 name=String(),
+                 description=String(),
+                 order=Number())
+bug_type.setkey('name')
+
+# Component
+component = Class(db, 'component',
+                  name=String(),
+                  description=String(),
+                  order=Number())
+component.setkey('name')
+
+# Platform
+platform = Class(db, 'platform',
+                 name=String(),
+                 description=String(),
+                 order=Number())
+platform.setkey('name')
+
+# Version
+version = Class(db, 'version',
+                name=String(),
+                description=String(),
+                order=Number())
+version.setkey('name')
+
+# Severity
+severity = Class(db, 'severity',
+                 name=String(),
+                 description=String(),
+                 order=Number())
+severity.setkey('name')
+
+# Status
+status = Class(db, "status",
+               name=String(),
+               description=String(),
+               order=Number())
+status.setkey("name")
 
 # Resolution
 resolution = Class(db, "resolution",
@@ -30,40 +58,26 @@
                    order=Number())
 resolution.setkey('name')
 
-# Groups
-group = Class(db, "group",
-              name=String(),
-              description=String(),
-              order=Number())
-group.setkey("name")
-            
-              
-
-# Keywords
-keyword = Class(db, "keyword",
-                name=String())
-keyword.setkey("name")
-
 # User-defined saved searches
 query = Class(db, "query",
-                klass=String(),
-                name=String(),
-                url=String(),
-                private_for=Link('user'))
+              klass=String(),
+              name=String(),
+              url=String(),
+              private_for=Link('user'))
 
 # add any additional database schema configuration here
 
 user = Class(db, "user",
-                username=String(),
-                password=Password(),
-                address=String(),
-                realname=String(),
-                phone=String(),
-                organisation=String(),
-                alternate_addresses=String(),
-                queries=Multilink('query'),
-                roles=String(),     # comma-separated string of Role names
-                timezone=String())
+             username=String(),
+             password=Password(),
+             address=String(),
+             realname=String(),
+             phone=String(),
+             organisation=String(),
+             alternate_addresses=String(),
+             queries=Multilink('query'),
+             roles=String(),     # comma-separated string of Role names
+             timezone=String())
 user.setkey("username")
 
 # FileClass automatically gets this property in addition to the Class ones:
@@ -86,15 +100,18 @@
 #   messages = Multilink("msg")
 #   files = Multilink("file")
 #   nosy = Multilink("user")
-#   superseder = Multilink("issue")
-issue = IssueClass(db, "issue",
-                assignedto=Link("user"),
-                topic=Multilink("keyword"),
-                priority=Link("priority"),
-                group=Link("group"),
-                status=Link("status"),
-                resolution=Link("resolution"),
-                imported_from_sf=Boolean())
+#   superseder = Multilink("bug")
+bug = IssueClass(db, "bug",
+                 type=Link('bug_type'),
+                 components=Multilink('component'),
+                 platforms=Multilink('platform'),
+                 versions=Multilink('version'),
+                 severity=Link('severity'),
+                 dependencies=Multilink('bug'),
+                 assignee=Link('user'),
+                 status=Link('status'),
+                 resolution=Link('resolution'),
+                 superseder=Link('bug'))
 
 #
 # TRACKER SECURITY SETTINGS
@@ -102,25 +119,75 @@
 # See the configuration and customisation document for information
 # about security setup.
 
+db.security.addRole(name='Developer', description='A developer')
+db.security.addRole(name='Coordinator', description='A coordinator')
+
 #
 # REGULAR USERS
 #
 # Give the regular users access to the web and email interface
-db.security.addPermissionToRole('User', 'Web Access')
-db.security.addPermissionToRole('User', 'Email Access')
-
-# Assign the access and edit Permissions for issue, file and message
-# to regular users now
-for cl in 'issue', 'file', 'msg', 'keyword':
+for r in 'User', 'Developer', 'Coordinator':
+    db.security.addPermissionToRole(r, 'Web Access')
+    db.security.addPermissionToRole(r, 'Email Access')
+
+##########################
+# User permissions
+##########################
+for cl in ('bug_type', 'severity', 'component', 'platform',
+           'version', 'status', 'resolution', 'bug', 'file', 'msg'):
     db.security.addPermissionToRole('User', 'View', cl)
-    db.security.addPermissionToRole('User', 'Edit', cl)
+
+for cl in 'file', 'msg':
     db.security.addPermissionToRole('User', 'Create', cl)
-for cl in 'priority', 'status', 'resolution', 'group':
-    db.security.addPermissionToRole('User', 'View', cl)
+
+p = db.security.addPermission(name='Create', klass='bug',
+                              properties=('title', 'type',
+                                          'components', 'platforms', 'versions',
+                                          'severity',
+                                          'messages', 'files', 'nosy'),
+                              description='User can report and discuss bugs')
+db.security.addPermissionToRole('User', p)
+
+p = db.security.addPermission(name='Edit', klass='bug',
+                              properties=('type',
+                                          'components', 'platforms', 'versions',
+                                          'severity',
+                                          'messages', 'files', 'nosy'),
+                              description='User can report and discuss bugs')
+db.security.addPermissionToRole('User', p)
+
+
+##########################
+# Developer permissions
+##########################
+for cl in ('bug_type', 'severity', 'component', 'platform',
+           'version', 'status', 'resolution', 'bug', 'file', 'msg'):
+    db.security.addPermissionToRole('Developer', 'View', cl)
+
+for cl in ('bug', 'file', 'msg'):
+    db.security.addPermissionToRole('Developer', 'Edit', cl)
+    db.security.addPermissionToRole('Developer', 'Create', cl)
+
+p = db.security.addPermission(name='Debugger', klass='bug',
+                              description='User can be assigned bugs')
+db.security.addPermissionToRole('Developer', p)
+
+
+##########################
+# Coordinator permissions
+##########################
+for cl in ('bug_type', 'severity', 'component', 'platform',
+           'version', 'status', 'resolution', 'bug', 'file', 'msg'):
+    db.security.addPermissionToRole('Coordinator', 'View', cl)
+    db.security.addPermissionToRole('Coordinator', 'Edit', cl)
+    db.security.addPermissionToRole('Coordinator', 'Create', cl)
+
 
 # May users view other user information? Comment these lines out
 # if you don't want them to
 db.security.addPermissionToRole('User', 'View', 'user')
+db.security.addPermissionToRole('Developer', 'View', 'user')
+db.security.addPermissionToRole('Coordinator', 'View', 'user')
 
 # Users should be able to edit their own details -- this permission is
 # limited to only the situation where the Viewed or Edited item is their own.
@@ -129,10 +196,12 @@
     return userid == itemid
 p = db.security.addPermission(name='View', klass='user', check=own_record,
     description="User is allowed to view their own user details")
-db.security.addPermissionToRole('User', p)
+for r in 'User', 'Developer', 'Coordinator':
+    db.security.addPermissionToRole(r, p)
 p = db.security.addPermission(name='Edit', klass='user', check=own_record,
     description="User is allowed to edit their own user details")
-db.security.addPermissionToRole('User', p)
+for r in 'User', 'Developer', 'Coordinator':
+    db.security.addPermissionToRole(r, p)
 
 # Users should be able to edit and view their own queries. They should also
 # be able to view any marked as not private. They should not be able to
@@ -145,13 +214,16 @@
     return userid == db.query.get(itemid, 'creator')
 p = db.security.addPermission(name='View', klass='query', check=view_query,
     description="User is allowed to view their own and public queries")
-db.security.addPermissionToRole('User', p)
+for r in 'User', 'Developer', 'Coordinator':
+    db.security.addPermissionToRole(r, p)
 p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
     description="User is allowed to edit their queries")
-db.security.addPermissionToRole('User', p)
+for r in 'User', 'Developer', 'Coordinator':
+    db.security.addPermissionToRole(r, p)
 p = db.security.addPermission(name='Create', klass='query',
     description="User is allowed to create queries")
-db.security.addPermissionToRole('User', p)
+for r in 'User', 'Developer', 'Coordinator':
+    db.security.addPermissionToRole(r, p)
 
 
 #
@@ -174,15 +246,15 @@
 # - Allow anonymous users to register
 db.security.addPermissionToRole('Anonymous', 'Create', 'user')
 
-# Allow anonymous users access to view issues (and the related, linked
+# Allow anonymous users access to view bugs (and the related, linked
 # information)
-for cl in 'issue', 'file', 'msg', 'keyword', 'priority', 'status', 'resolution', 'group':
+for cl in 'bug', 'file', 'msg', 'severity', 'status', 'resolution':
     db.security.addPermissionToRole('Anonymous', 'View', cl)
 
 # [OPTIONAL]
-# Allow anonymous users access to create or edit "issue" items (and the
+# Allow anonymous users access to create or edit "bug" items (and the
 # related file and message items)
-#for cl in 'issue', 'file', 'msg':
+#for cl in 'bug', 'file', 'msg':
 #   db.security.addPermissionToRole('Anonymous', 'Create', cl)
 #   db.security.addPermissionToRole('Anonymous', 'Edit', cl)
 


More information about the Python-checkins mailing list