Edgewall Software

Ticket #1135: Timeline.py.diff

File Timeline.py.diff, 7.8 KB (added by fog@…, 4 years ago)
  • Timeline.

    old new  
    3535    template_rss_name = 'timeline_rss.cs' 
    3636 
    3737    def get_info (self, start, stop, maxrows, tickets, 
    38                   changeset, wiki, milestone): 
     38                  changeset, wiki, milestone, component, cfilter): 
    3939        cursor = self.db.cursor () 
    4040 
    4141        tickets = tickets and self.perm.has_permission(perm.TICKET_VIEW) 
     
    5353        WIKI = 5 
    5454        MILESTONE = 6 
    5555 
     56        try: 
     57            display_components = int(self.env.get_config('timeline', 'display_components', 0)) 
     58        except ValueError, e: 
     59            self.env.log.warning("Invalid 'display_components' value, " 
     60                                 "please edit trac.ini : %s" % e) 
     61            display_components = 0 
     62 
     63        try: 
     64            guess_component = int(self.env.get_config('timeline', 'changeset_guess_component', 0)) 
     65        except ValueError, e: 
     66            self.env.log.warning("Invalid 'changeset_guess_component' value, " 
     67                                 "please edit trac.ini : %s" % e) 
     68            guess_component = 0 
     69 
    5670        q = [] 
    5771        if changeset: 
    5872            q.append("SELECT time, rev AS idata, '' AS tdata, 1 AS type, " 
    59                      " message, author " 
     73                     " message, author, '' AS component " 
    6074                     "FROM revision WHERE time>=%s AND time<=%s" % 
    6175                     (start, stop)) 
    6276        if tickets: 
    6377            q.append("SELECT time, id AS idata, '' AS tdata, 2 AS type, " 
    64                      "summary AS message, reporter AS author " 
     78                     "summary AS message, reporter AS author, component " 
    6579                     "FROM ticket WHERE time>=%s AND time<=%s" % 
    6680                     (start, stop)) 
    67             q.append("SELECT time, ticket AS idata, '' AS tdata, 4 AS type, " 
    68                      "'' AS message, author " 
    69                      "FROM ticket_change WHERE field='status' " 
    70                      "AND newvalue='reopened' AND time>=%s AND time<=%s" % 
     81            q.append("SELECT t1.time, t1.ticket AS idata, '' AS tdata, 4 AS type, " 
     82                     "  '' AS message, t1.author, t2.component AS component " 
     83                     "FROM ticket_change t1, ticket t2 " 
     84                     "WHERE t1.field='status' " 
     85                     "  AND t1.newvalue='reopened' AND t1.ticket = t2.id " 
     86                     "  AND t1.time>=%s AND t1.time<=%s" % 
    7187                     (start, stop)) 
    7288            q.append("SELECT t1.time AS time, t1.ticket AS idata," 
    7389                     "       t2.newvalue AS tdata, 3 AS type," 
    74                      "       t3.newvalue AS message, t1.author AS author" 
     90                     "       t3.newvalue AS message, t1.author AS author," 
     91                     "       t4.component AS component" 
    7592                     " FROM ticket_change t1" 
    7693                     "   INNER JOIN ticket_change t2 ON t1.ticket = t2.ticket" 
    7794                     "     AND t1.time = t2.time" 
    78                      "   LEFT OUTER JOIN ticket_change t3 ON t1.time = t3.time" 
     95                     "   INNER JOIN ticket t4 ON t1.ticket = t4.id" 
     96                     "   LEFT OUTER JOIN ticket_change t3 ON t1.time = t3.time" 
    7997                     "     AND t1.ticket = t3.ticket AND t3.field = 'comment'" 
    8098                     " WHERE t1.field = 'status' AND t1.newvalue = 'closed'" 
    8199                     "   AND t2.field = 'resolution'" 
    82100                     "   AND t1.time >= %s AND t1.time <= %s" % (start,stop)) 
    83101        if wiki: 
    84102            q.append("SELECT time, -1 AS idata, name AS tdata, 5 AS type, " 
    85                      "comment AS message, author " 
     103                     "comment AS message, author, '' AS component " 
    86104                        "FROM wiki WHERE time>=%s AND time<=%s" % 
    87105                     (start, stop)) 
    88106        if milestone: 
    89107            q.append("SELECT time, -1 AS idata, '' AS tdata, 6 AS type, " 
    90                      "name AS message, '' AS author "  
     108                     "name AS message, '' AS author, '' AS component "  
    91109                     "FROM milestone WHERE time>=%s AND time<=%s" % 
    92110                     (start, stop)) 
    93111 
     
    113131                    'tdata': row['tdata'], 
    114132                    'type': int(row['type']), 
    115133                    'message': row['message'] or '', 
    116                     'author': util.escape(row['author'] or 'anonymous') 
     134                    'author': util.escape(row['author'] or 'anonymous'), 
     135                    'component': row['component'] or '' 
    117136                    } 
    118137 
    119138            if item['type'] == CHANGESET: 
    120                 item['href'] = self.env.href.changeset(item['idata']) 
     139                changeset_component = '' 
     140                item['href'] = self.env.href.changeset(item['idata']) 
    121141                msg = item['message'] 
    122142                item['shortmsg'] = util.escape(util.shorten_line(msg)) 
    123143                item['msg_nowiki'] = util.escape(msg) 
     
    134154                    self.env.log.warning("Invalid 'changeset_show_files' value, " 
    135155                                         "please edit trac.ini : %s" % e) 
    136156                    max_node = 0 
    137                      
     157                 
    138158                if max_node != 0: 
    139159                    cursor_node = self.db.cursor () 
     160         
     161                    cursor_node.execute("SELECT name FROM component " 
     162                                        "ORDER BY name") 
     163                    components = map(lambda x: x[0], cursor_node.fetchall()) 
     164             
    140165                    cursor_node.execute("SELECT name, change " 
    141166                                        "FROM node_change WHERE rev=%d" % item['idata']) 
    142167                    node_list = '' 
     
    159184                            node_data = '<span class="diff-rem">' + row_node['name'] + "</span>" 
    160185                        node_list += node_data 
    161186                        node_count += 1 
     187                        if guess_component and row_node['name'].split('/')[0] in components: 
     188                            changeset_component = row_node['name'].split('/')[0]  
    162189                    item['node_list'] = node_list + ': ' 
    163  
     190                item['component'] = changeset_component; 
     191                 
    164192            elif item['type'] == WIKI: 
    165193                item['href'] = self.env.href.wiki(row['tdata']) 
    166194                item['message'] = wiki_to_oneliner(util.shorten_line(item['message']), 
     
    186214                item['author.rss'] = '' 
    187215            item['message.rss'] = util.escape(item['message'] or '') 
    188216 
    189             info.append(item) 
    190         return info 
     217            if not component or item['component'] == '' or item['component'] == cfilter: 
     218                info.append(item) 
     219 
     220            # now, after appending,  remove the component if asked for 
     221            if not display_components: 
     222                item['component'] = '' 
     223         
     224        return info 
    191225 
    192226    def render (self): 
    193227        self.perm.assert_permission(perm.TIMELINE_VIEW) 
     
    223257        ticket = self.args.has_key('ticket') 
    224258        changeset = self.args.has_key('changeset') 
    225259        milestone = self.args.has_key('milestone') 
     260        component = self.args.has_key('component') 
     261         
    226262        if not (wiki or ticket or changeset or milestone): 
    227263            wiki = ticket = changeset = milestone = 1 
    228264 
     
    234270            self.req.hdf.setValue('timeline.changeset', 'checked') 
    235271        if milestone: 
    236272            self.req.hdf.setValue('timeline.milestone', 'checked') 
    237  
     273        if component: 
     274            self.req.hdf.setValue('timeline.component', 'checked') 
     275             
     276        if self.args.has_key('cfilter'): 
     277            cfilter = self.args['cfilter'] 
     278        else: 
     279            cfilter = '' 
     280        self.req.hdf.setValue('timeline.cfilter', cfilter) 
     281         
    238282        info = self.get_info (start, stop, maxrows, ticket, 
    239                               changeset, wiki, milestone) 
     283                              changeset, wiki, milestone, component, cfilter) 
    240284        util.add_dictlist_to_hdf(info, self.req.hdf, 'timeline.items') 
    241285        self.req.hdf.setValue('title', 'Timeline') 
    242  
     286        util.sql_to_hdf(self.db, 'SELECT name FROM component ORDER BY name', 
     287                        self.req.hdf, 'timeline.components') 
     288     
    243289    def display_rss(self): 
    244290        self.req.display(self.template_rss_name, 'text/xml')