Exemple #1
0
    def process_request(self, req):
        req.perm.require('MILESTONE_VIEW')

        show = req.args.getlist('show')
        if 'all' in show:
            show = ['completed']

        db = self.env.get_db_cnx()
        milestones = Milestone.select(self.env, 'completed' in show, db)
        if 'noduedate' in show:
            milestones = [
                m for m in milestones if m.due is not None or m.completed
            ]
        milestones = [
            m for m in milestones if 'MILESTONE_VIEW' in req.perm(m.resource)
        ]

        stats = []
        queries = []

        for milestone in milestones:
            tickets = get_tickets_for_milestone(self.env, db, milestone.name,
                                                'owner')
            tickets = apply_ticket_permissions(self.env, req, tickets)
            stat = get_ticket_stats(self.stats_provider, tickets)
            stats.append(
                milestone_stats_data(self.env, req, stat,
                                     '^' + milestone.name))
            #milestone['tickets'] = tickets # for the iCalendar view

        if req.args.get('format') == 'ics':
            self.render_ics(req, db, milestones)
            return

        # FIXME should use the 'webcal:' scheme, probably
        username = None
        if req.authname and req.authname != 'anonymous':
            username = req.authname
        icshref = req.href.roadmap(show=show, user=username, format='ics')
        add_link(req, 'alternate', icshref, _('iCalendar'), 'text/calendar',
                 'ics')

        data = {
            'milestones': milestones,
            'milestone_stats': stats,
            'queries': queries,
            'show': show,
        }
        add_stylesheet(req, 'common/css/roadmap.css')
        return 'roadmap.html', data, None
    def _render_view(self, req, db, milestone):
        milestone_groups = []
        available_groups = []
        component_group_available = False
        ticket_fields = TicketSystem(self.env).get_ticket_fields()

        # collect fields that can be used for grouping
        for field in ticket_fields:
            if field['type'] == 'select' and field['name'] != 'milestone' \
                    or field['name'] in ('owner', 'reporter'):
                available_groups.append({'name': field['name'],
                                         'label': field['label']})
                if field['name'] == 'component':
                    component_group_available = True

        # determine the field currently used for grouping
        by = None
        if component_group_available:
            by = 'component'
        elif available_groups:
            by = available_groups[0]['name']
        by = req.args.get('by', by)

        tickets = get_tickets_for_milestone(self.env, db, milestone.name, by)
        stat = get_ticket_stats(self.stats_provider, tickets)
        tstat = get_ticket_stats(self.tickettype_stats_provider, tickets)
                
        # Parse the from date and adjust the timestamp to the last second of
        # the day
        today = datetime.now(req.tz)

        # Get milestone start date from session or use default day back.
        # TODO: add logic to remember the start date either in db or session.
#        if  req.session.get('mdashboard.fromdate') != None:
#
#            fromdate = parse_date(req.session.get('mdashboard.fromdate'), req.tz)        
#        else: 
        fromdate = today - timedelta(days=self.default_daysback + 1)
        fromdate = fromdate.replace(hour=23, minute=59, second=59)

        # Data for milestone and timeline
        data = {'fromdate': fromdate,
                'milestone': milestone,
                'tickethistory' : [],
                'dates' : [],
                'ticketstat' : {},
                'yui_base_url': self.yui_base_url 
                }
            
        data.update(milestone_stats_data(self.env, req, stat, milestone.name))
        
        ticketstat = {'name':'ticket type'}
        ticketstat.update(milestone_stats_data(self.env, req, tstat, milestone.name))
        data['ticketstat'] = ticketstat
        
        #self.env.log.info("ticketstat = %s" % (ticketstat,))
        
        # get list of ticket ids that in the milestone
        #ctickets = get_tickets_for_milestone(self.env, db, milestone.name, 'type')
        everytickets = get_every_tickets_in_milestone(db, milestone.name)
        
        if everytickets != []:
        
            #tkt_history = {}
            
#            collect_tickets_status_history(self.env, db, tkt_history, \
#                                           everytickets, milestone)
            
            tkt_history = collect_tickets_status_history(self.env, db, everytickets, milestone)
            
            if tkt_history != {}:
                            
                # Sort the key in the history list
                # returns sorted list of tuple of (key, value)
                sorted_events = sorted(tkt_history.items(), key=lambda(k,v):(k))
        
                #debug  
                self.env.log.info("sorted_event content")
                for event in sorted_events:
                    self.env.log.info("date: %s: event: %s" % (format_date(to_datetime(event[0])), event[1]))
        
              
                # Get first date that ticket enter the milestone
                begin_date = to_datetime(min(sorted_events)[0]);                
                
                if milestone.completed != None:
                    end_date = milestone.completed        
                else:
                    end_date = datetime.now(utc).date()
            
                # this is array of date in numpy
                numdates = drange(begin_date, end_date + timedelta(days=1), timedelta(days=1))
                
                tkt_history_table = make_ticket_history_table(self.env, numdates, sorted_events)
        
                #debug
                #self.env.log.info("tkt_history_table: %s", (tkt_history_table,))   
                
                #Create a data for the cumulative flow chart.
                tkt_cumulative_table = make_cumulative_data(self.env, tkt_history_table)
                
                #debug
                #self.env.log.info(tkt_cumulative_table)   
            
                # creat list of dateobject from dates
                dates = []
                for numdate in numdates:
                    
                    utc_date = num2date(numdate)
                    dates.append(utc_date)
                    #self.env.log.info("%s: %s" % (utc_date, format_date(utc_date, tzinfo=utc)))
                
                    #prepare Yahoo datasource for comulative flow chart
                dscumulative = ''
                for idx, date in enumerate(dates):
                    dscumulative = dscumulative +  '{ date: "%s", enter: %d, leave: %d, finish: %d}, ' \
                          % (format_date(date,tzinfo=utc), tkt_cumulative_table['Enter'][idx], \
                             tkt_cumulative_table['Leave'][idx], tkt_cumulative_table['Finish'][idx])
  
                
                
                data['tickethistory'] = tkt_cumulative_table
                data['dates'] = dates
                data['dscumulative'] = '[ ' + dscumulative + ' ];'
                
        return 'mdashboard.html', data, None
    def _render_view(self, req, db):
        
        showall = req.args.get('show') == 'all'
        showmetrics = req.args.get('showmetrics') == 'true'
                
        # Get list of milestone object for the project
        milestones = list(Milestone.select(self.env, showall, db))
        stats = []
        queries = []

        self.env.log.info("getting milestones statistics")
        for milestone in milestones:
            tickets = get_tickets_for_milestone(self.env, db, milestone.name,
                                                'owner')
            stat = get_ticket_stats(self.stats_provider, tickets)
            stats.append(milestone_stats_data(self.env, req, stat, milestone.name))

        project = {
            'name': self.env.project_name,
            'description': self.env.project_description
        }
        
        data = {
            'context': Context.from_request(req),
            'milestones': milestones,
            'milestone_stats': stats,
            'queries': queries,
            'showall': showall,
            'showmetrics': showmetrics,
            'project' : project,
            'yui_base_url': self.yui_base_url 
        }
        
        self.env.log.info("getting project statistics")
        project_tickets = get_project_tickets(self.env)
        
        # Get project progress stats
        proj_stat = self.stats_provider.get_ticket_group_stats(project_tickets)
        
        data['proj_progress_stat'] = {'stats': proj_stat,
                                      'stats_href': req.href.query(proj_stat.qry_args),
                                      'interval_hrefs': [req.href.query(interval['qry_args'])
                                                         for interval in proj_stat.intervals]}

        closed_stat = self.stats_provider.get_ticket_resolution_group_stats(project_tickets)

        data['proj_closed_stat'] = {'stats': closed_stat,
                                      'stats_href': req.href.query(closed_stat.qry_args),
                                      'interval_hrefs': [req.href.query(interval['qry_args'])
                                                         for interval in closed_stat.intervals]}

        tkt_frequency_stats = {}
        tkt_duration_stats = {}
        bmi_stats = []
        daily_backlog_chart = {}
        today = datetime.now()
            
        if showmetrics:                                                     
            self.env.log.info("getting ticket metrics")
            tkt_group_metrics = TicketGroupMetrics(self.env, project_tickets)      
        
            tkt_frequency_stats = tkt_group_metrics.get_frequency_metrics_stats()
            tkt_duration_stats = tkt_group_metrics.get_duration_metrics_stats()
            
            #stat for this month
            first_day = datetime(today.year, today.month, 1, tzinfo=utc)
            last_day = last_day_of_month(today.year, today.month)
            bmi_stats.append(tkt_group_metrics.get_bmi_monthly_stats(first_day, last_day))
         
            # stat for last month        
            last_day = first_day - timedelta(days=1)
            first_day = datetime(last_day.year, last_day.month, 1, tzinfo=utc)
            bmi_stats.append(tkt_group_metrics.get_bmi_monthly_stats(first_day, last_day))
            
            # get daily backlog history
            last_day = datetime(today.year, today.month, today.day, tzinfo=utc)
            first_day = last_day - timedelta(days=DAYS_BACK)            
            self.env.log.info("getting backlog history")
            backlog_history = tkt_group_metrics.get_daily_backlog_history(first_day, last_day)
            daily_backlog_chart = tkt_group_metrics.get_daily_backlog_chart(backlog_history)

        # Get dialy commits history
        last_day = datetime(today.year, today.month, today.day, tzinfo=utc)
        first_day = last_day - timedelta(days=DAYS_BACK)
        changeset_group_stats = ChangesetsStats(self.env, first_day, last_day)
        commits_by_date = changeset_group_stats.get_commit_by_date()
        commits_by_date_chart = changeset_group_stats.get_commit_by_date_chart(commits_by_date)
        
        data['project_bmi_stats'] = bmi_stats
        #self.env.log.info(bmi_stats)
        data['ticket_frequency_stats'] = tkt_frequency_stats
        data['ticket_duration_stats'] = tkt_duration_stats
        data['ds_daily_backlog'] = daily_backlog_chart
        data['ds_commit_by_date'] = commits_by_date_chart
        
        add_stylesheet(req, 'pd/css/dashboard.css')        
        add_stylesheet(req, 'common/css/report.css')
        
        return ('pdashboard.html', data, None)
Exemple #4
0
    def _render_view(self, req, milestone):
        available_groups = []
        component_group_available = False
        project_id = req.data['project_id']
        ticket_fields = TicketSystem(self.env).get_ticket_fields(pid=project_id)

        # collect fields that can be used for grouping
        for name, field in ticket_fields.iteritems():
            if field['type'] == 'select' and name != 'milestone' \
                    or name in ('owner', 'reporter'):
                available_groups.append({'name': name,
                                         'label': field['label']})
                if name == 'component':
                    component_group_available = True

        # determine the field currently used for grouping
        by = None
        if component_group_available:
            by = 'component'
        elif available_groups:
            by = available_groups[0]['name']
        by = req.args.get('by', by)

        db = self.env.get_read_db()
        tickets = get_tickets_for_milestone(self.env, db, milestone, by)
        stat = get_ticket_stats(self.stats_provider, tickets, project_id)
        tstat = get_ticket_stats(self.tickettype_stats_provider, tickets, project_id)

        # Data for milestone and timeline
        data = {
            'milestone': milestone,
            'tickethistory' : [],
            'dates' : [],
            'ticketstat' : {},
            'yui_base_url': self.tm.yui_base_url,
            '_': _,
        }

        data.update(milestone_stats_data(self.env, req, stat, milestone))

        ticketstat = {'name':'ticket type'}
        ticketstat.update(milestone_stats_data(self.env, req, tstat, milestone))
        data['ticketstat'] = ticketstat

        # get list of ticket ids that in the milestone
        everytickets = get_every_tickets_in_milestone(db, project_id, milestone.name)

        if everytickets:
            tkt_history = collect_tickets_status_history(db, everytickets, milestone)
            if tkt_history:

                # Sort the key in the history list
                # returns sorted list of tuple of (key, value)
                sorted_events = sorted(tkt_history.items(), key=lambda(t,events):(t))

                # Get first date that ticket enter the milestone
                min_time = sorted_events[0][0]
                begin_date = to_datetime(min_time, tzinfo=req.tz)

                if milestone.is_completed:
                    end_date = milestone.completed
                else:
                    end_date = None
                end_date = to_datetime(end_date, tzinfo=req.tz)

                dates = list(date_generator(begin_date, end_date))

                #Create a data for the cumulative flow chart.
                date_history = prepare_to_cumulate(sorted_events)
                tkt_cumulative_table = make_cumulative_data(dates, date_history)

                #prepare Yahoo datasource for comulative flow chart
                dscumulative = ''
                for idx, date in enumerate(dates):
                    dscumulative = dscumulative +  '{ date: "%s", enter: %d, leave: %d, finish: %d}, ' \
                          % (format_date(date,tzinfo=utc), tkt_cumulative_table['Enter'][idx], \
                             tkt_cumulative_table['Leave'][idx], tkt_cumulative_table['Finish'][idx])

                data['tickethistory'] = tkt_cumulative_table
                data['dates'] = dates
                data['dscumulative'] = '[ ' + dscumulative + ' ];'

        return 'mdashboard.html', data, None
Exemple #5
0
    def process_request(self, req):
        milestone_realm = Resource('milestone')
        req.perm.require('MILESTONE_VIEW')

        showall = req.args.get('show') == 'all'
        db = self.env.get_db_cnx()
        milestones = [m for m in StructuredMilestone.select(self.env, True, db)
                        if 'MILESTONE_VIEW' in req.perm(m.resource)]
        requested_fmt = req.args.get('format')
        if requested_fmt == 'ics':
            self.render_ics(req, db, milestones)
            return
        max_level = len(IttecoEvnSetup(self.env).milestone_levels)
        max_level = max_level and max_level-1 or 0;
        current_level = int(req.args.get('mil_type', max_level))
        
        if current_level==-1:
            #show all milestones regardless to the level
            milestones = sum([_get_milestone_with_all_kids(mil) for mil in milestones], [])
        else:
            #filter by level
            i =0        
            while i<current_level:
                next_level_mils = []
                for m in milestones:
                    next_level_mils.extend(m.kids)
                milestones = next_level_mils
                i+=1

        calc_on = req.args.get('calc_on')
        ticket_group = req.args.get('ticket_group', 'all')
        selected_types = None
        if ticket_group=='scope_element':
            selected_types = IttecoEvnSetup(self.env).scope_element
        elif ticket_group=='work_element':
            selected_types = IttecoEvnSetup(self.env).work_element
        else:
            ticket_group = 'all'
            
        selected_type_names = [tkt_type.name for tkt_type in Type.select(self.env) 
            if selected_types is None or tkt_type.value in selected_types]

        stats = []
        milestones = [mil for mil in milestones if showall or not mil.is_completed]
        for milestone in milestones:
            tickets = get_tickets_for_structured_milestone(
                self.env, db, milestone.name, calc_on, selected_type_names)
            tickets = apply_ticket_permissions(self.env, req, tickets)
            stat = SelectionTicketGroupStatsProvider(self.env).get_ticket_group_stats(tickets, calc_on)
            stats.append(
                milestone_stats_data(
                    req, stat, [m.name for m in _get_milestone_with_all_kids(milestone)]))

        if requested_fmt=='json':
            self._render_milestones_stats_as_json(req, milestones, stats)
            return
        # FIXME should use the 'webcal:' scheme, probably
        username = None
        if req.authname and req.authname != 'anonymous':
            username = req.authname
        icshref = req.href.roadmap(show=req.args.get('show'), user=username,
                                   format='ics')
        add_link(req, 'alternate', icshref, _('iCalendar'), 'text/calendar',
                 'ics')
        visibility = [{'index':idx, 'label': label, 'active': idx==current_level} 
            for idx, label in enumerate(IttecoEvnSetup(self.env).milestone_levels)]
        ticket_groups = [{'index':value, 'label': name, 'active': value==ticket_group} 
                for value, name in self._ticket_groups]
        
        calculate_on = self.get_statistics_source(req.args.get('calc_on'))
        data = {
            'milestones': milestones,
            'milestone_stats': stats,
            'mil_types': visibility,
            'ticket_groups': ticket_groups,
            'calc_on': calculate_on,
            'queries': [],
            'showall': showall,
        }
        self.env.log.debug('data:%s' % data)
        return 'itteco_roadmap.html', data, None
Exemple #6
0
    def process_request(self, req):
        milestone_realm = Resource('milestone')
        req.perm.require('MILESTONE_VIEW')

        showall = req.args.get('show') == 'all'
        db = self.env.get_db_cnx()
        milestones = [
            m for m in StructuredMilestone.select(self.env, True, db)
            if 'MILESTONE_VIEW' in req.perm(m.resource)
        ]
        requested_fmt = req.args.get('format')
        if requested_fmt == 'ics':
            self.render_ics(req, db, milestones)
            return
        max_level = len(IttecoEvnSetup(self.env).milestone_levels)
        max_level = max_level and max_level - 1 or 0
        current_level = int(req.args.get('mil_type', max_level))

        if current_level == -1:
            #show all milestones regardless to the level
            milestones = sum(
                [_get_milestone_with_all_kids(mil) for mil in milestones], [])
        else:
            #filter by level
            i = 0
            while i < current_level:
                next_level_mils = []
                for m in milestones:
                    next_level_mils.extend(m.kids)
                milestones = next_level_mils
                i += 1

        calc_on = req.args.get('calc_on')
        ticket_group = req.args.get('ticket_group', 'all')
        selected_types = None
        if ticket_group == 'scope_element':
            selected_types = IttecoEvnSetup(self.env).scope_element
        elif ticket_group == 'work_element':
            selected_types = IttecoEvnSetup(self.env).work_element
        else:
            ticket_group = 'all'

        selected_type_names = [
            tkt_type.name for tkt_type in Type.select(self.env)
            if selected_types is None or tkt_type.value in selected_types
        ]

        stats = []
        milestones = [
            mil for mil in milestones if showall or not mil.is_completed
        ]
        for milestone in milestones:
            tickets = get_tickets_for_structured_milestone(
                self.env, db, milestone.name, calc_on, selected_type_names)
            tickets = apply_ticket_permissions(self.env, req, tickets)
            stat = SelectionTicketGroupStatsProvider(
                self.env).get_ticket_group_stats(tickets, calc_on)
            stats.append(
                milestone_stats_data(
                    req, stat,
                    [m.name for m in _get_milestone_with_all_kids(milestone)]))

        if requested_fmt == 'json':
            self._render_milestones_stats_as_json(req, milestones, stats)
            return
        # FIXME should use the 'webcal:' scheme, probably
        username = None
        if req.authname and req.authname != 'anonymous':
            username = req.authname
        icshref = req.href.roadmap(show=req.args.get('show'),
                                   user=username,
                                   format='ics')
        add_link(req, 'alternate', icshref, _('iCalendar'), 'text/calendar',
                 'ics')
        visibility = [{
            'index': idx,
            'label': label,
            'active': idx == current_level
        } for idx, label in enumerate(
            IttecoEvnSetup(self.env).milestone_levels)]
        ticket_groups = [{
            'index': value,
            'label': name,
            'active': value == ticket_group
        } for value, name in self._ticket_groups]

        calculate_on = self.get_statistics_source(req.args.get('calc_on'))
        data = {
            'milestones': milestones,
            'milestone_stats': stats,
            'mil_types': visibility,
            'ticket_groups': ticket_groups,
            'calc_on': calculate_on,
            'queries': [],
            'showall': showall,
        }
        self.env.log.debug('data:%s' % data)
        return 'itteco_roadmap.html', data, None
Exemple #7
0
    def _render_view(self, req, db):

        showall = req.args.get('show') == 'all'
        showmetrics = req.args.get('showmetrics') == 'true'

        # Get list of milestone object for the project
        milestones = list(Milestone.select(self.env, showall, db))
        stats = []
        queries = []

        self.env.log.info("getting milestones statistics")
        for milestone in milestones:
            tickets = get_tickets_for_milestone(self.env, db, milestone.name,
                                                'owner')
            stat = get_ticket_stats(self.stats_provider, tickets)
            stats.append(
                milestone_stats_data(self.env, req, stat, milestone.name))

        project = {
            'name': self.env.project_name,
            'description': self.env.project_description
        }

        data = {
            'context': Context.from_request(req),
            'milestones': milestones,
            'milestone_stats': stats,
            'queries': queries,
            'showall': showall,
            'showmetrics': showmetrics,
            'project': project,
            'yui_base_url': self.yui_base_url
        }

        self.env.log.info("getting project statistics")

        # Get project progress stats
        query = Query.from_string(self.env, 'max=0&order=id')
        tickets = query.execute(req)
        proj_stat = get_ticket_stats(self.stats_provider, tickets)

        data['proj_progress_stat'] = {
            'stats':
            proj_stat,
            'stats_href':
            req.href.query(proj_stat.qry_args),
            'interval_hrefs': [
                req.href.query(interval['qry_args'])
                for interval in proj_stat.intervals
            ]
        }

        ticket_ids = [t['id'] for t in tickets]
        closed_stat = self.stats_provider.get_ticket_resolution_group_stats(
            ticket_ids)

        data['proj_closed_stat'] = {
            'stats':
            closed_stat,
            'stats_href':
            req.href.query(closed_stat.qry_args),
            'interval_hrefs': [
                req.href.query(interval['qry_args'])
                for interval in closed_stat.intervals
            ]
        }

        tkt_frequency_stats = {}
        tkt_duration_stats = {}
        bmi_stats = []
        daily_backlog_chart = {}
        today = to_datetime(None)

        if showmetrics:
            self.env.log.info("getting ticket metrics")
            tkt_group_metrics = TicketGroupMetrics(self.env, ticket_ids)

            tkt_frequency_stats = tkt_group_metrics.get_frequency_metrics_stats(
            )
            tkt_duration_stats = tkt_group_metrics.get_duration_metrics_stats()

            #stat for this month
            first_day = datetime(today.year, today.month, 1, tzinfo=utc)
            last_day = last_day_of_month(today.year, today.month)
            bmi_stats.append(
                tkt_group_metrics.get_bmi_monthly_stats(first_day, last_day))

            # stat for last month
            last_day = first_day - timedelta(days=1)
            first_day = datetime(last_day.year, last_day.month, 1, tzinfo=utc)
            bmi_stats.append(
                tkt_group_metrics.get_bmi_monthly_stats(first_day, last_day))

            # get daily backlog history
            last_day = datetime(today.year, today.month, today.day, tzinfo=utc)
            first_day = last_day - timedelta(days=DAYS_BACK)
            self.env.log.info("getting backlog history")
            backlog_history = tkt_group_metrics.get_daily_backlog_history(
                first_day, last_day)
            daily_backlog_chart = tkt_group_metrics.get_daily_backlog_chart(
                backlog_history)

        # Get dialy commits history
        last_day = datetime(today.year, today.month, today.day, tzinfo=utc)
        first_day = last_day - timedelta(days=DAYS_BACK)
        changeset_group_stats = ChangesetsStats(self.env, first_day, last_day)
        commits_by_date = changeset_group_stats.get_commit_by_date()
        commits_by_date_chart = changeset_group_stats.get_commit_by_date_chart(
            commits_by_date)

        data['project_bmi_stats'] = bmi_stats
        #self.env.log.info(bmi_stats)
        data['ticket_frequency_stats'] = tkt_frequency_stats
        data['ticket_duration_stats'] = tkt_duration_stats
        data['ds_daily_backlog'] = daily_backlog_chart
        data['ds_commit_by_date'] = commits_by_date_chart

        add_stylesheet(req, 'pd/css/dashboard.css')
        add_stylesheet(req, 'common/css/report.css')

        return ('pdashboard.html', data, None)
Exemple #8
0
    def _render_project_stats(self, req, data):
        project_id = req.data['project_id']

        defaults = {
            # summary
            'tkt_summary': True,
            'milestones_stats': True,
            'tkt_extra_stats': False,
            # time range
            'tkt_activity': False,
            'repos_stats': True,
            'backlog_daily': True,
            # time groups
            'repos_activity': True,
            'backlog_table': False,
            'wiki_activity': True,
        }
        metrics = self._enabled_metrics(req, defaults)

        show_completed = req.args.has_key('show_completed')

        data.update({
            'metrics': metrics,
            'show_completed': show_completed,
        })

        groupsize = data['groupsize']
        groupcnt  = data['groupcnt']
        first_day       = data['first_day']
        first_day_group = data['first_day_group']
        last_day        = data['last_day']

        db = self.env.get_read_db()

        if metrics['milestones_stats']:
            # Get list of milestone object for the project
            milestones = list(Milestone.select(self.env, project_id, show_completed, db))
            stats = []

            for milestone in milestones:
                tickets = get_tickets_for_milestone(self.env, db, milestone, 'owner')
                stat = get_ticket_stats(self.stats_provider, tickets, project_id)
                stats.append(milestone_stats_data(self.env, req, stat, milestone))

            add_stylesheet(req, 'common/css/roadmap.css')
            data.update({
                'milestones': milestones,
                'milestone_stats': stats,
            })

        project_tickets = get_project_tickets(self.env, project_id)

        if metrics['tkt_summary']:
            # Get project progress stats
            proj_stat = self.stats_provider.get_ticket_group_stats(project_tickets, project_id)

            data['proj_progress_stat'] = {'stats': proj_stat,
                                          'stats_href': req.href.query(proj_stat.qry_args, project_id=project_id),
                                          'interval_hrefs': [req.href.query(interval['qry_args'])
                                                             for interval in proj_stat.intervals]}

            closed_stat = self.stats_provider.get_ticket_resolution_group_stats(project_tickets, project_id)

            data['proj_closed_stat'] = {'stats': closed_stat,
                                        'stats_href': req.href.query(closed_stat.qry_args, project_id=project_id),
                                        'interval_hrefs': [req.href.query(interval['qry_args'])
                                                           for interval in closed_stat.intervals]}

        if metrics['backlog_daily'] or metrics['backlog_table'] or metrics['tkt_extra_stats']:
            tkt_group_metrics = TicketGroupMetrics(self.env, project_tickets)

            if metrics['tkt_extra_stats']:
                tkt_frequency_stats = tkt_group_metrics.get_frequency_metrics_stats()
                tkt_duration_stats = tkt_group_metrics.get_duration_metrics_stats()
                data.update({
                    'ticket_frequency_stats': tkt_frequency_stats,
                    'ticket_duration_stats': tkt_duration_stats,
                })

            if metrics['backlog_table']:
                bmi_stats = []
                d = first_day_group
                fday = datetime(d.year, d.month, d.day, tzinfo=req.tz)
                for _i in xrange(groupcnt):
                    lday = fday + timedelta(groupsize, microseconds=-1)
                    bstats = tkt_group_metrics.get_bmi_stats(fday, lday)
                    bmi_stats.append(('%s - %s' % (format_date(fday), format_date(lday)),) + bstats)
                    fday += timedelta(groupsize)
                data['project_bmi_stats'] = bmi_stats

            if metrics['backlog_daily']:
                # get daily backlog history
                backlog_history = tkt_group_metrics.get_daily_backlog_history(first_day, last_day)
                daily_backlog_chart = tkt_group_metrics.get_daily_backlog_chart(backlog_history)
                data['ds_daily_backlog'] = daily_backlog_chart


        if metrics['repos_stats']:
            # Get daily commits history
            changeset_group_stats = ChangesetsStats(self.env, project_id, first_day, last_day)
            commits_by_date = changeset_group_stats.get_commit_by_date()
            commits_by_date_chart = changeset_group_stats.get_commit_by_date_chart(commits_by_date)
            data['ds_commit_by_date'] = commits_by_date_chart


        data_json = {}

        if metrics['tkt_activity']:
            data['ticket_activity'] = reports.ticket_activity(project_id,
                                          first_day, last_day,
                                          db, req)
            data_json['ticket_activity'] = simplejson.dumps(data['ticket_activity'].get_data())

        if metrics['repos_activity']:
            data['repository_activity'] = reports.repository_activity(project_id,
                                              first_day_group, last_day, groupsize, groupcnt,
                                              db, req, authors_limit=self.tm.authors_limit_repos)
            data_json['repository_activity'] = simplejson.dumps(data['repository_activity'].get_data())

        if metrics['wiki_activity']:
            data['wiki_activity'] = reports.wiki_activity(project_id,
                                          first_day, last_day, groupsize, groupcnt,
                                          db, req, authors_limit=self.tm.authors_limit_wiki)
            data_json['wiki_activity'] = simplejson.dumps(data['wiki_activity'].get_data())

        data['json'] = data_json

        return ('pdashboard.html', data, None)
Exemple #9
0
    def _render_view(self, req, db, milestone):
        milestone_groups = []
        available_groups = []
        component_group_available = False
        ticket_fields = TicketSystem(self.env).get_ticket_fields()

        # collect fields that can be used for grouping
        for field in ticket_fields:
            if field['type'] == 'select' and field['name'] != 'milestone' \
                    or field['name'] in ('owner', 'reporter'):
                available_groups.append({
                    'name': field['name'],
                    'label': field['label']
                })
                if field['name'] == 'component':
                    component_group_available = True

        # determine the field currently used for grouping
        by = None
        if component_group_available:
            by = 'component'
        elif available_groups:
            by = available_groups[0]['name']
        by = req.args.get('by', by)

        tickets = get_tickets_for_milestone(self.env, db, milestone.name, by)
        stat = get_ticket_stats(self.stats_provider, tickets)
        tstat = get_ticket_stats(self.tickettype_stats_provider, tickets)

        # Parse the from date and adjust the timestamp to the last second of
        # the day
        today = to_datetime(None, req.tz)

        # Get milestone start date from session or use default day back.
        # TODO: add logic to remember the start date either in db or session.
        #        if  req.session.get('mdashboard.fromdate') != None:
        #
        #            fromdate = parse_date(req.session.get('mdashboard.fromdate'), req.tz)
        #        else:
        fromdate = today - timedelta(days=self.default_daysback + 1)
        fromdate = fromdate.replace(hour=23, minute=59, second=59)

        # Data for milestone and timeline
        data = {
            'fromdate': fromdate,
            'milestone': milestone,
            'tickethistory': [],
            'dates': [],
            'ticketstat': {},
            'yui_base_url': self.yui_base_url
        }

        data.update(milestone_stats_data(self.env, req, stat, milestone.name))

        ticketstat = {'name': 'ticket type'}
        ticketstat.update(
            milestone_stats_data(self.env, req, tstat, milestone.name))
        data['ticketstat'] = ticketstat

        #self.env.log.info("ticketstat = %s" % (ticketstat,))

        # get list of ticket ids that in the milestone
        #ctickets = get_tickets_for_milestone(self.env, db, milestone.name, 'type')
        everytickets = get_every_tickets_in_milestone(db, milestone.name)

        if everytickets != []:

            #tkt_history = {}

            #            collect_tickets_status_history(self.env, db, tkt_history, \
            #                                           everytickets, milestone)

            tkt_history = collect_tickets_status_history(
                self.env, db, everytickets, milestone)

            if tkt_history != {}:

                # Sort the key in the history list
                # returns sorted list of tuple of (key, value)
                sorted_events = sorted(tkt_history.items(),
                                       key=lambda (k, v): (k))

                #debug
                self.env.log.info("sorted_event content")
                for event in sorted_events:
                    self.env.log.info(
                        "date: %s: event: %s" %
                        (format_date(to_datetime(event[0])), event[1]))

                # Get first date that ticket enter the milestone
                min_time = min(sorted_events)[0]  #in Epoch Seconds
                begin_date = to_datetime(min_time).date()
                end_date = milestone.completed or to_datetime(None).date()

                # this is array of date in numpy
                numdates = drange(begin_date, end_date + timedelta(days=1),
                                  timedelta(days=1))

                tkt_history_table = make_ticket_history_table(
                    self.env, numdates, sorted_events)

                #debug
                #self.env.log.info("tkt_history_table: %s", (tkt_history_table,))

                #Create a data for the cumulative flow chart.
                tkt_cumulative_table = make_cumulative_data(
                    self.env, tkt_history_table)

                #debug
                #self.env.log.info(tkt_cumulative_table)

                # creat list of dateobject from dates
                dates = []
                for numdate in numdates:

                    utc_date = num2date(numdate)
                    dates.append(utc_date)
                    #self.env.log.info("%s: %s" % (utc_date, format_date(utc_date, tzinfo=utc)))

                    #prepare Yahoo datasource for comulative flow chart
                dscumulative = ''
                for idx, date in enumerate(dates):
                    dscumulative = dscumulative + '{ date: "%s", enter: %d, leave: %d, finish: %d}, ' \
                          % (format_date(date, tzinfo=utc), tkt_cumulative_table['Enter'][idx], \
                             tkt_cumulative_table['Leave'][idx], tkt_cumulative_table['Finish'][idx])

                data['tickethistory'] = tkt_cumulative_table
                data['dates'] = dates
                data['dscumulative'] = '[ ' + dscumulative + ' ];'

        return 'mdashboard.html', data, None