忍者ブログ
想いとグチの吐き出し場

フルネームを表示する@trac (Trac1.0ja版)

これまで使っていたTracを1.0にバージョンアップすることに。
(正確にいうと、Trac1.0サーバを新たにたてることになった)

ということは、前のTracに加えていたカスタマイズを
新しいTracにも反映しないといけないわけで。

ほとんど0.12版と同じなので、
 そっち参照
でもいいかなと想ったけど、
せっかくTracも1.0版になったし、まとめておこうかと。


背景は以下のとおり。

 Tracでは、チケットの担当者などがユーザID(ログインID)で表示される。
 誰のことかすぐに分かるIDだったら問題ないんだけど
 そうじゃない環境(たとえば社員番号とか)だと
 「これじゃ誰のことか分かんねーよ」と文句がくる。
 なので名前で表示されるようにしたい。
 
 ところが厄介なことに、Tracにはそういう設定項目がない。
 なので、オープンソースの強みを活かして
 ソースをいじくって対応する。

ということで、どのソースをどう改変すればいいかは続きで。
ただし、
 自分はTracの製作者等ではなく、単なる1ユーザーでしかありません。
 ソースの改変によるいかなる損失・被害等にも対応しませんし
 動作保証すらしていません。
 もしこの記事を読んでソースの改変を行う時は
 自己責任でお願いします。

ということはお忘れなきよう。




まずは環境の確認。
  • Ubuntu 14.04 (64bit server)
  • Apache 2.4.7
  • Trac 1.0.ja1
  • Babel 1.3
  • Genshi 0.7 (with speedups)
  • Python 2.7.6 (default, Mar 22 2014, 23:03:41) [GCC 4.8.2]
  • SQLite 3.8.2
  • Subversion 1.8.8 (r1568071)
で、ソースの改変。
ユーザ名が表示される箇所を個別に観ていきます。
  • チケット作成時の担当者選択プルダウン
対象ソース1:Trac-1.0.ja1/trac/ticket/web_ui.py
改変内容:
1454,1464d1453
<
< # ADD FROM
< # Get DisplayName of all known users
< self.db = self.env.get_db_cnx()
< name_map = {}
< for username, name, email in self.env.get_known_users(self.db):
< if name:
< name_map[username] = name
< field['name_map'] = name_map
< # ADD TO
<






対象ソース2:Trac-1.0.ja1/trac/ticket/templates/ticket.html
改変内容:
261,271c261,263
< <py:if test="field.name_map">
< <option py:for="option in field.options"
< selected="${value == option or None}"
< value="${option}"
< py:content="field.name_map[option] or option"></option>
< </py:if>
< <py:if test="not field.name_map">
< <option py:for="option in field.options"
< selected="${value == option or None}"
< py:content="option"></option>
< </py:if>
---
> <option py:for="option in field.options"
> selected="${value == option or None}"
> value="$option" py:content="option"></option>



  • ticketを表示したときの担当者や報告者
対象ソース:Trac-1.0.ja1/trac/web/chrome.py
改変内容:
520,529d519
<
< def __init__(self):
< # 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
<
<
1077,1080c1067
< if author in self.name_map:
< return self.name_map[author]
< else:
< return obfuscate_email_address(author)
---
> return author
1086,1094c1073,1074
< if author in self.name_map:
< return self.name_map[author]
< else:
< return author
< else:
< if author in self.name_map:
< return self.name_map[author]
< else:
< return obfuscate_email_address(author)
---
> return author
> return obfuscate_email_address(author)




  • レポートを表示したときの担当者、報告者
対象ソース:Trac-1.0.ja1/trac/ticket/templates/report_view.html
改変内容:
190,201d189
< <py:when test="col in ('reporter', '報告者')">
< <td class="$col" py:attrs="td_attrs">${cell.value != '' and format_author(cell.value) or '--'}
< <hr py:if="fullrow"/>
< </td>
< </py:when>
<
< <py:when test="col in ('owner', '担当者')">
< <td class="$col" py:attrs="td_attrs">${cell.value != '' and format_author(cell.value) or '--'}
< <hr py:if="fullrow"/>
< </td>
< </py:when>
<



  • ticketのアクションのところ
Trac0.12ではFlexibleAssignToプラグインで対応したが、Trac1.00では上手くいかない。
他と同様にソースを直す。
★2014/11/18 修正
対象ソース:Trac-1.0.ja1/trac/ticket/default_workflow.py
改変内容:

131,136d130
< # 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
236,239d229
< if current_owner in self.name_map:
< disp_name = self.name_map[current_owner]
< else:
< disp_name = current_owner
289c279
< [tag.option(self.name_map[x], value=x,
---
> [tag.option(x, value=x,
295c285
< current_owner=disp_name))
---
> current_owner=current_owner))
299,300c289,290
< "to %(authname)s", current_owner=disp_name,
< authname=self.name_map[req.authname]))
---
> "to %(authname)s", current_owner=current_owner,
> authname=req.authname))




  • カスタムクエリの検索条件設定の担当者のところ
対象ソース:Trac-1.0.ja1/trac/ticket/templates/query.html
改変内容:
86,93d85
< <py:when test="n_field_name == '0_owner'">
< <select name="${n_field_name}">
< <option></option>
< <option py:for="option in field.options"
< selected="${option == constraint_value and 'selected' or None}"
< value="$option">${format_author(option)}</option>
< </select>
< </py:when>



  • チケットの更新履歴の担当者のところ
対象ソース:Trac-1.0.ja1/trac/ticket/templates/ticket_change.html
改変内容:
87,89d86
< <py:when test="field_name == 'owner'"><i18n:msg params="old, new">
< changed from <em>${format_author(field.old)}</em> to <em>${format_author(field.new)}</em>
< </i18n:msg></py:when>



  • xxxxxとしてログイン中のところ
対象ソース:Trac-1.0.ja1/trac/web/auth.py
改変内容:
85,92d84
< def __init__(self):
< # 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
<
117c109
< user=self.name_map[req.authname]))
---
> user=req.authname))






以上!
PR