Edgewall Software

NewWorkflow: patch-newworkflow-0_8_2-r1752.diff

File patch-newworkflow-0_8_2-r1752.diff, 100.1 KB (added by pkou at ua.fm, 3 years ago)

Patch for the changes: Synchonized with milestone:0.8.2

  • htdocs/css/timeline.css

     
    4040/* Apply icon background-image twice to avoid hover-flicker in IE/Win */ 
    4141dt.changeset, dt.changeset a { background-image: url(../changeset.png) !important } 
    4242dt.newticket, dt.newticket a { background-image: url(../newticket.png) !important } 
     43dt.resolvedticket, dt.resolvedticket a { background-image: url(../resolvedticket.png) !important } 
     44dt.reopenedticket, dt.reopenedticket a { background-image: url(../reopenedticket.png) !important } 
    4345dt.closedticket, dt.closedticket a { background-image: url(../closedticket.png) !important } 
    4446dt.wiki, dt.wiki a { background-image: url(../wiki.png) !important } 
    4547dt.milestone, dt.milestone a { background-image: url(../milestone.png) !important } 
  • wiki-default/TracIni

     
    2727See also: TracLogging 
    2828 
    2929== [ticket] == 
     30|| workflow || Ticket workflow class.  If not specified, it is ''trac.workflows.SimpleWorkflow'' || 
    3031|| default_version   || Default version for newly created tickets || 
    3132|| default_severity  || Default severity for newly created tickets || 
    3233|| default_priority  || Default priority for newly created tickets || 
  • wiki-default/TracAdmin

     
    2828permission add <user> <action> [action] [...]     -- Add a new permission rule                              
    2929permission remove <user> <action> [action] [...]  -- Remove permission rule                                 
    3030component list                                    -- Show available components                              
    31 component add <name> <owner>                      -- Add a new component                                    
     31component add <name> <owner> [<qaowner>]          -- Add a new component                                    
    3232component rename <name> <newname>                 -- Rename a component                                     
    3333component remove <name>                           -- Remove/uninstall component                             
    34 component chown <name> <owner>                    -- Change component ownership                             
     34component chown <name> <owner> [<qaowner>]        -- Change component ownership                             
    3535priority list                                     -- Show possible ticket priorities                        
    3636priority add <value>                              -- Add a priority value option                            
    3737priority change <value> <newvalue>                -- Change a priority value                                
     
    4646version time <name> <time>                        -- Set version date (Format: "Jun 3, 2003")               
    4747version remove <name>                             -- Remove version                                         
    4848milestone list                                    -- Show milestones                                        
    49 milestone add <name> [time]                       -- Add milestone                                          
     49milestone add <name> [<owner> [time]]             -- Add milestone                                          
    5050milestone rename <name> <newname>                 -- Rename milestone                                       
    5151milestone time <name> <time>                      -- Set milestone date (Format: "Jun 3, 2003")             
    5252milestone remove <name>                           -- Remove milestone                                       
     53milestone chown <name> <owner>                    -- Change milestone ownership 
    5354}}} 
    5455 
    5556== Interactive Mode == 
  • scripts/trac-admin

     
    292292 
    293293#    ## Component 
    294294    _help_component = [('component list', 'Show available components'), 
    295                        ('component add <name> <owner>', 'Add a new component'), 
     295                       ('component add <name> <owner> [<qaowner>]', 'Add a new component'), 
    296296                       ('component rename <name> <newname>', 'Rename a component'), 
    297297                       ('component remove <name>', 'Remove/uninstall component'), 
    298                        ('component chown <name> <owner>', 'Change component ownership')] 
     298                       ('component chown <name> <owner> [<qaowner>]', 'Change component ownership')] 
    299299 
    300300    def complete_component (self, text, line, begidx, endidx): 
    301301        if begidx in [16,17]: 
     
    311311        try: 
    312312            if arg[0]  == 'list': 
    313313                self._do_component_list() 
    314             elif arg[0] == 'add' and len(arg)==3: 
     314            elif arg[0] == 'add' and len(arg) in [3,4]: 
    315315                name = arg[1] 
    316316                owner = arg[2] 
    317                 self._do_component_add(name, owner) 
     317                if len(arg) == 4: 
     318                    qaowner = arg[3] 
     319                else: 
     320                    qaowner = owner 
     321                self._do_component_add(name, owner, qaowner) 
    318322            elif arg[0] == 'rename' and len(arg)==3: 
    319323                name = arg[1] 
    320324                newname = arg[2] 
     
    322326            elif arg[0] == 'remove'  and len(arg)==2: 
    323327                name = arg[1] 
    324328                self._do_component_remove(name) 
    325             elif arg[0] == 'chown' and len(arg)==3: 
     329            elif arg[0] == 'chown' and len(arg) in [3,4]: 
    326330                name = arg[1] 
    327331                owner = arg[2] 
    328                 self._do_component_set_owner(name, owner) 
     332                if len(arg) == 4: 
     333                    qaowner = arg[3] 
     334                else: 
     335                    qaowner = owner 
     336                self._do_component_set_owner(name, owner, qaowner) 
    329337            else:     
    330338                self.do_help ('component') 
    331339        except Exception, e: 
    332340            print 'Component %s failed:' % arg[0], e 
    333341 
    334342    def _do_component_list(self): 
    335         data = self.db_execsql('SELECT name, owner FROM component')  
    336         self.print_listing(['Name', 'Owner'], data) 
     343        data = self.db_execsql('SELECT name, owner, qaowner FROM component')  
     344        self.print_listing(['Name', 'Owner', 'QA Owner'], data) 
    337345 
    338     def _do_component_add(self, name, owner): 
    339         data = self.db_execsql("INSERT INTO component VALUES('%s', '%s')" 
    340                                % (name, owner)) 
     346    def _do_component_add(self, name, owner, qaowner): 
     347        data = self.db_execsql("INSERT INTO component VALUES('%s', '%s', '%s')" 
     348                               % (name,owner,qaowner)) 
    341349 
    342350    def _do_component_rename(self, name, newname): 
    343351        cnx = self.db_open() 
     
    362370        data = self.db_execsql("DELETE FROM component WHERE name='%s'" 
    363371                               % (name)) 
    364372 
    365     def _do_component_set_owner(self, name, owner): 
     373    def _do_component_set_owner(self, name, owner, qaowner): 
    366374        cnx = self.db_open() 
    367375        cursor = cnx.cursor () 
    368376        cursor.execute('SELECT name FROM component WHERE name=%s', name) 
    369377        data = cursor.fetchone() 
    370378        if not data: 
    371379            raise Exception("No such component '%s'" % name) 
    372         data = self.db_execsql("UPDATE component SET owner='%s' WHERE name='%s'" 
    373                                % (owner,name)) 
     380        data = self.db_execsql("UPDATE component SET owner='%s', qaowner='%s' WHERE name='%s'" 
     381                               % (owner,qaowner,name)) 
    374382 
    375383 
    376384    ## Permission 
     
    797805 
    798806    ## Milestone 
    799807    _help_milestone = [('milestone list', 'Show milestones'), 
    800                        ('milestone add <name> [time]', 'Add milestone'), 
     808                       ('milestone add <name> [<owner> [time]]', 'Add milestone'), 
    801809                       ('milestone rename <name> <newname>', 
    802810                        'Rename milestone'), 
     811                       ('milestone chown <name> <newowner>', 'Change milestone owner'), 
    803812                       ('milestone time <name> <time>', 'Set milestone date (Format: "Jun 3, 2003")'), 
    804813                       ('milestone remove <name>', 'Remove milestone')] 
    805814 
     
    807816 
    808817        if begidx in [15,17]: 
    809818            comp = self.get_milestone_list () 
     819        elif begidx > 15 and line.startswith('milestone chown '): 
     820            comp = self.get_user_list() 
    810821        elif begidx < 15: 
    811             comp = ['list','add','rename','time','remove'] 
     822            comp = ['list','add','rename','chown','time','remove'] 
    812823        return self.word_complete(text, comp) 
    813824 
    814825    def do_milestone(self, line): 
    815         self._do_mile_ver('milestone', line) 
     826        type = 'milestone' 
     827        arg = self.arg_tokenize(line) 
     828        try: 
     829            if arg[0]  == 'list': 
     830                self._do_milestone_list() 
     831            elif arg[0] == 'add' and len(arg) in [2,3,4]: 
     832                name = arg[1] 
     833                self._do_mile_ver_add(type, name) 
     834                if len(arg) >= 3: 
     835                    owner = arg[2] 
     836                    self._do_mile_ver_chown(type, name, owner) 
     837                if len(arg) >= 4: 
     838                    time = arg[3] 
     839                    self._do_mile_ver_time(type, name, time) 
     840            elif arg[0] == 'rename' and len(arg)==3: 
     841                name = arg[1] 
     842                newname = arg[2] 
     843                self._do_mile_ver_rename(type, name, newname) 
     844            elif arg[0] == 'chown' and len(arg)==3: 
     845                name = arg[1] 
     846                owner = arg[2] 
     847                self._do_mile_ver_chown(type, name, owner) 
     848            elif arg[0] == 'time' and len(arg)==3: 
     849                name = arg[1] 
     850                time = arg[2] 
     851                self._do_mile_ver_time(type, name, time) 
     852            elif arg[0] == 'remove' and len(arg)==2: 
     853                name = arg[1] 
     854                self._do_mile_ver_remove(type, name) 
     855            else: 
     856                self.do_help (type) 
     857        except Exception, e: 
     858            print 'Command %s failed:' % arg[0], e 
    816859 
     860    def _do_milestone_list(self): 
     861        data = self.db_execsql("SELECT name,owner,time FROM milestone ORDER BY time,name") 
     862        data = map(lambda x: (x[0], x[1], x[2] and time.strftime('%c', time.localtime(x[2]))), data) 
     863        #print data 
     864        self.print_listing(['Name', 'Owner', 'Time'], data) 
    817865 
     866 
    818867    ## Version 
    819868    _help_version = [('version list', 'Show versions'), 
    820869                       ('version add <name> [time]', 'Add version'), 
     
    834883    def do_version(self, line): 
    835884        self._do_mile_ver('version', line) 
    836885 
    837     # Milestone and Version are identical,  methods 
     886    # Milestone and Version are almost identical,  methods 
    838887 
    839888    def _do_mile_ver(self, type, line): 
    840889        arg = self.arg_tokenize(line) 
     
    925974        else: 
    926975            print >> sys.stderr, 'Unknown time format' 
    927976 
     977    def _do_mile_ver_chown(self, type, name, owner): 
     978        data = self.db_execsql("UPDATE %s SET owner='%s' WHERE name='%s'" 
     979                               % (type, owner, name)); 
     980 
    928981    _help_upgrade = [('upgrade', 'Upgrade database to current version.')] 
    929982    def do_upgrade(self, line): 
    930983        arg = self.arg_tokenize(line) 
  • setup.py

     
    206206      author_email="info@edgewall.com", 
    207207      license=LICENSE, 
    208208      url=URL, 
    209       packages=['trac', 'trac.upgrades', 'trac.wikimacros', 'trac.mimeviewers'], 
     209      packages=['trac', 'trac.upgrades', 'trac.wikimacros', 'trac.mimeviewers', 
     210                'trac.workflows'], 
    210211      data_files=[(_p('share/trac/templates'), glob('templates/*')), 
    211212                  (_p('share/trac/htdocs'), glob(_p('htdocs/*.*')) + [_p('htdocs/README')]), 
    212213                  (_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  
    290291        (CASE owner WHEN '$USER' THEN 'font-weight: bold' END) 
    291292    END) AS __style__, 
    292293   id AS ticket, summary, component, status,  
    293    resolution,version, severity, priority, owner, 
     294   (CASE WHEN resolution ISNULL THEN '' ELSE resolution END) AS resolution, 
     295   version, severity, priority, owner, 
    294296   changetime AS modified, 
    295297   time AS _time,reporter AS _reporter 
    296298  FROM ticket t,enum p 
    297299  WHERE p.name=t.priority AND p.type='priority' 
    298   ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'),  
     300  ORDER BY (IFNULL(milestone, '') = '') DESC, milestone DESC, (status = 'closed'),  
    299301        (CASE status WHEN 'closed' THEN modified ELSE -p.value END) DESC 
    300302"""), 
    301303#---------------------------------------------------------------------------- 
     
    307309""", 
    308310""" 
    309311SELECT p.value AS __color__, 
    310    (CASE status WHEN 'assigned' THEN 'Assigned' ELSE 'Owned' END) AS __group__, 
    311    id AS ticket, summary, component, version, milestone, 
    312    severity, priority, time AS created, 
     312   (CASE WHEN status <> 'new' THEN 'Assigned' 
     313         ELSE 'Owned in ' || IFNULL(milestone, 'N/A') 
     314    END) AS __group__, 
     315   id AS ticket, summary, component, status, resolution, version, milestone, 
     316   priority, time AS created, 
    313317   changetime AS _changetime, description AS _description, 
    314318   reporter AS _reporter 
    315319  FROM ticket t, enum p 
    316   WHERE t.status IN ('new', 'assigned', 'reopened')  
     320  WHERE t.status <> 'closed'  
    317321AND p.name = t.priority AND p.type = 'priority' AND owner = '$USER' 
    318   ORDER BY (status = 'assigned') DESC, p.value, milestone, severity, time 
     322  ORDER BY (status = 'new'), (IFNULL(milestone, '') = '') DESC, 
     323           milestone, p.value, resolution, time 
    319324"""), 
    320325#---------------------------------------------------------------------------- 
    321326('Active Tickets, Mine first', 
     
    338343  WHERE status IN ('new', 'assigned', 'reopened')  
    339344AND p.name = t.priority AND p.type = 'priority' 
    340345  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     346"""), 
     347#---------------------------------------------------------------------------- 
     348('Open Tickets, Mine first', 
     349""" 
     350 * List all not closed tickets by priority. 
     351 * Show all tickets owned by the logged in user in a group first. 
     352""", 
     353""" 
     354SELECT p.value AS __color__, 
     355   (CASE owner  
     356     WHEN '$USER' THEN 'My Tickets'  
     357     ELSE 'Open Tickets'  
     358    END) AS __group__, 
     359   id AS ticket, summary, component, status, version, milestone, severity,  
     360   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     361   time AS created, 
     362   changetime AS _changetime, description AS _description, 
     363   reporter AS _reporter 
     364  FROM ticket t, enum p 
     365  WHERE status <> 'closed'  
     366AND p.name = t.priority AND p.type = 'priority' 
     367  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     368"""), 
     369#---------------------------------------------------------------------------- 
     370('Open Tickets by Version', 
     371""" 
     372 * List all not closed tickets by priority. 
     373 * Group results by version. 
     374""", 
     375""" 
     376SELECT p.value AS __color__, 
     377   (CASE WHEN IFNULL(version, '') = '' THEN 'Not Specified' ELSE 'Version ' || version END) AS __group__, 
     378   id AS ticket, summary, component, status, milestone, severity,  
     379   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     380   time AS created, 
     381   changetime AS _changetime, description AS _description, 
     382   reporter AS _reporter 
     383  FROM ticket t, enum p 
     384  WHERE status <> 'closed' 
     385AND p.name = t.priority AND p.type = 'priority' 
     386  ORDER BY (IFNULL(version, '') = '') desc,version, p.value, severity, time 
     387"""), 
     388#---------------------------------------------------------------------------- 
     389('Open Tickets by Milestone', 
     390""" 
     391 * List all not closed tickets by priority. 
     392 * Group results by milestone. 
     393""", 
     394""" 
     395SELECT p.value AS __color__, 
     396   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     397   id AS ticket, summary, component, status, version, severity,  
     398   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     399   time AS created, 
     400   changetime AS _changetime, description AS _description, 
     401   reporter AS _reporter 
     402  FROM ticket t, enum p 
     403  WHERE status <> 'closed'  
     404AND p.name = t.priority AND p.type = 'priority' 
     405  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
     406"""), 
     407#---------------------------------------------------------------------------- 
     408('Open Tickets by Owner', 
     409""" 
     410List not closed tickets, group by ticket owner, sorted by priority. 
     411""", 
     412""" 
     413SELECT p.value AS __color__, 
     414   (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 
     415   id AS ticket, summary, component, status, version, milestone, severity, 
     416   time AS created, changetime AS _changetime, description AS _description, 
     417   reporter AS _reporter 
     418  FROM ticket t,enum p 
     419  WHERE status <> 'closed' 
     420AND p.name=t.priority AND p.type='priority' 
     421  ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 
     422"""), 
     423#---------------------------------------------------------------------------- 
     424('Open Tickets by Status', 
     425""" 
     426 * List all not closed tickets by priority. 
     427 * Group results by status. 
     428""", 
     429""" 
     430SELECT p.value AS __color__, 
     431   status AS __group__, 
     432   id AS ticket, summary, component, version, milestone, severity, owner, 
     433   time AS created, 
     434   changetime AS _changetime, description AS _description, 
     435   reporter AS _reporter 
     436  FROM ticket t, enum q, enum p 
     437  WHERE status <> 'closed'  
     438AND q.name = t.status AND q.type = 'status' 
     439AND p.name = t.priority AND p.type = 'priority' 
     440  ORDER BY q.value, p.value, severity, time 
     441"""), 
     442#---------------------------------------------------------------------------- 
     443('Resolved Tickets, Mine first', 
     444""" 
     445 * List all resolved tickets by priority. 
     446 * Show all tickets owned by the logged in user in a group first. 
     447""", 
     448""" 
     449SELECT p.value AS __color__, 
     450   (CASE owner  
     451     WHEN '$USER' THEN 'My Tickets'  
     452     ELSE 'Active Tickets'  
     453    END) AS __group__, 
     454   id AS ticket, summary, component, version, milestone, severity,  
     455   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     456   time AS created, 
     457   changetime AS _changetime, description AS _description, 
     458   reporter AS _reporter 
     459  FROM ticket t, enum p 
     460  WHERE status = 'resolved'  
     461AND p.name = t.priority AND p.type = 'priority' 
     462  ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 
     463"""), 
     464#---------------------------------------------------------------------------- 
     465('Resolved Tickets by Milestone', 
     466""" 
     467List resolved tickets, sorted by priority, grouped by milestone 
     468""", 
     469""" 
     470SELECT p.value AS __color__, 
     471   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     472   id AS ticket, summary, component, version, severity,  
     473   (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 
     474   time AS created, 
     475   changetime AS _changetime, description AS _description, 
     476   reporter AS _reporter 
     477  FROM ticket t, enum p 
     478  WHERE status = 'resolved'  
     479AND p.name = t.priority AND p.type = 'priority' 
     480  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
     481"""), 
     482#---------------------------------------------------------------------------- 
     483('Resolved Tickets by Owner', 
     484""" 
     485List resolved tickets, group by ticket owner, sorted by priority. 
     486""", 
     487""" 
     488SELECT p.value AS __color__, 
     489   (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 
     490   id AS ticket, summary, component, version, milestone, severity, time AS created, 
     491   changetime AS _changetime, description AS _description, 
     492   reporter AS _reporter 
     493  FROM ticket t,enum p 
     494  WHERE status = 'resolved' 
     495AND p.name=t.priority AND p.type='priority' 
     496  ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 
     497"""), 
     498#---------------------------------------------------------------------------- 
     499('Completed Tickets by Milestone (Full Description)', 
     500""" 
     501Release Notes: List verified and closed tickets, group by milestone, include description. 
     502""", 
     503""" 
     504SELECT p.value AS __color__, 
     505   (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 
     506   id AS ticket, summary, component, status, version, severity, time AS created, 
     507   description AS _description_, 
     508   changetime AS _changetime, reporter AS _reporter 
     509  FROM ticket t, enum p 
     510  WHERE status IN ('verified', 'closed') 
     511AND p.name = t.priority AND p.type = 'priority' 
     512  ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 
    341513""")) 
    342514 
    343515 
     
    347519 
    348520# (table, (column1, column2), ((row1col1, row1col2), (row2col1, row2col2))) 
    349521data = (('component', 
    350              ('name', 'owner'), 
    351                (('component1', 'somebody'), 
    352                 ('component2', 'somebody'))), 
     522             ('name', 'owner', 'qaowner'), 
     523               (('component1', 'somebody', 'qasomebody'), 
     524                ('component2', 'somebody', 'qasomebody'))), 
    353525           ('milestone', 
    354526             ('name', 'time'), 
    355527               (('', 0),  
     
    367539               (('status', 'new', 1), 
    368540                ('status', 'assigned', 2), 
    369541                ('status', 'reopened', 3), 
    370                 ('status', 'closed', 4), 
     542                ('status', 'resolved', 4), 
     543                ('status', 'verified', 5), 
     544                ('status', 'closed', 6), 
    371545                ('resolution', 'fixed', 1), 
    372546                ('resolution', 'invalid', 2), 
    373547                ('resolution', 'wontfix', 3), 
     
    426600  ('project', 'footer', 
    427601   ' Visit the Trac open source project at<br />' 
    428602   '<a href="http://trac.edgewall.com/">http://trac.edgewall.com/</a>'), 
     603  ('ticket', 'workflow', 'trac.workflows.QaRmtWorkflow'), 
    429604  ('ticket', 'default_version', ''), 
    430605  ('ticket', 'default_severity', 'normal'), 
    431606  ('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           &n