Hatena::ブログ(Diary)

almost nearly dead このページをアンテナに追加 RSSフィード Twitter

2011-05-11

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

| 09:23 | 0.12対応版チケットとカスタムクエリの日付表示フォーマットを変えるを含むブックマーク

※2011/05/12 ticket_box.htmlのカスタマイズに誤りがあったので訂正しました。

以前にTrac 0.11用のカスタマイズ例を「チケットとカスタムクエリの日付表示フォーマットを変える - almost nearly dead」で書きましたが、Trac 0.12用についてもまとめておきます。

0.12では手を入れる対象のテンプレートは3つになります。

TracLightning3.1.1の場合、

%TRAC_LIGHT_HOME%\python-lib\trac\trac\ticket\templates以下に

ticket.html

ticket_box.html

query_results.html

がありますので、コピーしてから修正します。

--- ticket/templates/ticket.html
+++ mod/ticket.html
@@ -139,7 +139,7 @@
                         </py:for></py:if>
                     </py:if>
                   </span>
-                  <i18n:msg params="date, author">Changed ${dateinfo(change.date)} ago by ${authorinfo(change.author)}</i18n:msg>
+                  <i18n:msg params="date, author">Changed ${dateinfo(change.date)} ago by ${authorinfo(change.author)}</i18n:msg> ${format_datetime(ticket.changetime)}
                 </h3>
                 <py:if test="not show_editor and comment_version == max_version">
                   <form py:if="'cnum' in change and can_edit_comment" method="get" action="#comment:${change.cnum}">
@@ -162,11 +162,11 @@
                   <i18n:msg params="version, date, author" py:when="comment_version != max_version">
                       Version ${comment_version}, edited ${dateinfo(change.comment_history[comment_version].date)} ago
                       by ${authorinfo(change.comment_history[comment_version].author)}
-                  </i18n:msg>
+                  </i18n:msg> ${format_datetime(change.comment_history[comment_version].date)}
                   <i18n:msg params="date, author" py:otherwise="">
                       Last edited ${dateinfo(change.comment_history[comment_version].date)} ago
                       by ${authorinfo(change.comment_history[comment_version].author)}
-                  </i18n:msg>
+                  </i18n:msg> ${format_datetime(change.comment_history[comment_version].date)}
                   <py:if test="comment_version > 0">
                     (<a href="${href.ticket(ticket.id, cnum_hist=change.cnum, cversion=comment_version - 1)
                                }#comment:${change.cnum}">previous</a>)

--- ticket/templates/ticket_box.html
+++ mod/ticket_box.html
@@ -16,8 +16,8 @@
      xmlns:i18n="http://genshi.edgewall.org/i18n"
      id="ticket" class="${preview_mode and 'ticketdraft' or None}">
   <div class="date">
-    <p i18n:msg="created" py:if="ticket.exists">Opened ${dateinfo(ticket.time)} ago</p>
-    <p i18n:msg="modified" py:if="ticket.changetime != ticket.time">Last modified ${dateinfo(ticket.changetime)} ago</p>
+    <p><i18n:msg params="created" py:if="ticket.exists">Opened ${dateinfo(ticket.time)} ago</i18n:msg> (${format_datetime(ticket.time)})</p>
+    <p><i18n:msg params="modified" py:if="ticket.changetime != ticket.time">Last modified ${dateinfo(ticket.changetime)} ago</i18n:msg> (${format_datetime(ticket.changetime)})</p>
     <p py:if="not ticket.exists"><i>(ticket not yet created)</i></p>
   </div>
   <!--! use a placeholder if it's a new ticket -->

--- ticket/templates/query_results.html
+++ mod/query_results.html
@@ -73,7 +73,7 @@
                         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>
@@ -88,8 +88,8 @@
               <py:with vars="result_rows = [t for t in row if result[t]]">
                 <tr py:if="result_rows" class="fullrow">
                   <td colspan="${len(headers)}">
-                    <p class="meta" i18n:msg="author, date">Reported by <strong>${authorinfo(result.reporter)}</strong>,
-                      ${dateinfo(result.time)} ago.</p>
+                    <p class="meta"><i18n:msg params="author, date">Reported by <strong>${authorinfo(result.reporter)}</strong>,
+                      ${dateinfo(result.time)} ago.</i18n:msg> (${format_datetime(result.time)})</p>
                   </td>
                 </tr>
                 <py:choose>

以前と同様に修正したテンプレートは、

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

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

修正したテンプレートの移動が終わったら念のためApache再起動しましょう。

すると、若干表示位置は違いますが0.11のときと同じように日付が人に優しい形で表示されます。

チケットの登録/更新日f:id:kanu-orz:20110510214726p:image
チケットのコメントf:id:kanu-orz:20110510215002p:image
カスタムクエリf:id:kanu-orz:20110510215147p:image

同じような手法でリポジトリブラウザ関連の日付表示もカスタマイズできますが、0.12でテンプレートをカスタマイズする場合は、0.12では多国語対応(i18n)となっているためi18nがうまく機能するように手を入れてあげる必要があるので注意してください。

今回のカスタマイズもi18n対応を無視して0.11と同じ表示にすることも可能ですが、その場合はテンプレートの該当箇所を自力で日本語化する必要が出てきますのでご注意下さい。

前述の例は可能な限りTracが持っているi18nを生かした形でカスタマイズしてあります。

ちなみに次のバージョンである0.13では一歩進んだi18n対応が行われので、今までのような日付の表示周りのカスタマイズは不要になります。

参考: #9777 (New option for displaying absolute date/time in ticket) ? The Trac Project

ponmikiponmiki 2011/05/11 21:06 0.12系での修正手順の情報ありがとうございます。早速、適用しました。非常に助かりました!

ちなみに、ticket_box.html で修正する1行目ですが、
(${format_datetime(ticket.changetime)})ではなく(${format_datetime(ticket.time)})では?

kanu-orzkanu-orz 2011/05/12 08:21 ponmikiさん

指摘ありがとうございます。思いっきり間違ってますね(^^;;
記事訂正しました。

jun66j5jun66j5 2011/05/15 18:13 コメントが付けられていないチケットの場合に、つまり ticket.changetime == ticket.time なときに
登録: 5週前 (2011/04/13 12:51:49)
(2011/04/13 12:51:49)
みたいな表記になる気がします。

ticket_box.html の差分2行目はたぶん ↓ でしょうか。

+ <p py:if="ticket.changetime != ticket.time"><i18n:msg params="modified">Last modified ${dateinfo(ticket.changetime)} ago</i18n:msg> (${format_datetime(ticket.changetime)})</p>

ponmikiponmiki 2011/05/16 23:01 かぬさん

あと、チケットのコメントの日時ですが、コメントがいくつかあるとすべて最後の更新日時になってしまうような気がするのですが、
こちらがどこか間違っているだけでしょうか?

ponmikiponmiki 2011/05/19 00:43 たびたびすいません。ticket.htmlですが、142行目の追記は
${format_datetime(change.comment_history[comment_version].date)}
とすると、コメントの更新日時が正しく表示されるました。ただ、コメントを『編集』するとそのコメントの最終更新日時になってしまいましたが。
ticket.htmlの165行目の修正は169行目の修正だけでいいように見えました。
あとでsf.jpのチケットにしておきます。

osamussoosamusso 2011/06/15 16:01 ありがとうございます!
人に優しい表示になりとても助かりました。

ticket.html の修正ですが、
${format_datetime(ticket.changetime)} ではなく、
${format_datetime(change.date)} ではないでしょうか?
このように変更したら、編集した日時が表示されました。

@@ -139,7 +139,7 @@
+<i18n:msg params="date, author">Changed ${dateinfo(change.date)}
ago by ${authorinfo(change.author)}
</i18n:msg> ${format_datetime(ticket.changetime)}