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

Reply via email to