Trac 0.11.2.1-ja1 IDを名前に差し替えるパッチ

前にもネタにした通り、TracはデータベースにはIDと本名(とメールアドレス)の対応を保存しているが、ID表示を名前に切り替える機能は持たない。
タイムラインやチケット表示のとき、ユーザをIDで表示している事はクローズドなチームや開発畑だけでTracを使ってる場合はそれ程問題にならないが、あまり交流のなかったメンバーが加わるプロジェクトや、営業を含めるような場合だと結構な障害になったり。
(IDをフルネーム+部署名で運用するという手もありますが)

そこで、IDを名前に差し替えるパッチを作成してみた。
trac/web/chrome.pyに以下のパッチを適用する。
2009/07/29 22:10 改訂
デバッグログ保存処理のせいで名前を入れてないと例外で落ちるバグが入っていました。修正。
上記より前に当てた方は修正をお願いします。

--- chrome.py.old	2008-11-27 03:59:32.000000000 +0900
+++ chrome.py	2009-07-27 12:00:00.000000000 +0900
@@ -323,6 +323,12 @@
         import genshi
         self.env.systeminfo.append(('Genshi',
                                     get_pkginfo(genshi).get('version')))
+        # Get Name of all known users
+        self.db = self.env.get_db_cnx()
+        self.name_map = {}
+        for username, name, email in self.env.get_known_users(self.db):
+            if name:
+                self.name_map[username] = name
 
     # IEnvironmentSetupParticipant methods
 
@@ -746,9 +753,15 @@
     
     def format_author(self, req, author):
         if self.show_email_addresses or not req or 'EMAIL_VIEW' in req.perm:
-            return author
+            if author in self.name_map:
+                return self.name_map[author]
+            else: 
+                return author
         else:
-            return obfuscate_email_address(author)
+            if author in self.name_map:
+                return self.name_map[author]
+            else: 
+                return obfuscate_email_address(author)
 
     # Template filters
 

これで、登録済みのユーザであればIDが本名に差し替えられます。
ちなみに、レポートやチケット登録時の担当者・関係者入力等では変換されません。
関係者の入力はCCSelectorPluginの改造で、担当者はrestrict_ownerフラグtrueでの表示の改造でなんとかなんないかなあと思ったりはしていますが。誰か作って

ちなみに俺のpython歴はせいぜい壺スレからエロ動画をリストアップしてIrvineに登録するスクリプトを作った程度のため、上のソースは自己責任でお願いします。おかしいところは突っ込み大歓迎。
クラスメンバとして辞書を持つってpythonWebアプリ的にアリなのかしら…

追記:
担当者の入力における改善にはこんなのがあった。
http://trac-hacks.org/wiki/FlexibleAssignToPlugin:Title
これでなんとか実用になりそう。素敵。