def setUp(self): self.env = EnvironmentStub(default_data=True) self.milestone1 = Milestone(self.env) self.milestone1.name = 'Test' self.milestone1.insert() self.milestone2 = Milestone(self.env) self.milestone2.name = 'Test2' self.milestone2.insert() tkt1 = insert_ticket(self.env, summary='Foo', milestone='Test', owner='foman', status='new') tkt2 = insert_ticket(self.env, summary='Bar', milestone='Test', status='closed', owner='barman') tkt3 = insert_ticket(self.env, summary='Sum', milestone='Test', owner='suman', status='reopened') self.tkt1 = tkt1 self.tkt2 = tkt2 self.tkt3 = tkt3 prov = DefaultTicketGroupStatsProvider(ComponentManager()) prov.env = self.env prov.config = self.env.config self.stats = prov.get_ticket_group_stats([tkt1.id, tkt2.id, tkt3.id])
def _get_stats_config(self): all_statuses = set(TicketSystem(self.env).get_all_status()) remaining_statuses = set(all_statuses) groups = DefaultTicketGroupStatsProvider(self.env)._get_ticket_groups() catch_all_group = None for group in groups: status_str = group['status'].strip() if status_str == '*': if catch_all_group: raise TracError(_( "'%(group1)s' and '%(group2)s' milestone groups " "both are declared to be \"catch-all\" groups. " "Please check your configuration.", group1=group['name'], group2=catch_all_group['name'])) catch_all_group = group else: group_statuses = set([s.strip() for s in status_str.split(',')]) \ & all_statuses if group_statuses - remaining_statuses: raise TracError(_( "'%(groupname)s' milestone group reused status " "'%(status)s' already taken by other groups. " "Please check your configuration.", groupname=group['name'], status=', '.join(group_statuses - remaining_statuses))) else: remaining_statuses -= group_statuses group['statuses'] = group_statuses if catch_all_group: catch_all_group['statuses'] = remaining_statuses return groups
def _group_sprints_by_milestone(self, req, milestones_to_show): """ Returns a dict which holds the sprints grouped by milestone (key: milestone, value: list of tuples (sprint, progress bar data)). The dict contains only sprints for milestones in milestones_to_show. """ # save sprints in dictionary, key is the associated milestone provider = DefaultTicketGroupStatsProvider(self.env) milestone_names = [milestone.name for milestone in milestones_to_show] sprints = {} sp_controller = SprintController(self.env) list_sprints = SprintController.ListSprintsCommand(self.env, criteria={'milestone': 'in %s' % \ milestone_names}) for s in sp_controller.process_command(list_sprints): # milestone_name = sprint.milestone # if (not milestone_name) or (milestone_name not in milestone_names): # continue milestone_name = s.milestone if milestone_name not in sprints: sprints[milestone_name] = [] sprint_stats = self.build_sprint_story_statistics(req, s.name, provider=provider) sprint_data = (s, sprint_stats) sprints[milestone_name].append(sprint_data) return sprints
def setUp(self): self.env = EnvironmentStub(default_data=True) self.milestone1 = Milestone(self.env) self.milestone1.name = 'Test' self.milestone1.insert() self.milestone2 = Milestone(self.env) self.milestone2.name = 'Test2' self.milestone2.insert() tkt1 = Ticket(self.env) tkt1.populate({ 'summary': 'Foo', 'milestone': 'Test', 'owner': 'foman', 'status': 'new' }) tkt1.insert() tkt2 = Ticket(self.env) tkt2.populate({ 'summary': 'Bar', 'milestone': 'Test', 'status': 'closed', 'owner': 'barman' }) tkt2.insert() tkt3 = Ticket(self.env) tkt3.populate({ 'summary': 'Sum', 'milestone': 'Test', 'owner': 'suman', 'status': 'reopened' }) tkt3.insert() self.tkt1 = tkt1 self.tkt2 = tkt2 self.tkt3 = tkt3 prov = DefaultTicketGroupStatsProvider(ComponentManager()) prov.env = self.env prov.config = self.env.config self.stats = prov.get_ticket_group_stats([tkt1.id, tkt2.id, tkt3.id])
def get_ticket_group_stats(self, tickets, field_name=None): total_cnt = 0 ticket_ids = [] for ticket in tickets: try: ticket_ids.append(ticket['id']) total_cnt += int(ticket.get(field_name, 0)) except: pass if not field_name: return DefaultTicketGroupStatsProvider( self.env).get_ticket_group_stats(ticket_ids) all_statuses = set(TicketSystem(self.env).get_all_status()) status_cnt = {} for s in all_statuses: status_cnt[s] = 0 if total_cnt: cursor = self.env.get_db_cnx().cursor() str_ids = [str(x) for x in sorted(ticket_ids)] cursor.execute("SELECT status, sum(cast('0'||tc.value as int))"+\ " FROM ticket t LEFT OUTER JOIN ticket_custom tc ON t.id=tc.ticket AND tc.name=%s "+\ " WHERE id IN (%s) GROUP BY status" % ("%s,"*len(str_ids))[:-1], [field_name,]+str_ids) for s, cnt in cursor: status_cnt[s] = cnt stat = TicketGroupStats('ticket status', 'ticket') remaining_statuses = set(all_statuses) groups = DefaultTicketGroupStatsProvider(self.env)._get_ticket_groups() catch_all_group = None # we need to go through the groups twice, so that the catch up group # doesn't need to be the last one in the sequence for group in groups: status_str = group['status'].strip() if status_str == '*': if catch_all_group: raise TracError( _( "'%(group1)s' and '%(group2)s' milestone groups " "both are declared to be \"catch-all\" groups. " "Please check your configuration.", group1=group['name'], group2=catch_all_group['name'])) catch_all_group = group else: group_statuses = set([s.strip() for s in status_str.split(',')]) \ & all_statuses if group_statuses - remaining_statuses: raise TracError( _( "'%(groupname)s' milestone group reused status " "'%(status)s' already taken by other groups. " "Please check your configuration.", groupname=group['name'], status=', '.join(group_statuses - remaining_statuses))) else: remaining_statuses -= group_statuses group['statuses'] = group_statuses if catch_all_group: catch_all_group['statuses'] = remaining_statuses for group in groups: group_cnt = 0 query_args = {} for s, cnt in status_cnt.iteritems(): if s in group['statuses']: group_cnt += cnt or 0 query_args.setdefault('status', []).append(s) for arg in [ kv for kv in group.get('query_args', '').split(',') if '=' in kv ]: k, v = [a.strip() for a in arg.split('=', 1)] query_args[k] = v stat.add_interval(group.get('label', group['name']), group_cnt, query_args, group.get('css_class', group['name']), bool(group.get('overall_completion'))) stat.refresh_calcs() return stat
def build_sprint_story_statistics(self, req, sprint_name, provider=None): if provider is None: provider = DefaultTicketGroupStatsProvider(self.env) return self._build_story_statistics(req, provider, sprint_name)