Commits

Anonymous committed 2a440e2

switch 'bug' back to 'issue'

  • Participants
  • Parent commits 2b08636

Comments (0)

Files changed (15)

detectors/nosyreaction.py

         "messages" property.
         
         When a new message is added, the detector sends it to all the users on
-        the "nosy" list for the bug that are not already on the "recipients"
+        the "nosy" list for the issue 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 bug)
+        # the action was a set (so adding new messages to an existing issue)
         m = {}
         for msgid in oldvalues['messages']:
             m[msgid] = 1
         messages = []
-        # figure which of the messages now on the bug weren't there before
+        # figure which of the messages now on the issue 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 bug weren't
+            # figure which of the messages now on the issue weren't
             oldmessages = cl.get(nodeid, 'messages')
             messages = []
             for msgid in newvalues['messages']:
         newvalues['nosy'] = list(new_nosy)
 
 def init(db):
-    db.bug.react('create', nosyreaction)
-    db.bug.react('set', nosyreaction)
-    db.bug.audit('create', updatenosy)
-    db.bug.audit('set', updatenosy)
+    db.issue.react('create', nosyreaction)
+    db.issue.react('set', nosyreaction)
+    db.issue.audit('create', updatenosy)
+    db.issue.audit('set', updatenosy)

detectors/statusauditor.py

 def init_status(db, cl, nodeid, newvalues):
-    """ Make sure the status is set on new bugs"""
+    """ Make sure the status is set on new issues"""
 
     if newvalues.has_key('status') and newvalues['status']:
         return
 
     # format the info
     u = db.config.TRACKER_WEB
-    s = ', '.join(['<a href="%sbug%s">%s</a>'%(u,id,id) for id in dependencies])
+    s = ', '.join(['<a href="%sissue%s">%s</a>'%(u,id,id) for id in dependencies])
     if len(dependencies) == 1:
-        s = 'bug %s is'%s
+        s = 'issue %s is'%s
     else:
-        s = 'bugs %s are'%s
+        s = 'issues %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
+        raise ValueError, "This issue can't be closed until %s closed."%s
 
 
 def resolve(db, cl, nodeid, newvalues):
     # 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"
+            raise ValueError, "resolution and superseder must only be set when a issue 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"
+            raise ValueError, "resolution must be set when a issue 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'"
+                raise ValueError, "please provide a superseder when closing a issue as 'duplicate'"
 
 
 
 
     # 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')
+    issues = cl.find(dependencies=nodeid)
+    for issueid in issues:
+        dependencies = cl.get(issueid, 'dependencies')
         if nodeid in dependencies:
             dependencies.remove(nodeid)
-            cl.set(bugid, dependencies=dependencies)
+            cl.set(issueid, dependencies=dependencies)
 
 
 def init(db):
     # fire before changes are made
-    db.bug.audit('create', init_status)
-    db.bug.audit('create', block_resolution)
-    db.bug.audit('set', block_resolution)
-    db.bug.audit('set', resolve)
+    db.issue.audit('create', init_status)
+    db.issue.audit('create', block_resolution)
+    db.issue.audit('set', block_resolution)
+    db.issue.audit('set', resolve)
 
     # adjust after changes are committed
-    db.bug.react('set', resolve_dependencies)
+    db.issue.react('set', resolve_dependencies)

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

   <td tal:content="file/creation">creation date</td>
  </tr>
 
- <metal:block use-macro="templates/bug.index/macros/batch-footer" />
+ <metal:block use-macro="templates/issue.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 bugs. You may
+ tracker. The tag below lists the currently open issues. 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.bug.renderWith('index',
+<span tal:replace="structure python:db.issue.renderWith('index',
     sort=[('-', 'activity')], group=[('+', 'severity')], filter=['status'],
     columns=['id','activity','title','creator','assignee', 'status'],
     filterspec={'status':['1','2']})" />

html/issue.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 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>
+<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: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/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('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>
+</tal:block>
+</tal:block>

html/issue.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.issue_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.issue.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:issue${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.issue.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:issue${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: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>

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: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:issue_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:issue;
+                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 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>

html/msg.index.html

   </tr>
  </tal:block>
 
- <metal:block use-macro="templates/bug.index/macros/batch-footer" />
+ <metal:block use-macro="templates/issue.index/macros/batch-footer" />
 
 </table>
 </td>
    <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 Bug Tracker">Bug Tracker</a>
     <ul class="level-two">
-     <li tal:condition="python:request.user.hasPermission('View', 'bug')">
-      <b i18n:translate="">Bugs</b>
+     <li tal:condition="python:request.user.hasPermission('View', 'issue')">
+      <b i18n:translate="">Issues</b>
        <ul class="level-three">
-        <li tal:condition="python:request.user.hasPermission('Create', 'bug')">
-         <a href="bug?@template=item" i18n:translate="">Create New</a>
+        <li tal:condition="python:request.user.hasPermission('Create', 'issue')">
+         <a href="issue?@template=item" i18n:translate="">Create New</a>
         </li>
         <li>
     <li><a href="#"
-       tal:attributes="href python:request.indexargs_url('bug', {
+       tal:attributes="href python:request.indexargs_url('issue', {
       '@sort': '-activity',
       '@group': 'severity',
       '@filter': 'status,assignee',
      })"
        i18n:translate="">Show Unassigned</a></li>
     <li><a href="#"
-       tal:attributes="href python:request.indexargs_url('bug', {
+       tal:attributes="href python:request.indexargs_url('issue', {
       '@sort': '-activity',
       '@group': 'severity',
       '@filter': 'status',
      })"
        i18n:translate="">Show All</a></li>
         <li>
-         <a href="bug?@template=search" i18n:translate="">Search</a>
+         <a href="issue?@template=search" i18n:translate="">Search</a>
         </li>
         <li>
          <form method="post" tal:attributes="action request/base">
-          <input type="submit" class="form-small" value="Show bug:"
+          <input type="submit" class="form-small" value="Show issue:"
                  i18n:attributes="value"/>
           <input class="form-small" size="4"
                  type="text" name="@number"/>
-          <input type="hidden" name="@type" value="bug"/>
+          <input type="hidden" name="@type" value="issue"/>
           <input type="hidden" name="@action" value="show"/>
          </form>
         </li>
     <ul class="level-three">
     <li>
     <a href="#"
-       tal:attributes="href python:request.indexargs_url('bug', {
+       tal:attributes="href python:request.indexargs_url('issue', {
       '@sort': '-activity',
       '@group': 'severity',
       '@filter': 'status,assignee',
       '@search_text': '',
       'status': status_notresolved,
       'assignee': request.user.id,
-      '@dispname': i18n.gettext('Your Bugs'),
+      '@dispname': i18n.gettext('Your Issues'),
      })"
-    i18n:translate="">Your Bugs</a>
+    i18n:translate="">Your Issues</a>
     </li>
     <li>
        <a tal:attributes="href string:user${request/user/id}"
 </div> <!-- body-main -->
 </div> <!-- content -->
 
-<pre tal:condition="request/form/debug | nothing" tal:content="request">
+<pre tal:condition="request/form/deissue | nothing" tal:content="request">
 </pre>
 
 </body>
 The invoking context must define a "name" variable which names the
 property being searched.
 
-See bug.search.html in the classic template for examples.
+See issue.search.html in the classic template for examples.
 -->
 
 <!-- creates a th and a label: -->
                          name name;
                          id name"/>
   <a class="classhelp"
-	 tal:attributes="href python:'''javascript:help_window('bug?@template=calendar&property=%s&form=itemSynopsis', 300, 200)'''%name">(cal)</a>
+	 tal:attributes="href python:'''javascript:help_window('issue?@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.bug.classhelp(columns,
+  <span tal:replace="structure python:db.issue.classhelp(columns,
                                       property=name)" />
 </td>
 

html/user.forgotten.html

 
 <p i18n:translate="">Or, if you know your username, then enter it below.</p>
 
-<p i18n:translate="">If you have previously created or modified bug
-reports in the sourceforge bug tracker, you have an account here with
+<p i18n:translate="">If you have previously created or modified issue
+reports in the sourceforge issue tracker, you have an account here with
 the same username as your sourceforge username.</p>
 
 <table class="form">
 # TRACKER INITIAL PRIORITY AND STATUS VALUES
 #
 
-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')
+issue_type = db.getclass('issue_type')
+issue_type.create(name='crash', order='1')
+issue_type.create(name='compile error', order='2')
+issue_type.create(name='resource usage', order='3')
+issue_type.create(name='security', order='4')
+issue_type.create(name='behavior', order='5')
+issue_type.create(name='rfe', order='6')
 
 component = db.getclass('component')
 component.create(name='core', order='1')
 #   creator = Link('user')
 #   actor = Link('user')
 
-# Bug Type
-bug_type = Class(db, 'bug_type',
-                 name=String(),
-                 description=String(),
-                 order=Number())
-bug_type.setkey('name')
+# Issue Type
+issue_type = Class(db, 'issue_type',
+                   name=String(),
+                   description=String(),
+                   order=Number())
+issue_type.setkey('name')
 
 # Component
 component = Class(db, 'component',
 #   messages = Multilink("msg")
 #   files = Multilink("file")
 #   nosy = Multilink("user")
-#   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'))
+#   superseder = Multilink("issue")
+issue = IssueClass(db, "issue",
+                   type=Link('issue_type'),
+                   components=Multilink('component'),
+                   platforms=Multilink('platform'),
+                   versions=Multilink('version'),
+                   severity=Link('severity'),
+                   dependencies=Multilink('issue'),
+                   assignee=Link('user'),
+                   status=Link('status'),
+                   resolution=Link('resolution'),
+                   superseder=Link('issue'))
 
 #
 # TRACKER SECURITY SETTINGS
 ##########################
 # User permissions
 ##########################
-for cl in ('bug_type', 'severity', 'component', 'platform',
-           'version', 'status', 'resolution', 'bug', 'file', 'msg'):
+for cl in ('issue_type', 'severity', 'component', 'platform',
+           'version', 'status', 'resolution', 'issue', 'file', 'msg'):
     db.security.addPermissionToRole('User', 'View', cl)
 
 for cl in 'file', 'msg':
     db.security.addPermissionToRole('User', 'Create', cl)
 
-p = db.security.addPermission(name='Create', klass='bug',
+p = db.security.addPermission(name='Create', klass='issue',
                               properties=('title', 'type',
                                           'components', 'platforms', 'versions',
                                           'severity',
                                           'messages', 'files', 'nosy'),
-                              description='User can report and discuss bugs')
+                              description='User can report and discuss issues')
 db.security.addPermissionToRole('User', p)
 
-p = db.security.addPermission(name='Edit', klass='bug',
+p = db.security.addPermission(name='Edit', klass='issue',
                               properties=('type',
                                           'components', 'platforms', 'versions',
                                           'severity',
                                           'messages', 'files', 'nosy'),
-                              description='User can report and discuss bugs')
+                              description='User can report and discuss issues')
 db.security.addPermissionToRole('User', p)
 
 
 ##########################
 # Developer permissions
 ##########################
-for cl in ('bug_type', 'severity', 'component', 'platform',
-           'version', 'status', 'resolution', 'bug', 'file', 'msg'):
+for cl in ('issue_type', 'severity', 'component', 'platform',
+           'version', 'status', 'resolution', 'issue', 'file', 'msg'):
     db.security.addPermissionToRole('Developer', 'View', cl)
 
-for cl in ('bug', 'file', 'msg'):
+for cl in ('issue', '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')
+p = db.security.addPermission(name='Debugger', klass='issue',
+                              description='User can be assigned issues')
 db.security.addPermissionToRole('Developer', p)
 
 
 ##########################
 # Coordinator permissions
 ##########################
-for cl in ('bug_type', 'severity', 'component', 'platform',
-           'version', 'status', 'resolution', 'bug', 'file', 'msg'):
+for cl in ('issue_type', 'severity', 'component', 'platform',
+           'version', 'status', 'resolution', 'issue', 'file', 'msg'):
     db.security.addPermissionToRole('Coordinator', 'View', cl)
     db.security.addPermissionToRole('Coordinator', 'Edit', cl)
     db.security.addPermissionToRole('Coordinator', 'Create', cl)
 # limited to only the situation where the Viewed or Edited item is their own.
 def own_record(db, userid, itemid):
     '''Determine whether the userid matches the item being accessed.'''
+    print 'own record', userid, itemid
     return userid == itemid
 p = db.security.addPermission(name='View', klass='user', check=own_record,
     description="User is allowed to view their own user details")
 # - Allow anonymous users to register
 db.security.addPermissionToRole('Anonymous', 'Create', 'user')
 
-# Allow anonymous users access to view bugs (and the related, linked
+# Allow anonymous users access to view issues (and the related, linked
 # information)
-for cl in 'bug', 'file', 'msg', 'severity', 'status', 'resolution':
+for cl in 'issue', 'file', 'msg', 'severity', 'status', 'resolution':
     db.security.addPermissionToRole('Anonymous', 'View', cl)
 
 # [OPTIONAL]
-# Allow anonymous users access to create or edit "bug" items (and the
+# Allow anonymous users access to create or edit "issue" items (and the
 # related file and message items)
-#for cl in 'bug', 'file', 'msg':
+#for cl in 'issue', 'file', 'msg':
 #   db.security.addPermissionToRole('Anonymous', 'Create', cl)
 #   db.security.addPermissionToRole('Anonymous', 'Edit', cl)