BLOGTIMES
2011/02/24

Tracのメールの通知先をプロファイルのEmail宛にする

  trac 
このエントリーをはてなブックマークに追加

Tracで前々から不便だなと思っていることとして、Notificationの送り先のカスタマイズ性が低いというものがあります。

具体的に述べると、Tracのメールの通知先はログイン名がメールアドレスになっていればそのアドレス、もしくは設定を変更することでログイン名+あるドメイン名をつけたもの宛にしかならないので、ユーザーが通知先を自由に変更することができません。また、ユーザーごとに通知のOn/Offを切り替えるような機能もありません。

ユーザーのプロファイルには折角Emailの欄があるので、このアドレス宛にメール通知を行なうように改造してみました。ちょっとやっつけなので、今回のパッチを当てると、ユーザーのプロファイル欄だけを通知先を見なすようになるので、ログイン名をメールアドレスにしていても、ユーザーのプロファイル欄が空であれば通知は行なわれないようになります。coalesce()を使えば、プロファイルのメールを優先するようにすることくらいは可能かもしれません。

notification.py.diff

今回はTracLightningだったので C:\TracLight\python\Lib\site-packages\Trac-0.11.5.ja1-py2.5.egg\trac\ticket\notification.py に下記のような変更を加えています。

--- notification.py.org Thu Feb 24 11:40:38 2011 +++ notification.py Thu Feb 24 11:42:51 2011 @@ -241,8 +241,11 @@ cursor = self.db.cursor() # Harvest email addresses from the cc, reporter, and owner fields - cursor.execute("SELECT cc,reporter,owner FROM ticket WHERE id=%s", - (tktid,)) + cursor.execute("SELECT s1.value,s2.value,s3.value FROM ticket t " + "LEFT OUTER JOIN session_attribute s1 ON cc = s1.sid AND s1.name = 'email' " + "LEFT OUTER JOIN session_attribute s2 ON reporter = s2.sid AND s2.name = 'email' " + "LEFT OUTER JOIN session_attribute s3 ON owner = s3.sid AND s3.name = 'email' " + "WHERE t.id=%s", (tktid,)) row = cursor.fetchone() if row: ccrecipients += row[0] and row[0].replace(',', ' ').split() or [] @@ -255,20 +258,24 @@ # Harvest email addresses from the author field of ticket_change(s) if notify_updater: - cursor.execute("SELECT DISTINCT author,ticket FROM ticket_change " + cursor.execute("SELECT DISTINCT value,ticket FROM ticket_change " + "LEFT OUTER JOIN session_attribute ON author = sid AND name = 'email' " "WHERE ticket=%s", (tktid,)) for author,ticket in cursor: torecipients.append(author) # Suppress the updater from the recipients updater = None - cursor.execute("SELECT author FROM ticket_change WHERE ticket=%s " + cursor.execute("SELECT value FROM ticket_change " + "LEFT OUTER JOIN session_attribute ON author = sid AND name = 'email' " + "WHERE ticket=%s " "ORDER BY time DESC LIMIT 1", (tktid,)) for updater, in cursor: break else: - cursor.execute("SELECT reporter FROM ticket WHERE id=%s", - (tktid,)) + cursor.execute("SELECT value FROM ticket " + "LEFT OUTER JOIN session_attribute ON reporter = sid AND name = 'email' " + "WHERE id=%s", (tktid,)) for updater, in cursor: break

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4089
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン