--- Timeline.py-old	2005-01-16 17:36:33.000000000 +0100
+++ Timeline.py	2005-01-16 19:31:15.000000000 +0100
@@ -35,7 +35,7 @@
     template_rss_name = 'timeline_rss.cs'
 
     def get_info (self, start, stop, maxrows, tickets,
-                  changeset, wiki, milestone):
+                  changeset, wiki, milestone, component, cfilter):
         cursor = self.db.cursor ()
 
         tickets = tickets and self.perm.has_permission(perm.TICKET_VIEW)
@@ -53,41 +53,59 @@
         WIKI = 5
         MILESTONE = 6
 
+	try:
+	    display_components = int(self.env.get_config('timeline', 'display_components', 0))
+	except ValueError, e:
+	    self.env.log.warning("Invalid 'display_components' value, "
+	                         "please edit trac.ini : %s" % e)
+	    display_components = 0
+
+	try:
+	    guess_component = int(self.env.get_config('timeline', 'changeset_guess_component', 0))
+	except ValueError, e:
+	    self.env.log.warning("Invalid 'changeset_guess_component' value, "
+	                         "please edit trac.ini : %s" % e)
+	    guess_component = 0
+
         q = []
         if changeset:
             q.append("SELECT time, rev AS idata, '' AS tdata, 1 AS type, "
-                     " message, author "
+                     " message, author, '' AS component "
                      "FROM revision WHERE time>=%s AND time<=%s" %
                      (start, stop))
         if tickets:
             q.append("SELECT time, id AS idata, '' AS tdata, 2 AS type, "
-                     "summary AS message, reporter AS author "
+                     "summary AS message, reporter AS author, component "
                      "FROM ticket WHERE time>=%s AND time<=%s" %
                      (start, stop))
-            q.append("SELECT time, ticket AS idata, '' AS tdata, 4 AS type, "
-                     "'' AS message, author "
-                     "FROM ticket_change WHERE field='status' "
-                     "AND newvalue='reopened' AND time>=%s AND time<=%s" %
+            q.append("SELECT t1.time, t1.ticket AS idata, '' AS tdata, 4 AS type, "
+                     "  '' AS message, t1.author, t2.component AS component "
+		     "FROM ticket_change t1, ticket t2 "
+                     "WHERE t1.field='status' "
+                     "  AND t1.newvalue='reopened' AND t1.ticket = t2.id "
+		     "  AND t1.time>=%s AND t1.time<=%s" %
                      (start, stop))
             q.append("SELECT t1.time AS time, t1.ticket AS idata,"
                      "       t2.newvalue AS tdata, 3 AS type,"
-                     "       t3.newvalue AS message, t1.author AS author"
+                     "       t3.newvalue AS message, t1.author AS author,"
+		     "       t4.component AS component"
                      " FROM ticket_change t1"
                      "   INNER JOIN ticket_change t2 ON t1.ticket = t2.ticket"
                      "     AND t1.time = t2.time"
-                     "   LEFT OUTER JOIN ticket_change t3 ON t1.time = t3.time"
+                     "   INNER JOIN ticket t4 ON t1.ticket = t4.id"
+		     "   LEFT OUTER JOIN ticket_change t3 ON t1.time = t3.time"
                      "     AND t1.ticket = t3.ticket AND t3.field = 'comment'"
                      " WHERE t1.field = 'status' AND t1.newvalue = 'closed'"
                      "   AND t2.field = 'resolution'"
                      "   AND t1.time >= %s AND t1.time <= %s" % (start,stop))
         if wiki:
             q.append("SELECT time, -1 AS idata, name AS tdata, 5 AS type, "
-                     "comment AS message, author "
+                     "comment AS message, author, '' AS component "
                         "FROM wiki WHERE time>=%s AND time<=%s" %
                      (start, stop))
         if milestone:
             q.append("SELECT time, -1 AS idata, '' AS tdata, 6 AS type, "
-                     "name AS message, '' AS author " 
+                     "name AS message, '' AS author, '' AS component " 
                      "FROM milestone WHERE time>=%s AND time<=%s" %
                      (start, stop))
 
@@ -113,11 +131,13 @@
                     'tdata': row['tdata'],
                     'type': int(row['type']),
                     'message': row['message'] or '',
-                    'author': util.escape(row['author'] or 'anonymous')
+                    'author': util.escape(row['author'] or 'anonymous'),
+		    'component': row['component'] or ''
                     }
 
             if item['type'] == CHANGESET:
-                item['href'] = self.env.href.changeset(item['idata'])
+                changeset_component = ''
+		item['href'] = self.env.href.changeset(item['idata'])
                 msg = item['message']
                 item['shortmsg'] = util.escape(util.shorten_line(msg))
                 item['msg_nowiki'] = util.escape(msg)
@@ -134,9 +154,14 @@
                     self.env.log.warning("Invalid 'changeset_show_files' value, "
                                          "please edit trac.ini : %s" % e)
                     max_node = 0
-                    
+		
                 if max_node != 0:
                     cursor_node = self.db.cursor ()
+	
+		    cursor_node.execute("SELECT name FROM component "
+		                        "ORDER BY name")
+		    components = map(lambda x: x[0], cursor_node.fetchall())
+	    
                     cursor_node.execute("SELECT name, change "
                                         "FROM node_change WHERE rev=%d" % item['idata'])
                     node_list = ''
@@ -159,8 +184,11 @@
                             node_data = '<span class="diff-rem">' + row_node['name'] + "</span>"
                         node_list += node_data
                         node_count += 1
+			if guess_component and row_node['name'].split('/')[0] in components:
+			    changeset_component = row_node['name'].split('/')[0] 
                     item['node_list'] = node_list + ': '
-
+		item['component'] = changeset_component;
+		
             elif item['type'] == WIKI:
                 item['href'] = self.env.href.wiki(row['tdata'])
                 item['message'] = wiki_to_oneliner(util.shorten_line(item['message']),
@@ -186,8 +214,14 @@
                 item['author.rss'] = ''
             item['message.rss'] = util.escape(item['message'] or '')
 
-            info.append(item)
-        return info
+	    if not component or item['component'] == '' or item['component'] == cfilter:
+		info.append(item)
+
+	    # now, after appending,  remove the component if asked for
+	    if not display_components:
+		item['component'] = ''
+        
+	return info
 
     def render (self):
         self.perm.assert_permission(perm.TIMELINE_VIEW)
@@ -223,6 +257,8 @@
         ticket = self.args.has_key('ticket')
         changeset = self.args.has_key('changeset')
         milestone = self.args.has_key('milestone')
+	component = self.args.has_key('component')
+	
         if not (wiki or ticket or changeset or milestone):
             wiki = ticket = changeset = milestone = 1
 
@@ -234,11 +270,21 @@
             self.req.hdf.setValue('timeline.changeset', 'checked')
         if milestone:
             self.req.hdf.setValue('timeline.milestone', 'checked')
-
+	if component:
+	    self.req.hdf.setValue('timeline.component', 'checked')
+	    
+	if self.args.has_key('cfilter'):
+	    cfilter = self.args['cfilter']
+	else:
+	    cfilter = ''
+	self.req.hdf.setValue('timeline.cfilter', cfilter)
+	
         info = self.get_info (start, stop, maxrows, ticket,
-                              changeset, wiki, milestone)
+                              changeset, wiki, milestone, component, cfilter)
         util.add_dictlist_to_hdf(info, self.req.hdf, 'timeline.items')
         self.req.hdf.setValue('title', 'Timeline')
-
+	util.sql_to_hdf(self.db, 'SELECT name FROM component ORDER BY name',
+                        self.req.hdf, 'timeline.components')
+    
     def display_rss(self):
         self.req.display(self.template_rss_name, 'text/xml')

