Redmineのプラグインの作成

Redmineのプラグインを作成するプロセスは、非常に不十分に文書化されています。 この記事の目的は、小さいながらも有用なプラグインを作成する際の成功体験について話すことで、このギャップを部分的に埋めることです。 重要な注意。 RedmineはRuby on Railsで記述されています。独自のプラグインを作成する予定がある場合は、これに備える必要があります:)



最初のタスク



当社では、Redmineをメインタスクトラッカーとして使用しています。 私はその長所と短所を考慮せず、タスクの変更で彼が送信する文字数にのみ焦点を当てます。 この「ノイズ」では、新しいタスクや重要なコメントが失われることがあります。



もちろん、開発者はこの点に関して多くの設定を提供しましたが、それらはかなり少ないです。 特定の変更の通知を構成できるようにしたいと思います。







タスクのステータスを「タスクが閉じられました」に変更することに関する通知は、特に迷惑でした。 開発者として、彼らは私にとって重要ではありません。 タスクに改善がある場合、タスクに再び「新規」のステータスが割り当てられ、何らかのコメントが書き込まれ、通知を受け取って解決に進みます。



このような手紙のメールにフィルターを構成できます(言う)が、プロセスのすべての参加者(実行者、作成者、オブザーバー)にこれらの通知を調整できる独自のプラグインを作成する方がはるかに興味深いものでした。



そのため、タスク:「タスクが閉じられたときに通知しない」設定をユーザーのアカウントに追加するプラグインを作成します。



ソリューションの説明



プラグインのテンプレートの作成は省略しますが、これについてはredmine.orgの 対応するセクションで詳しく説明されています。



「自分で行った変更について通知しない」のようなチェックマークを追加します。 これを行うには、 \ app \ views \ users \ _mail_notifications.html.erbテンプレートをプラグインにコピーし、必要なhtmlコードを追加します。



これはあまり正しくありませんが、ユーザーフォームへの標準的なフック:view_users_formは、間違った場所にチェックボックスを表示します。 Redmineは新しいバージョンごとにますます多くのフックをサポートしていますが、それらは常に不十分であり、この場合も例外ではありません。



次に、3つのメソッドを「パッチ」します。これは、ユーザーadminを作成および編集し、アカウントページで編集します。 これらのメソッドにもフックはありません。そのため、「箱から出してすぐに使えるフック」であるalias_methodalias_method_chainが助けになりました。 彼らの仕事の論理は、チェーンの名前、リンクメソッド、リンクメソッドから明らかです。



コントローラーアカウントは、 アカウントメソッドであるmy_controllerコントローラーを担当します 。 プラグイン\ lib \ patch \ my_controller_patch.rbのサブディレクトリにファイルを作成して、 パッチを適用します。



module Patches module MyControllerPatch def self.included(base) #    base.extend(ClassMethods) #     base.send(:include, InstanceMethods) base.class_eval do unloadable #     alias_method_chain :account, :ext end end module ClassMethods end module InstanceMethods #     ext def account_with_ext if request.post? #           User.current.pref[:no_self_notified_closed] = (params[:no_self_notified_closed] == '1') end #    account account_without_ext end end end end
      
      





同様に、管理者による作成と編集。



次に、通知を受け取るユーザーのリストを作成するときに設定値を読み取る必要があります。 問題モデル、 受信者メソッド、およびwatcher_recipientsがこれを担当し、それらを\ lib \ patch \ issue_patch.rbにコピーして、自分で変更します。



 module Patches module IssuePatch def self.included(base) … base.class_eval do unloadable #     alias_method :recipients, :recipients_ext alias_method :watcher_recipients, :watcher_recipients_ext end end … module InstanceMethods #     def recipients_ext #       @status = IssueStatus.find_by_id(self.status_id) notified = project.notified_users #         ( allow_notify_closed) notified << author if author && author.active? && author.notify_about?(self) && allow_notify_closed?(author) if assigned_to if assigned_to.is_a?(Group) notified += assigned_to.users.select { |u| u.active? && u.notify_about?(self) && allow_notify_closed?(u) } else notified << assigned_to if assigned_to.active? && assigned_to.notify_about?(self) && allow_notify_closed?(assigned_to) end end notified.uniq! notified.reject! { |user| !visible?(user) } notified.collect(&:mail) end #  def watcher_recipients_ext notified = watcher_users.active notified.reject! { |user| user.mail_notification == 'none' || allow_notify_closed?(user) === false } if respond_to?(:visible?) notified.reject! { |user| !visible?(user) } end notified.collect(&:mail).compact end private #   ,          def allow_notify_closed?(user) (user.pref[:no_self_notified_closed] && @status.is_closed?) ? false : true end end end end
      
      





そして残された最も重要なことは、パッチを接続することです。 プラグインのルートであるinit.rbファイルに、次を追加します。



 # dispatcher       require 'dispatcher' Dispatcher.to_prepare do MyController.send(:include, Patches::MyControllerPatch) UsersController.send(:include, Patches::UsersControllerPatch) Issue.send(:include, Patches::IssuePatch) end
      
      





/ vendor / plugins /フォルダーにプラグインをインストールし、redmineを再起動します。 これで、通知を管理できるようになり、不要なメールを受信しなくなりました。 したがって、Redmineのメソッドの動作を変更し、作業を自動化および促進する独自のプラグインを作成できます。



ソースへのリンクhttps://github.com/parshukovvv/redmine_notice



All Articles