Changeset 1230
- Timestamp:
- 01/29/05 00:42:25 (6 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
-
templates/timeline.cs (modified) (1 diff)
-
templates/timeline_rss.cs (modified) (1 diff)
-
trac/Timeline.py (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/templates/timeline.cs
r1229 r1230 42 42 </form> 43 43 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 52 51 53 <?csdef:tlitem(url, type, msg, descr) ?>52 def:tlitem(url, type, msg, descr) ?> 54 53 <dt class="<?cs var:type ?>"> 55 54 <a href="<?cs var:url ?>"><span class="time"><?cs 56 55 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 ?> 60 60 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 93 if:len(timeline.items) ?></dl><?cs /if ?> 90 94 91 95 <div id="help"> 92 96 <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> 94 98 for information about the timeline view. 95 99 </div> -
trunk/templates/timeline_rss.cs
r1229 r1230 1 1 <?xml version="1.0"?> 2 <!-- RSS generated by Trac v<?cs var:$trac.version ?> on <?cs var:$trac.time ?> -->3 2 <rss version="2.0"><?cs 4 3 if:baseurl == '' ?><?cs 5 4 set:base_url = HTTP.Protocol + '://' + HTTP.Host ?><?cs 6 5 if HTTP.Port ?><?cs 7 set:base_url = base_url + ':' + $HTTP.Port ?><?cs6 set:base_url = base_url + ':' + HTTP.Port ?><?cs 8 7 /if ?><?cs 9 8 else ?><?cs 10 set $base_url = $baseurl ?><?cs9 set base_url = baseurl ?><?cs 11 10 /if ?><?cs 12 11 13 12 def:rss_item(category,title, link, descr) ?> 14 13 <item><?cs 15 if: $item.author.rss?>16 <author><?cs var: $item.author.rss?></author><?cs14 if:item.author ?> 15 <author><?cs var:item.author ?></author><?cs 17 16 /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> 23 22 </item><?cs 24 23 /def ?> 25 24 26 25 <channel><?cs 27 if $project.name.encoded ?>28 <title><?cs var: $project.name.encoded ?>: <?cs var:$title ?></title><?cs26 if:project.name.encoded ?> 27 <title><?cs var:project.name.encoded ?>: <?cs var:title ?></title><?cs 29 28 else ?> 30 <title><?cs var: $title ?></title><?cs29 <title><?cs var:title ?></title><?cs 31 30 /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> 33 32 <description>Trac Timeline</description> 34 33 <language>en-us</language> 35 <generator>Trac v<?cs var: $trac.version ?></generator>34 <generator>Trac v<?cs var:trac.version ?></generator> 36 35 <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> 40 40 </image><?cs 41 each:item = $timeline.items ?><?cs41 each:item = timeline.items ?><?cs 42 42 if:item.type == 'changeset' ?><?cs 43 43 call:rss_item('Changeset', 'Changeset [' + item.idata + '] by ' + item.author, 44 item.href, item.m sg_escwiki) ?><?cs44 item.href, item.message) ?><?cs 45 45 elif:item.type == 'newticket' ?><?cs 46 46 call:rss_item('Ticket', 'Ticket #' + item.idata + ' created by ' + item.author, 47 item.href, item.m sg_escwiki) ?><?cs47 item.href, item.message) ?><?cs 48 48 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 51 50 elif:item.type == 'reopenedticket' ?><?cs 52 call:rss_item('Ticket', '#' + item.idata + ' reopened : ' + item.shortmsg,53 item.href, item.m sg_escwiki) ?><?cs51 call:rss_item('Ticket', '#' + item.idata + ' reopened by ' + item.author, 52 item.href, item.message) ?><?cs 54 53 elif:item.type == 'wiki' ?><?cs 55 54 call:rss_item('Wiki', item.tdata + ' page edited by ' + item.author, 56 item.href, item.m sg_escwiki) ?><?cs55 item.href, item.message) ?><?cs 57 56 elif:item.type == 'milestone' ?><?cs 58 call:rss_item('Milestone', 'Milestone ' + item. message.rss+ ' reached',59 '', 'Milestone ' + $item.tdata + ' reached.') ?><?cs57 call:rss_item('Milestone', 'Milestone ' + item.tdata + ' reached', 58 item.href, 'Milestone ' + item.tdata + ' reached.') ?><?cs 60 59 /if ?><?cs 61 60 /each ?> -
trunk/trac/Timeline.py
r1229 r1230 21 21 22 22 import time 23 import string24 import urllib25 import sys26 23 27 24 import perm 28 import util 25 from util import add_to_hdf, escape, shorten_line 29 26 from Module import Module 30 27 from Wiki import wiki_to_oneliner, wiki_to_html … … 38 35 39 36 def get_info(self, req, start, stop, maxrows, 40 filters=('tickets', 'changeset', 'wiki', 'milestone'), 41 absurls=0): 37 filters=('tickets', 'changeset', 'wiki', 'milestone')): 42 38 perm_map = {'tickets': perm.TICKET_VIEW, 'changeset': perm.CHANGESET_VIEW, 43 39 'wiki': perm.WIKI_VIEW, 'milestone': perm.MILESTONE_VIEW} 44 40 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) 46 43 if not filters: 47 44 return [] … … 56 53 " FROM ticket WHERE time>=%s AND time<=%s") 57 54 params += (start, stop) 58 sql.append("SELECT time,ticket,'',' closedticket','',author "55 sql.append("SELECT time,ticket,'','reopenedticket','',author " 59 56 "FROM ticket_change WHERE field='status' " 60 57 "AND newvalue='reopened' AND time>=%s AND time<=%s") 61 58 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'," 63 60 "t3.newvalue,t1.author" 64 61 " FROM ticket_change t1" … … 76 73 params += (start, stop) 77 74 if 'milestone' in filters: 78 sql.append("SELECT completed ,-1,'','milestone',name,''"75 sql.append("SELECT completed AS time,-1,name,'milestone','',''" 79 76 " FROM milestone WHERE completed>=%s AND completed<=%s") 80 77 params += (start, stop) … … 87 84 cursor = self.db.cursor() 88 85 cursor.execute(sql, params) 89 90 href = self.env.href91 if absurls:92 href = self.env.abs_href93 86 94 87 # Make the data more HDF-friendly … … 109 102 'datetime': time.strftime('%a, %d %b %Y %H:%M:%S GMT', gmt), 110 103 'idata': int(row[1]), 111 'tdata': util.escape(row[2]),104 'tdata': escape(row[2]), 112 105 'type': row[3], 113 106 'message': row[4] or '', 114 'author': util.escape(row[5] or 'anonymous')107 'author': escape(row[5] or 'anonymous') 115 108 } 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 = 0135 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 break147 if node_count != 0:148 node_list += ', '149 if (max_node != -1) and (node_count >= max_node):150 node_list += '...'151 break152 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_data159 node_count += 1160 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, reopenedticket171 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 RSS182 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 187 109 info.append(item) 188 110 return info … … 227 149 req.hdf.setValue('timeline.%s' % f, 'checked') 228 150 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') 235 162 236 163 def display_rss(self, req): … … 238 165 req.hdf.setValue('baseurl', base_url) 239 166 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.
