« VMwareのゲストOSに対してSSHでアクセス | Main | Tracの通知メールを編集 »

2008.09.01

Trac:通知メール送信の条件を追加

Tracでnotificationを有効にすると、チケットの内容に何らかの変更が発生する度にメールが送信されることになります。が、それだと『メールが飛び交いすぎる』ということになる場合も。

ってことで、例えば『メール送信を行う』というチェックボックスをチケット入力画面に追加し、そこにチェックがついている場合のみメールを送信するというようなことにする場合。

ticket/web_ui.pyの_do_create(チケット作成時)および_do_save(チケット更新時)のtn = TicketNotifyEmailの処理を行うところに

if 'sendmail' in req.args:
といった条件文を追加すればOK(sendmailはチェックボックスのパラメータ名)。
_do_saveの場合、チケットの変更点がないとメールは送信されませんが、『送信し忘れた』というような場合に後付で送信できるようにする場合は、
if ticket.save_changes (get_reporter_id(req, 'author'),~
のifブロック(変更点がありDBを更新した場合にtrue/DBを更新しなかった(する必要がなかった)場合はfalse)に対してelse節を追加し、そこにメール送信を行う処理を記述。なお、else節においては、modtime=nowの部分をmodtime=ticket.time_changedとすると、最後に変更された内容を用いてメールを構築します。

#html側は、ticket/template/ticket.htmlに

<input type="checkbox" id="sendmail" name="sendmail" value="1" /><label for="sendmail">メール送信</label>
といった感じで追加すればOK。

|

« VMwareのゲストOSに対してSSHでアクセス | Main | Tracの通知メールを編集 »

Subversion・Trac・etc.」カテゴリの記事

Comments

syoさん、はじめまして。
momoと申します。

突然すみませんが、syoさんの”Trac:通知メール送信の条件を追加”の記事について質問させてください。

syoさんの”Trac:通知メール送信の条件を追加”を読んで、自分の環境で試しましたが、
うまく行きませんでした。tn = TicketNotifyEmailの処理を行うところにifを追加するだけで宜しいでしょうか?

お手数をお掛けしますが、ご教授頂けるようお願いします。

宜しくお願い致します。


以下参考としてTRACのソースを添付します。
def _do_create(self, req, ticket):
ticket.insert()

# Notify
try:
tn = TicketNotifyEmail(self.env)
tn.notify(ticket, newticket=True)
if 'sendmail' in req.args:
tn = TicketNotifyEmail(self.env)
tn.notify(ticket, newticket=True)
except Exception, e:
self.log.error("Failure sending notification on creation of "
"ticket #%s: %s", ticket.id, exception_to_unicode(e))

# Redirect the user to the newly created ticket or add attachment
if 'attachment' in req.args:
req.redirect(req.href.attachment('ticket', ticket.id,
action='new'))
if 'TICKET_VIEW' not in req.perm('ticket', ticket.id):
req.redirect(req.href.newticket())
req.redirect(req.href.ticket(ticket.id))

def _do_save(self, req, ticket, action):
cnum = req.args.get('cnum')
replyto = req.args.get('replyto')
internal_cnum = cnum
if cnum and replyto: # record parent.child relationship
internal_cnum = '%s.%s' % (replyto, cnum)

# Save the action controllers we need to call side-effects for before
# we save the changes to the ticket.
controllers = list(self._get_action_controllers(req, ticket, action))

# -- Save changes

now = datetime.now(utc)
if ticket.save_changes(get_reporter_id(req, 'author'),
req.args.get('comment'), when=now,
cnum=internal_cnum):
try:
tn = TicketNotifyEmail(self.env)
tn.notify(ticket, newticket=False, modtime=now)
if 'sendmail' in req.args:
tn = TicketNotifyEmail(self.env)
tn.notify(ticket, newticket=False, modtime=now)
except Exception, e:

Posted by: momo | 2011.05.27 at 18:51

if文でチェックするためのパラメータを、htmlテンプレート側にも追加しておく必要があります(htmlのフォームに、チェックボックスを追加)。

ticket/template/ticket.html ファイルの方も確認していただけますでしょうか。

Posted by: syo | 2011.05.28 at 08:58

syoさん、お忙しい中、ご回答頂き誠にありがとうございます。

ticket.htmlも部分も追加してありました。
説明不足な部分がありましたので、再度事象をご説明します。

■web_ui.py
def _do_create(self, req, ticket):
try:
tn = TicketNotifyEmail(self.env)
tn.notify(ticket, newticket=True)
if 'sendmail' in req.args: //追加
tn = TicketNotifyEmail(self.env) //追加
tn.notify(ticket, newticket=True) //追加

def _do_save(self, req, ticket, action):
try:
tn = TicketNotifyEmail(self.env)
tn.notify(ticket, newticket=False, modtime=now)
if 'sendmail' in req.args: //追加
tn = TicketNotifyEmail(self.env) //追加
tn.notify(ticket, newticket=False, modtime=now) //追加

■ticket.html
*表示できないため、先頭部分の"<"を削除しました。

/fieldset>
//追加ここより
p class="mailcheckbox">
label>
input type="checkbox" id="sendmail" name="sendmail" value="1" checked="checked" />
この登録/変更をメールで通知します。
/label>
/p>
//追加ここまで
!--! Workflow support -->
py:if test="ticket.id">

■エラー事象
web_ui.pyに上記の修正後、TRACに入ると、Internal Server Errorが発生します。
ticket.htmlはチェックボックスが表示されることは確認しました。

Posted by: momo | 2011.05.30 at 10:20

Tracのバージョンは0.11系列でしょうか?(私の方では、0.11.1をベースにしたもので動作確認しております)

Oops! ではなく、Internal Server Errorのメッセージだけが表示される状態であれば、おそらく、Apacheのエラーログにログが出力されているかと思います。差し支えなければ、エラー部分のログを教えていただけますでしょうか。

ちなみに、if の次の行はインデントしていますか? コメントではそこまで判断ができないのですが、このページのソースを見てみると、if の行と、tn = TicketNotifyEmail(self.env) が同じ位置から始まっているようです(Pythonの場合、インデントでどこまでがifブロックなのか、を表現するので)。
http://www.pythonweb.jp/tutorial/if/index2.html などが参考になるかと思います。

Posted by: syo | 2011.05.30 at 20:23

shoさん、ご回答ありがとうございます。
今まで出張だったため返事が遅くなり申し訳ございません。
今日回答頂いた内容を参考に、Pythonの制約通りにソースを修正しましたら無事ページが表示されました。
本当にありがとうございますm(__)m
Pythonにこんな書き方があるとは知らなかったです・・・。勉強になりました。

ちなみに今回の"通知メール送信の条件を追加"は、
管理のnotificationに設定されたアドレスに送信するか否かを選択できるものでしたが、
宛先自体を複数変更することは難しいですよね?
例えば、発行されたチケットの作成の状態までは、AのMLに送付して、
回答された状態後はBのMLに送付するです。

Posted by: momo | 2011.06.03 at 15:23

Pythonの制約というより、「規約」ですね。
ともあれ、問題なく動作したようで何よりです。

なお、残念ながら、宛先を動的に切り替えるような仕組みは対応しておりません(私が使っている範囲で、そのような要望を受けたことがないので・・・)。

申し訳ありませんが、よろしくお願いします。

Posted by: syo | 2011.06.03 at 20:46

了解しました。
ご回答頂きありがとうございましたm(__)m

Posted by: momo | 2011.06.06 at 18:11

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/42333328

Listed below are links to weblogs that reference Trac:通知メール送信の条件を追加:

« VMwareのゲストOSに対してSSHでアクセス | Main | Tracの通知メールを編集 »