Edgewall Software

Changeset 1230


Ignore:
Timestamp:
01/29/05 00:42:25 (6 years ago)
Author:
cmlenz
Message:

More refactoring for the timeline.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/templates/timeline.cs

    r1229 r1230  
    4242 </form> 
    4343 
    44 <?cs def:day_separator(date) ?> 
    45  <?cs if: $date != $current_date ?> 
    46   <?cs if: $current_date ?></dl><?cs /if ?> 
    47   <?cs set: $current_date = $date ?> 
    48   <h2><?cs var:date ?>:</h2> 
    49   <dl> 
    50  <?cs /if ?> 
    51 <?cs /def ?> 
     44<?cs def:day_separator(date) ?><?cs 
     45 if:date != current_date ?><?cs 
     46  if:current_date ?></dl><?cs /if ?><?cs 
     47  set:current_date = $date ?> 
     48  <h2><?cs var:date ?>:</h2><dl><?cs 
     49 /if ?><?cs 
     50/def ?><?cs 
    5251 
    53 <?cs def:tlitem(url, type, msg, descr) ?> 
     52def:tlitem(url, type, msg, descr) ?> 
    5453 <dt class="<?cs var:type ?>"> 
    5554  <a href="<?cs var:url ?>"><span class="time"><?cs 
    5655    var:item.time ?></span> <?cs var:msg ?></a> 
    57  </dt> 
    58  <?cs if:descr ?><dd><?cs var:descr ?></dd><?cs /if ?> 
    59 <?cs /def ?> 
     56 </dt><?cs 
     57 if:descr ?><dd><?cs var:descr ?></dd><?cs 
     58 /if ?><?cs 
     59/def ?> 
    6060 
    61 <?cs each:item = timeline.items ?> 
    62  <?cs call:day_separator(item.date) ?> 
    63  <?cs if:item.type == 'changeset' ?> 
    64   <?cs call:tlitem(item.href, 'changeset', 
    65     'Changeset <em>['+$item.idata+']</em> by '+$item.author,$item.node_list+item.message) ?> 
    66  <?cs elif:item.type == 'newticket' ?> 
    67   <?cs call:tlitem(item.href, 'newticket', 
    68     'Ticket <em>#'+$item.idata+'</em> created by '+$item.author, item.message) ?> 
    69  <?cs elif:item.type == 'closedticket' ?> 
    70   <?cs if:item.message ?> 
    71    <?cs set:imessage = ' - ' + $item.message ?> 
    72   <?cs else ?> 
    73    <?cs set:imessage = '' ?> 
    74   <?cs /if ?> 
    75   <?cs call:tlitem(item.href, 'closedticket', 
    76     'Ticket <em>#'+$item.idata+'</em> resolved by '+$item.author,  
    77     $item.tdata+$imessage) ?> 
    78  <?cs elif:item.type == 'reopenedticket' ?> 
    79   <?cs call:tlitem(item.href, 'newticket', 
    80     'Ticket <em>#'+$item.idata+'</em> reopened by '+$item.author, '') ?> 
    81  <?cs elif:item.type == 'wiki' ?> 
    82   <?cs call:tlitem(item.href, 'wiki', 
    83     '<em>'+$item.tdata+'</em> edited by '+$item.author, item.message) ?> 
    84  <?cs elif:item.type == 'milestone' ?> 
    85   <?cs call:tlitem(item.href, 'milestone', 
    86     '<em>Milestone '+$item.message+'</em> reached', '') ?> 
    87  <?cs /if ?> 
    88 <?cs /each ?> 
    89 <?cs if:len(timeline.items) ?></dl><?cs /if ?> 
     61<?cs each:item = timeline.items ?><?cs 
     62 call:day_separator(item.date) ?><?cs 
     63 if:item.type == 'changeset' ?><?cs 
     64  call:tlitem(item.href, 'changeset', 
     65              'Changeset <em>[' + item.idata + ']</em> by ' + item.author, 
     66              item.node_list + item.message) ?><?cs 
     67 elif:item.type == 'newticket' ?><?cs 
     68  call:tlitem(item.href, 'newticket', 
     69              'Ticket <em>#' + item.idata + '</em> created by ' + item.author, 
     70              item.message) ?><?cs 
     71 elif:item.type == 'closedticket' ?><?cs 
     72  if:item.message ?><?cs 
     73   set:imessage = ' - ' + item.message ?><?cs 
     74  else ?><?cs 
     75   set:imessage = '' ?><?cs 
     76  /if ?><?cs 
     77  call:tlitem(item.href, 'closedticket', 
     78              'Ticket <em>#' + item.idata + '</em> resolved by ' + item.author, 
     79              item.tdata + imessage) ?><?cs 
     80 elif:item.type == 'reopenedticket' ?><?cs 
     81  call:tlitem(item.href, 'newticket', 
     82              'Ticket <em>#' + item.idata + '</em> reopened by ' + item.author, 
     83              '') ?><?cs 
     84 elif:item.type == 'wiki' ?><?cs 
     85  call:tlitem(item.href, 'wiki', 
     86              '<em>' + item.tdata + '</em> edited by ' + item.author, 
     87              item.message) ?><?cs 
     88 elif:item.type == 'milestone' ?><?cs 
     89  call:tlitem(item.href, 'milestone', 
     90              '<em>Milestone ' + item.tdata + '</em> reached', '') ?><?cs 
     91 /if ?><?cs 
     92/each ?><?cs 
     93if:len(timeline.items) ?></dl><?cs /if ?> 
    9094 
    9195<div id="help"> 
    9296 <hr /> 
    93  <strong>Note:</strong> See <a href="<?cs var:$trac.href.wiki ?>/TracTimeline">TracTimeline</a>  
     97 <strong>Note:</strong> See <a href="<?cs var:trac.href.wiki ?>/TracTimeline">TracTimeline</a>  
    9498 for information about the timeline view. 
    9599</div> 
  • trunk/templates/timeline_rss.cs

    r1229 r1230  
    11<?xml version="1.0"?> 
    2 <!-- RSS generated by Trac v<?cs var:$trac.version ?> on <?cs var:$trac.time ?> --> 
    32<rss version="2.0"><?cs 
    43 if:baseurl == '' ?><?cs 
    54  set:base_url = HTTP.Protocol + '://' + HTTP.Host ?><?cs 
    65  if HTTP.Port ?><?cs 
    7    set:base_url = base_url + ':' + $HTTP.Port ?><?cs 
     6   set:base_url = base_url + ':' + HTTP.Port ?><?cs 
    87  /if ?><?cs 
    98 else ?><?cs 
    10   set $base_url = $baseurl ?><?cs 
     9  set base_url = baseurl ?><?cs 
    1110 /if ?><?cs 
    1211 
    1312 def:rss_item(category,title, link, descr) ?> 
    1413  <item><?cs 
    15    if:$item.author.rss ?> 
    16     <author><?cs var:$item.author.rss ?></author><?cs 
     14   if:item.author ?> 
     15    <author><?cs var:item.author ?></author><?cs 
    1716   /if ?> 
    18    <pubDate><?cs var:$item.datetime ?></pubDate> 
    19    <title><?cs var:$title ?></title> 
    20    <link><?cs var:$link ?></link> 
    21    <description><?cs var:$descr ?></description> 
    22    <category><?cs var:$category ?></category> 
     17   <pubDate><?cs var:item.datetime ?></pubDate> 
     18   <title><?cs var:title ?></title> 
     19   <link><?cs var:link ?></link> 
     20   <description><?cs var:descr ?></description> 
     21   <category><?cs var:category ?></category> 
    2322  </item><?cs  
    2423 /def ?> 
    2524 
    2625 <channel><?cs 
    27   if $project.name.encoded ?> 
    28    <title><?cs var:$project.name.encoded ?>: <?cs var:$title ?></title><?cs 
     26  if:project.name.encoded ?> 
     27   <title><?cs var:project.name.encoded ?>: <?cs var:title ?></title><?cs 
    2928  else ?> 
    30    <title><?cs var:$title ?></title><?cs 
     29   <title><?cs var:title ?></title><?cs 
    3130  /if ?> 
    32   <link><?cs var:$base_url ?><?cs var:$trac.href.timeline ?></link> 
     31  <link><?cs var:base_url ?><?cs var:trac.href.timeline ?></link> 
    3332  <description>Trac Timeline</description> 
    3433  <language>en-us</language> 
    35   <generator>Trac v<?cs var:$trac.version ?></generator> 
     34  <generator>Trac v<?cs var:trac.version ?></generator> 
    3635  <image> 
    37    <title><?cs var:$project.name.encoded ?></title> 
    38    <url><?cs if !$header_logo.src_abs ?><?cs var:$base_url ?><?cs /if ?><?cs var $header_logo.src ?></url> 
    39    <link><?cs var:$trac.href.timeline ?></link> 
     36   <title><?cs var:project.name.encoded ?></title> 
     37   <url><?cs if:!header_logo.src_abs ?><?cs var:base_url ?><?cs /if ?><?cs 
     38    var:header_logo.src ?></url> 
     39   <link><?cs var:trac.href.timeline ?></link> 
    4040  </image><?cs 
    41   each:item = $timeline.items ?><?cs 
     41  each:item = timeline.items ?><?cs 
    4242   if:item.type == 'changeset' ?><?cs 
    4343    call:rss_item('Changeset', 'Changeset [' + item.idata + '] by ' + item.author, 
    44                   item.href, item.msg_escwiki) ?><?cs 
     44                  item.href, item.message) ?><?cs 
    4545   elif:item.type == 'newticket' ?><?cs 
    4646    call:rss_item('Ticket', 'Ticket #' + item.idata + ' created by ' + item.author, 
    47                   item.href, item.msg_escwiki) ?><?cs 
     47                  item.href, item.message) ?><?cs 
    4848   elif:item.type == 'closedticket' ?><?cs 
    49     call:rss_item('Ticket', 'Ticket #' + item.idata + ' resolved: ' + item.shortmsg, 
    50                   item.href, item.msg_escwiki) ?><?cs 
     49    call:rss_item('Ticket', 'Ticket #' + item.idata + ' resolved as ' + item.tdata + ' by ' + item.author, item.href, item.message) ?><?cs 
    5150   elif:item.type == 'reopenedticket' ?><?cs 
    52     call:rss_item('Ticket', '#' + item.idata + ' reopened: ' + item.shortmsg, 
    53                   item.href, item.msg_escwiki) ?><?cs 
     51    call:rss_item('Ticket', '#' + item.idata + ' reopened by ' + item.author, 
     52                  item.href, item.message) ?><?cs 
    5453   elif:item.type == 'wiki' ?><?cs 
    5554    call:rss_item('Wiki', item.tdata + ' page edited by ' + item.author, 
    56                   item.href, item.msg_escwiki) ?><?cs 
     55                  item.href, item.message) ?><?cs 
    5756   elif:item.type == 'milestone' ?><?cs 
    58     call:rss_item('Milestone', 'Milestone ' + item.message.rss + ' reached', 
    59                   '', 'Milestone ' + $item.tdata + ' reached.') ?><?cs 
     57    call:rss_item('Milestone', 'Milestone ' + item.tdata + ' reached', 
     58                  item.href, 'Milestone ' + item.tdata + ' reached.') ?><?cs 
    6059   /if ?><?cs 
    6160  /each ?> 
  • trunk/trac/Timeline.py

    r1229 r1230  
    2121 
    2222import time 
    23 import string 
    24 import urllib 
    25 import sys 
    2623 
    2724import perm 
    28 import util 
     25from util import add_to_hdf, escape, shorten_line 
    2926from Module import Module 
    3027from Wiki import wiki_to_oneliner, wiki_to_html 
     
    3835 
    3936    def get_info(self, req, start, stop, maxrows, 
    40                  filters=('tickets', 'changeset', 'wiki', 'milestone'), 
    41                  absurls=0): 
     37                 filters=('tickets', 'changeset', 'wiki', 'milestone')): 
    4238        perm_map = {'tickets': perm.TICKET_VIEW, 'changeset': perm.CHANGESET_VIEW, 
    4339                    'wiki': perm.WIKI_VIEW, 'milestone': perm.MILESTONE_VIEW} 
    4440        for k,v in perm_map.items(): 
    45             if not self.perm.has_permission(v): filters.remove(k) 
     41            if not self.perm.has_permission(v): 
     42                filters.remove(k) 
    4643        if not filters: 
    4744            return [] 
     
    5653                       " FROM ticket WHERE time>=%s AND time<=%s") 
    5754            params += (start, stop) 
    58             sql.append("SELECT time,ticket,'','closedticket','',author " 
     55            sql.append("SELECT time,ticket,'','reopenedticket','',author " 
    5956                       "FROM ticket_change WHERE field='status' " 
    6057                       "AND newvalue='reopened' AND time>=%s AND time<=%s") 
    6158            params += (start, stop) 
    62             sql.append("SELECT t1.time,t1.ticket,t2.newvalue,'reopenedticket'," 
     59            sql.append("SELECT t1.time,t1.ticket,t2.newvalue,'closedticket'," 
    6360                       "t3.newvalue,t1.author" 
    6461                       " FROM ticket_change t1" 
     
    7673            params += (start, stop) 
    7774        if 'milestone' in filters: 
    78             sql.append("SELECT completed,-1,'','milestone',name,''"  
     75            sql.append("SELECT completed AS time,-1,name,'milestone','',''"  
    7976                       " FROM milestone WHERE completed>=%s AND completed<=%s") 
    8077            params += (start, stop) 
     
    8784        cursor = self.db.cursor() 
    8885        cursor.execute(sql, params) 
    89  
    90         href = self.env.href 
    91         if absurls: 
    92             href = self.env.abs_href 
    9386 
    9487        # Make the data more HDF-friendly 
     
    109102                'datetime': time.strftime('%a, %d %b %Y %H:%M:%S GMT', gmt), 
    110103                'idata': int(row[1]), 
    111                 'tdata': util.escape(row[2]), 
     104                'tdata': escape(row[2]), 
    112105                'type': row[3], 
    113106                'message': row[4] or '', 
    114                 'author': util.escape(row[5] or 'anonymous') 
     107                'author': escape(row[5] or 'anonymous') 
    115108            } 
    116  
    117             if item['type'] == 'changeset': 
    118                 item['href'] = util.escape(href.changeset(item['idata'])) 
    119                 msg = item['message'] 
    120                 item['shortmsg'] = util.escape(util.shorten_line(msg)) 
    121                 item['msg_nowiki'] = util.escape(msg) 
    122                 item['msg_escwiki'] = util.escape(wiki_to_html(msg, 
    123                                                                req.hdf, 
    124                                                                self.env, 
    125                                                                self.db, 
    126                                                                absurls=absurls)) 
    127                 item['message'] = wiki_to_oneliner(msg, self.env, self.db, 
    128                                                    absurls=absurls) 
    129                 try: 
    130                     max_node = int(self.env.get_config('timeline', 'changeset_show_files', 0)) 
    131                 except ValueError, e: 
    132                     self.env.log.warning("Invalid 'changeset_show_files' value, " 
    133                                          "please edit trac.ini : %s" % e) 
    134                     max_node = 0 
    135                      
    136                 if max_node != 0: 
    137                     cursor_node = self.db.cursor() 
    138                     cursor_node.execute("SELECT name, change " 
    139                                         "FROM node_change WHERE rev=%s", item['idata']) 
    140                     node_list = '' 
    141                     node_data = '' 
    142                     node_count = 0; 
    143                     while 1: 
    144                         row_node = cursor_node.fetchone() 
    145                         if not row_node: 
    146                             break 
    147                         if node_count != 0: 
    148                             node_list += ', ' 
    149                         if (max_node != -1) and (node_count >= max_node): 
    150                             node_list += '...' 
    151                             break 
    152                         if row_node['change'] == 'A': 
    153                             node_data = '<span class="diff-add">' + row_node['name'] + "</span>" 
    154                         elif row_node['change'] == 'M': 
    155                             node_data = '<span class="diff-mod">' + row_node['name'] + "</span>" 
    156                         elif row_node['change'] == 'D': 
    157                             node_data = '<span class="diff-rem">' + row_node['name'] + "</span>" 
    158                         node_list += node_data 
    159                         node_count += 1 
    160                     item['node_list'] = node_list + ': ' 
    161  
    162             elif item['type'] == 'wiki': 
    163                 item['href'] = util.escape(href.wiki(item['tdata'])) 
    164                 item['message'] = wiki_to_oneliner(util.shorten_line(item['message']), 
    165                                                    self.env, self.db, absurls=absurls) 
    166                 item['msg_escwiki'] = util.escape(item['message']) 
    167             elif item['type'] == 'milestone': 
    168                 item['href'] = util.escape(href.milestone(item['message'])) 
    169                 item['message'] = util.escape(item['message']) 
    170             else: # newticket, closedticket, reopenedticket 
    171                 item['href'] = util.escape(href.ticket(item['idata'])) 
    172                 msg = item['message'] 
    173                 item['shortmsg'] = util.escape(util.shorten_line(msg)) 
    174                 item['message'] = wiki_to_oneliner(util.shorten_line(item['message']), 
    175                                                    self.env, self.db, absurls=absurls) 
    176                 item['msg_escwiki'] = util.escape(wiki_to_html(msg, 
    177                                                                req.hdf, 
    178                                                                self.env, 
    179                                                                self.db, 
    180                                                                absurls=absurls)) 
    181             # Kludges for RSS 
    182             item['author.rss'] = item['author'] 
    183             if item['author.rss'].find('@') == -1: 
    184                 item['author.rss'] = '' 
    185             item['message.rss'] = util.escape(item['message'] or '') 
    186  
    187109            info.append(item) 
    188110        return info 
     
    227149            req.hdf.setValue('timeline.%s' % f, 'checked') 
    228150 
    229         absurls = 0 
    230         if req.args.get('format') == 'rss': 
    231             absurls = 1 
    232         info = self.get_info(req, start, stop, maxrows, filters, 
    233                              absurls=absurls) 
    234         util.add_to_hdf(info, req.hdf, 'timeline.items') 
     151        info = self.get_info(req, start, stop, maxrows, filters) 
     152        for item in info: 
     153            render_func = getattr(self, '_render_%s' % item['type']) 
     154            item = render_func(req, item) 
     155 
     156            if req.args.get('format') == 'rss': 
     157                # For RSS, author must be an email address 
     158                if item['author'].find('@') == -1: 
     159                    item['author'] = '' 
     160 
     161        add_to_hdf(info, req.hdf, 'timeline.items') 
    235162 
    236163    def display_rss(self, req): 
     
    238165        req.hdf.setValue('baseurl', base_url) 
    239166        req.display(self.template_rss_name, 'text/xml') 
     167 
     168    def _render_changeset(self, req, item): 
     169        absurls = req.args.get('format') == 'rss' 
     170        href = self.env.href 
     171        if absurls: 
     172            href = self.env.abs_href 
     173 
     174        item['href'] = escape(href.changeset(item['idata'])) 
     175        if req.args.get('format') == 'rss': 
     176            item['message'] = escape(wiki_to_html(item['message'], req.hdf, 
     177                                                  self.env, self.db, 
     178                                                  absurls=absurls)) 
     179        else: 
     180            item['message'] = wiki_to_oneliner(item['message'], self.env, 
     181                                               self.db, absurls=absurls) 
     182 
     183        try: 
     184            show_files = int(self.env.get_config('timeline', 'changeset_show_files', 0)) 
     185        except ValueError, e: 
     186            self.log.warning("Invalid 'changeset_show_files' value, " 
     187                             "please fix trac.ini: %s" % e) 
     188            show_files = 0 
     189 
     190        if show_files != 0: 
     191            cursor = self.db.cursor() 
     192            cursor.execute("SELECT name,change FROM node_change WHERE rev=%s", 
     193                           (item['idata'])) 
     194            files = [] 
     195            while 1: 
     196                row = cursor.fetchone() 
     197                if not row: 
     198                    break 
     199                if show_files > 0 and len(files) >= show_files: 
     200                    files.append('...') 
     201                    break 
     202                if row[1] == 'A': 
     203                    files.append('<span class="diff-add">%s</span>' % row[0]) 
     204                elif row[1] == 'M': 
     205                    files.append('<span class="diff-mod">%s</span>' % row[0]) 
     206                elif row[1] == 'D': 
     207                    files.append('<span class="diff-rem">%s</span>' % row[0]) 
     208            item['node_list'] = ', '.join(files) + ': ' 
     209 
     210        return item 
     211 
     212    def _render_ticket(self, req, item): 
     213        absurls = req.args.get('format') == 'rss' 
     214        href = self.env.href 
     215        if absurls: 
     216            href = self.env.abs_href 
     217 
     218        item['href'] = escape(href.ticket(item['idata'])) 
     219        if req.args.get('format') == 'rss': 
     220            item['message'] = escape(wiki_to_html(item['message'], 
     221                                                  req.hdf, self.env, 
     222                                                  self.db, absurls=absurls)) 
     223        else: 
     224            item['message'] = wiki_to_oneliner(shorten_line(item['message']), 
     225                                               self.env, self.db, absurls=absurls) 
     226        return item 
     227    _render_reopenedticket = _render_ticket 
     228    _render_newticket = _render_ticket 
     229    _render_closedticket = _render_ticket 
     230 
     231    def _render_milestone(self, req, item): 
     232        absurls = req.args.get('format') == 'rss' 
     233        href = self.env.href 
     234        if absurls: 
     235            href = self.env.abs_href 
     236 
     237        item['href'] = escape(href.milestone(item['tdata'])) 
     238        return item 
     239 
     240    def _render_wiki(self, req, item): 
     241        absurls = req.args.get('format') == 'rss' 
     242        href = self.env.href 
     243        if absurls: 
     244            href = self.env.abs_href 
     245 
     246        item['href'] = escape(href.wiki(item['tdata'])) 
     247        item['message'] = wiki_to_oneliner(shorten_line(item['message']), 
     248                                           self.env, self.db, absurls=absurls) 
     249        if req.args.get('format') == 'rss': 
     250            item['message'] = escape(item['message']) 
     251        return item 
Note: See TracChangeset for help on using the changeset viewer.