Edgewall Software

Version 34 (modified by Felix Collins, 18 years ago) ( diff )

Added documentation on using the fields added by the patch.

Time Tracking

Support for basic time tracking is an often request feature, but it does not look like it is going to be integrated into Trac any time soon. Please read #710 for further details. Still there are ways to enhance the ticket system with the desired functionality. This page is meant as an overview of working solutions and as a howto.

So far two solutions are available that are described below, both modify the Trac's source code:

  • Extending the data model (for Trac 0.8)
  • Using custom ticket fields (for Trac 0.9.x)

This patch is unofficial, please do not report bugs through the Trac ticket system. Instead contact the trac user mailing list or Steffen Pingel.

Extending the data model

A patch has been posted to #1005 that adds two new fields to the ticket table, "Planned work" and "Actual work", that can be edited in the ticket view. It also extends the Roadmap with a progress bar that displays how much work has been done and how much remains.

Using custom ticket fields

A less invasive way to add time tracking is through TracTicketsCustomFields. Custom fields are meant as an extension mechanism that allows to store additional data with tickets without changing the underlying data model.

This patch touches quite a few spots though:

  • Patch Trac to provide a progress bar in the Roadmap view
  • Modify trac.ini for each project to add custom fields
  • Add a ticket query
  • Use a Subversion commit hook to log spent time
Screenshots

Here is a screen shot of the roadmap (click to enlarge):

No image "trac-roadmap-thumb.png" attached to TimeTracking

And of the ticket report:

No image "trac-timetracking-report-thumb.png" attached to TimeTracking

Patching Trac

Download and apply the time tracking patch:

  • Download and unzip/untar Trac
  • Run patch from the created trac-0.9 directory:
    patch -p0 < trac-time-tracking-0.9.3.diff
    
  • Reinstall Trac:
    ./setup.py install
    
Modifying trac.ini

Add the following section to your trac.ini (this needs to be used for each project that you want to use with time tracking):

[ticket-custom]
tt_estimated = text
tt_estimated.label = Time planned

tt_spent = text
tt_spent.label = Time spent

tt_remaining = text
tt_remaining.label = Time remaining
Adding the query

Open your Trac project in a web browser and goto "View Tickets" → "New Report" (you might need to grant REPORT_CREATE permission first). Enter a title like "Time Tracking" and the following query:

SQLite
SELECT DISTINCT 

   id AS ticket,
   (CASE WHEN pl.value ISNULL THEN '' ELSE pl.value END) AS planned,
   (CASE WHEN s.value ISNULL THEN '' ELSE s.value END) AS spent,
   (CASE WHEN r.value ISNULL THEN '' ELSE r.value END) AS remaining,
   (CASE WHEN ((s.value + r.value) - pl.value) = "0.0" THEN ' ' ELSE (s.value + r.value) - pl.value END) as accuracy,
   milestone AS customer,
   summary, component, status 



  FROM ticket t,enum p

  LEFT OUTER JOIN ticket_custom pl ON
       (t.id=pl.ticket AND pl.name='tt_estimated')

  LEFT OUTER JOIN ticket_custom s ON
       (t.id=s.ticket AND s.name='tt_spent')

  LEFT OUTER JOIN ticket_custom r ON
       (t.id=r.ticket AND r.name='tt_remaining')


  ORDER BY milestone
Using Postgres with psycho

Postgres has a few wrinkles and time intervals are not as hard to use.

SELECT DISTINCT 
   id AS ticket,
   pl.value::interval  AS planned,
   s.value::interval AS spent,
   r.value::interval AS interval,
  ((s.value::interval + r.value::interval) - pl.value::interval) as accuracy,
   milestone AS customer,   summary, component, status 
  FROM enum,ticket t
  LEFT OUTER JOIN ticket_custom pl ON
       (t.id=pl.ticket AND pl.name='tt_estimated')
  LEFT OUTER JOIN ticket_custom s ON
       (t.id=s.ticket AND s.name='tt_spent')
  LEFT OUTER JOIN ticket_custom r ON
       (t.id=r.ticket AND r.name='tt_remaining')
  ORDER BY milestone;

Using a Subversion commit hook

The contrib/trac-post-commit-hook script is a very convenient tool to interact with Trac's ticket system on commit. Copy the script that gets created by the .diff above into /usr/share/trac/contrib and create a script hooks/post-commit in your Subversion repository (do not forget to set the executable bit chmod 755 hooks/post-commit with the following content, modify the TRAC_ENV to point to your local Trac project:

REPOS="$1"
REV="$2"
LOG=`svnlook log -r $REV $REPOS`
AUTHOR=`svnlook author -r $REV $REPOS`
TRAC_ENV='/var/trac/test'

/usr/bin/python /usr/share/trac/contrib/trac-post-commit-hook \
  -p "$TRAC_ENV"  \
  -r "$REV"       \
  -u "$AUTHOR"    \
  -m "$LOG"

You can now use special keywords in your commit message to modify Trac tickets. The available commands are:

refs #idAdds a reference to the ticket's Changelog
closes #idCloses the ticket
spent xxhAdds the amount to the time spent, decreases the time remaining by amount
rem xxhSets the time remaining to the amount.

Examples:

svn commit -m 'Added time tracking, refs #1, spent 4h, rem 1h'

This adds an entry to the Changelog of ticket #1, increases the time spent by 4 hours and sets the remaining time to 1 hour.

svn commit -m 'Added time tracking, closes #1, spent 1h'

This closes ticket #1, increases the time spent by 1 hour and decreases the remaining time by 1 hour.


Issues

  • I couldn't see the second milestone bars so hacked the roadmap.cs to see them … until I realized that using units (4h instead of just 4 …) was the problem. All working now, very nice, many thanks.

Adding new custom field types

It is useful to have fields that only accept numbers, fields that only accept an entry when the ticket is created and perhaps a field that accumulates the numbers you enter? This can be achieved with a patch to the appropriate .cs files and the addition of a little javascript. The changes can be found in the patch file attached.

Description of new types:

integer

Allows only integer values such as "12" and "-98329847" to be entered into the custom field.

cumulative_integer

Like integer but only allows the user to enter a value that is added to the current value. Useful for accumulating work done on a ticket or dollars spent.

set_once_integer

Like integer but only allows the user to set a value when the ticket is created. From then on the value is fixed.

Syntax of ini file:

<name> = <type>

Example:

{{{ [ticket-custom] mycustominteger = integer mycustominteger_cumulative = cumulative_integer mycustominteger_setonce = set_once_integer }}}

Note: See TracWiki for help on using the wiki.