Tracの環境を
- Fedora Core 6
- Trac 0.10.4
- TracGanttCalendarPlugin 0.0.1
から
- FreeBSD 8.0
- Trac 0.11.5
- TracGanttCalendarPlugin 0.3
にしてみたらカレンダーが機能しなくなったので、DEBUGログを有効にしてコンソールをぼけと眺めてみる。
00:28:55 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 >= '05/30/10' AND a.value <= '07/03/10' ) OR (c.value >= '05/30/10' AND c.value <= '07/03/10'))
日付フォーマットが %m/%d/%y になっている?
コードを眺めると、
ticketcalendar.py
sql = ("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 >= '%s' AND a.value <= '%s' ) "
"OR (c.value >= '%s' AND c.value <= '%s')) %s %s" %
(format_date(parse_date(first.isoformat())),
format_date(parse_date(last.isoformat())),
format_date(parse_date(first.isoformat())),
format_date(parse_date(last.isoformat())),
my_ticket_sql,
selected_milestone_sql))
datefmt.py
def format_date(t=None, format='%x', tzinfo=None):
"""Convenience method for formatting the date part of a `datetime` object.
See `format_datetime` for more details.
"""
if format == 'iso8601':
format = 'iso8601date'
return format_datetime(t, format, tzinfo=tzinfo)
%x が %m/%d/%y に展開されている様子。
とりあえず、export LC_TIME=ja_JP.UTF-8 としてみたものの変化なし。
/usr/share/locale/ja_JP.UTF-8/LC_TIME には %Y/%m/%d とあるんですけどね。ここじゃないのか。
最小限のコードで試してみても同様。
from datetime import date
from trac.util.datefmt import parse_date, format_date
d = date.today().isoformat()
print d
print parse_date(d)
print format_date(parse_date(d))
print format_date(parse_date(d), '%x')
print format_date(parse_date(d), '%Y/%m/%d')
# 2010-06-10
# 2010-06-10 00:00:00+09:00
# 06/10/10
# 06/10/10
# 2010/06/10
面倒になってきたので、フォーマット指定を追加してお茶を濁す。
--- ticketcalendar.py~
+++ ticketcalendar.py
@@ -69,10 +69,10 @@
"JOIN ticket_custom c ON c.ticket = t.id AND c.name = 'due_close' "
"WHERE ((a.value >= '%s' AND a.value <= '%s' ) "
"OR (c.value >= '%s' AND c.value <= '%s')) %s %s" %
- (format_date(parse_date(first.isoformat())),
- format_date(parse_date(last.isoformat())),
- format_date(parse_date(first.isoformat())),
- format_date(parse_date(last.isoformat())),
+ (format_date(parse_date(first.isoformat(), '%Y/%m/%d')),
+ format_date(parse_date(last.isoformat(), '%Y/%m/%d')),
+ format_date(parse_date(first.isoformat(), '%Y/%m/%d')),
+ format_date(parse_date(last.isoformat(), '%Y/%m/%d')),
my_ticket_sql,
selected_milestone_sql))
ここしばらく右手の調子が悪くてすぐぶちまけそうになる。
ぶちまけそうになるというか、かつ丼はぶちまけた。泣いた。