Edgewall Software

NewWorkflow: patch-newworkflow-r1034.diff

File patch-newworkflow-r1034.diff, 67.1 KB (added by pkou <pkou at ua.fm>, 4 years ago)

Patch for the changes

  • htdocs/css/timeline.css

     
    3030/* Apply icon background-image twice to avoid hover-flicker in IE/Win */ 
    3131dt.changeset, dt.changeset a { background-image: url(../changeset.png) !important } 
    3232dt.newticket, dt.newticket a { background-image: url(../newticket.png) !important } 
     33dt.resolvedticket, dt.resolvedticket a { background-image: url(../resolvedticket.png) !important } 
     34dt.reopenedticket, dt.reopenedticket a { background-image: url(../reopenedticket.png) !important } 
    3335dt.closedticket, dt.closedticket a { background-image: url(../closedticket.png) !important } 
    3436dt.wiki, dt.wiki a { background-image: url(../wiki.png) !important } 
    3537dt.milestone, dt.milestone a { background-image: url(../milestone.png) !important } 
  • wiki-default/TracIni

     
    2222See also: TracLogging 
    2323 
    2424== [ticket] == 
     25|| workflow_version  || Workflow version: 1 for simple, 2 for advanced || 
    2526|| default_version   || Default version for newly created tickets || 
    2627|| default_severity  || Default severity for newly created tickets || 
    2728|| default_priority  || Default priority for newly created tickets || 
  • wiki-default/TracAdmin

     
    2323permission add <user> <action>      -- Add a new permission rule 
    2424permission remove <user> <action>   -- Remove permission rule 
    2525component list                      -- Show available components 
    26 component add <name> <owner>        -- Add a new component 
     26component add <name> <owner> [<qaowner>]   -- Add a new component 
    2727component rename <name> <newname>   -- Rename a component 
    2828component remove <name>             -- Remove/uninstall component 
    29 component chown <name> <owner>     -- Change component ownership 
     29component chown <name> <owner> [<qaowner>] -- Change component ownership 
    3030priority list                       -- Show possible ticket priorities 
    3131priority add <value>                -- Add a priority value option 
    3232priority change <value> <newvalue>  -- Change a priority value 
     
    4141version time <name> <time>          -- Set version date/time 
    4242version remove <name>               -- Remove version 
    4343milestone list                      -- Show milestones 
    44 milestone add <name> [time]        -- Add milestone 
     44milestone add <name> [<owner> [time]] -- Add milestone 
    4545milestone rename <name> <newname>   -- Rename milestone 
    4646milestone time <name> <time>        -- Set milestone date/time 
     47milestone chown <name> <owner>      -- Change milestone ownership 
    4748milestone remove <name>             -- Remove milestone 
    4849}}} 
    4950 
  • scripts/trac-admin

     
    290290     
    291291#    ## Component 
    292292    _help_component = [('component list', 'Show available components'), 
    293                        ('component add <name> <owner>', 'Add a new component'), 
     293                       ('component add <name> <owner> [<qaowner>]', 'Add a new component'), 
    294294                       ('component rename <name> <newname>', 'Rename a component'), 
    295295                       ('component remove <name>', 'Remove/uninstall component'), 
    296                        ('component chown <name> <owner>', 'Change component ownership')] 
     296                       ('component chown <name> <owner> [<qaowner>]', 'Change component ownership')] 
    297297 
    298298    def complete_component (self, text, line, begidx, endidx): 
    299299        if begidx in [16,17]: 
     
    309309        try: 
    310310            if arg[0]  == 'list': 
    311311                self._do_component_list() 
    312             elif arg[0] == 'add' and len(arg)==3: 
     312            elif arg[0] == 'add' and len(arg) in [3,4]: 
    313313                name = arg[1] 
    314314                owner = arg[2] 
    315                 self._do_component_add(name, owner) 
     315                if len(arg) == 4: 
     316                    qaowner = arg[3] 
     317                else: 
     318                    qaowner = owner 
     319                self._do_component_add(name, owner, qaowner) 
    316320            elif arg[0] == 'rename' and len(arg)==3: 
    317321                name = arg[1] 
    318322                newname = arg[2] 
     
    320324            elif arg[0] == 'remove'  and len(arg)==2: 
    321325                name = arg[1] 
    322326                self._do_component_remove(name) 
    323             elif arg[0] == 'chown' and len(arg)==3: 
     327            elif arg[0] == 'chown' and len(arg) in [3,4]: 
    324328                name = arg[1] 
    325329                owner = arg[2] 
    326                 self._do_component_set_owner(name, owner) 
     330                if len(arg) == 4: 
     331                    qaowner = arg[3] 
     332                else: 
     333                    qaowner = owner 
     334                self._do_component_set_owner(name, owner, qaowner) 
    327335            else:     
    328336                self.do_help ('component') 
    329337        except Exception, e: 
    330338            print 'Component %s failed:' % arg[0], e 
    331339 
    332340    def _do_component_list(self): 
    333         data = self.db_execsql('SELECT name, owner FROM component')  
    334         self.print_listing(['Name', 'Owner'], data) 
     341        data = self.db_execsql('SELECT name, owner, qaowner FROM component')  
     342        self.print_listing(['Name', 'Owner', 'QA Owner'], data) 
    335343 
    336     def _do_component_add(self, name, owner): 
    337         data = self.db_execsql("INSERT INTO component VALUES('%s', '%s')" 
    338                                % (name, owner)) 
     344    def _do_component_add(self, name, owner, qaowner): 
     345        data = self.db_execsql("INSERT INTO component VALUES('%s', '%s', '%s')" 
     346                               % (name,owner,qaowner)) 
    339347 
    340348    def _do_component_rename(self, name, newname): 
    341349        cnx = self.db_open() 
     
    360368        data = self.db_execsql("DELETE FROM component WHERE name='%s'" 
    361369                               % (name)) 
    362370 
    363     def _do_component_set_owner(self, name, owner): 
     371    def _do_component_set_owner(self, name, owner, qaowner): 
    364372        cnx = self.db_open() 
    365373        cursor = cnx.cursor () 
    366374        cursor.execute('SELECT name FROM component WHERE name=%s', name) 
    367375        data = cursor.fetchone() 
    368376        if not data: 
    369377            raise Exception("No such component '%s'" % name) 
    370         data = self.db_execsql("UPDATE component SET owner='%s' WHERE name='%s'" 
    371                                % (owner,name)) 
     378        data = self.db_execsql("UPDATE component SET owner='%s', qaowner='%s' WHERE name='%s'" 
     379                               % (owner,qaowner,name)) 
    372380 
    373381 
    374382    ## Permission 
     
    795803 
    796804    ## Milestone 
    797805    _help_milestone = [('milestone list', 'Show milestones'), 
    798                        ('milestone add <name> [time]', 'Add milestone'), 
     806                       ('milestone add <name> [<owner> [time]]', 'Add milestone'), 
    799807                       ('milestone rename <name> <newname>', 
    800808                        'Rename milestone'), 
     809                       ('milestone chown <name> <newowner>', 'Change milestone owner'), 
    801810                       ('milestone time <name> <time>', 'Set milestone date (Format: "Jun 3, 2003")'), 
    802811                       ('milestone remove <name>', 'Remove milestone')] 
    803812 
     
    805814 
    806815        if begidx in [15,17]: 
    807816            comp = self.get_milestone_list () 
     817        elif begidx > 15 and line.startswith('milestone chown '): 
     818            comp = self.get_user_list() 
    808819        elif begidx < 15: 
    809             comp = ['list','add','rename','time','remove'] 
     820            comp = ['list','add','rename','chown','time','remove'] 
    810821        return self.word_complete(text, comp) 
    811822 
    812823    def do_milestone(self, line): 
    813         self._do_mile_ver('milestone', line) 
     824        type = 'milestone' 
     825        arg = self.arg_tokenize(line) 
     826        try: 
     827            if arg[0]  == 'list': 
     828                self._do_milestone_list() 
     829            elif arg[0] == 'add' and len(arg) in [2,3,4]: 
     830                name = arg[1] 
     831                self._do_mile_ver_add(type, name) 
     832                if len(arg) >= 3: 
     833                    owner = arg[2] 
     834                    self._do_mile_ver_chown(type, name, owner) 
     835                if len(arg) >= 4: 
     836                    time = arg[3] 
     837                    self._do_mile_ver_time(type, name, time) 
     838            elif arg[0] == 'rename' and len(arg)==3: 
     839                name = arg[1] 
     840                newname = arg[2] 
     841                self._do_mile_ver_rename(type, name, newname) 
     842            elif arg[0] == 'chown' and len(arg)==3: 
     843                name = arg[1] 
     844                owner = arg[2] 
     845                self._do_mile_ver_chown(type, name, owner) 
     846            elif arg[0] == 'time' and len(arg)==3: 
     847                name = arg[1] 
     848                time = arg[2] 
     849                self._do_mile_ver_time(type, name, time) 
     850            elif arg[0] == 'remove' and len(arg)==2: 
     851                name = arg[1] 
     852                self._do_mile_ver_remove(type, name) 
     853            else: 
     854                self.do_help (type) 
     855        except Exception, e: 
     856            print 'Command %s failed:' % arg[0], e 
    814857 
     858    def _do_milestone_list(self): 
     859        data = self.db_execsql("SELECT name,owner,time FROM milestone ORDER BY time,name") 
     860        data = map(lambda x: (x[0], x[1], x[2] and time.strftime('%c', time.localtime(x[2]))), data) 
     861        #print data 
     862        self.print_listing(['Name', 'Owner', 'Time'], data) 
    815863 
     864 
    816865    ## Version 
    817866    _help_version = [('version list', 'Show versions'), 
    818867                       ('version add <name> [time]', 'Add version'), 
     
    832881    def do_version(self, line): 
    833882        self._do_mile_ver('version', line) 
    834883 
    835     # Milestone and Version are identical,  methods 
     884    # Milestone and Version are almost identical,  methods 
    836885 
    837886    def _do_mile_ver(self, type, line): 
    838887        arg = self.arg_tokenize(line) 
     
    923972        else: 
    924973            print >> sys.stderr, 'Unknown time format' 
    925974 
     975    def _do_mile_ver_chown(self, type, name, owner): 
     976        data = self.db_execsql("UPDATE %s SET owner='%s' WHERE name='%s'" 
     977                               % (type, owner, name)); 
     978 
    926979    _help_upgrade = [('upgrade', 'Upgrade database to current version.')] 
    927980    def do_upgrade(self, line): 
    928981        arg = self.arg_tokenize(line) 
  • trac/db_default.py

     
    2121 
    2222 
    2323# Database version identifier. Used for automatic upgrades. 
    24 db_version = 7 
     24db_version = 8 
     25# Current workflow version identifier 
     26current_workflow_version = 2 
    2527 
    2628def __mkreports(reps): 
    2729    """Utility function used to create report data in same syntax as the 
     
    125127); 
    126128CREATE TABLE component ( 
    127129         name            text PRIMARY KEY, 
    128          owner           text 
     130         owner           text, 
     131         qaowner         text 
    129132); 
    130133CREATE TABLE milestone ( 
    131134         id              integer PRIMARY KEY, 
    132135         name            text, 
    133136         time            integer, 
     137         owner           text, 
    134138         descr           text, 
    135139         UNIQUE(name) 
    136140); 
     
    209213""", 
    210214""" 
    211215SELECT p.value AS __color__, 
    212    version AS __group__, 
    213    id AS ticket, summary, component, version, severity,  
     216   (CASE WHEN IFNULL(version, '') = '' THEN 'Not Specified' ELSE 'Version ' || version END) AS __group__, 
     217   id AS ticket, summary, component, milestone, severity,  
    214218   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
    215219   time AS created, 
    216220   changetime AS _changetime, description AS _description, 
     
    218222  FROM ticket t, enum p 
    219223  WHERE status IN ('new', 'assigned', 'reopened')  
    220224AND p.name = t.priority AND p.type = 'priority' 
    221   ORDER BY (version IS NULL),version, p.value, severity, time 
     225  ORDER BY (IFNULL(version, '') = '') DESC,version, p.value, severity, time 
    222226"""), 
    223227#---------------------------------------------------------------------------- 
    224 ('All Tickets by Milestone', 
     228('Active Tickets by Milestone', 
    225229""" 
    226230This report shows how to color results by priority, 
    227231while grouping results by milestone. 
     
    231235""", 
    232236""" 
    233237SELECT p.value AS __color__, 
    234    milestone||' Release' AS __group__, 
     238   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
    235239   id AS ticket, summary, component, version, severity,  
    236240   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
    237241   time AS created, 
     
    240244  FROM ticket t, enum p 
    241245  WHERE status IN ('new', 'assigned', 'reopened')  
    242246AND p.name = t.priority AND p.type = 'priority' 
    243   ORDER BY (milestone IS NULL),milestone, p.value, severity, time 
     247  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
    244248"""), 
    245249#---------------------------------------------------------------------------- 
    246250('Assigned, Active Tickets by Owner', 
     
    248252List assigned tickets, group by ticket owner, sorted by priority. 
    249253""", 
    250254""" 
    251  
    252255SELECT p.value AS __color__, 
    253    owner AS __group__, 
    254    id AS ticket, summary, component, milestone, severity, time AS created, 
     256   (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 
     257   id AS ticket, summary, component, version, milestone, severity, time AS created, 
    255258   changetime AS _changetime, description AS _description, 
    256259   reporter AS _reporter 
    257260  FROM ticket t,enum p 
    258261  WHERE status = 'assigned' 
    259262AND p.name=t.priority AND p.type='priority' 
    260   ORDER BY owner, p.value, severity, time 
     263  ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 
    261264"""), 
    262265#---------------------------------------------------------------------------- 
    263266('Assigned, Active Tickets by Owner (Full Description)', 
     
    268271""" 
    269272SELECT p.value AS __color__, 
    270273   owner AS __group__, 
    271    id AS ticket, summary, component, milestone, severity, time AS created, 
     274   id AS ticket, summary, component, version, milestone, severity, time AS created, 
    272275   description AS _description_, 
    273276   changetime AS _changetime, reporter AS _reporter 
    274277  FROM ticket t, enum p 
     
    283286""", 
    284287""" 
    285288SELECT p.value AS __color__, 
    286    t.milestone AS __group__, 
     289   (CASE WHEN IFNULL(t.milestone, '') = '' THEN 'Not Assigned' ELSE t.milestone || ' Release' END) AS __group__, 
    287290   (CASE status  
    288291      WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;' 
    289292      ELSE  
     
    295298   time AS _time,reporter AS _reporter 
    296299  FROM ticket t,enum p 
    297300  WHERE p.name=t.priority AND p.type='priority' 
    298   ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'),  
     301  ORDER BY (IFNULL(milestone, '') = '') DESC, milestone DESC, (status = 'closed'),  
    299302        (CASE status WHEN 'closed' THEN modified ELSE -p.value END) DESC 
    300303"""), 
    301304#---------------------------------------------------------------------------- 
     
    308311""" 
    309312SELECT p.value AS __color__, 
    310313   (CASE status WHEN 'assigned' THEN 'Assigned' ELSE 'Owned' END) AS __group__, 
    311    id AS ticket, summary, component, version, milestone, 
     314   id AS ticket, summary, component, status, version, milestone, 
    312315   severity, priority, time AS created, 
    313316   changetime AS _changetime, description AS _description, 
    314317   reporter AS _reporter 
    315318  FROM ticket t, enum p 
    316   WHERE t.status IN ('new', 'assigned', 'reopened')  
     319  WHERE t.status <> 'closed'  
    317320AND p.name = t.priority AND p.type = 'priority' AND owner = '$USER' 
    318321  ORDER BY (status = 'assigned') DESC, p.value, milestone, severity, time 
    319322"""), 
     
    338341  WHERE status IN ('new', 'assigned', 'reopened')  
    339342AND p.name = t.priority AND p.type = 'priority' 
    340343  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     344"""), 
     345#---------------------------------------------------------------------------- 
     346('Open Tickets, Mine first', 
     347""" 
     348 * List all not closed tickets by priority. 
     349 * Show all tickets owned by the logged in user in a group first. 
     350""", 
     351""" 
     352SELECT p.value AS __color__, 
     353   (CASE owner  
     354     WHEN '$USER' THEN 'My Tickets'  
     355     ELSE 'Open Tickets'  
     356    END) AS __group__, 
     357   id AS ticket, summary, component, status, version, milestone, severity,  
     358   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     359   time AS created, 
     360   changetime AS _changetime, description AS _description, 
     361   reporter AS _reporter 
     362  FROM ticket t, enum p 
     363  WHERE status <> 'closed'  
     364AND p.name = t.priority AND p.type = 'priority' 
     365  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     366"""), 
     367#---------------------------------------------------------------------------- 
     368('Open Tickets by Version', 
     369""" 
     370 * List all not closed tickets by priority. 
     371 * Group results by version. 
     372""", 
     373""" 
     374SELECT p.value AS __color__, 
     375   (CASE WHEN IFNULL(version, '') = '' THEN 'Not Specified' ELSE 'Version ' || version END) AS __group__, 
     376   id AS ticket, summary, component, status, milestone, severity,  
     377   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     378   time AS created, 
     379   changetime AS _changetime, description AS _description, 
     380   reporter AS _reporter 
     381  FROM ticket t, enum p 
     382  WHERE status <> 'closed' 
     383AND p.name = t.priority AND p.type = 'priority' 
     384  ORDER BY (IFNULL(version, '') = '') desc,version, p.value, severity, time 
     385"""), 
     386#---------------------------------------------------------------------------- 
     387('Open Tickets by Milestone', 
     388""" 
     389 * List all not closed tickets by priority. 
     390 * Group results by milestone. 
     391""", 
     392""" 
     393SELECT p.value AS __color__, 
     394   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     395   id AS ticket, summary, component, status, version, severity,  
     396   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     397   time AS created, 
     398   changetime AS _changetime, description AS _description, 
     399   reporter AS _reporter 
     400  FROM ticket t, enum p 
     401  WHERE status <> 'closed'  
     402AND p.name = t.priority AND p.type = 'priority' 
     403  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
     404"""), 
     405#---------------------------------------------------------------------------- 
     406('Open Tickets by Owner', 
     407""" 
     408List not closed tickets, group by ticket owner, sorted by priority. 
     409""", 
     410""" 
     411SELECT p.value AS __color__, 
     412   (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 
     413   id AS ticket, summary, component, status, version, milestone, severity, 
     414   time AS created, changetime AS _changetime, description AS _description, 
     415   reporter AS _reporter 
     416  FROM ticket t,enum p 
     417  WHERE status <> 'closed' 
     418AND p.name=t.priority AND p.type='priority' 
     419  ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 
     420"""), 
     421#---------------------------------------------------------------------------- 
     422('Open Tickets by Status', 
     423""" 
     424 * List all not closed tickets by priority. 
     425 * Group results by status. 
     426""", 
     427""" 
     428SELECT p.value AS __color__, 
     429   status AS __group__, 
     430   id AS ticket, summary, component, version, milestone, severity, owner, 
     431   time AS created, 
     432   changetime AS _changetime, description AS _description, 
     433   reporter AS _reporter 
     434  FROM ticket t, enum q, enum p 
     435  WHERE status <> 'closed'  
     436AND q.name = t.status AND q.type = 'status' 
     437AND p.name = t.priority AND p.type = 'priority' 
     438  ORDER BY q.value, p.value, severity, time 
     439"""), 
     440#---------------------------------------------------------------------------- 
     441('Resolved Tickets, Mine first', 
     442""" 
     443 * List all resolved tickets by priority. 
     444 * Show all tickets owned by the logged in user in a group first. 
     445""", 
     446""" 
     447SELECT p.value AS __color__, 
     448   (CASE owner  
     449     WHEN '$USER' THEN 'My Tickets'  
     450     ELSE 'Active Tickets'  
     451    END) AS __group__, 
     452   id AS ticket, summary, component, version, milestone, severity,  
     453   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     454   time AS created, 
     455   changetime AS _changetime, description AS _description, 
     456   reporter AS _reporter 
     457  FROM ticket t, enum p 
     458  WHERE status = 'resolved'  
     459AND p.name = t.priority AND p.type = 'priority' 
     460  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     461"""), 
     462#---------------------------------------------------------------------------- 
     463('Resolved Tickets by Milestone', 
     464""" 
     465List resolved tickets, sorted by priority, grouped by milestone 
     466""", 
     467""" 
     468SELECT p.value AS __color__, 
     469   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     470   id AS ticket, summary, component, version, severity,  
     471   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     472   time AS created, 
     473   changetime AS _changetime, description AS _description, 
     474   reporter AS _reporter 
     475  FROM ticket t, enum p 
     476  WHERE status = 'resolved'  
     477AND p.name = t.priority AND p.type = 'priority' 
     478  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
     479"""), 
     480#---------------------------------------------------------------------------- 
     481('Resolved Tickets by Owner', 
     482""" 
     483List resolved tickets, group by ticket owner, sorted by priority. 
     484""", 
     485""" 
     486SELECT p.value AS __color__, 
     487   (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 
     488   id AS ticket, summary, component, version, milestone, severity, time AS created, 
     489   changetime AS _changetime, description AS _description, 
     490   reporter AS _reporter 
     491  FROM ticket t,enum p 
     492  WHERE status = 'resolved' 
     493AND p.name=t.priority AND p.type='priority' 
     494  ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 
     495"""), 
     496#---------------------------------------------------------------------------- 
     497('Verified Tickets by Milestone (Full Description)', 
     498""" 
     499Release Notes: List verified and closed tickets, group by milestone, include description. 
     500""", 
     501""" 
     502SELECT p.value AS __color__, 
     503   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     504   id AS ticket, summary, component, status, version, severity, time AS created, 
     505   description AS _description_, 
     506   changetime AS _changetime, reporter AS _reporter 
     507  FROM ticket t, enum p 
     508  WHERE status IN ('verified', 'closed') 
     509AND p.name = t.priority AND p.type = 'priority' 
     510  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
    341511""")) 
    342512 
    343513 
     
    347517 
    348518# (table, (column1, column2), ((row1col1, row1col2), (row2col1, row2col2))) 
    349519data = (('component', 
    350              ('name', 'owner'), 
    351                (('component1', 'somebody'), 
    352                 ('component2', 'somebody'))), 
     520             ('name', 'owner', 'qaowner'), 
     521               (('component1', 'somebody', 'qasomebody'), 
     522                ('component2', 'somebody', 'qasomebody'))), 
    353523           ('milestone', 
    354524             ('name', 'time'), 
    355525               (('', 0),  
     
    367537               (('status', 'new', 1), 
    368538                ('status', 'assigned', 2), 
    369539                ('status', 'reopened', 3), 
    370                 ('status', 'closed', 4), 
     540                ('status', 'resolved', 4), 
     541                ('status', 'verified', 5), 
     542                ('status', 'closed', 6), 
    371543                ('resolution', 'fixed', 1), 
    372544                ('resolution', 'invalid', 2), 
    373545                ('resolution', 'wontfix', 3), 
    374546                ('resolution', 'duplicate', 4), 
    375547                ('resolution', 'worksforme', 5), 
     548                ('resolution', 'moved', 6), 
    376549                ('severity', 'blocker', 1), 
    377550                ('severity', 'critical', 2), 
    378551                ('severity', 'major', 3), 
     
    426599  ('project', 'footer', 
    427600   ' Visit the Trac open source project at<br />' 
    428601   '<a href="http://trac.edgewall.com/">http://trac.edgewall.com/</a>'), 
     602  ('ticket', 'workflow_version', str(current_workflow_version)), 
    429603  ('ticket', 'default_version', ''), 
    430604  ('ticket', 'default_severity', 'normal'), 
    431605  ('ticket', 'default_priority', 'normal'), 
  • trac/Milestone.py

     
    6060    if not group: 
    6161        queries['all_tickets'] = env.href.query({'milestone': milestone}) 
    6262        queries['active_tickets'] = env.href.query({ 
    63             'milestone': milestone, 'status': ['new', 'assigned', 'reopened'] 
     63            'milestone': milestone, 'status': ['new', 'assigned', 'reopened', 'resolved'] 
    6464        }) 
    6565        queries['closed_tickets'] = env.href.query({ 
    66             'milestone': milestone, 'status': 'closed' 
     66            'milestone': milestone, 'status': ['closed', 'verified'] 
    6767        }) 
    6868    else: 
    6969        queries['all_tickets'] = env.href.query({ 
     
    7171        }) 
    7272        queries['active_tickets'] = env.href.query({ 
    7373            'milestone': milestone, grouped_by: group, 
    74             'status': ['new', 'assigned', 'reopened'] 
     74            'status': ['new', 'assigned', 'reopened', 'resolved'] 
    7575        }) 
    7676        queries['closed_tickets'] = env.href.query({ 
    7777            'milestone': milestone, grouped_by: group, 
    78             'status': 'closed' 
     78            'status': ['closed', 'verified'] 
    7979        }) 
    8080    return queries 
    8181 
    8282def calc_ticket_stats(tickets): 
    8383    total_cnt = len(tickets) 
    84     active = [ticket for ticket in tickets if ticket['status'] != 'closed'] 
     84    active = [ticket for ticket in tickets if ticket['status'] != 'closed' and ticket['status'] != 'verified'] 
    8585    active_cnt = len(active) 
    8686    closed_cnt = total_cnt - active_cnt 
    8787 
     
    116116                if datestr: 
    117117                    date = self.parse_date(datestr) 
    118118            descr = self.args.get('descr', '') 
     119            owner = self.args.get('owner', '') 
    119120            if not id: 
    120                 self.create_milestone(name, date, descr) 
     121                self.create_milestone(name, date, descr, owner) 
    121122            else: 
    122                 self.update_milestone(id, name, date, descr) 
     123                self.update_milestone(id, name, date, descr, owner) 
    123124        elif id: 
    124125            self.req.redirect(self.env.href.milestone(id)) 
    125126        else: 
     
    141142                            'Invalid Date Format') 
    142143        return seconds 
    143144 
    144     def create_milestone(self, name, date=0, descr=''): 
     145    def create_milestone(self, name, date=0, descr='', owner=''): 
    145146        self.perm.assert_permission(perm.MILESTONE_CREATE) 
    146147        if not name: 
    147148            raise TracError('You must provide a name for the milestone.', 
    148149                            'Required Field Missing') 
    149150        cursor = self.db.cursor() 
    150151        self.env.log.debug("Creating new milestone '%s'" % name) 
    151         cursor.execute("INSERT INTO milestone (id, name, time, descr) " 
    152                        "VALUES (NULL, %s, %d, %s)", name, date, descr) 
     152        cursor.execute("INSERT INTO milestone (id, name, time, descr, owner) " 
     153                       "VALUES (NULL, %s, %d, %s, %s)", name, date, descr, owner) 
    153154        self.db.commit() 
    154155        self.req.redirect(self.env.href.milestone(name)) 
    155156 
     
    179180        else: 
    180181            self.req.redirect(self.env.href.milestone(id)) 
    181182 
    182     def update_milestone(self, id, name, date, descr): 
     183    def update_milestone(self, id, name, date, descr, owner): 
    183184        self.perm.assert_permission(perm.MILESTONE_MODIFY) 
    184185        cursor = self.db.cursor() 
    185186        self.env.log.debug("Updating milestone '%s'" % id)