trac + ganttcalendarplugin

gentoo に乗ってる Trac に TracGanttCalendarPlugin を入れてみたんだが、ガントチャートは表示されてもカレンダーが表示されないという状態でした。

ログを見てみるとクエリがこんな感じ。

2009-11-08 00:46:22,535 Trac[ticketcalendar] DEBUG: SELECT id, type, summary, owner, description, status, a.value, c.value from ticket t JOIN ticket_custom a ON a.ticket = t.id AND a.name = 'due_assign' JOIN ticket_custom c ON c.ticket = t.id AND c.name = 'due_close' WHERE ((a.value >= '2009年11月01日' AND a.value <= '2009年12月05日' ) OR (c.value >= '2009年11月01日' AND c.value <= '2009年12月05日'))

で、実際のデータベースのテーブルの中身が以下

sqlite> select * from ticket_custom;
1|due_assign|2009-10-23
1|due_close|2009-12-01
1|complete|

日付の比較はただの文字列比較(「'2009-10-23' >= '2009年11月01日'」みたいな感じ)になっているよう。これは検索引っかからないよなーということで、チケットの日付を日本語表記にしてみても変化なし。
いろいろ調べてみたところ、どうもロケール依存の日本語日付文字列を python が読み込めないのが問題っぽい。
↓テストプログラム(for python 2.6)

#!/usr/bin/env python
# -*- coding: utf-8; -*-
import locale, datetime, time

locale.setlocale(locale.LC_TIME, 'ja_JP.utf8')

print "locale: %s" % str( locale.getlocale(locale.LC_TIME) )

today = datetime.date.today()
todayLocaleStr = today.strftime('%x')

print "strftime: %s" % todayLocaleStr
print "type: %s" % type(todayLocaleStr)
print time.strptime(todayLocaleStr, '%x')

gentoo 上の実行結果は以下。

% python testdatetime.py
locale: ('ja_JP', 'UTF8')
strftime: 2009年11月08日
type: <type 'str'>
Traceback (most recent call last):
  File "testdatetime.py", line 14, in <module>
    print time.strptime(todayLocaleStr, '%x')
  File "/usr/lib64/python2.6/_strptime.py", line 454, in _strptime_time
    return _strptime(data_string, format)[0]
  File "/usr/lib64/python2.6/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '2009\xe5\xb9\xb411\xe6\x9c\x8808\xe6\x97\xa5' does not match format '%x'

というわけで DB から日付文字列を取ってきたときに変換失敗して、そのレコードを読み飛ばしてしまっている模様。

うーん、日付書式はいろいろあるのでサポート大変なんだろうけど、これは何とかしてほしいなぁ。
ロケールの設定をいじればよさそうだけど、Trac のためだけに設定を変更するのもなんなので、とりあえずは日付書式を ISO8601 に統一した上で、パッチ作って使う感じかな。