[Python-checkins] r60859 - in tracker/instances/jobs: config.ini.template detectors/audit2to3.py detectors/changes_xml_writer.py detectors/cia.py detectors/nosyreaction.py detectors/sendmail.py detectors/severityauditor.py detectors/statusauditor.py html/home.html html/issue.index.html html/issue.item.html html/issue.search.html html/keyword.index.html html/keyword.item.html html/msg.item.html html/offer.index.html html/offer.item.html html/offer.search.html html/page.html html/user.forgotten.html html/user.register.html initial_data.py schema.py

martin.v.loewis python-checkins at python.org
Sat Feb 16 15:29:25 CET 2008


Author: martin.v.loewis
Date: Sat Feb 16 15:29:24 2008
New Revision: 60859

Added:
   tracker/instances/jobs/html/offer.index.html
      - copied, changed from r60858, tracker/instances/jobs/html/issue.index.html
   tracker/instances/jobs/html/offer.item.html
      - copied, changed from r60858, tracker/instances/jobs/html/issue.item.html
   tracker/instances/jobs/html/offer.search.html
      - copied, changed from r60858, tracker/instances/jobs/html/issue.search.html
Removed:
   tracker/instances/jobs/detectors/audit2to3.py
   tracker/instances/jobs/detectors/changes_xml_writer.py
   tracker/instances/jobs/detectors/cia.py
   tracker/instances/jobs/detectors/severityauditor.py
   tracker/instances/jobs/html/issue.index.html
   tracker/instances/jobs/html/issue.item.html
   tracker/instances/jobs/html/issue.search.html
   tracker/instances/jobs/html/keyword.index.html
   tracker/instances/jobs/html/keyword.item.html
Modified:
   tracker/instances/jobs/config.ini.template
   tracker/instances/jobs/detectors/nosyreaction.py
   tracker/instances/jobs/detectors/sendmail.py
   tracker/instances/jobs/detectors/statusauditor.py
   tracker/instances/jobs/html/home.html
   tracker/instances/jobs/html/msg.item.html
   tracker/instances/jobs/html/page.html
   tracker/instances/jobs/html/user.forgotten.html
   tracker/instances/jobs/html/user.register.html
   tracker/instances/jobs/initial_data.py
   tracker/instances/jobs/schema.py
Log:
Implement basic workflow for jobs tracker.


Modified: tracker/instances/jobs/config.ini.template
==============================================================================
--- tracker/instances/jobs/config.ini.template	(original)
+++ tracker/instances/jobs/config.ini.template	Sat Feb 16 15:29:24 2008
@@ -1,6 +1,3 @@
-# Roundup issue tracker configuration file
-# Autogenerated at Fri Nov 17 16:59:49 2006
-
 # WARNING! Following options need adjustments:
 #  [mail]: domain, host
 #  [tracker]: web
@@ -115,7 +112,7 @@
 # Default: NO DEFAULT
 #web = NO DEFAULT
 #web = http://psf.upfronthosting.co.za/roundup/tracker/
-web = http://localhost:9999/python-dev/
+web = http://localhost:9999/jobs/
 
 # Email address that mail to roundup should go to.
 # Default: issue_tracker
@@ -160,7 +157,7 @@
 
 # Name of the database to use.
 # Default: roundup
-name = roundup
+name = roundup_jobs
 
 # Database server host.
 # Default: localhost

Deleted: /tracker/instances/jobs/detectors/audit2to3.py
==============================================================================
--- /tracker/instances/jobs/detectors/audit2to3.py	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,41 +0,0 @@
-import roundup
-import roundup.instance
-import sets
-
-def update2to3(db, cl, nodeid, newvalues):
-    '''Component 2to3 issues to be assigned to collinwinter unless otherwise
-       assigned.
-    '''
-    # nodeid will be None if this is a new node
-    componentIDS=None
-    if nodeid is not None:
-        componentIDS = cl.get(nodeid, 'components')
-    if newvalues.has_key('components'):
-        componentIDS = newvalues['components']
-    if componentIDS and (theComponent in componentIDS):
-        if not newvalues.has_key('assignee') or \
-               newvalues['assignee'] == Nobody:
-            newvalues['assignee'] = theMan
-
-def init(db):
-    global theMan, theComponent, Nobody
-    theMan = db.user.lookup('collinwinter')
-    Nobody = db.user.lookup('nobody')
-    theComponent = db.component.lookup('2to3 (2.x to 3.0 conversion tool)')
-
-    db.issue.audit('create', update2to3)
-    db.issue.audit('set', update2to3)
-
-if __name__ == '__main__':
-    global theMan, theComponent, Nobody
-    instanceHome='/home/roundup/trackers/tracker'
-    instance = roundup.instance.open(instanceHome)
-    db = instance.open('admin')
-    cl = db.issue
-    nodeID = '1002'
-    theMan = db.user.lookup('collinwinter')
-    Nobody = db.user.lookup('nobody')
-    theComponent = db.component.lookup('2to3 (2.x to 3.0 conversion tool)')
-    newvalues = { 'components': [theComponent] , 'assignee': Nobody}
-    update2to3(db, cl, nodeID, newvalues)
-    print Nobody, theMan, theComponent, newvalues

Deleted: /tracker/instances/jobs/detectors/changes_xml_writer.py
==============================================================================
--- /tracker/instances/jobs/detectors/changes_xml_writer.py	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,194 +0,0 @@
-#
-#  changes.xml writer detector.
-#
-# Copyright (c) 2007  Michal Kwiatkowski <constant.beta at gmail.com>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-#   notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-#   notice, this list of conditions and the following disclaimer in the
-#   documentation and/or other materials provided with the distribution.
-#
-# * Neither the name of the author nor the names of his contributors
-#   may be used to endorse or promote products derived from this software
-#   without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-
-"""changes.xml writer detector -- save each database change to an XML file.
-
-Root element is called `changes` and it has at most `ChangesXml.max_items`
-children, each called a `change`. Each `change` has the following attributes:
-
-:date:  date in RFC2822 format when the change was made
-:id:    unique identifier of this change (note: not an integer)
-:type:  type of this change (see below)
-
-A structure of a `change` depends on its `type`. Currently implemented
-change types and their formats are listed below.
-
-* type = `file-added`
-
-  Describes a new file attached to an existing issue. Child elements:
-
-  :file-id:   unique integer identifier of the file
-  :file-name: name of the uploaded file
-  :file-type: MIME type of the file content
-  :file-url:  permanent URL of the file
-  :issue-id:  unique integer identifier of an issue this file is attached to
-"""
-
-import os
-import urllib
-from xml.dom import minidom
-from xml.parsers.expat import ExpatError
-from time import gmtime, strftime
-
-# Relative to tracker home directory.
-FILENAME = os.path.join('%(TEMPLATES)s', 'recent-changes.xml')
-
-
-def tracker_url(db):
-    return str(db.config.options[('tracker', 'web')])
-
-def changes_xml_path(db):
-    return os.path.join(db.config.HOME, FILENAME % db.config.options)
-
-def rfc2822_date():
-    return strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
-
-class File(object):
-    def __init__(self, db, id, issue_id):
-        self.db = db
-        self.id = id
-        self.issue_id = issue_id
-
-        self.name = db.file.get(id, 'name')
-        self.type = db.file.get(id, 'type')
-        # Based on roundup.cgi.templating._HTMLItem.download_url().
-        self.download_url = tracker_url(self.db) +\
-            urllib.quote('%s%s/%s' % ('file', self.id, self.name))
-
-class ChangesXml(object):
-    # Maximum number of changes stored in a file.
-    max_items = 20
-
-    def __init__(self, filename):
-        self.filename = filename
-        self._read_document()
-        self.modified = False
-
-    def save(self):
-        if not self.modified:
-            return
-
-        self._trim_to_max_items()
-
-        fd = open(self.filename, 'w')
-        self.document.writexml(fd, encoding="UTF-8")
-        fd.close()
-
-    def add_file(self, file):
-        change = self._change("file%s-added-to-issue%s" % (file.id, file.issue_id),
-                              "file-added")
-
-        change.appendChild(self._element_with_text("file-id",   file.id))
-        change.appendChild(self._element_with_text("file-name", file.name))
-        change.appendChild(self._element_with_text("file-type", file.type))
-        change.appendChild(self._element_with_text("file-url",  file.download_url))
-        change.appendChild(self._element_with_text("issue-id",  file.issue_id))
-
-        self.root.appendChild(change)
-        self.modified = True
-
-    def add_files(self, files):
-        for file in files:
-            self.add_file(file)
-
-    def _change(self, id, type):
-        """Return new 'change' element of a given type.
-           <change id='id' date='now' type='type'></change>
-        """
-        change = self.document.createElement("change")
-        change.setAttribute("id",   id)
-        change.setAttribute("type", type)
-        change.setAttribute("date", rfc2822_date())
-        return change
-
-    def _element_with_text(self, name, value):
-        """Return new element with given name and text node as a value.
-           <name>value</name>
-        """
-        element = self.document.createElement(name)
-        text = self.document.createTextNode(str(value))
-        element.appendChild(text)
-        return element
-
-    def _trim_to_max_items(self):
-        """Remove changes exceeding self.max_items.
-        """
-        # Assumes that changes are stored sequentially from oldest to newest.
-        # Will do for now.
-        for change in self.root.getElementsByTagName("change")[0:-self.max_items]:
-            self.root.removeChild(change)
-
-    def _read_document(self):
-        try:
-            self.document = minidom.parse(self.filename)
-            self.root = self.document.firstChild
-        except IOError, e:
-            # File not found, create a new one then.
-            if e.errno != 2:
-                raise
-            self._create_new_document()
-        except ExpatError:
-            # File has been damaged, forget about it and create a new one.
-            self._create_new_document()
-
-    def _create_new_document(self):
-        self.document = minidom.Document()
-        self.root = self.document.createElement("changes")
-        self.document.appendChild(self.root)
-
-def get_new_files_ids(issue_now, issue_then):
-    """Return ids of files added between `now` and `then`.
-    """
-    files_now = set(issue_now['files'])
-    if issue_then:
-        files_then = set(issue_then['files'])
-    else:
-        files_then = set()
-    return map(int, files_now - files_then)
-
-def file_added_to_issue(db, cl, issue_id, olddata):
-    try:
-        changes   = ChangesXml(changes_xml_path(db))
-        issue     = db.issue.getnode(issue_id)
-        new_files = [ File(db, id, issue_id) for id in get_new_files_ids(issue, olddata) ]
-
-        changes.add_files(new_files)
-        changes.save()
-    except:
-        # We can't mess up with a database commit.
-        pass
-
-
-def init(db):
-    db.issue.react('create', file_added_to_issue)
-    db.issue.react('set',    file_added_to_issue)

Deleted: /tracker/instances/jobs/detectors/cia.py
==============================================================================
--- /tracker/instances/jobs/detectors/cia.py	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,86 +0,0 @@
-# Reactor for sending changes to CIA.vc
-import xmlrpclib
-import cgi
-
-server = "http://CIA.vc"
-
-parameters = {
-    'name':'Roundup Reactor for CIA',
-    'revision': "$Revision$"[11:-2],
-    'project': 'Python',
-    'branch': 'roundup',
-    'urlprefix': 'http://bugs.python.org/issue',
-}
-
-max_content = 150
-
-TEMPLATE = """
-<message>
-<generator>
-  <name>Roundup Reactor for CIA</name>
-  <version>%(revision)s</version>
-</generator>
-<source>
-  <project>%(project)s</project>
-  <module>#%(nodeid)s</module>
-  <branch>%(branch)s</branch>
-</source>
-<body>
-  <commit>
-    <author>%(author)s</author>
-    <files><file>%(file)s</file></files>
-    <log>%(log)s</log>
-    <url>%(urlprefix)s%(nodeid)s</url>
-  </commit>
-</body>
-</message>
-"""
-
-
-def sendcia(db, cl, nodeid, oldvalues):
-    messages = set(cl.get(nodeid, 'messages'))
-    if oldvalues:
-        messages -= set(oldvalues.get('messages',()))
-    if not messages:
-        return
-    messages = list(messages)
-
-    if oldvalues:
-        oldstatus = oldvalues['status']
-    else:
-        oldstatus = None
-    newstatus = db.issue.get(nodeid, 'status')
-    if oldstatus != newstatus:
-        if oldvalues:
-            status = db.status.get(newstatus, 'name')
-        else:
-            status = 'new'
-        log = '[' + status + '] '
-    else:
-        log = ''
-    for msg in messages:
-        log += db.msg.get(msg, 'content')
-    if len(log) > max_content:
-        log = log[:max_content-4] + ' ...'
-    log = log.replace('\n', ' ')
-
-    params = parameters.copy()
-    params['file'] = cgi.escape(db.issue.get(nodeid, 'title'))
-    params['nodeid'] = nodeid
-    params['author'] = db.user.get(db.getuid(), 'username')
-    params['log'] = cgi.escape(log)
-
-    payload = TEMPLATE % params
-
-    try:
-        rpc = xmlrpclib.ServerProxy(server)
-        rpc.hub.deliver(payload)
-    except:
-        # Ignore any errors in sending the CIA;
-        # if the server is down, that's just bad luck
-        # XXX might want to do some logging here
-        pass
-
-def init(db):
-    db.issue.react('create', sendcia)
-    db.issue.react('set', sendcia)

Modified: tracker/instances/jobs/detectors/nosyreaction.py
==============================================================================
--- tracker/instances/jobs/detectors/nosyreaction.py	(original)
+++ tracker/instances/jobs/detectors/nosyreaction.py	Sat Feb 16 15:29:24 2008
@@ -46,7 +46,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 offer weren't
             oldmessages = cl.get(nodeid, 'messages')
             messages = []
             for msgid in newvalues['messages']:
@@ -82,8 +82,9 @@
                          
 
 def init(db):
-    db.issue.audit('create', updatenosy)
-    db.issue.audit('set', updatenosy)
+    pass
+    #db.offer.audit('create', updatenosy)
+    #db.offer.audit('set', updatenosy)
 
-    # Make sure creator of issue is added. Do this after 'updatenosy'. 
-    db.issue.audit('create', addcreator, priority=110)
+    # Make sure creator of offer is added. Do this after 'updatenosy'. 
+    #db.offer.audit('create', addcreator, priority=110)

Modified: tracker/instances/jobs/detectors/sendmail.py
==============================================================================
--- tracker/instances/jobs/detectors/sendmail.py	(original)
+++ tracker/instances/jobs/detectors/sendmail.py	Sat Feb 16 15:29:24 2008
@@ -9,12 +9,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 offer)
         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 offer weren't there before
         for msgid in cl.get(nodeid, 'messages'):
             if not m.has_key(msgid):
                 messages.append(msgid)
@@ -47,7 +47,7 @@
     * For all changes (property-only, or with new message), send mail
       to all members of the nosy list.
 
-    * For new issues, and only for new issue, send mail to
+    * For new offers, and only for new offer, send mail to
       db.config.detectors['TRIAGE_EMAIL']
 
     """
@@ -73,7 +73,7 @@
         changenote = cl.generateChangeNote(nodeid, oldvalues)
         oldfiles = oldvalues.get('files', [])        
 
-    newfiles = db.issue.get(nodeid, 'files', [])
+    newfiles = db.offer.get(nodeid, 'files', [])
     if oldfiles != newfiles:
         added = [fid for fid in newfiles if fid not in oldfiles]
         removed = [fid for fid in oldfiles if fid not in newfiles]
@@ -109,7 +109,7 @@
 def nosymessage(db, nodeid, msgid, oldvalues, note,
                 whichnosy='nosy',
                 from_address=None, cc=[], bcc=[]):
-    """Send a message to the members of an issue's nosy list.
+    """Send a message to the members of an offer's nosy list.
 
     The message is sent only to users on the nosy list who are not
     already on the "recipients" list for the message.
@@ -167,7 +167,7 @@
         seen_message[authid] = 1
 
     # now deal with the nosy and cc people who weren't recipients.
-    for userid in cc + db.issue.get(nodeid, whichnosy):
+    for userid in cc + db.offer.get(nodeid, whichnosy):
         if good_recipient(userid):
             add_recipient(userid, sendto)
 
@@ -181,10 +181,10 @@
     if sendto or bcc_sendto:
         if msgid is not None:
             db.msg.set(msgid, recipients=recipients)
-        db.issue.send_message(nodeid, msgid, note, sendto, from_address,
+        db.offer.send_message(nodeid, msgid, note, sendto, from_address,
                               bcc_sendto)
 
 
 def init(db):
-    db.issue.react('set', sendmail)
-    db.issue.react('create', sendmail)
+    db.offer.react('set', sendmail)
+    db.offer.react('create', sendmail)

Deleted: /tracker/instances/jobs/detectors/severityauditor.py
==============================================================================
--- /tracker/instances/jobs/detectors/severityauditor.py	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,11 +0,0 @@
-
-def init_severity(db, cl, nodeid, newvalues):
-    """Make sure severity is set on new issues"""
-    if newvalues.has_key('severity') and newvalues['severity']:
-        return
-
-    normal = db.severity.lookup('normal')
-    newvalues['severity'] = normal
-
-def init(db):
-    db.issue.audit('create', init_severity)

Modified: tracker/instances/jobs/detectors/statusauditor.py
==============================================================================
--- tracker/instances/jobs/detectors/statusauditor.py	(original)
+++ tracker/instances/jobs/detectors/statusauditor.py	Sat Feb 16 15:29:24 2008
@@ -1,15 +1,15 @@
 def init_status(db, cl, nodeid, newvalues):
-    """ Make sure the status is set on new issues"""
+    """ Make sure the status is set on new offers"""
 
     if newvalues.has_key('status') and newvalues['status']:
         return
 
-    new_id = db.status.lookup('open')
+    new_id = db.status.lookup('submitted')
     newvalues['status'] = new_id
 
 
 def block_resolution(db, cl, nodeid, newvalues):
-    """ If the issue has blockers, don't allow it to be resolved."""
+    """ If the offer has blockers, don't allow it to be resolved."""
 
     if nodeid is None:
         dependencies = []
@@ -24,15 +24,15 @@
 
     # format the info
     u = db.config.TRACKER_WEB
-    s = ', '.join(['<a href="%sissue%s">%s</a>'%(u,id,id) for id in dependencies])
+    s = ', '.join(['<a href="%soffer%s">%s</a>'%(u,id,id) for id in dependencies])
     if len(dependencies) == 1:
-        s = 'issue %s is'%s
+        s = 'offer %s is'%s
     else:
-        s = 'issues %s are'%s
+        s = 'offers %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 issue can't be closed until %s closed."%s
+        raise ValueError, "This offer can't be closed until %s closed."%s
 
 
 def resolve(db, cl, nodeid, newvalues):
@@ -44,23 +44,23 @@
     # 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 issue is closed"
+            raise ValueError, "resolution and superseder must only be set when a offer 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 issue is closed"
+            raise ValueError, "resolution must be set when a offer 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 issue as 'duplicate'"
+                raise ValueError, "please provide a superseder when closing a offer 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."""
+    """ When we resolve an offer that's a blocker, remove it from the
+    blockers list of the offer(s) it blocks."""
 
     newstatus = cl.get(nodeid,'status')
 
@@ -74,22 +74,22 @@
     if newstatus != closed_id:
         return
 
-    # yes - find all the dependend issues, if any, and remove me from
+    # yes - find all the dependend offers, if any, and remove me from
     # their dependency list
-    issues = cl.find(dependencies=nodeid)
-    for issueid in issues:
-        dependencies = cl.get(issueid, 'dependencies')
+    offers = cl.find(dependencies=nodeid)
+    for offerid in offers:
+        dependencies = cl.get(offerid, 'dependencies')
         if nodeid in dependencies:
             dependencies.remove(nodeid)
-            cl.set(issueid, dependencies=dependencies)
+            cl.set(offerid, dependencies=dependencies)
 
 
 def init(db):
     # fire before changes are made
-    db.issue.audit('create', init_status)
-#    db.issue.audit('create', block_resolution)
-#    db.issue.audit('set', block_resolution)
-#    db.issue.audit('set', resolve)
+    db.offer.audit('create', init_status)
+#    db.offer.audit('create', block_resolution)
+#    db.offer.audit('set', block_resolution)
+#    db.offer.audit('set', resolve)
 
     # adjust after changes are committed
-#    db.issue.react('set', resolve_dependencies)
+#    db.offer.react('set', resolve_dependencies)

Modified: tracker/instances/jobs/html/home.html
==============================================================================
--- tracker/instances/jobs/html/home.html	(original)
+++ tracker/instances/jobs/html/home.html	Sat Feb 16 15:29:24 2008
@@ -1,10 +1,13 @@
 <!--
  This is the default body that is displayed when people visit the
- 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
+ tracker. The tag below lists the currently open offers. You may
+ replace it with a greeting message, or a different list of offers or
+ whatever. It's a good idea to have the offers 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','assignee', 'status'],
-    filterspec={'status':['1','3']})" />
+<span tal:condition="python:request.user.hasPermission('View', 'issue')"
+    tal:replace="structure python:db.offer.renderWith('index',
+    sort=[('-', 'activity')], group=[('-', 'status')], filter=['status'],
+    columns=['id','activity','title','creator','status'],
+    filterspec={'status':['1','2','3']})" />
+<span tal:condition="python:not request.user.hasPermission('View', 'issue')"
+    tal:replace="structure python:db.offer.renderWith('item')" />

Deleted: /tracker/instances/jobs/html/issue.index.html
==============================================================================
--- /tracker/instances/jobs/html/issue.index.html	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,177 +0,0 @@
-<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/components"  i18n:translate="">Components</th>
-   <th tal:condition="request/show/versions" i18n:translate="">Versions</th>
-   <th tal:condition="request/show/status"    i18n:translate="">Status</th>
-   <th tal:condition="request/show/resolution" i18n:translate="">Resolution</th>
-   <th tal:condition="request/show/creator" i18n:translate="">Creator</th>
-   <th tal:condition="request/show/assignee" i18n:translate="">Assigned&nbsp;To</th>
-   <th tal:condition="request/show/keywords" i18n:translate="">Keywords</th>
-   <th tal:condition="request/show/dependencies" i18n:translate="">Depends On</th>
-   <th tal:condition="request/show/type" i18n:translate="">Type</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 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/components"
-       tal:content="python:i.components.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/versions"
-       tal:content="python:i.versions.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/status"
-       tal:content="python:i.status.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/resolution"
-       tal:content="python:i.resolution.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>
-   <td tal:condition="request/show/keywords"
-       tal:content="python:i.keywords.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/dependencies"
-       tal:content="python:i.dependencies.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/type"
-       tal:content="python:i.type.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>

Deleted: /tracker/instances/jobs/html/issue.item.html
==============================================================================
--- /tracker/instances/jobs/html/issue.item.html	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,273 +0,0 @@
-<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">
-
-<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:condition="context/title/is_edit_ok"
-     tal:content="structure python:context.title.field(size=60)">title</td>
- <td colspan="3" 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>
-<!-- Set severity to normal per default -->
-<td tal:condition="not: context/severity"
-     tal:content="structure
-     python:context.severity.menu(value=db.severity.filter(filterspec={'name':'normal'})[0].id)">severity></td>
-
- <td tal:condition="context/severity"
-     tal:content="structure context/severity/menu">severity</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>
-</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> -->
-   <br><span i18n:translate="">View</span>:
-     <a tal:content="context/superseder/id"
-        tal:attributes="href string:issue${context/superseder/id}; title context/superseder/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="userdata python:db._db.user.filter_sql('select id,_username from _user where _roles like \'%Developer%\' order by _username')">
-    <option tal:attributes="value python:userdata[0]; 
-                            selected python:str(userdata[0]) == context.assignee._value"
-            tal:content="python:userdata[1]"></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>
- <th>
-   <span tal:replace="structure python:db.priority.classhelp('id,name,description',label='Priority')" />:
- </th>
- <td tal:content="structure context/priority/menu">priority</td>
- <th i18n:translate="">Keywords:</th>
- <td tal:content="structure python:context['keywords'].menu(height=3)">keywords</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="hidden" name="@link at files" value="file-1">
-   <input type="file" name="file-1 at content" size="40">
- </td>
-</tr>
-<tr tal:condition="context/is_edit_ok">
- <th><tal:block i18n:translate="">File Description</tal:block>:</th>
- <td colspan=3><input type="edit" name="file-1 at description" 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="">Description</th>
-  <th i18n:translate="">Edit</th>
-  <th i18n:translate="">Remove</th>
- </tr>
- <tr tal:repeat="file python:context.files.sorted('creation')">
-  <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/description" />
-  <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="file/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/realname"
-       i18n:name="author" /> (<tal:x replace="msg/author"/>)</th>
-   <th i18n:translate="">Date: <tal:x replace="msg/date"
-       i18n:name="date" /></th>
-   <th>
-    <form style="padding:0" tal:condition="msg/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">
-    <p class="error-message"
-       tal:condition="python:utils.sb_is_spam(msg)">
-       Message has been classified as spam.
-    </p>
-    <pre tal:condition="python:msg.content.is_view_ok()"
-         tal:content="structure python:utils.localReplace(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>

Deleted: /tracker/instances/jobs/html/issue.search.html
==============================================================================
--- /tracker/instances/jobs/html/issue.search.html	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,311 +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: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;">
-  <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;">
-  <th i18n:translate="">Last 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:nosy">
-  <th i18n:translate="">Nosy list member:</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: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:components;
-                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:versions;
-                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_input"/>
-  <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;">
-  <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:keywords;
-                db_klass string:keyword;
-                db_content string:name;">
-  <th i18n:translate="">Keyword:</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 set</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: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:resolution;
-                db_klass string:resolution;
-                db_content string:name;">
-  <th i18n:translate="">Resolution:</th>
-  <td metal:use-macro="search_select_translated"/>
-  <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>

Deleted: /tracker/instances/jobs/html/keyword.index.html
==============================================================================
--- /tracker/instances/jobs/html/keyword.index.html	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,46 +0,0 @@
-<tal:block metal:use-macro="templates/page/macros/icing">
-<title metal:fill-slot="head_title" >
-  <span tal:omit-tag="true" i18n:translate="" >List of keywords</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 keywords</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>
-
-<table width="100%" tal:condition="context/is_view_ok" class="list">
-<tr>
- <th i18n:translate="">Keyword</th>
- <th i18n:translate="">Description</th>
-</tr>
-
-<tal:block repeat="keyword context/list">
-<tr tal:attributes="class python:['normal', 'alt'][repeat['keyword'].index%6/3]">
- <td>
-  <a tal:attributes="href string:keyword${keyword/id}"
-     tal:content="keyword/name">keyword name</a>
- </td>
- <td tal:content="python:keyword.description.plain() or
-     default">&nbsp;</td>
-</tr>
-</tal:block>
-
-<tr tal:condition="context/is_edit_ok">
-   <td colspan="2"><a href="keyword?@template=item">New Keyword</a></td>
-</tr>
-</table>
-
-</tal:block>
-</tal:block>
\ No newline at end of file

Deleted: /tracker/instances/jobs/html/keyword.item.html
==============================================================================
--- /tracker/instances/jobs/html/keyword.item.html	Sat Feb 16 15:29:24 2008
+++ (empty file)
@@ -1,78 +0,0 @@
-<tal:doc metal:use-macro="templates/page/macros/icing"
-define="edit_ok context/is_edit_ok"
->
-<title metal:fill-slot="head_title">
-<tal:if condition="context/id" i18n:translate=""
- >Keyword <span tal:replace="context/id" i18n:name="id"
- />: <span tal:replace="context/name" i18n:name="title"
- /> - <span tal:replace="config/TRACKER_NAME" i18n:name="tracker"
-/></tal:if>
-<tal:if condition="not:context/id" i18n:translate=""
- >New Keyword - <span tal:replace="config/TRACKER_NAME" i18n:name="tracker"
-/></tal:if>
-</title>
-<metal:slot fill-slot="more-javascript">
-<script type="text/javascript" src="@@file/help_controls.js"></script>
-</metal:slot>
-<tal:block metal:fill-slot="body_title"
-  define="edit_ok context/is_edit_ok">
- <span tal:condition="python: not (context.id or edit_ok)"
-  tal:omit-tag="python:1" i18n:translate="">New Keyword</span>
- <span tal:condition="python: not context.id and edit_ok"
-  tal:omit-tag="python:1" i18n:translate="">New Keyword Editing</span>
- <span tal:condition="python: context.id and not edit_ok"
-  tal:omit-tag="python:1" i18n:translate="">Keyword<tal:x
-  replace="context/id" i18n:name="id" /></span>
- <span tal:condition="python: context.id and edit_ok"
-  tal:omit-tag="python:1" i18n:translate="">Keyword<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"
-      tal:define="required python:'name description'.split()"
-      enctype="multipart/form-data"
-      tal:attributes="action context/designator;">
-
-<table class="form">
-
-<tr>
- <th class="required" i18n:translate="">Keyword:</th>
- <td tal:content="structure
- python:context.name.field(size=60)">title</td>
-</tr>
-
-<tr>
- <th class="required" i18n:translate="">Description:</th>
- <td tal:content="structure python:context.description.field(size=60)">description</td>
-
-</tr>
-
- <tr tal:condition="context/is_edit_ok">
-  <td>
-   &nbsp;
-   <input type="hidden" name="@template" value="item">
-   <input type="hidden" name="@required" value="name,description"
-          tal:attributes="value python:','.join(required)">
-  </td>
-  <td><input type="submit" value="save" tal:replace="structure context/submit"><!--submit button here-->
-    <input type="reset">
-  </td>
- </tr>
-
-</table>
-</form>
-</div>
-</td>
-</tal:doc>

Modified: tracker/instances/jobs/html/msg.item.html
==============================================================================
--- tracker/instances/jobs/html/msg.item.html	(original)
+++ tracker/instances/jobs/html/msg.item.html	Sat Feb 16 15:29:24 2008
@@ -34,8 +34,8 @@
 <table class="form">
 
 <tr>
- <th i18n:translate="">Author</th>
- <td tal:content="context/author"></td>
+ <th i18n:translate="">Creator</th>
+ <td tal:content="context/creator"></td>
 </tr>
 
 <tr>
@@ -44,8 +44,8 @@
 </tr>
 
 <tr>
- <th i18n:translate="">Date</th>
- <td tal:content="context/date"></td>
+ <th i18n:translate="">Creation</th>
+ <td tal:content="context/creation"></td>
 </tr>
 
  <tr>

Copied: tracker/instances/jobs/html/offer.index.html (from r60858, tracker/instances/jobs/html/issue.index.html)
==============================================================================
--- tracker/instances/jobs/html/issue.index.html	(original)
+++ tracker/instances/jobs/html/offer.index.html	Sat Feb 16 15:29:24 2008
@@ -1,12 +1,12 @@
 <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 offers</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 offers</span>
   <span tal:condition="request/dispname"
    tal:replace="python:' - %s' % request.dispname" />
 </span>
@@ -23,21 +23,13 @@
 <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/components"  i18n:translate="">Components</th>
-   <th tal:condition="request/show/versions" i18n:translate="">Versions</th>
    <th tal:condition="request/show/status"    i18n:translate="">Status</th>
-   <th tal:condition="request/show/resolution" i18n:translate="">Resolution</th>
    <th tal:condition="request/show/creator" i18n:translate="">Creator</th>
-   <th tal:condition="request/show/assignee" i18n:translate="">Assigned&nbsp;To</th>
-   <th tal:condition="request/show/keywords" i18n:translate="">Keywords</th>
-   <th tal:condition="request/show/dependencies" i18n:translate="">Depends On</th>
-   <th tal:condition="request/show/type" i18n:translate="">Type</th>
   </tr>
  <tal:block tal:repeat="i batch" condition=true>
   <tr tal:define="group python:[r[1] for r in request.group]"
@@ -50,8 +42,6 @@
   </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>
@@ -60,27 +50,13 @@
    <td 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}"
+    <a tal:attributes="href string:offer${i/id}"
 		tal:content="python:str(i.title.plain(hyperlink=0)) or '[no title]'">title</a>
    </td>
-   <td tal:condition="request/show/components"
-       tal:content="python:i.components.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/versions"
-       tal:content="python:i.versions.plain() or default">&nbsp;</td>
    <td tal:condition="request/show/status"
        tal:content="python:i.status.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/resolution"
-       tal:content="python:i.resolution.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>
-   <td tal:condition="request/show/keywords"
-       tal:content="python:i.keywords.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/dependencies"
-       tal:content="python:i.dependencies.plain() or default">&nbsp;</td>
-   <td tal:condition="request/show/type"
-       tal:content="python:i.type.plain() or default">&nbsp;</td>
   </tr>
 
  </tal:block>
@@ -115,7 +91,7 @@
  </metal:index>
 </table>
 
-<a tal:attributes="href python:request.indexargs_url('issue',
+<a tal:attributes="href python:request.indexargs_url('offer',
             {'@action':'export_csv'})" i18n:translate="">Download as CSV</a>
 
 <form method="get" class="index-controls"

Copied: tracker/instances/jobs/html/offer.item.html (from r60858, tracker/instances/jobs/html/issue.item.html)
==============================================================================
--- tracker/instances/jobs/html/issue.item.html	(original)
+++ tracker/instances/jobs/html/offer.item.html	Sat Feb 16 15:29:24 2008
@@ -1,24 +1,24 @@
 <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"
+ >Offer <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 Offer - <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 Offer</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 Offer 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="">Offer<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="">Offer<tal:x
   replace="context/id" i18n:name="id" /> Editing</span>
 </tal:block>
 
@@ -37,106 +37,76 @@
 <form method="POST" name="itemSynopsis"
       onSubmit="return submit_once()" enctype="multipart/form-data"
       tal:attributes="action context/designator">
-
-<fieldset><legend>classification</legend>
+  <input type="hidden" name="@template" value="item"/>
+  <input type="hidden" name="@required" value="title,organization"/>
+<fieldset><legend>Posted content</legend>
+<span tal:replace="structure context/submit">submit button</span>
 <table class="form">
+
 <tr>
  <th class="required" i18n:translate="">Title:</th>
- <td colspan="3" tal:condition="context/title/is_edit_ok"
-     tal:content="structure python:context.title.field(size=60)">title</td>
- <td colspan="3" tal:condition="not:context/title/is_edit_ok">
+ <td tal:condition="context/is_edit_ok"
+     tal:content="structure python:context.title.field(size=60)">Title</td>
+ <td tal:condition="not:context/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>
-<!-- Set severity to normal per default -->
-<td tal:condition="not: context/severity"
-     tal:content="structure
-     python:context.severity.menu(value=db.severity.filter(filterspec={'name':'normal'})[0].id)">severity></td>
+ <th>Company</th>
+ <td tal:condition="context/is_edit_ok"
+     tal:content="structure python:context.organization.field(size=60)"></td>
+ <td tal:condition="not:context/is_edit_ok">
+  <span tal:content="structure context/organization/plain"/>
+  <input type="hidden" name="title" tal:attributes="value context/organization">
+ </td>
+</tr>
 
- <td tal:condition="context/severity"
-     tal:content="structure context/severity/menu">severity</td>
+<tr>
+ <th>Company URL (optional)</th>
+ <td tal:condition="context/is_edit_ok"
+     tal:content="structure python:context.organization_url.field(size=60)">OK</td>
+ <td tal:condition="not:context/is_edit_ok">
+  <span tal:content="structure context/organization/plain"/>
+  <input type="hidden" name="title" tal:attributes="value context/organization_url">
+ </td>
+</tr>
 
+<tr tal:condition="context/is_edit_ok">
+ <th><tal:block i18n:translate="">Description</tal:block>:</th>
+ <td tal:define="curval python:context.description and context.description.content">
+  <input type="hidden" name="@link at description" value="msg-1">
+  <textarea tal:content="request/form/msg-1 at content/value | curval"
+            name="msg-1 at content" rows="10" cols="72"></textarea>
+ </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>
+<tr tal:condition="context/is_edit_ok">
+ <th><tal:block i18n:translate="">What Python is used for</tal:block>:</th>
+ <td tal:define="curval python:context.python_used_for and context.python_used_for.content">
+  <input type="hidden" name="@link at python_used_for" value="msg-2">
+  <textarea tal:content="request/form/msg-2 at content/value | curval"
+            name="msg-2 at content" cols="72"></textarea>
+ </td>
 </tr>
+
 </table>
 </fieldset>
+</form>
 
+<form tal:condition="context/id"
+      method="POST" name="itemSynopsis"
+      onSubmit="return submit_once()" enctype="multipart/form-data"
+      tal:attributes="action context/designator">
 <fieldset><legend>process</legend>
+<span tal:replace="structure context/submit">submit button</span>
 <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> -->
-   <br><span i18n:translate="">View</span>:
-     <a tal:content="context/superseder/id"
-        tal:attributes="href string:issue${context/superseder/id}; title context/superseder/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="userdata python:db._db.user.filter_sql('select id,_username from _user where _roles like \'%Developer%\' order by _username')">
-    <option tal:attributes="value python:userdata[0]; 
-                            selected python:str(userdata[0]) == context.assignee._value"
-            tal:content="python:userdata[1]"></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')" />
@@ -145,51 +115,18 @@
   <span tal:replace="structure context/nosy/field" />
  </td>
 </tr>
-<tr>
- <th>
-   <span tal:replace="structure python:db.priority.classhelp('id,name,description',label='Priority')" />:
- </th>
- <td tal:content="structure context/priority/menu">priority</td>
- <th i18n:translate="">Keywords:</th>
- <td tal:content="structure python:context['keywords'].menu(height=3)">keywords</td>
-
 
-</tr>
 <tr tal:condition="context/is_edit_ok">
  <th><tal:block i18n:translate="">Change Note</tal:block>:</th>
  <td colspan="3">
+  <input type="hidden" name="@link at messages" value="msg-3">
   <textarea tal:content="request/form/@note/value | default"
-            name="@note" wrap="hard" rows="5" cols="72"></textarea>
+            name="msg-3 at content" 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="hidden" name="@link at files" value="file-1">
-   <input type="file" name="file-1 at content" size="40">
- </td>
-</tr>
-<tr tal:condition="context/is_edit_ok">
- <th><tal:block i18n:translate="">File Description</tal:block>:</th>
- <td colspan=3><input type="edit" name="file-1 at description" 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="">
@@ -223,7 +160,7 @@
   </td>
   <td>
    <form style="padding:0" tal:condition="file/is_edit_ok"
-         tal:attributes="action string:issue${context/id}">
+         tal:attributes="action string:offer${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">
@@ -238,13 +175,13 @@
   <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/realname"
-       i18n:name="author" /> (<tal:x replace="msg/author"/>)</th>
-   <th i18n:translate="">Date: <tal:x replace="msg/date"
+   <th i18n:translate="">Author: <tal:x replace="msg/creator/realname"
+       i18n:name="author" /> (<tal:x replace="msg/creator"/>)</th>
+   <th i18n:translate="">Date: <tal:x replace="msg/creation"
        i18n:name="date" /></th>
    <th>
     <form style="padding:0" tal:condition="msg/is_edit_ok"
-          tal:attributes="action string:issue${context/id}">
+          tal:attributes="action string:offer${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">

Copied: tracker/instances/jobs/html/offer.search.html (from r60858, tracker/instances/jobs/html/issue.search.html)
==============================================================================
--- tracker/instances/jobs/html/issue.search.html	(original)
+++ tracker/instances/jobs/html/offer.search.html	Sat Feb 16 15:29:24 2008
@@ -1,8 +1,8 @@
 <tal:block metal:use-macro="templates/page/macros/icing">
-<title metal:fill-slot="head_title" i18n:translate="">Issue searching - <span
+<title metal:fill-slot="head_title" i18n:translate="">Offer 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>
+ i18n:translate="">Offer searching</span>
 <td class="content" metal:fill-slot="content">
 
 <form method="get" name="itemSynopsis"
@@ -15,7 +15,7 @@
    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';
+   group_on python:(group_on and group_on[1]) or 'status';
 
    search_input templates/page/macros/search_input;
    search_date templates/page/macros/search_date;
@@ -108,60 +108,8 @@
   <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:components;
-                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:versions;
-                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_klass string:offer;
                 db_content string:id;">
   <th i18n:translate="">Depends on:</th>
   <td metal:use-macro="search_input"/>
@@ -187,32 +135,6 @@
   <td metal:use-macro="group_input"></td>
 </tr>
 
-<tr tal:define="name string:keywords;
-                db_klass string:keyword;
-                db_content string:name;">
-  <th i18n:translate="">Keyword:</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 set</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: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;">
@@ -230,16 +152,6 @@
   <td metal:use-macro="group_input"></td>
 </tr>
 
-<tr tal:define="name string:resolution;
-                db_klass string:resolution;
-                db_content string:name;">
-  <th i18n:translate="">Resolution:</th>
-  <td metal:use-macro="search_select_translated"/>
-  <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>
@@ -293,7 +205,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 offer titles
   </span><br>
   <span tal:condition="python:request.user.hasPermission('Edit', 'query')"
    i18n:translate="" tal:omit-tag="true"

Modified: tracker/instances/jobs/html/page.html
==============================================================================
--- tracker/instances/jobs/html/page.html	(original)
+++ tracker/instances/jobs/html/page.html	Sat Feb 16 15:29:24 2008
@@ -34,16 +34,16 @@
 <div id="utility-menu">
 <!-- Search Box -->
 <div id="searchbox">
-    <form name="searchform" method="get" action="issue" id="searchform">
+    <form name="searchform" method="get" action="offer" id="searchform">
       <div id="search">
        <input type="hidden" name="@columns"
               tal:attributes="value columns_showall"/>
        <input type="hidden" name="@sort" value="-activity" />
-       <input type="hidden" name="@group" value="priority" />
+       <input type="hidden" name="@group" value="status" />
        <input type="hidden" name="@filter" value="status"/>
        <input type="hidden" name="status" tal:attributes="value status_notresolved"/>
        <input class="input-text" id="search-text" name="@search_text" size="10" />
-<input type="submit" id="submit" value="search in open issues" name="submit"
+<input type="submit" id="submit" value="search in open offers" name="submit"
        class="input-button"/>
       </div>
      </form>
@@ -64,19 +64,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 Offer Tracker">Offer 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', 'offer')">
+      <b i18n:translate="">Offers</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', 'offer')">
+         <a href="offer?@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('offer', {
       '@sort': '-activity',
-      '@group': 'priority',
+      '@group': 'status',
       '@filter': 'status',
       '@columns': columns_showall,
       '@search_text': '',
@@ -85,29 +85,16 @@
       '@startwith': 0,
      })"
        i18n:translate="">Show Open</a></li>
-    <li><a href="#"
-       tal:attributes="href python:request.indexargs_url('issue', {
-      '@sort': '-activity',
-      '@group': 'priority',
-      '@filter': 'status,assignee',
-      '@columns': columns,
-      '@search_text': '',
-      'status': status_notresolved,
-      'assignee': '-1',
-      '@dispname': i18n.gettext('Show Unassigned'),
-      '@startwith': 0,
-     })"
-       i18n:translate="">Show Unassigned</a></li>
         <li>
-         <a href="issue?@template=search&status=1" i18n:translate="">Search</a>
+         <a href="offer?@template=search&status=1" i18n:translate="">Search</a>
         </li>
         <li>
          <form method="post" action="#">
-          <input type="submit" class="form-small" value="Show issue:"
+          <input type="submit" class="form-small" value="Show offer:"
                  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="offer"/>
           <input type="hidden" name="@action" value="show"/>
          </form>
         </li>
@@ -144,18 +131,18 @@
     <ul class="level-three">
     <li>
     <a href="#"
-       tal:attributes="href python:request.indexargs_url('issue', {
+       tal:attributes="href python:request.indexargs_url('offer', {
       '@sort': '-activity',
-      '@group': 'priority',
-      '@filter': 'status,assignee',
+      '@group': 'status',
+      '@filter': 'status,creator',
       '@columns': 'id,activity,title,creator,status',
       '@search_text': '',
       'status': status_notresolved,
-      'assignee': request.user.id,
-      '@dispname': i18n.gettext('Your Issues'),
+      'creator': request.user.id,
+      '@dispname': 'Your Offers',
       '@startwith': 0,
      })"
-    i18n:translate="">Your Issues</a>
+    i18n:translate="">Your Offers</a>
     </li>
     <li>
        <a tal:attributes="href string:user${request/user/id}"
@@ -228,8 +215,8 @@
 <div id="credits">
 <a href="http://www.python.org/about/website">Website maintained by the Python community</a><br />
 
-<a href="http://www.upfrontsystems.co.za/" title="issue tracker hosting provided by Upfront Systems, South Africa">hosting by Upfront Systems</a> / 
-  <a href="http://roundup.sf.net" title="Powered by the Roundup Issue Tracker">powered by Roundup</a>
+<a href="http://www.upfrontsystems.co.za/" title="offer tracker hosting provided by Upfront Systems, South Africa">hosting by Upfront Systems</a> / 
+  <a href="http://roundup.sf.net" title="Powered by the Roundup Offer Tracker">powered by Roundup</a>
 </div> <!-- credits -->
 Copyright &copy; 1990-2006, <a href="http://python.org/psf">Python Software Foundation</a><br />
 <a href="http://python.org/about/legal">Legal Statements</a>
@@ -237,7 +224,7 @@
 </div> <!-- body-main -->
 </div> <!-- content -->
 
-<pre tal:condition="request/form/deissue | nothing" tal:content="request">
+<pre tal:condition="request/form/deoffer | nothing" tal:content="request">
 </pre>
 
 </body>
@@ -250,7 +237,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 offer.search.html in the classic template for examples.
 -->
 
 <!-- creates a th and a label: -->
@@ -272,7 +259,7 @@
                          name 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('offer?@template=calendar&property=%s&form=itemSynopsis', 300, 200)'''%name">(cal)</a>
 </td>
 
 <td metal:define-macro="search_popup">
@@ -283,7 +270,7 @@
   <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                          name name;
                          id name"/>
-  <span tal:replace="structure python:db.issue.classhelp(columns,
+  <span tal:replace="structure python:db.offer.classhelp(columns,
                                       property=name)" />
 </td>
 
@@ -322,7 +309,7 @@
     <option value="" i18n:translate="">don't care</option>
     <option value="" i18n:translate="" disabled="disabled">------------</option>
     <option value="User">User</option>
-    <option value="Developer">Developer</option>
+    <option value="Editor">Editor</option>
     <option value="Coordinator">Coordinator</option>
   </select>
 </td>

Modified: tracker/instances/jobs/html/user.forgotten.html
==============================================================================
--- tracker/instances/jobs/html/user.forgotten.html	(original)
+++ tracker/instances/jobs/html/user.forgotten.html	Sat Feb 16 15:29:24 2008
@@ -10,11 +10,6 @@
 <p i18n:translate="">You have two options if you have forgotten your password.
 If you know the email address you registered with, enter it below.</p>
 
-<p i18n:translate="">If your  user was  automatically  created during
-import  from  the old  sourceforge  tracker,  your  e-mail address  is
-&lt;Sourceforge  username&gt;@users.sourceforge.net. The  mail address
-associated with your account can be changed after login.</p>
-
 <form method="POST" onSubmit="return submit_once()"
       tal:attributes="action context/designator">
     <table class="form">
@@ -35,10 +30,6 @@
 
 <p i18n:translate="">Or, if you know your username, then enter it below.</p>
 
-<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">
  <tr><th i18n:translate="">Username:</th> <td><input name="username"></td> </tr>
  <tr><td></td><td><input type="submit" value="Request password reset"

Modified: tracker/instances/jobs/html/user.register.html
==============================================================================
--- tracker/instances/jobs/html/user.register.html	(original)
+++ tracker/instances/jobs/html/user.register.html	Sat Feb 16 15:29:24 2008
@@ -7,13 +7,6 @@
  tal:replace="db/config/TRACKER_NAME" /></span>
 <td class="content" metal:fill-slot="content">
 
-<p><span style="color:red; font-size:large;">NOTE</span>: If you have previously created or modified issue
-reports using the sourceforge issue tracker previously used for python
-bugs, your username on sourceforge already exists in this tracker. Use
-the <a href="user?@template=forgotten">Password recovery form</a> to
-get a password for your account.</p>
-
-
 <form method="POST" onSubmit="return submit_once()"
       enctype="multipart/form-data"
       tal:attributes="action context/designator">

Modified: tracker/instances/jobs/initial_data.py
==============================================================================
--- tracker/instances/jobs/initial_data.py	(original)
+++ tracker/instances/jobs/initial_data.py	Sat Feb 16 15:29:24 2008
@@ -4,84 +4,19 @@
 # TRACKER INITIAL PRIORITY AND STATUS VALUES
 #
 
-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="Build", order="1")
-component.create(name="Demos and Tools", order="2")
-component.create(name="Distutils", order="3")
-component.create(name="Documentation", order="4")
-component.create(name="Extension Modules", order="5")
-component.create(name="IDLE", order="6")
-component.create(name="Installation", order="7")
-component.create(name="Interpreter Core", order="8")
-component.create(name="Library (Lib)", order="9")
-component.create(name="Macintosh", order="10")
-component.create(name="Regular Expressions", order="11")
-component.create(name="Tests", order="12")
-component.create(name="Tkinter", order="13")
-component.create(name="Unicode", order="14")
-component.create(name="Windows", order="15")
-component.create(name="XML", order="16")
-
-version = db.getclass('version')
-version.create(name='Python 2.6', order='1')
-version.create(name='Python 2.5', order='2')
-version.create(name='Python 2.4', order='3')
-version.create(name='Python 2.3', order='4')
-version.create(name='Python 2.2.3', order='5')
-version.create(name='Python 2.2.2', order='6')
-version.create(name='Python 2.2.1', order='7')
-version.create(name='Python 2.2', order='8')
-version.create(name='Python 2.1.2', order='9')
-version.create(name='Python 2.1.1', order='10')
-version.create(name='3rd party', order='11')
-
-
-severity = db.getclass('severity')
-severity.create(name='critical', order='1')
-severity.create(name='urgent', order='2')
-severity.create(name='major', order='3')
-severity.create(name='normal', order='4')
-severity.create(name='minor', order='5')
-
-priority = db.getclass('priority')
-priority.create(name='immediate', order='1')
-priority.create(name='urgent', order='2')
-priority.create(name='high', order='3')
-priority.create(name='normal', order='4')
-priority.create(name='low', order='5')
-
 status = db.getclass('status')
-status.create(name='open', order='1')
-status.create(name='closed', order='2')
+status.create(name='submitted', order='1')
+status.create(name='posted', order='2')
 status.create(name='pending', description='user feedback required', order='3')
+status.create(name='withdrawn', description='submitter has the offer withdrawn', order='4')
+status.create(name='expired', description='The posting was removed after being online for the scheduled time', order='5')
+status.create(name='rejected', description='The offer was rejected for posting', order='6')
 
-resolution = db.getclass('resolution')
-resolution.create(name='accepted', order='1')
-resolution.create(name='duplicate', order='2')
-resolution.create(name='fixed', order='3')
-resolution.create(name='invalid', order='4')
-resolution.create(name='later', order='5')
-resolution.create(name='out of date', order='6')
-resolution.create(name='postponed', order='7')
-resolution.create(name='rejected', order='8')
-resolution.create(name='remind', order='9')
-resolution.create(name='wont fix', order='10')
-resolution.create(name='works for me', order='11')
-
-keyword = db.getclass("keyword")
-keyword.create(name="py3k", description="Python 3000 bugs")
-keyword.create(name="patch", description="Contains patch")
 
 #
 # create the two default users
 user = db.getclass('user')
 user.create(username="admin", password=adminpw, address=admin_email, roles='Admin')
 user.create(username="anonymous", roles='Anonymous')
+user.create(username="user", password=Password("user"), roles='User')
+user.create(username="editor", password=Password("editor"), roles='Editor')

Modified: tracker/instances/jobs/schema.py
==============================================================================
--- tracker/instances/jobs/schema.py	(original)
+++ tracker/instances/jobs/schema.py	Sat Feb 16 15:29:24 2008
@@ -9,41 +9,6 @@
 #   creator = Link('user')
 #   actor = Link('user')
 
-# Issue Type
-issue_type = Class(db, 'issue_type',
-                   name=String(),
-                   description=String(),
-                   order=Number())
-issue_type.setkey('name')
-
-# Component
-component = Class(db, 'component',
-                  name=String(),
-                  description=String(),
-                  order=Number())
-component.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')
-
-# Priority
-priority = Class(db, 'priority',
-                 name=String(),
-                 description=String(),
-                 order=Number())
-priority.setkey('name')
-
 # Status
 status = Class(db, "status",
                name=String(),
@@ -51,20 +16,6 @@
                order=Number())
 status.setkey("name")
 
-# Resolution
-resolution = Class(db, "resolution",
-                   name=String(),
-                   description=String(),
-                   order=Number())
-resolution.setkey('name')
-
-# Keyword
-keyword = Class(db, "keyword",
-                name=String(),
-                description=String())
-keyword.setkey("name")
-                
-
 # User-defined saved searches
 query = Class(db, "query",
               klass=String(),
@@ -113,18 +64,14 @@
 #   files = Multilink("file")
 #   nosy = Multilink("user")
 #   superseder = Multilink("issue")
-issue = IssueClass(db, "issue",
-                   type=Link('issue_type'),
-                   components=Multilink('component'),
-                   versions=Multilink('version'),
-                   severity=Link('severity'),
-                   priority=Link('priority'),
-                   dependencies=Multilink('issue'),
-                   assignee=Link('user'),
+offer = IssueClass(db, "offer",
+                   organization=String(),
+                   organization_url=String(),
+                   agency=Boolean(),
+                   description=Link('msg'),
+                   python_used_for=Link('msg'),
                    status=Link('status'),
-                   resolution=Link('resolution'),
-                   superseder=Link('issue'),
-                   keywords=Multilink("keyword"))
+                   )
 
 #
 # TRACKER SECURITY SETTINGS
@@ -132,7 +79,7 @@
 # See the configuration and customisation document for information
 # about security setup.
 
-db.security.addRole(name='Developer', description='A developer')
+db.security.addRole(name='Editor', description='An editor')
 db.security.addRole(name='Coordinator', description='A coordinator')
 
 db.security.addPermission(name="SB: May Classify")
@@ -142,7 +89,7 @@
 # REGULAR USERS
 #
 # Give the regular users access to the web and email interface
-for r in 'User', 'Developer', 'Coordinator':
+for r in 'User', 'Editor', 'Coordinator':
     db.security.addPermissionToRole(r, 'Web Access')
     db.security.addPermissionToRole(r, 'Email Access')
 
@@ -150,9 +97,14 @@
 # User permissions
 ##########################
 
-for cl in ('issue_type', 'severity', 'component',
-           'version', 'priority', 'status', 'resolution',
-           'issue', 'keyword'):
+def own_offer(db, userid, itemid):
+    return db.offer.get(itemid, 'creator')==userid
+
+p = db.security.addPermission(name='View', klass='offer', check=own_offer,
+    description="User is allowed to view their own offers")
+db.security.addPermissionToRole('User',p)
+
+for cl in ('status',):
     db.security.addPermissionToRole('User', 'View', cl)
     db.security.addPermissionToRole('Anonymous', 'View', cl)
 
@@ -174,7 +126,9 @@
 
         return True
 
-for cl in ('file', 'msg'):
+# files are disabled for the moment
+#for cl in ('file', 'msg'):
+for cl in ('msg',):
     p = db.security.addPermission(name='View', klass=cl,
                                   description="allowed to see metadata object regardless of spam status",
                                   properties=('creation', 'activity',
@@ -187,7 +141,6 @@
                                               'description',
                                               ))
 
-    db.security.addPermissionToRole('Anonymous', p)
     db.security.addPermissionToRole('User', p)
 
     db.security.addPermissionToRole('User', 'Create', cl)
@@ -203,24 +156,23 @@
                                           properties=('content', 'summary'),
                                           check=may_view_spam(cl))
 
-    db.security.addPermissionToRole('Anonymous', spamcheck)
 
     
 
-p = db.security.addPermission(name='Create', klass='issue',
-                              properties=('title', 'type',
-                                          'components', 'versions',
-                                          'severity',
+p = db.security.addPermission(name='Create', klass='offer',
+                              properties=('title', 'organization',
+                                          'organization_url', 'agency',
+                                          'description', 'python_used_for',
                                           'messages', 'files', 'nosy'),
-                              description='User can report and discuss issues')
+                              description='User can report and discuss offers')
 db.security.addPermissionToRole('User', p)
 
-p = db.security.addPermission(name='Edit', klass='issue',
-                              properties=('title', 'type',
-                                          'components', 'versions',
-                                          'severity',
+p = db.security.addPermission(name='Edit', klass='offer',
+                              properties=('title','organization',
+                                          'organization_url', 'agency',
+                                          'description', 'python_used_for',
                                           'messages', 'files', 'nosy'),
-                              description='User can report and discuss issues')
+                              description='User can add and discuss offers')
 db.security.addPermissionToRole('User', p)
 
 db.security.addPermissionToRole('User', 'SB: May Report Misclassified')
@@ -228,23 +180,20 @@
 
 
 ##########################
-# Developer permissions
+# Editor permissions
 ##########################
-for cl in ('issue_type', 'severity', 'component',
-           'version', 'priority', 'status', 'resolution',
-           'issue', 'file', 'msg', 'keyword'):
-    db.security.addPermissionToRole('Developer', 'View', cl)
-
-for cl in ('issue', 'file', 'msg', 'keyword'):
-    db.security.addPermissionToRole('Developer', 'Edit', cl)
-    db.security.addPermissionToRole('Developer', 'Create', cl)
+for cl in ('status','offer', 'file', 'msg'):
+    db.security.addPermissionToRole('Editor', 'View', cl)
+
+for cl in ('offer', 'file', 'msg'):
+    db.security.addPermissionToRole('Editor', 'Edit', cl)
+    db.security.addPermissionToRole('Editor', 'Create', cl)
 
 
 ##########################
 # Coordinator permissions
 ##########################
-for cl in ('issue_type', 'severity', 'component',
-           'version', 'priority', 'status', 'resolution', 'issue', 'file', 'msg'):
+for cl in ('status', 'offer', 'file', 'msg'):
     db.security.addPermissionToRole('Coordinator', 'View', cl)
     db.security.addPermissionToRole('Coordinator', 'Edit', cl)
     db.security.addPermissionToRole('Coordinator', 'Create', cl)
@@ -254,7 +203,7 @@
 # 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('Editor', 'View', 'user')
 db.security.addPermissionToRole('Coordinator', 'View', 'user')
 
 # Allow Coordinator to edit any user, including their roles.
@@ -268,7 +217,7 @@
     return userid == itemid
 p = db.security.addPermission(name='View', klass='user', check=own_record,
     description="User is allowed to view their own user details")
-for r in 'User', 'Developer', 'Coordinator':
+for r in 'User', 'Editor', '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",
@@ -278,7 +227,7 @@
                 'alternate_addresses',
                 'queries',
                 'timezone')) # Note: 'roles' excluded - users should not be able to edit their own roles. 
-for r in 'User', 'Developer':
+for r in 'User', 'Editor':
     db.security.addPermissionToRole(r, p)
 
 # Users should be able to edit and view their own queries. They should also
@@ -292,15 +241,15 @@
     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")
-for r in 'User', 'Developer', 'Coordinator':
+for r in 'User', 'Editor', '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")
-for r in 'User', 'Developer', 'Coordinator':
+for r in 'User', 'Editor', 'Coordinator':
     db.security.addPermissionToRole(r, p)
 p = db.security.addPermission(name='Create', klass='query',
     description="User is allowed to create queries")
-for r in 'User', 'Developer', 'Coordinator':
+for r in 'User', 'Editor', 'Coordinator':
     db.security.addPermissionToRole(r, p)
 
 
@@ -324,12 +273,12 @@
 # - 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 offers (and the related, linked
 # information).
 # Note permissions settings for file and msg above (due to spambayes
 # integration).
 
-for cl in 'issue', 'severity', 'status', 'resolution':
+for cl in 'offer', 'status':
     db.security.addPermissionToRole('Anonymous', 'View', cl)
 
 # Allow users to see the realname
@@ -341,9 +290,9 @@
 
 
 # [OPTIONAL]
-# Allow anonymous users access to create or edit "issue" items (and the
+# Allow anonymous users access to create or edit "offer" items (and the
 # related file and message items)
-#for cl in 'issue', 'file', 'msg':
+#for cl in 'offer', 'file', 'msg':
 #   db.security.addPermissionToRole('Anonymous', 'Create', cl)
 #   db.security.addPermissionToRole('Anonymous', 'Edit', cl)
 


More information about the Python-checkins mailing list