チケットとカスタムクエリの日付表示フォーマットを変える

TracLightningの0.12対応も進みつつありますが0.11系の話題です。
先日のOSC2010/Tokyoで尋ねられたことなのですが、Trac のチケットやカスタムクエリで表示される登録日や更新日は今ひとつ優しくありません。

チケットの登録/更新日
チケットのコメント
カスタムクエリ

何ヶ月前とか何分前とか表示されても、ちっとも嬉しくありません。
マウスカーソルをリンクに当てると年月日の表示も見られますが、極めて直感的ではないと言えます。
そこでTracのテンプレートを修正して、直感的な日時の表示にしちゃいましょう。


手を入れる対象のテンプレートは2つで、TracLightning2.5.xの場合は、
%TRAC_LIGHT_HOME%python\Lib\site-packages\Trac-0.11.7.ja1-py2.5.egg\trac\ticket\templates以下に
ticket.html
query_results.html
がありますので、コピーしてから修正します。*1
改修箇所も内容も多くないので、diff使うよりも手で直したほうが早いかもしれませんが、面倒だからといって直接手を入れるとバージョンアップなどで私のように苦労することになるので注意しましょう(笑)

--- ticket/templates/ticket.html
+++ mod/ticket.html
@@ -146,8 +146,8 @@
         <div id="ticket" py:if="ticket.exists or preview_mode"
           class="${preview_mode and 'ticketdraft' or None}">
           <div class="date">
-            <p py:if="ticket.exists">登録: ${dateinfo(ticket.time_created)} 前</p> <!--! FIXME: message_contains_tag -->
-            <p py:if="ticket.time_changed != ticket.time_created">最終更新: ${dateinfo(ticket.time_changed)} 前</p> <!--! FIXME: message_contains_tag -->
+            <p py:if="ticket.exists">登録: ${format_datetime(ticket.time_created)}(${dateinfo(ticket.time_created)}前)</p> <!--! FIXME: message_contains_tag -->
+            <p py:if="ticket.time_changed != ticket.time_created">最終更新: ${format_datetime(ticket.time_changed)} (${dateinfo(ticket.time_changed)}前)</p> <!--! FIXME: message_contains_tag -->
             <p py:if="not ticket.exists"><i>${_('(ticket not yet created)')}</i></p>
           </div>
           <!--! use a placeholder if it's a new ticket -->
@@ -240,7 +240,7 @@
                     &nbsp;
                   </span>
                   <!--! FIXME: message_contains_tag -->
-                  更新者: ${authorinfo(change.author)} (${dateinfo(change.date)} 前)
+                  更新者: ${authorinfo(change.author)}  ${format_datetime(change.date)} (${dateinfo(change.date)} 前)
                 </h3>
                 <div py:if="'cnum' in change and can_append" class="inlinebuttons">
                   <input type="hidden" name="replyto" value="${change.cnum}" />
--- ticket/templates/query_results.html
+++ mod/query_results.html
@@ -62,7 +62,7 @@
                     <td py:when="name == 'id'" class="id"><a href="$result.href" title="${_('View ticket')}" class="${classes(closed=result.status == 'closed')}">#$result.id</a></td>
                     <td py:otherwise="" class="$name" py:choose="">
                       <a py:when="name == 'summary'" href="$result.href" title="${_('View ticket')}">$value</a>
-                      <py:when test="isinstance(value, datetime)">${dateinfo(value)}</py:when>
+                      <py:when test="isinstance(value, datetime)">${format_date(value)} (${dateinfo(value)})</py:when>
                       <py:when test="name == 'reporter'">${authorinfo(value)}</py:when>
                       <py:when test="name == 'cc'">${format_emails(ticket_context, value)}</py:when>
                       <py:when test="name == 'owner' and value">${authorinfo(value)}</py:when>
@@ -79,7 +79,7 @@
                   <td colspan="${len(headers)}">
                     <!--! FIXME: message_contains_tag -->
                     <p class="meta">${_('Reported by')} <strong>${authorinfo(result.reporter)}</strong>,
-                      ${dateinfo(result.time)}前.</p>
+                      ${format_date(result.time)} (${dateinfo(result.time)}前.)</p>
                   </td>
                 </tr>
                 <py:choose>

修正したテンプレートは、

  • プロジェクトのテンプレートフォルダに入れる。
    • %TRAC_LIGHT_HOME%\projects\trac\%プロジェクト名%\templates にカスタマイズしたファイルを置く
  • 利用しているTracの全体のテンプレートフォルダを作って、そこへ入れる。
    • %TRAC_LIGHT_HOME%\python\share\trac\conf\trac.iniの[inherit]のセクションにtemplates_dirを追加しテンプレートフォルダーを追加し、そのフォルダーにカスタマイズしたテンプレートを置く。

の、どちらかで対処しましょう。

プロジェクト個別で対応したければ前者、Trac全体に適用したいなら後者になると思います。

修正したテンプレートの移動が終わったらTracを再起動しましょう。
するとほら、日付が人に優しい形で表示されます。

チケットの登録/更新日
チケットのコメント
カスタムクエリ

以上、ちょっとしたことですが気にする人は気にするので普及のために手を入れてみるのも悪くないと思います。

*1:違うバージョン等の場合は適宜読み替えるか、探し出してください。