Edgewall Software

NewWorkflow: patch-newworkflow-r1064.diff

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

Support customized workflows in Trac

  • 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 || Ticket workflow class.  If not specified, it is ''trac.workflows.SimpleWorkflow'' || 
    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 || 
     
    5455  
    5556[[BR]] 
    5657---- 
    57 See also: TracGuide, TracAdmin 
    58  No newline at end of file 
     58See also: TracGuide, TracAdmin 
  • 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) 
  • setup.py

     
    198198      author_email="info@edgewall.com", 
    199199      license=LICENSE, 
    200200      url=URL, 
    201       packages=['trac', 'trac.upgrades', 'trac.wikimacros', 'trac.mimeviewers'], 
     201      packages=['trac', 'trac.upgrades', 'trac.wikimacros', 'trac.mimeviewers', 
     202                'trac.workflows'], 
    202203      data_files=[(_p('share/trac/templates'), glob('templates/*')), 
    203204                  (_p('share/trac/htdocs'), glob(_p('htdocs/*.*')) + [_p('htdocs/README')]), 
    204205                  (_p('share/trac/htdocs/css'), glob(_p('htdocs/css/*'))), 
  • trac/db_default.py

     
    2121 
    2222 
    2323# Database version identifier. Used for automatic upgrades. 
    24 db_version = 7 
     24db_version = 8 
    2525 
    2626def __mkreports(reps): 
    2727    """Utility function used to create report data in same syntax as the 
     
    125125); 
    126126CREATE TABLE component ( 
    127127         name            text PRIMARY KEY, 
    128          owner           text 
     128         owner           text, 
     129         qaowner         text 
    129130); 
    130131CREATE TABLE milestone ( 
    131132         id              integer PRIMARY KEY, 
    132133         name            text, 
    133134         time            integer, 
     135         owner           text, 
    134136         descr           text, 
    135137         UNIQUE(name) 
    136138); 
     
    209211""", 
    210212""" 
    211213SELECT p.value AS __color__, 
    212    version AS __group__, 
    213    id AS ticket, summary, component, version, severity,  
     214   (CASE WHEN IFNULL(version, '') = '' THEN 'Not Specified' ELSE 'Version ' || version END) AS __group__, 
     215   id AS ticket, summary, component, milestone, severity,  
    214216   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
    215217   time AS created, 
    216218   changetime AS _changetime, description AS _description, 
     
    218220  FROM ticket t, enum p 
    219221  WHERE status IN ('new', 'assigned', 'reopened')  
    220222AND p.name = t.priority AND p.type = 'priority' 
    221   ORDER BY (version IS NULL),version, p.value, severity, time 
     223  ORDER BY (IFNULL(version, '') = '') DESC,version, p.value, severity, time 
    222224"""), 
    223225#---------------------------------------------------------------------------- 
    224 ('All Tickets by Milestone', 
     226('Active Tickets by Milestone', 
    225227""" 
    226228This report shows how to color results by priority, 
    227229while grouping results by milestone. 
     
    231233""", 
    232234""" 
    233235SELECT p.value AS __color__, 
    234    milestone||' Release' AS __group__, 
     236   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
    235237   id AS ticket, summary, component, version, severity,  
    236238   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
    237239   time AS created, 
     
    240242  FROM ticket t, enum p 
    241243  WHERE status IN ('new', 'assigned', 'reopened')  
    242244AND p.name = t.priority AND p.type = 'priority' 
    243   ORDER BY (milestone IS NULL),milestone, p.value, severity, time 
     245  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
    244246"""), 
    245247#---------------------------------------------------------------------------- 
    246248('Assigned, Active Tickets by Owner', 
     
    248250List assigned tickets, group by ticket owner, sorted by priority. 
    249251""", 
    250252""" 
    251  
    252253SELECT p.value AS __color__, 
    253    owner AS __group__, 
    254    id AS ticket, summary, component, milestone, severity, time AS created, 
     254   (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 
     255   id AS ticket, summary, component, version, milestone, severity, time AS created, 
    255256   changetime AS _changetime, description AS _description, 
    256257   reporter AS _reporter 
    257258  FROM ticket t,enum p 
    258259  WHERE status = 'assigned' 
    259260AND p.name=t.priority AND p.type='priority' 
    260   ORDER BY owner, p.value, severity, time 
     261  ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 
    261262"""), 
    262263#---------------------------------------------------------------------------- 
    263264('Assigned, Active Tickets by Owner (Full Description)', 
     
    268269""" 
    269270SELECT p.value AS __color__, 
    270271   owner AS __group__, 
    271    id AS ticket, summary, component, milestone, severity, time AS created, 
     272   id AS ticket, summary, component, version, milestone, severity, time AS created, 
    272273   description AS _description_, 
    273274   changetime AS _changetime, reporter AS _reporter 
    274275  FROM ticket t, enum p 
     
    283284""", 
    284285""" 
    285286SELECT p.value AS __color__, 
    286    t.milestone AS __group__, 
     287   (CASE WHEN IFNULL(t.milestone, '') = '' THEN 'Not Assigned' ELSE t.milestone || ' Release' END) AS __group__, 
    287288   (CASE status  
    288289      WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;' 
    289290      ELSE  
     
    295296   time AS _time,reporter AS _reporter 
    296297  FROM ticket t,enum p 
    297298  WHERE p.name=t.priority AND p.type='priority' 
    298   ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'),  
     299  ORDER BY (IFNULL(milestone, '') = '') DESC, milestone DESC, (status = 'closed'),  
    299300        (CASE status WHEN 'closed' THEN modified ELSE -p.value END) DESC 
    300301"""), 
    301302#---------------------------------------------------------------------------- 
     
    308309""" 
    309310SELECT p.value AS __color__, 
    310311   (CASE status WHEN 'assigned' THEN 'Assigned' ELSE 'Owned' END) AS __group__, 
    311    id AS ticket, summary, component, version, milestone, 
     312   id AS ticket, summary, component, status, version, milestone, 
    312313   severity, priority, time AS created, 
    313314   changetime AS _changetime, description AS _description, 
    314315   reporter AS _reporter 
    315316  FROM ticket t, enum p 
    316   WHERE t.status IN ('new', 'assigned', 'reopened')  
     317  WHERE t.status <> 'closed'  
    317318AND p.name = t.priority AND p.type = 'priority' AND owner = '$USER' 
    318319  ORDER BY (status = 'assigned') DESC, p.value, milestone, severity, time 
    319320"""), 
     
    338339  WHERE status IN ('new', 'assigned', 'reopened')  
    339340AND p.name = t.priority AND p.type = 'priority' 
    340341  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     342"""), 
     343#---------------------------------------------------------------------------- 
     344('Open Tickets, Mine first', 
     345""" 
     346 * List all not closed tickets by priority. 
     347 * Show all tickets owned by the logged in user in a group first. 
     348""", 
     349""" 
     350SELECT p.value AS __color__, 
     351   (CASE owner  
     352     WHEN '$USER' THEN 'My Tickets'  
     353     ELSE 'Open Tickets'  
     354    END) AS __group__, 
     355   id AS ticket, summary, component, status, version, milestone, severity,  
     356   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     357   time AS created, 
     358   changetime AS _changetime, description AS _description, 
     359   reporter AS _reporter 
     360  FROM ticket t, enum p 
     361  WHERE status <> 'closed'  
     362AND p.name = t.priority AND p.type = 'priority' 
     363  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     364"""), 
     365#---------------------------------------------------------------------------- 
     366('Open Tickets by Version', 
     367""" 
     368 * List all not closed tickets by priority. 
     369 * Group results by version. 
     370""", 
     371""" 
     372SELECT p.value AS __color__, 
     373   (CASE WHEN IFNULL(version, '') = '' THEN 'Not Specified' ELSE 'Version ' || version END) AS __group__, 
     374   id AS ticket, summary, component, status, milestone, severity,  
     375   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     376   time AS created, 
     377   changetime AS _changetime, description AS _description, 
     378   reporter AS _reporter 
     379  FROM ticket t, enum p 
     380  WHERE status <> 'closed' 
     381AND p.name = t.priority AND p.type = 'priority' 
     382  ORDER BY (IFNULL(version, '') = '') desc,version, p.value, severity, time 
     383"""), 
     384#---------------------------------------------------------------------------- 
     385('Open Tickets by Milestone', 
     386""" 
     387 * List all not closed tickets by priority. 
     388 * Group results by milestone. 
     389""", 
     390""" 
     391SELECT p.value AS __color__, 
     392   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     393   id AS ticket, summary, component, status, version, severity,  
     394   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     395   time AS created, 
     396   changetime AS _changetime, description AS _description, 
     397   reporter AS _reporter 
     398  FROM ticket t, enum p 
     399  WHERE status <> 'closed'  
     400AND p.name = t.priority AND p.type = 'priority' 
     401  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
     402"""), 
     403#---------------------------------------------------------------------------- 
     404('Open Tickets by Owner', 
     405""" 
     406List not closed tickets, group by ticket owner, sorted by priority. 
     407""", 
     408""" 
     409SELECT p.value AS __color__, 
     410   (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 
     411   id AS ticket, summary, component, status, version, milestone, severity, 
     412   time AS created, changetime AS _changetime, description AS _description, 
     413   reporter AS _reporter 
     414  FROM ticket t,enum p 
     415  WHERE status <> 'closed' 
     416AND p.name=t.priority AND p.type='priority' 
     417  ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 
     418"""), 
     419#---------------------------------------------------------------------------- 
     420('Open Tickets by Status', 
     421""" 
     422 * List all not closed tickets by priority. 
     423 * Group results by status. 
     424""", 
     425""" 
     426SELECT p.value AS __color__, 
     427   status AS __group__, 
     428   id AS ticket, summary, component, version, milestone, severity, owner, 
     429   time AS created, 
     430   changetime AS _changetime, description AS _description, 
     431   reporter AS _reporter 
     432  FROM ticket t, enum q, enum p 
     433  WHERE status <> 'closed'  
     434AND q.name = t.status AND q.type = 'status' 
     435AND p.name = t.priority AND p.type = 'priority' 
     436  ORDER BY q.value, p.value, severity, time 
     437"""), 
     438#---------------------------------------------------------------------------- 
     439('Resolved Tickets, Mine first', 
     440""" 
     441 * List all resolved tickets by priority. 
     442 * Show all tickets owned by the logged in user in a group first. 
     443""", 
     444""" 
     445SELECT p.value AS __color__, 
     446   (CASE owner  
     447     WHEN '$USER' THEN 'My Tickets'  
     448     ELSE 'Active Tickets'  
     449    END) AS __group__, 
     450   id AS ticket, summary, component, version, milestone, severity,  
     451   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     452   time AS created, 
     453   changetime AS _changetime, description AS _description, 
     454   reporter AS _reporter 
     455  FROM ticket t, enum p 
     456  WHERE status = 'resolved'  
     457AND p.name = t.priority AND p.type = 'priority' 
     458  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     459"""), 
     460#---------------------------------------------------------------------------- 
     461('Resolved Tickets by Milestone', 
     462""" 
     463List resolved tickets, sorted by priority, grouped by milestone 
     464""", 
     465""" 
     466SELECT p.value AS __color__, 
     467   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     468   id AS ticket, summary, component, version, severity,  
     469   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     470   time AS created, 
     471   changetime AS _changetime, description AS _description, 
     472   reporter AS _reporter 
     473  FROM ticket t, enum p 
     474  WHERE status = 'resolved'  
     475AND p.name = t.priority AND p.type = 'priority' 
     476  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
     477"""), 
     478#---------------------------------------------------------------------------- 
     479('Resolved Tickets by Owner', 
     480""" 
     481List resolved tickets, group by ticket owner, sorted by priority. 
     482""", 
     483""" 
     484SELECT p.value AS __color__, 
     485   (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 
     486   id AS ticket, summary, component, version, milestone, severity, time AS created, 
     487   changetime AS _changetime, description AS _description, 
     488   reporter AS _reporter 
     489  FROM ticket t,enum p 
     490  WHERE status = 'resolved' 
     491AND p.name=t.priority AND p.type='priority' 
     492  ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 
     493"""), 
     494#---------------------------------------------------------------------------- 
     495('Completed Tickets by Milestone (Full Description)', 
     496""" 
     497Release Notes: List verified and closed tickets, group by milestone, include description. 
     498""", 
     499""" 
     500SELECT p.value AS __color__, 
     501   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     502   id AS ticket, summary, component, status, version, severity, time AS created, 
     503   description AS _description_, 
     504   changetime AS _changetime, reporter AS _reporter 
     505  FROM ticket t, enum p 
     506  WHERE status IN ('verified', 'closed') 
     507AND p.name = t.priority AND p.type = 'priority' 
     508  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
    341509""")) 
    342510 
    343511 
     
    347515 
    348516# (table, (column1, column2), ((row1col1, row1col2), (row2col1, row2col2))) 
    349517data = (('component', 
    350              ('name', 'owner'), 
    351                (('component1', 'somebody'), 
    352                 ('component2', 'somebody'))), 
     518             ('name', 'owner', 'qaowner'), 
     519               (('component1', 'somebody', 'qasomebody'), 
     520                ('component2', 'somebody', 'qasomebody'))), 
    353521           ('milestone', 
    354522             ('name', 'time'), 
    355523               (('', 0),  
     
    367535               (('status', 'new', 1), 
    368536                ('status', 'assigned', 2), 
    369537                ('status', 'reopened', 3), 
    370                 ('status', 'closed', 4), 
     538                ('status', 'resolved', 4), 
     539                ('status', 'verified', 5), 
     540                ('status', 'closed', 6), 
    371541                ('resolution', 'fixed', 1), 
    372542                ('resolution', 'invalid', 2), 
    373543                ('resolution', 'wontfix', 3), 
     
    426596  ('project', 'footer', 
    427597   ' Visit the Trac open source project at<br />' 
    428598   '<a href="http://trac.edgewall.com/">http://trac.edgewall.com/</a>'), 
     599  ('ticket', 'workflow', 'trac.workflows.QaRmtWorkflow'), 
    429600  ('ticket', 'default_version', ''), 
    430601  ('ticket', 'default_severity', 'normal'), 
    431602  ('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.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