Edgewall Software

Ticket #2511: trac.testing.diff

File trac.testing.diff, 13.2 KB (added by wichert@…, 3 years ago)

testing status support

  • htdocs/css/roadmap.css

     
    99} 
    1010div.progress :link:hover, div.progress :visited:hover { background: #fff } 
    1111div.progress .closed:link, div.progress .closed:visited { background: #bae0ba } 
     12div.progress .testing:link, div.progress .testing:visited { background: #fff788 } 
    1213p.percent { font-size: 10px; line-height: 2.4em; margin: 0.9em 0 0 } 
    1314 
    1415/* Styles for the roadmap view */ 
  • trac/db_default.py

     
    344344                ('status', 'assigned', 2), 
    345345                ('status', 'reopened', 3), 
    346346                ('status', 'closed', 4), 
     347                ('status', 'testing', 5), 
    347348                ('resolution', 'fixed', 1), 
    348349                ('resolution', 'invalid', 2), 
    349350                ('resolution', 'wontfix', 3), 
  • trac/ticket/api.py

     
    2929    def get_available_actions(self, ticket, perm_): 
    3030        """Returns the actions that can be performed on the ticket.""" 
    3131        actions = { 
    32             'new':      ['leave', 'resolve', 'reassign', 'accept'], 
    33             'assigned': ['leave', 'resolve', 'reassign'          ], 
    34             'reopened': ['leave', 'resolve', 'reassign'          ], 
    35             'closed':   ['leave',                        'reopen'] 
     32            'new':      ['leave', 'testing', 'resolve', 'reassign', 'accept'], 
     33            'assigned': ['leave', 'testing', 'resolve', 'reassign'          ], 
     34            'reopened': ['leave', 'testing', 'resolve', 'reassign'          ], 
     35            'testing':  ['leave',            'resolve', 'reassign', 'reopen'], 
     36            'closed':   ['leave',                                   'reopen'] 
    3637        } 
    3738        perms = {'resolve': 'TICKET_MODIFY', 'reassign': 'TICKET_CHGPROP', 
     39                 'testing': 'TICKET_CHGPROP', 
    3840                 'accept': 'TICKET_CHGPROP', 'reopen': 'TICKET_CREATE'} 
    3941        return [action for action in actions.get(ticket['status'], ['leave']) 
    4042                if action not in perms or perm_.has_permission(perms[action])] 
  • trac/ticket/web_ui.py

     
    368368        elif action == 'reopen': 
    369369            ticket['status'] = 'reopened' 
    370370            ticket['resolution'] = '' 
     371        elif action == 'testing': 
     372            ticket['status'] = 'testing' 
     373            ticket['resolution'] = '' 
    371374 
    372375        now = int(time.time()) 
    373376        ticket.save_changes(req.args.get('author', req.authname), 
  • trac/ticket/tests/api.py

     
    5555    def test_available_actions_full_perms(self): 
    5656        ts = TicketSystem(self.env) 
    5757        perm = Mock(has_permission=lambda x: 1) 
    58         self.assertEqual(['leave', 'resolve', 'reassign', 'accept'], 
     58        self.assertEqual(['leave', 'testing', 'resolve', 'reassign', 'accept'], 
    5959                         ts.get_available_actions({'status': 'new'}, perm)) 
    60         self.assertEqual(['leave', 'resolve', 'reassign'], 
     60        self.assertEqual(['leave', 'testing', 'resolve', 'reassign'], 
    6161                         ts.get_available_actions({'status': 'assigned'}, perm)) 
    62         self.assertEqual(['leave', 'resolve', 'reassign'], 
     62        self.assertEqual(['leave', 'testing', 'resolve', 'reassign'], 
    6363                         ts.get_available_actions({'status': 'reopened'}, perm)) 
    6464        self.assertEqual(['leave', 'reopen'], 
    6565                         ts.get_available_actions({'status': 'closed'}, perm)) 
     
    9191    def test_available_actions_chgprop_only(self): 
    9292        ts = TicketSystem(self.env) 
    9393        perm = Mock(has_permission=lambda x: x == 'TICKET_CHGPROP') 
    94         self.assertEqual(['leave', 'reassign', 'accept'], 
     94        self.assertEqual(['leave', 'testing', 'reassign', 'accept'], 
    9595                         ts.get_available_actions({'status': 'new'}, perm)) 
    96         self.assertEqual(['leave', 'reassign'], 
     96        self.assertEqual(['leave', 'testing', 'reassign'], 
    9797                         ts.get_available_actions({'status': 'assigned'}, perm)) 
    98         self.assertEqual(['leave', 'reassign'], 
     98        self.assertEqual(['leave', 'testing', 'reassign'], 
    9999                         ts.get_available_actions({'status': 'reopened'}, perm)) 
    100100        self.assertEqual(['leave'], 
    101101                         ts.get_available_actions({'status': 'closed'}, perm)) 
  • trac/ticket/roadmap.py

     
    4949        q['all_tickets'] = env.href.query(milestone=milestone) 
    5050        q['active_tickets'] = env.href.query(milestone=milestone, 
    5151                                             status=('new', 'assigned', 'reopened')) 
     52        q['testing_tickets'] = env.href.query(milestone=milestone, 
     53                                             status=('testing')) 
    5254        q['closed_tickets'] = env.href.query(milestone=milestone, status='closed') 
    5355    else: 
    5456        q['all_tickets'] = env.href.query({grouped_by: group}, 
     
    5658        q['active_tickets'] = env.href.query({grouped_by: group}, 
    5759                                             milestone=milestone, 
    5860                                             status=('new', 'assigned', 'reopened')) 
     61        q['testing_tickets'] = env.href.query({grouped_by: group}, 
     62                                             milestone=milestone, 
     63                                             status=('testing')) 
    5964        q['closed_tickets'] = env.href.query({grouped_by: group}, 
    6065                                             milestone=milestone, 
    6166                                             status='closed') 
     
    6368 
    6469def calc_ticket_stats(tickets): 
    6570    total_cnt = len(tickets) 
    66     active = [ticket for ticket in tickets if ticket['status'] != 'closed'] 
     71    active = [ticket for ticket in tickets if ticket['status'] != 'closed' and \ 
     72                    ticket['status'] != 'testing' ] 
    6773    active_cnt = len(active) 
    68     closed_cnt = total_cnt - active_cnt 
     74    testing = [ticket for ticket in tickets if ticket['status'] == 'testing']  
     75    testing_cnt = len(testing) 
     76    closed_cnt = total_cnt - active_cnt - testing_cnt 
    6977 
    70     percent_active, percent_closed = 0, 0 
     78    percent_active, percent_testing, percent_closed = 0, 0, 0 
    7179    if total_cnt > 0: 
    7280        percent_active = round(float(active_cnt) / float(total_cnt) * 100) 
     81        percent_testing = round(float(testing_cnt) / float(total_cnt) * 100) 
    7382        percent_closed = round(float(closed_cnt) / float(total_cnt) * 100) 
    74         if percent_active + percent_closed > 100: 
     83        if percent_active + percent_testing + percent_closed > 100: 
    7584            percent_closed -= 1 
    7685 
    7786    return { 
    7887        'total_tickets': total_cnt, 
    7988        'active_tickets': active_cnt, 
    8089        'percent_active': percent_active, 
     90        'testing_tickets': testing_cnt, 
     91        'percent_testing': percent_testing, 
    8192        'closed_tickets': closed_cnt, 
    8293        'percent_closed': percent_closed 
    8394    } 
     
    200211            status = ticket['status'] 
    201212            if status == 'new' or status == 'reopened' and not ticket['owner']: 
    202213                return 'NEEDS-ACTION' 
    203             elif status == 'assigned' or status == 'reopened': 
     214            elif status in [ 'assigned', 'reopened', 'testing']: 
    204215                return 'IN-PROCESS' 
    205216            elif status == 'closed': 
    206217                if ticket['resolution'] == 'fixed': return 'COMPLETED' 
  • templates/ticket.cs

     
    248248   call:action_radio('reopen') ?> 
    249249   <label for="reopen">reopen ticket</label><br /><?cs 
    250250  /if ?><?cs 
     251  if:ticket.actions.testing ?><?cs 
     252   call:action_radio('testing') ?> 
     253   <label for="testing">ready for testing</label><br /><?cs 
     254  /if ?><?cs 
    251255  if:ticket.actions.resolve ?><?cs 
    252256   call:action_radio('resolve') ?> 
    253257   <label for="resolve">resolve</label><?cs 
  • templates/roadmap.cs

     
    4444         var:#stats.closed_tickets ?> of <?cs 
    4545         var:#stats.total_tickets ?> ticket<?cs 
    4646         if:#stats.total_tickets != #1 ?>s<?cs /if ?> closed"></a> 
     47       <a class="testing" href="<?cs 
     48         var:milestone.queries.testing_tickets ?>" style="width: <?cs 
     49         var:#stats.percent_testing ?>%" title="<?cs 
     50         var:#stats.testing_tickets ?> of <?Cs 
     51         var:#stats.total_tickets ?> ticket<?cs 
     52         if:#stats.total_tickets != #1 ?>s<?cs /if ?> testing"></a> 
    4753       <a class="open" href="<?cs 
    4854         var:milestone.queries.active_tickets ?>" style="width: <?cs 
    4955         var:#stats.percent_active - 1 ?>%" title="<?cs 
     
    5662       <dt>Closed tickets:</dt> 
    5763       <dd><a href="<?cs var:milestone.queries.closed_tickets ?>"><?cs 
    5864         var:stats.closed_tickets ?></a></dd> 
     65       <dt>Testing tickets:</dt> 
     66       <dd><a href="<?cs var:milestone.queries.testing_tickets ?>"><?cs 
     67         var:stats.testing_tickets ?></a></dd> 
    5968       <dt>Active tickets:</dt> 
    6069       <dd><a href="<?cs var:milestone.queries.active_tickets ?>"><?cs 
    6170         var:stats.active_tickets ?></a></dd> 
  • templates/milestone.cs

     
    124124        var:#stats.closed_tickets ?> of <?cs 
    125125        var:#stats.total_tickets ?> ticket<?cs 
    126126        if:#stats.total_tickets != #1 ?>s<?cs /if ?> closed"></a> 
     127       <a class="testing" href="<?cs 
     128         var:milestone.queries.testing_tickets ?>" style="width: <?cs 
     129         var:#stats.percent_testing ?>%" title="<?cs 
     130         var:#stats.testing_tickets ?> of <?Cs 
     131         var:#stats.total_tickets ?> ticket<?cs 
     132         if:#stats.total_tickets != #1 ?>s<?cs /if ?> testing"></a> 
    127133      <a class="open" href="<?cs 
    128134        var:milestone.queries.active_tickets ?>" style="width: <?cs 
    129135        var:#stats.percent_active - 1 ?>%" title="<?cs 
     
    136142      <dt>Closed tickets:</dt> 
    137143      <dd><a href="<?cs var:milestone.queries.closed_tickets ?>"><?cs 
    138144        var:stats.closed_tickets ?></a></dd> 
     145      <dt>Testing tickets:</dt> 
     146      <dd><a href="<?cs var:milestone.queries.testingtickets ?>"><?cs 
     147        var:stats.testing_tickets ?></a></dd> 
    139148      <dt>Active tickets:</dt> 
    140149      <dd><a href="<?cs var:milestone.queries.active_tickets ?>"><?cs 
    141150        var:stats.active_tickets ?></a></dd> 
     
    170179          var:group.closed_tickets ?> of <?cs 
    171180          var:group.total_tickets ?> ticket<?cs 
    172181          if:group.total_tickets != #1 ?>s<?cs /if ?> closed"></a> 
     182         <a class="testing" href="<?cs 
     183           var:group.queries.testing_tickets ?>" style="width: <?cs 
     184           var:#group.percent_testing ?>%" title="<?cs 
     185          var:group.testing_tickets ?> of <?cs 
     186          var:group.total_tickets ?> ticket<?cs 
     187          if:group.total_tickets != #1 ?>s<?cs /if ?> testing"></a> 
    173188         <a class="open" href="<?cs 
    174189           var:group.queries.active_tickets ?>" style="width: <?cs 
    175190           var:#group.percent_active - 1 ?>%" title="<?cs 
  • contrib/trac-post-commit-hook

     
    9999                  help='The user who is responsible for this action') 
    100100parser.add_option('-m', '--msg', dest='msg', 
    101101                  help='The log message to search.') 
     102parser.add_option('-t', '--testing', dest='testing', 
     103                  action='store_true', default='False', 
     104                  help='Set a ticket to testing instead of resolved if the ' 
     105                       'commit message indicates it is fixed.') 
    102106parser.add_option('-s', '--siteurl', dest='url', 
    103107                  help='The base URL to the project\'s trac website (to which ' 
    104108                       '/ticket/## is appended).  If this is not specified, ' 
     
    151155        for tkt_id in tickets: 
    152156            try: 
    153157                ticket = Ticket(self.env, tkt_id) 
    154                 ticket['status'] = 'closed' 
    155                 ticket['resolution'] = 'fixed' 
     158                if options.testing: 
     159                    ticket['status'] = 'testing' 
     160                    ticket['resolution'] = '' 
     161                else: 
     162                    ticket['status'] = 'closed' 
     163                    ticket['resolution'] = 'fixed' 
    156164                ticket.save_changes(self.author, self.msg, self.now) 
    157165                tn = TicketNotifyEmail(self.env) 
    158166                tn.notify(ticket, newticket=0, modtime=self.now)