Index: trac/Milestone.py
===================================================================
--- trac/Milestone.py	(revision 1520)
+++ trac/Milestone.py	(working copy)
@@ -57,46 +57,42 @@
         tickets.append(ticket)
     return tickets
 
-
-def get_query_links(env, milestone, grouped_by='component', group=None):
-    q = {}
-    if not group:
-        q['all_tickets'] = env.href.query(milestone=milestone)
-        q['active_tickets'] = env.href.query(milestone=milestone,
-                                             status=('new', 'assigned', 'reopened'))
-        q['closed_tickets'] = env.href.query(milestone=milestone, status='closed')
-    else:
-        q['all_tickets'] = env.href.query(milestone=milestone, grouped_by=group)
-        q['active_tickets'] = env.href.query(milestone=milestone,
-                                             grouped_by=group,
-                                             status=('new', 'assigned', 'reopened'))
-        q['closed_tickets'] = env.href.query(milestone=milestone, grouped_by=group,
-                                             status='closed')
-    return q
-
-
-def calc_ticket_stats(tickets):
+def get_tickets_progressbar(tickets, env, milestone, grouped_by='component', group=None):
     total_cnt = len(tickets)
-    active = [ticket for ticket in tickets if ticket['status'] != 'closed']
-    active_cnt = len(active)
-    closed_cnt = total_cnt - active_cnt
+    closed_cnt = len([ticket for ticket in tickets if ticket['status'] in ('verified', 'closed')])
+    active_cnt = total_cnt - closed_cnt
 
-    percent_active, percent_closed = 0, 0
+    # Determine percentages
+    active_pct, closed_pct = 0, 0
     if total_cnt > 0:
-        percent_active = round(float(active_cnt) / float(total_cnt) * 100)
-        percent_closed = round(float(closed_cnt) / float(total_cnt) * 100)
-        if percent_active + percent_closed > 100:
-            percent_closed -= 1
+        closed_pct = round(float(closed_cnt) / float(total_cnt) * 100)
+        active_pct = 100 - closed_pct
 
+    # Additional URL constraint?    
+    extra = group and { grouped_by: group } or {}
+
+    # Determine URLs
+    closed_url = env.href.query(
+        milestone=milestone, status=('closed',), **extra)
+    active_url = env.href.query(
+        milestone=milestone, status=('new', 'assigned', 'reopened'), **extra)
+    all_url = env.href.query(milestone=milestone, **extra)
+
+    # Construct result    
+    bar = [
+        {'name': 'closed',  'capsname': 'Closed', 'pct': closed_pct,
+         'cnt': closed_cnt, 'url': closed_url},
+        {'name': 'active',  'capsname': 'Active', 'pct': active_pct,
+         'cnt': active_cnt, 'url': active_url}
+        ]
     return {
         'total_tickets': total_cnt,
-        'active_tickets': active_cnt,
-        'percent_active': percent_active,
-        'closed_tickets': closed_cnt,
-        'percent_closed': percent_closed
+        'bar': bar,
+        'all_tickets_url' : all_url,        
+        'text_pct': '%d%%' % closed_pct,      # Shown like: 25%
+        'text_frac': '%d/%d' % (closed_cnt, total_cnt) # Shown like: 1/4
     }
 
-
 class Milestone(Module):
 
     def save_milestone(self, req, id):
@@ -333,10 +329,8 @@
         req.hdf['milestone.stats.grouped_by'] = by
 
         tickets = get_tickets_for_milestone(self.env, self.db, id, by)
-        stats = calc_ticket_stats(tickets)
+        stats = get_tickets_progressbar(tickets, self.env, milestone['name'])
         req.hdf['milestone.stats'] = stats
-        queries = get_query_links(self.env, milestone['name'])
-        req.hdf['milestone.queries'] = queries
 
         groups = self.get_groups(by)
         group_no = 0
@@ -353,9 +347,7 @@
                 if percent_total > max_percent_total:
                     max_percent_total = percent_total
             req.hdf['%s.percent_total' % prefix] = percent_total * 100
-            stats = calc_ticket_stats(group_tickets)
+            stats = get_tickets_progressbar(group_tickets, self.env, milestone['name'], by, group)
             req.hdf[prefix] = stats
-            queries = get_query_links(self.env, milestone['name'], by, group)
-            req.hdf['%s.queries' % prefix] = queries
             group_no += 1
         req.hdf['milestone.stats.max_percent_total'] = max_percent_total * 100
Index: trac/Roadmap.py
===================================================================
--- trac/Roadmap.py	(revision 1520)
+++ trac/Roadmap.py	(working copy)
@@ -92,10 +92,8 @@
             tickets = Milestone.get_tickets_for_milestone(self.env, self.db,
                                                           milestone['name'],
                                                           'owner')
-            stats = Milestone.calc_ticket_stats(tickets)
+            stats = Milestone.get_tickets_progressbar(tickets, self.env, milestone['name'])
             req.hdf['roadmap.milestones.%s.stats' % milestone_no] = stats
-            queries = Milestone.get_query_links(self.env, milestone['name'])
-            req.hdf['roadmap.milestones.%s.queries' % milestone_no] = queries
             milestone['tickets'] = tickets # for the iCalendar view
             milestone_no += 1
 
@@ -116,7 +114,7 @@
             status = ticket['status']
             if status == 'new' or status == 'reopened' and not ticket['owner']:
                 return 'NEEDS-ACTION'
-            elif status == 'assigned' or status == 'reopened':
+            elif status != 'closed':
                 return 'IN-PROCESS'
             elif status == 'closed':
                 if ticket['resolution'] == 'fixed': return 'COMPLETED'
Index: templates/roadmap.cs
===================================================================
--- templates/roadmap.cs	(revision 1518)
+++ templates/roadmap.cs	(working copy)
@@ -39,27 +39,21 @@
     with:stats = milestone.stats ?><?cs
      if:#stats.total_tickets > #0 ?>
       <div class="progress">
-       <a class="closed" href="<?cs
-         var:milestone.queries.closed_tickets ?>" style="width: <?cs
-         var:#stats.percent_closed ?>%" title="<?cs
-         var:#stats.closed_tickets ?> of <?cs
+       <?cs each:bar = stats.bar ?>
+       <a class="<?cs var:bar.name ?>" href="<?cs
+         var:bar.url ?>" style="width: <?cs
+         var:#bar.pct ?>%" title="<?cs
+         var:#bar.cnt ?> of <?cs
          var:#stats.total_tickets ?> ticket<?cs
-         if:#stats.total_tickets != #1 ?>s<?cs /if ?> closed"></a>
-       <a class="open" href="<?cs
-         var:milestone.queries.active_tickets ?>" style="width: <?cs
-         var:#stats.percent_active ?>%" title="<?cs
-         var:#stats.active_tickets ?> of <?cs
-         var:#stats.total_tickets ?> ticket<?cs
-         if:#stats.total_tickets != #1 ?>s<?cs /if ?> active"></a>
+         if:#stats.total_tickets != #1 ?>s<?cs /if ?> <?cs var:bar.name ?>"></a>
+       <?cs /each ?>
       </div>
-      <p class="percent"><?cs var:#stats.percent_closed ?>%</p>
+      <p class="percent"><?cs var:stats.text_pct ?></p>
       <dl>
-       <dt>Active tickets:</dt>
-       <dd><a href="<?cs var:milestone.queries.active_tickets ?>"><?cs
-         var:stats.active_tickets ?></a></dd>
-       <dt>Closed tickets:</dt>
-       <dd><a href="<?cs var:milestone.queries.closed_tickets ?>"><?cs
-         var:stats.closed_tickets ?></a></dd>
+       <?cs each:bar = stats.bar ?>
+       <dt><?cs var:bar.capsname ?> tickets:</dt>
+       <dd><a href="<?cs var:bar.url ?>"><?cs var:bar.cnt ?></a></dd>
+       <?cs /each ?>
       </dl><?cs
      /if ?><?cs
     /with ?>
Index: templates/milestone.cs
===================================================================
--- templates/milestone.cs	(revision 1518)
+++ templates/milestone.cs	(working copy)
@@ -94,7 +94,7 @@
    <select name="target" id="target">
     <option value="">None</option><?cs
      each:other = milestones ?><?cs if:other != milestone.name ?>
-      <option><?cs var:other ?></option><?cs 
+      <option><?cs var:other ?></option><?cs
      /if ?><?cs /each ?>
    </select>
    <div class="buttons">
@@ -121,27 +121,21 @@
    with:stats = milestone.stats ?><?cs
     if:#stats.total_tickets > #0 ?>
      <div class="progress">
-      <a class="closed" href="<?cs
-        var:milestone.queries.closed_tickets ?>" style="width: <?cs
-        var:#stats.percent_closed ?>%" title="<?cs
-        var:#stats.closed_tickets ?> of <?cs
-        var:#stats.total_tickets ?> ticket<?cs
-        if:#stats.total_tickets != #1 ?>s<?cs /if ?> closed"></a>
-      <a class="open" href="<?cs
-        var:milestone.queries.active_tickets ?>" style="width: <?cs
-        var:#stats.percent_active ?>%" title="<?cs
-        var:#stats.active_tickets ?> of <?cs
-        var:#stats.total_tickets ?> ticket<?cs
-        if:#stats.total_tickets != #1 ?>s<?cs /if ?> active"></a>
+       <?cs each:bar = stats.bar ?>
+       <a class="<?cs var:bar.name ?>" href="<?cs
+         var:bar.url ?>" style="width: <?cs
+         var:#bar.pct ?>%" title="<?cs
+         var:#bar.cnt ?> of <?cs
+         var:#stats.total_tickets ?> ticket<?cs
+         if:#stats.total_tickets != #1 ?>s<?cs /if ?> <?cs var:bar.name ?>"></a>
+       <?cs /each ?>
      </div>
-     <p class="percent"><?cs var:#stats.percent_closed ?>%</p>
+     <p class="percent"><?cs var:stats.text_pct ?></p>
      <dl>
-      <dt>Active tickets:</dt>
-      <dd><a href="<?cs var:milestone.queries.active_tickets ?>"><?cs
-        var:stats.active_tickets ?></a></dd>
-      <dt>Closed tickets:</dt>
-      <dd><a href="<?cs var:milestone.queries.closed_tickets ?>"><?cs
-        var:stats.closed_tickets ?></a></dd>
+       <?cs each:bar = stats.bar ?>
+       <dt><?cs var:bar.capsname ?> tickets:</dt>
+       <dd><a href="<?cs var:bar.url ?>"><?cs var:bar.cnt ?></a></dd>
+       <?cs /each ?>
      </dl><?cs
     /if ?><?cs
    /with ?>
@@ -165,25 +159,20 @@
      each:group = milestone.stats.groups ?>
       <tr>
        <th scope="row"><a href="<?cs
-         var:group.queries.all_tickets ?>"><?cs var:group.name ?></a></th>
+         var:group.all_tickets_url ?>"><?cs var:group.name ?></a></th>
        <td nowrap=nowrap><?cs if:#group.total_tickets ?>
         <div class="progress" style="width: <?cs
           var:#group.percent_total * #80 / #milestone.stats.max_percent_total ?>%">
-         <a class="closed" href="<?cs
-           var:group.queries.closed_tickets ?>" style="width: <?cs
-           var:#group.percent_closed ?>%" title="<?cs
-          var:group.closed_tickets ?> of <?cs
-          var:group.total_tickets ?> ticket<?cs
-          if:group.total_tickets != #1 ?>s<?cs /if ?> closed"></a>
-         <a class="open" href="<?cs
-           var:group.queries.active_tickets ?>" style="width: <?cs
-           var:#group.percent_active - 1 ?>%" title="<?cs
-          var:group.active_tickets ?> of <?cs
-          var:group.total_tickets ?> ticket<?cs
-          if:group.total_tickets != 1 ?>s<?cs /if ?> active"></a>
+				 <?cs each:bar = group.bar ?>
+				 <a class="<?cs var:bar.name ?>" href="<?cs
+					 var:bar.url ?>" style="width: <?cs
+					 var:#bar.pct ?>%" title="<?cs
+					 var:#bar.cnt ?> of <?cs
+					 var:#group.total_tickets ?> ticket<?cs
+					 if:#group.total_tickets != #1 ?>s<?cs /if ?> <?cs var:bar.name ?>"></a>
+				 <?cs /each ?>
         </div>
-        <p class="percent"><?cs var:group.closed_tickets ?>/<?cs
-         var:group.total_tickets ?></p>
+        <p class="percent"><?cs var:group.text_frac ?></p>
        <?cs /if ?></td>
       </tr><?cs
      /each ?>

