プロジェクト

全般

プロフィール

プラグイン Tips » 履歴 » バージョン 7

Mitsuyoshi Yoshida, 2011/05/23 00:05

1 1 Toshiyuki Ando
h1. プラグイン Tips
2
3 5 Toshiyuki Ando
{{>toc}}
4
5 1 Toshiyuki Ando
チュートリアルの域を超えそうなものはこちらに?
6
7
h2. 活動ページにプラグインの履歴を表示する
8
9
Hudson プラグインを例にとり、プラグインの履歴を表示する方法を紹介します。
10
11 2 Toshiyuki Ando
h3. 準備するもの
12 1 Toshiyuki Ando
13 2 Toshiyuki Ando
* 履歴の名前
14 3 Toshiyuki Ando
* 履歴を管理するクラス
15 2 Toshiyuki Ando
16
Hudson の場合は、
17
18
* 履歴の名前: hudson
19 3 Toshiyuki Ando
* 履歴を管理するクラス: HudsonBuild (ビルドを活動の履歴としたいので)
20 2 Toshiyuki Ando
21
としました。
22
23
h3. サイドバーに表示される履歴の名前に、自分のプラグインを追加する
24
25 1 Toshiyuki Ando
h4. 1. init.rb で活動ページに参加することを宣言する
26
27
以下のコードを Redmine::Plugin.register の中に追加します。
28
29
<pre><code class="ruby">
30 2 Toshiyuki Ando
  activity_provider :[履歴の名前], :class_name => '[履歴を管理するクラス]', :default => false
31 1 Toshiyuki Ando
</code></pre>
32
33
Hudson の場合は以下のようになります。
34 2 Toshiyuki Ando
default => false は、サイドバーのチェックボックスの状態で、最初表示した時にはチェックされないことを意味します。
35 1 Toshiyuki Ando
36
<pre><code class="ruby">
37
  activity_provider :hudson, :class_name => 'HudsonBuild', :default => false
38
</code></pre>
39
40 2 Toshiyuki Ando
h4. 2. 権限に view_[履歴の名前] を追加する
41 1 Toshiyuki Ando
42
活動の履歴では権限をチェックします。
43 2 Toshiyuki Ando
現在ログインしているユーザが履歴を閲覧してよいかどうかは、 *view_[履歴の名前]権限が許されているかどうか* に依存します。
44 1 Toshiyuki Ando
45 2 Toshiyuki Ando
Hudsonプラグインで言うと、履歴の種類が hudson なので、 *view_hudson* 権限が必要です。
46
*init.rb に記述する権限に view_hudson がないと、権限なしとみなされてサイドバーに履歴の名前が表示されません。*
47 1 Toshiyuki Ando
48
<pre><code class="ruby">
49
  project_module :hudson do
50
    # パーミッション設定。
51
    permission :view_hudson, {:hudson => [:index, :history]}  # !!ここ大事!!
52
    permission :build_hudson, {:hudson => [:build]}, :require => :member
53
    permission :edit_hudson_settings, {:hudson_settings => [:edit, :joblist]}
54
  end
55
</code></pre>
56
57 6 Toshiyuki Ando
h4. 3. 言語ファイルに label_[履歴の名前]_plural というエントリを追加する
58 1 Toshiyuki Ando
59 6 Toshiyuki Ando
サイドバーに表示する用語は、 label_[履歴の名前]_plural に統一されています。
60 1 Toshiyuki Ando
Hudsonだと label_hudson_plural ですね。
61
言語ファイルに登録しておかないと label_hudson_plural が表示されるという、格好悪いことになります。
62 3 Toshiyuki Ando
63
h3. 履歴を表示する
64
65 4 Toshiyuki Ando
h4. 1. 履歴を管理するクラスに、 project, author のプロパティを用意する
66 1 Toshiyuki Ando
67 4 Toshiyuki Ando
履歴を表示する際に、 project, author のプロパティが必要となります。
68
HudsonBuild には project, author がなかったので、
69
70
* project => 親のjobから借りてくる
71
* author => でっちあげる(caused_by という列を用意して、Redmine Admin(user_id=1)が起動したことにする)
72
73
ことにしました。
74
75
h4. 2. 履歴を管理するクラスに、acts_as_event を追加する
76
77
コードを参考に追加してみてください。
78
79 3 Toshiyuki Ando
<pre><code class="ruby">
80
  acts_as_event :title => Proc.new {|o| "#{l(:label_build)} #{o.job.name} #{o.number}: #{o.result}"},
81
                :description => "",
82
                :datetime => :finished_at
83
</code></pre>
84 1 Toshiyuki Ando
85 4 Toshiyuki Ando
|:title      |表題に利用されます                          |
86
|:description|詳細…斜体で表示されている部分に利用されます|
87
|:datetime   |発生した日時に利用されます                  |
88
89
Proc.new は自分的にはおまじない…(^^; o が表示対象のオブジェクトと考えれば大丈夫なはず。
90
91
h4. 3. 履歴を管理するクラスに、acts_as_activity_provider を追加する
92
93
同じくコードを参考に…。
94
95 3 Toshiyuki Ando
<pre><code class="ruby">
96 1 Toshiyuki Ando
  acts_as_activity_provider :type => 'hudson',
97 3 Toshiyuki Ando
                             :timestamp => "#{HudsonBuild.table_name}.finished_at",
98 4 Toshiyuki Ando
                             :author_key => "#{HudsonBuild.table_name}.caused_by",
99 1 Toshiyuki Ando
                             :find_options => {:include => {:job => :project}}
100
</code></pre>
101
102 4 Toshiyuki Ando
|:type        |履歴の名前にあわせましょう        |
103
|:timestamp   |発生した日時を表す列              |
104
|:find_options|多分ですが、プロジェクトを探す方法|
105 3 Toshiyuki Ando
106 4 Toshiyuki Ando
:find_options ですが、例で言うと、HudsonBuild から job(HudsonJob)をたどって、project(Project)を探してくださいという意味になります。
107 7 Mitsuyoshi Yoshida
108
109
h4. wiki マクロを追加する
110
111
Redmine では <notextile>{{foo(arg1, arg2)}}</notextile> のような形式で wiki のマクロを記述します。これはプラグインで自由に追加することができます。
112
113
114
サンプルコード
115
* "表示":http://code.google.com/p/myoshida-rp/source/browse/#svn%2Ftrunk%2FTips%2Falias%2Fwikimacro%2Fredmine_wikipedia_link%253Fstate%253Dclosed
116
* "ダウンロード":http://code.google.com/p/myoshida-rp/downloads/detail?name=sample-wikimacro.zip
117
118
サンプルとしてウィキペディアへのリンクをはるマクロを考えてみます。
119
ウィキペディアで例えば _Redmine_ や _日本語_ を表示してみると次のようなアドレスになっています。
120
<pre>
121
http://ja.wikipedia.org/wiki/Redmine
122
http://ja.wikipedia.org/wiki/日本語
123
</pre>
124
これを見ると <notextile>http://ja.wikipedia.org/wiki</notextile>の後に単語を追加すればいいみたいです。そこで単語をマクロの引数で指定して、それを wiki/ の後に追加するマクロにしましょう。
125
ちなみに最近のブラウザはかしこいので、アドレスには日本語が表示されていますが、実際には日本語はアドレスとしては使えない文字なので、%E6... といった感じでエスケープされています。
126
127
マクロのプラグインの場合も通常のプラグインのように最初にスケルトンを生成します。ただし、今回は簡単なので init.rb しか使用しません。その後 init.rb のプラグインの register 内を適当に記述します。
128
129
wiki マクロを登録するには Plugin のように register 関数で登録します。この関数は実行されればどこに書いてもいいと思いますが、通常 *init.rb* に記述します。
130
<pre><code class="ruby">
131
Redmine::WikiFormatting::Macros.register do
132
  desc "Wikipedia link macro"
133
  macro :wikipedia do |obj, args|
134
    if (args.size != 1)
135
      raise "Wikipedia macro is given only one argument."
136
    else
137
      word = args.first.strip
138
      addr = "http://ja.wikipedia.org/wiki/" + CGI.escape(word)
139
      return link_to(word, addr)
140
    end
141
  end
142
end
143
</pre>
144
145
まず、Plugin の register のように desc でマクロの説明を記述します。
146
ただ、何に使われるのかはよく分かりません。
147
148
3 行目の macro からマクロの処理を記述します。
149
引数でマクロのキーワードを指定します。今回 wikipedia が引数になるようにしています。
150
ブロック引数の @args@ にマクロの引数が配列で入っていて、これを元にリンクを作成していきます。
151
152
4, 5 行目でマクロの引数のチェックをしています。
153
マクロの作成中に @raise@ するとそれがエラーとしてページに挿入されます。
154
155
7 行目で空白をとっています。
156
wikipedia( Redmine ) というように空白を入れていると引数には空白込みで値がわたってきているためです。 
157
158
8 行目でリンク先のアドレスを作成しています。
159
CGI.escape は ruby の標準の添付ライブラリである cgi に含まれる関数で日本語や = のようなアドレスとして使えない文字を % 形式のものに変換します。
160
161
9 行でリンクの文字列を返しています。この戻り値がそのまま html のページに挿入されます。
162
link_to は rails の関数で <a src = "_addr_"> word </a> といった html のリンクタグの文字列を返します。
163
今回リンクの表示文字はマクロの引数のままにしています。表示文字の場合も <, >, & といった使えない文字がありますが、これは link_to 内で勝手に直してくれます。
164
165
出来たプラグインを使ってみると、以下のような感じになります。
166
<pre>
167
* {{wikipedia(Redmine)}}
168
* {{wikipedia(日本語)}}
169
* {{wikipedia(two, argument)}}
170
</pre>
171
!wikimacro_view.png!