Edgewall Software

Ticket #890: ticket_comments_in_timeline.1017.diff

File ticket_comments_in_timeline.1017.diff, 6.8 KB (added by cboos@…, 4 years ago)

patch that does the proposed solution

  • htdocs/css/timeline.css

    === htdocs/css/timeline.css
    ==================================================================
     
    2727dt .time { color: #777 } 
    2828dd { font-size: 80%; margin: 0 0 .5em 5em; padding: 0 } 
    2929 
     30 
    3031/* Apply icon background-image twice to avoid hover-flicker in IE/Win */ 
    3132dt.changeset, dt.changeset a { background-image: url(../changeset.png) !important } 
    3233dt.newticket, dt.newticket a { background-image: url(../newticket.png) !important } 
    3334dt.closedticket, dt.closedticket a { background-image: url(../closedticket.png) !important } 
    3435dt.wiki, dt.wiki a { background-image: url(../wiki.png) !important } 
    3536dt.milestone, dt.milestone a { background-image: url(../milestone.png) !important } 
     37dt.ticketcomment a { font-size: 80%; color: #555 } 
     38dd.ticketcomment { font-size: 70%; color: #555; margin: 0 0 .5em 5em; padding: 0 } 
    3639 
     40 
    3741.diff-unmod { color: #000 } 
    3842.diff-rem { color: #e00 } 
    3943.diff-add { color: #2e2 } 
  • templates/timeline.cs

    === templates/timeline.cs
    ==================================================================
     
    1818   <?cs if:trac.acl.TICKET_VIEW ?><div class="field"> 
    1919    <input type="checkbox" id="ticket" name="ticket" <?cs 
    2020      if:timeline.ticket ?>checked="checked"<?cs /if ?> /> 
    21     <label for="ticket">Ticket changes</label> 
     21    <label for="ticket">Ticket status changes</label> 
     22    <input type="checkbox" id="ticket_comments" name="ticket_comments" <?cs 
     23      if:timeline.ticket_comments ?>checked="checked"<?cs /if ?> /> 
     24    <label for="ticket_comments">Ticket contributions</label> 
    2225   </div><?cs /if ?> 
    2326   <?cs if:trac.acl.CHANGESET_VIEW ?><div class="field"> 
    2427    <input type="checkbox" id="changeset" name="changeset" <?cs 
     
    5558  <a href="<?cs var:url ?>"><span class="time"><?cs 
    5659    var:item.time ?> :</span> <?cs var:msg ?></a> 
    5760 </dt> 
    58  <?cs if:descr ?><dd><?cs var:descr ?></dd><?cs /if ?> 
     61 <?cs if:descr ?><dd class="<?cs var:type ?>"><?cs var:descr ?></dd><?cs /if ?> 
    5962<?cs /def ?> 
    6063 
    6164<?cs each:item = timeline.items ?> 
     
    8487 <?cs elif:item.type == #6 ?><!-- milestone --> 
    8588  <?cs call:tlitem(item.href, 'milestone', 
    8689    '<em>Milestone '+$item.message+'</em> reached', '') ?> 
     90 <?cs elif:item.type == #7 ?><!-- Ticket comment --> 
     91  <?cs call:tlitem(item.href, 'ticketcomment', 
     92    'Ticket <em>#'+$item.idata+'</em> contribution by '+$item.author, $item.message) ?> 
    8793 <?cs /if ?> 
    8894<?cs /each ?> 
    8995<?cs if:len(timeline.items) ?></dl><?cs /if ?> 
  • trac/Timeline.py

    === trac/Timeline.py
    ==================================================================
     
    3434    template_name = 'timeline.cs' 
    3535    template_rss_name = 'timeline_rss.cs' 
    3636 
    37     def get_info (self, start, stop, maxrows, tickets, 
     37    def get_info (self, start, stop, maxrows, tickets, ticket_comments, 
    3838                  changeset, wiki, milestone): 
    3939        cursor = self.db.cursor () 
    4040 
    4141        tickets = tickets and self.perm.has_permission(perm.TICKET_VIEW) 
     42        ticket_comments = ticket_comments and self.perm.has_permission(perm.TICKET_VIEW) 
    4243        changeset = changeset and self.perm.has_permission(perm.CHANGESET_VIEW) 
    4344        wiki = wiki and self.perm.has_permission(perm.WIKI_VIEW) 
    4445        milestone = milestone and self.perm.has_permission(perm.MILESTONE_VIEW) 
     
    5253        REOPENED_TICKET = 4 
    5354        WIKI = 5 
    5455        MILESTONE = 6 
     56        TICKET_COMMENT = 7 
    5557 
    5658        q = [] 
    5759        if changeset: 
     
    9092                     "name AS message, '' AS author "  
    9193                     "FROM milestone WHERE time>=%s AND time<=%s" % 
    9294                     (start, stop)) 
     95        if ticket_comments: 
     96            q.append("SELECT time, ticket AS idata, '' AS tdata, 7 AS type, " 
     97                     "newvalue AS message, author AS author " 
     98                     "FROM ticket_change WHERE field = 'comment' " 
     99                     "AND time>=%s AND time<=%s" % (start, stop)) 
    93100 
    94101        q_str = string.join(q, ' UNION ALL ') 
    95102        q_str += ' ORDER BY time DESC' 
     
    100107 
    101108        # Make the data more HDF-friendly 
    102109        info = [] 
     110        tickets = {} 
    103111        while 1: 
    104112            row = cursor.fetchone() 
    105113            if not row: 
     
    163171            elif item['type'] == MILESTONE: 
    164172                item['href'] = self.env.href.milestone(item['message']) 
    165173                item['message'] = util.escape(item['message']) 
    166             else:               # TICKET 
     174            else:               # all the TICKET types 
    167175                item['href'] = self.env.href.ticket(item['idata']) 
     176                if item['type'] == TICKET_COMMENT: 
     177                # The following would be ok if there would be a cost effective way 
     178                # to get that change number... 
     179                # item['href'] += '#change_%d' % item['change'] 
     180                    pass 
     181                else: 
     182                    tickets[(item['idata'], item['time'])] = 1 
    168183                msg = item['message'] 
    169184                item['shortmsg'] = util.escape(util.shorten_line(msg)) 
    170185                item['message'] = wiki_to_oneliner( 
     
    182197            item['message.rss'] = util.escape(item['message'] or '') 
    183198 
    184199            info.append(item) 
    185         return info 
     200        # Ok, the following line is maybe not Python 2.1 friendly, I don't know... 
     201        # return [ i for i in info if i['type'] != 7 or not tickets.has_key((i['idata'], i['time'])) ] 
     202        info2 = [] 
     203        for item in info: 
     204            if item['type'] != 7 or not tickets.has_key((item['idata'], item['time'])): 
     205                info2.append(item) 
     206        return info2 
    186207 
    187208    def render (self): 
    188209        self.perm.assert_permission(perm.TIMELINE_VIEW) 
     
    214235 
    215236        wiki = self.args.has_key('wiki')  
    216237        ticket = self.args.has_key('ticket') 
     238        ticket_comments = self.args.has_key('ticket_comments') 
    217239        changeset = self.args.has_key('changeset') 
    218240        milestone = self.args.has_key('milestone') 
    219241        if not (wiki or ticket or changeset or milestone): 
     
    223245            self.req.hdf.setValue('timeline.wiki', 'checked') 
    224246        if ticket: 
    225247            self.req.hdf.setValue('timeline.ticket', 'checked') 
     248        if ticket_comments: 
     249            self.req.hdf.setValue('timeline.ticket_comments', 'checked') 
    226250        if changeset: 
    227251            self.req.hdf.setValue('timeline.changeset', 'checked') 
    228252        if milestone: 
    229253            self.req.hdf.setValue('timeline.milestone', 'checked') 
    230254 
    231         info = self.get_info (start, stop, maxrows, ticket, 
     255        info = self.get_info (start, stop, maxrows, ticket, ticket_comments,  
    232256                              changeset, wiki, milestone) 
    233257        util.add_dictlist_to_hdf(info, self.req.hdf, 'timeline.items') 
    234258        self.req.hdf.setValue('title', 'Timeline')