Hi,
This week-end I wrote the following patch which addresses a few issues
with the timeline, and I'd like some feed back about it.
----
Refactored the Timeline event providers.
This was done by using a new `Timeline.get_event_data` function,
which factors out common logic among providers.
That logic consists in:
* using absolute hrefs for the RSS feed, relative hrefs otherwise
* appending mention ''by author'' if author is known, but not
for RSS feed events, as there's anyway an ''author'' element
in the feed item
* use the full content as the description, when using RSS
''or'' when the new TracIni entry `show_full_content` is set
(#2360).
----
Also, the title of ticket events now always contain the (shortened)
summary (#2454 and #2070).
The display of ticket information places the ticket type information
in front of the summary, as I think it provides a way to quickly
categorize the ticket and to read the summary already in ''context''
(is this the description of a bug or of a feature?).
In a similar spirit, the placement of the ticket type field has been
moved above the summary (#991).
----
(As the above suggests, the patch could probably be split in two
different blocks)
-- Christian
Index: trac/ticket/web_ui.py
===================================================================
--- trac/ticket/web_ui.py (revision 2819)
+++ trac/ticket/web_ui.py (working copy)
@@ -24,7 +24,7 @@
from trac.env import IEnvironmentSetupParticipant
from trac.ticket import Milestone, Ticket, TicketSystem
from trac.ticket.notification import TicketNotifyEmail
-from trac.Timeline import ITimelineEventProvider
+from trac.Timeline import ITimelineEventProvider, get_event_data
from trac.web import IRequestHandler
from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
from trac.wiki import wiki_to_html, wiki_to_oneliner
@@ -240,17 +240,15 @@
yield ('ticket_details', 'Ticket details', False)
def get_timeline_events(self, req, start, stop, filters):
- format = req.args.get('format')
-
status_map = {'new': ('newticket', 'created'),
'reopened': ('newticket', 'reopened'),
'closed': ('closedticket', 'closed'),
'edit': ('editedticket', 'updated')}
def produce((id, t, author, type, summary), status, fields, comment):
+ info = ''
if status == 'edit':
if 'ticket_details' in filters:
- info = ''
if len(fields) > 0:
info = ', '.join(['<i>%s</i>' % f for f in \
fields.keys()]) + ' changed<br />'
@@ -261,29 +259,18 @@
info = fields['resolution']
if info and comment:
info = '%s: ' % info
- else:
- info = ''
else:
return None
+
kind, verb = status_map[status]
- title = util.Markup('Ticket <em title="%s">#%s</em> (%s) %s by %s',
- summary, id, type, verb, author)
- href = format == 'rss' and self.env.abs_href.ticket(id) or \
- self.env.href.ticket(id)
+ title, description, href = get_event_data(
+ self.env, req, db,
+ util.Markup('%s Ticket <em title="%s">#%s</em> (%s) %s',
+ type.capitalize(), summary, id,
+ util.shorten_line(summary), verb),
+ comment, 'ticket', id, author=author)
+ return kind, href, title, t, author, util.Markup(info) + description
- if status == 'new':
- message = summary
- else:
- message = util.Markup(info)
- if comment:
- if format == 'rss':
- message += wiki_to_html(comment, self.env, req, db,
- absurls=True)
- else:
- message += wiki_to_oneliner(comment, self.env, db,
- shorten=True)
- return kind, href, title, t, author, message
-
# Ticket changes
if 'ticket' in filters or 'ticket_details' in filters:
db = self.env.get_db_cnx()
@@ -318,11 +305,12 @@
# New tickets
if 'ticket' in filters:
- cursor.execute("SELECT id,time,reporter,type,summary"
+ cursor.execute("SELECT id, time, reporter, "
+ " type, summary, description"
" FROM ticket WHERE time>=%s AND time<=%s",
(start, stop))
for row in cursor:
- yield produce(row, 'new', {}, None)
+ yield produce(row[:5], 'new', {}, row[5])
# Internal methods
Index: trac/ticket/roadmap.py
===================================================================
--- trac/ticket/roadmap.py (revision 2819)
+++ trac/ticket/roadmap.py (working copy)
@@ -24,7 +24,7 @@
from trac.util import escape, format_date, format_datetime, parse_date, \
pretty_timedelta, shorten_line, unescape, CRLF, Markup
from trac.ticket import Milestone, Ticket, TicketSystem
-from trac.Timeline import ITimelineEventProvider
+from trac.Timeline import ITimelineEventProvider, get_event_data
from trac.web import IRequestHandler
from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiSyntaxProvider
@@ -306,23 +306,17 @@
def get_timeline_events(self, req, start, stop, filters):
if 'milestone' in filters:
- format = req.args.get('format')
db = self.env.get_db_cnx()
cursor = db.cursor()
cursor.execute("SELECT completed,name,description FROM milestone "
"WHERE completed>=%s AND completed<=%s",
(start, stop,))
for completed, name, description in cursor:
- title = Markup('Milestone <em>%s</em> completed', name)
- if format == 'rss':
- href = self.env.abs_href.milestone(name)
- message = wiki_to_html(description, self.env, db,
- absurls=True)
- else:
- href = self.env.href.milestone(name)
- message = wiki_to_oneliner(description, self.env, db,
- shorten=True)
- yield 'milestone', href, title, completed, None, message or '--'
+ title, description, href = get_event_data(
+ self.env, req, db,
+ Markup('Milestone <em>%s</em> completed', name),
+ description, 'milestone', name)
+ yield 'milestone', href, title, completed, None, description
# IRequestHandler methods
Index: trac/versioncontrol/web_ui/changeset.py
===================================================================
--- trac/versioncontrol/web_ui/changeset.py (revision 2819)
+++ trac/versioncontrol/web_ui/changeset.py (working copy)
@@ -28,7 +28,7 @@
from trac.mimeview import Mimeview, is_binary
from trac.perm import IPermissionRequestor
from trac.Search import ISearchSource, query_to_sql, shorten_result
-from trac.Timeline import ITimelineEventProvider
+from trac.Timeline import ITimelineEventProvider, get_event_data
from trac.versioncontrol import Changeset, Node
from trac.versioncontrol.diff import get_diff_options, hdf_diff, unified_diff
from trac.versioncontrol.svn_authz import SubversionAuthorizer
@@ -549,20 +549,15 @@
db = self.env.get_db_cnx()
repos = self.env.get_repository(req.authname)
for chgset in repos.get_changesets(start, stop):
- message = chgset.message or '--'
- shortlog = wiki_to_oneliner(message, self.env, db, shorten=True)
+ msg = wiki_to_oneliner(chgset.message, self.env, db,
+ shorten=True)
if format == 'rss':
- title = util.Markup('Changeset [%s]: %s',
- chgset.rev, shortlog)
- href = self.env.abs_href.changeset(chgset.rev)
- message = wiki_to_html(message, self.env, req, db,
- absurls=True)
+ title = util.Markup('Changeset [%s]: %s', chgset.rev, msg)
else:
- title = util.Markup('Changeset <em>[%s]</em> by %s',
- chgset.rev, chgset.author)
- href = self.env.href.changeset(chgset.rev)
- message = wiki_to_oneliner(message, self.env, db,
- shorten=True)
+ title = util.Markup('Changeset <em>[%s]</em>', chgset.rev)
+ title, message, href = get_event_data(
+ self.env, req, db, title, chgset.message,
+ 'changeset', chgset.rev, author=chgset.author)
if show_files:
files = []
for chg in chgset.get_changes():
Index: trac/Timeline.py
===================================================================
--- trac/Timeline.py (revision 2819)
+++ trac/Timeline.py (working copy)
@@ -25,8 +25,8 @@
from trac.util import format_date, format_time, http_date, Markup, rss_title
from trac.web import IRequestHandler
from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
+from trac.wiki import wiki_to_html, wiki_to_oneliner
-
class ITimelineEventProvider(Interface):
"""
Extension point interface for adding sources for timed events to the
@@ -186,3 +186,20 @@
'label': fltr[1], 'enabled': int(fltr[0] in filters)}
return 'timeline.cs', None
+
+
+def get_event_data(env, req, db, title, message, type, id, version=None,
+ author=None):
+ format = req.args.get('format')
+ if format == 'rss':
+ href = env.abs_href(type, id)
+ else:
+ href = env.href(type, id)
+ if author:
+ title += ' by ' + author
+ if format == 'rss' or env.config.getbool('timeline', 'show_full_content'):
+ message = wiki_to_html(message, env, req, db, absurls=format=='rss')
+ else:
+ message = wiki_to_oneliner(message, env, db, shorten=True)
+ return (title, message, href)
+
Index: trac/wiki/web_ui.py
===================================================================
--- trac/wiki/web_ui.py (revision 2819)
+++ trac/wiki/web_ui.py (working copy)
@@ -23,7 +23,7 @@
from trac.core import *
from trac.perm import IPermissionRequestor
from trac.Search import ISearchSource, query_to_sql, shorten_result
-from trac.Timeline import ITimelineEventProvider
+from trac.Timeline import ITimelineEventProvider, get_event_data
from trac.util import format_datetime, get_reporter_id, pretty_timedelta, \
shorten_line, Markup
from trac.versioncontrol.diff import get_diff_options, hdf_diff
@@ -137,16 +137,10 @@
"FROM wiki WHERE time>=%s AND time<=%s",
(start, stop))
for t,name,comment,author in cursor:
- title = Markup('<em>%s</em> edited by %s', name, author)
- if format == 'rss':
- href = self.env.abs_href.wiki(name)
- comment = wiki_to_html(comment or '--', self.env, req, db,
- absurls=True)
- else:
- href = self.env.href.wiki(name)
- comment = wiki_to_oneliner(comment, self.env, db,
- shorten=True)
- yield 'wiki', href, title, t, author, comment
+ title, description, href = get_event_data(
+ self.env, req, db, Markup('<em>%s</em> edited', name),
+ comment, 'wiki', name, author=author)
+ yield 'wiki', href, title, t, author, description
# Internal methods
_______________________________________________
Trac-dev mailing list
[email protected]
http://lists.edgewall.com/mailman/listinfo/trac-dev