tracのticket_notify_email.txtで通知メールをカスタマイズする
tracでチケットを作成したり、コメントを追加したりすると通知メールが飛びます。その通知メールですが、デフォルトだとReporterとか、キーワードとかチケットのプロパティ値が二段組になって送られてきます。
こんな感じ。
#42: testing ---------------------------+------------------------------------------------ Id: 42 | Status: assigned Component: report system | Modified: Fri Apr 9 00:04:31 2004 Severity: major | Milestone: 0.9 Priority: lowest | Version: 0.6 Owner: anonymous | Reporter: jonas@example.com ---------------------------+------------------------------------------------ Changes: * component: changset view => search system * priority: low => highest * owner: jonas => anonymous * cc: daniel@example.com => daniel@example.com, jonas@example.com * status: new => assigned Comment: I'm interested too! -- Ticket URL: <http://example.com/trac/ticket/42> My Project <http://myproj.example.com/>
しかしこの段組部分ですがメーラが等角フォントじゃない場合はズレまくってしまって読みにくいことこの上ない。
しかも、段組中で一行に入らない場合は二行に分けてでてくるんです。こんな感じ。
#7: テスト -------------------------------------+------------------------------------- Reporter: hogehoge | Type: xxxxxxxxxxx Status: new | るページ有り Keywords: <この項目は不 | Priority: 中 使用> | 所属: 総務課 お名前: ほげ | 連絡先(内線or外線): 2544 データ一時受渡利用: 0 | 公開希望日: 2013/5/25 掲載終了日: | -------------------------------------+-------------------------------------
まあ項目名を長くしちゃったのがいけないんですが。でもってこの通知メールですが、テンプレートでフォーマットを変更することができます。
tracのインスタンス/templates/ticket_notify_email.txtを作成して、それでコントロールするみたい。
例えば、段組をやめて'|'のところで改行してしまうテンプレートはここに例があります。
でもこの例。'|'で改行して、指定された項目名(:の左側の部分)とつなげて出しているので上記の例のように項目に対する値が複数行に分かれてしまっている場合は、途中までしかでない。
title1: longlonglonglong | title2: hogehoge value | title3: fugafuga
これが
title1:longlonglonglong title2:hogehoge title2:fugafuga
となる。
title1:longlonglonglongvalue
となってほしいんですよね。
templteでpythonのコードを入れる
ということでスクラッチからテンプレートを書く。このテンプレートファイルはgenshiというもので記述されています。genshiのマニュアルを参照するとpythonのコードがそのままかけるようです。
このチケットのプロパティに相当する部分はticket_propsという文字列に格納されてテンプレートで参照できるのでこれを利用してpythonでもって文字列を加工します。
genshi中でpythonのコードを入れるには
{%python code... %}\
と書くようです。
こんな風に書きました。
ticket_body_hdr {% python tmp_str=ticket_props.replace(' ','') tmp_str=tmp_str.replace('|','\n') list = tmp_str.split('\n') list = list[1:-1] count = 0 for i in list: if i.find('-----') != -1: break elif i.find(':') == -1: list[count-2] = list[count-2]+i list[count] = '' count = count+1 outstr="" for i in list: if i != '' and i.find('Keywords:') == -1: outstr=outstr+"\n"+i %}\ ${outstr} {% end %}\
$ticket_propsを削除して{%python .. %}と${outstr}を追加。
コードはかなりやっつけです。ticket_propsの空白を削除、'|'で全部改行した上で文字列をリストへ変換。
リストの0番目と最後の要素はセパレータなので削除。
リストの要素中に':'がなければ二行前の要素に結合(途中で改行が入っちゃたのをもとに戻す)。
チケットのデータにtextareaがあるとまたセパレータが出てくるので、それはスキップ。
でもって、再度リストをループさせて、出したくない要素をスキップする。
pythonスクリプト的には全く大したことはないのですが、ticket_notify_email.txtがgenshiであるということを理解するのに時間がかかってしまいました。