From 19dd1712dbc5dc2ccfbee54cf4d5274b147be607 Mon Sep 17 00:00:00 2001
From: Alexander Meindl
+ <%= content_tag(:label, l(:label_settings_messenger_verify_ssl)) %> + <%= check_box_tag 'settings[messenger_verify_ssl]', 1, @settings[:messenger_verify_ssl] %> + <%= t(:messenger_verify_ssl_info_html) %> +
+ +<%= content_tag(:label, l(:label_settings_auto_mentions)) %> <%= check_box_tag 'settings[auto_mentions]', 1, @settings[:auto_mentions] %>
+<%= content_tag(:label, l(:label_settings_display_watchers)) %> <%= check_box_tag 'settings[display_watchers]', 1, @settings[:display_watchers] %> @@ -48,7 +59,57 @@ <%= content_tag(:label, l(:label_settings_post_private_notes)) %> <%= check_box_tag 'settings[post_private_notes]', 1, @settings[:post_private_notes] %>
+ ++ <%= content_tag(:label, l(:label_settings_post_wiki)) %> + <%= check_box_tag 'settings[post_wiki]', 1, @settings[:post_wiki] %> +
<%= content_tag(:label, l(:label_settings_post_wiki_updates)) %> <%= check_box_tag 'settings[post_wiki_updates]', 1, @settings[:post_wiki_updates] %>
+ +<% if RedmineReporting::REDMINE_DB_SUPPORT %> ++ <%= content_tag(:label, l(:label_settings_post_db)) %> + <%= check_box_tag 'settings[post_db]', 1, @settings[:post_db] %> +
++ <%= content_tag(:label, l(:label_settings_post_db_updates)) %> + <%= check_box_tag 'settings[post_db_updates]', 1, @settings[:post_db_updates] %> +
+<% end %> + +<% if RedmineReporting::REDMINE_CONTACTS_SUPPORT %> ++ <%= content_tag(:label, l(:label_settings_post_contact)) %> + <%= check_box_tag 'settings[post_contact]', 1, @settings[:post_contact] %> +
++ <%= content_tag(:label, l(:label_settings_post_contact_updates)) %> + <%= check_box_tag 'settings[post_contact_updates]', 1, @settings[:post_contact_updates] %> +
+<% end %> + +<% if RedmineReporting::REDMINE_PASSWORDS_SUPPORT %> ++ <%= content_tag(:label, l(:label_settings_post_password)) %> + <%= check_box_tag 'settings[post_password]', 1, @settings[:post_password] %> +
++ <%= content_tag(:label, l(:label_settings_post_password_updates)) %> + <%= check_box_tag 'settings[post_password_updates]', 1, @settings[:post_password_updates] %> +
+<% end %> diff --git a/config/locales/de.yml b/config/locales/de.yml index 08015ec..65b0949 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1,16 +1,31 @@ # German strings de: - label_settings_messenger_channel: Messenger Channel - label_settings_messenger_username: Messenger Benutzer - label_settings_messenger_url: Messenger URL - label_settings_messenger_icon: Messenger Icon - messenger_channel_info_html: 'The channel can be changed on a per-project basis by creating a project custom field named "Messenger Channel" (without quotes).' - messenger_url_info_html: 'Generate an "Incoming WebHook" URL from the Integrations configuration page on Rocket.Chat. This URL can be changed on a per-project basis by creating a project custom field named "Messenger URL" (without quotes).' label_settings_auto_mentions: Convert names to mentions? label_settings_display_watchers: Display watchers? - label_settings_post_updates: Post issue updates? + label_settings_messenger_channel: Messenger Channel + label_settings_messenger_icon: Messenger Icon + label_settings_messenger_url: Messenger URL + label_settings_messenger_username: Messenger Benutzer label_settings_new_include_description: Description in new issue? - label_settings_updated_include_description: Description in update issue? label_settings_post_private_issues: Post updates for private issues? label_settings_post_private_notes: Post private notes? + label_settings_post_updates: Post issue updates? label_settings_post_wiki_updates: Post Wiki updates? + label_settings_post_wiki: Post Wiki added? + label_settings_updated_include_description: Description in update issue? + messenger_channel_info_html: 'The channel can be changed on a per-project basis by creating a project custom field named "Messenger Channel" (without quotes).' + messenger_url_info_html: 'Generate an Incoming WebHook URL from the sessenger service. This URL can be changed on a per-project basis by creating a project custom field named "Messenger URL" (without quotes).' + label_settings_messenger_verify_ssl: SSL verifiziert + messenger_verify_ssl_info_html: 'If your Messenger service uses an invalid or self-signed SSL certificate, disable it.' + label_settings_post_db: DB entry added? + label_settings_post_db_updates: DB entry updates? + label_settings_post_contact: Contact added? + label_settings_post_contact_updates: Contact updates? + label_settings_post_password: Password added? + label_settings_post_password_updates: Password updates? + label_messenger_db_entry_created: "[%{project_url}] DB Eintrag %{url} erstellt von *%{user}*" + label_messenger_db_entry_updated: "[%{project_url}] DB Eintrag %{url} aktualisiert von *%{user}*" + label_messenger_contact_created: "[%{project_url}] Kontakt %{url} erstellt von *%{user}*" + label_messenger_contact_updated: "[%{project_url}] Kontakt %{url} aktualisiert von *%{user}*" + label_messenger_password_created: "[%{project_url}] Kennwort %{url} erstellt von *%{user}*" + label_messenger_password_updated: "[%{project_url}] Kennwort %{url} aktualisiert von *%{user}*" diff --git a/config/locales/en.yml b/config/locales/en.yml index 24d9682..599cbb2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,16 +1,31 @@ # English strings en: - label_settings_messenger_channel: Messenger Channel - label_settings_messenger_username: Messenger username - label_settings_messenger_url: Messenger URL - label_settings_messenger_icon: Messenger Icon - messenger_channel_info_html: 'The channel can be changed on a per-project basis by creating a project custom field named "Messenger Channel" (without quotes).' - messenger_url_info_html: 'Generate an "Incoming WebHook" URL from the Integrations configuration page on Rocket.Chat. This URL can be changed on a per-project basis by creating a project custom field named "Messenger URL" (without quotes).' label_settings_auto_mentions: Convert names to mentions? label_settings_display_watchers: Display watchers? - label_settings_post_updates: Post issue updates? + label_settings_messenger_channel: Messenger Channel + label_settings_messenger_icon: Messenger Icon + label_settings_messenger_url: Messenger URL + label_settings_messenger_username: Messenger username label_settings_new_include_description: Description in new issue? - label_settings_updated_include_description: Description in update issue? label_settings_post_private_issues: Post updates for private issues? label_settings_post_private_notes: Post private notes? + label_settings_post_updates: Post issue updates? label_settings_post_wiki_updates: Post Wiki updates? + label_settings_post_wiki: Post Wiki added? + label_settings_updated_include_description: Description in update issue? + messenger_channel_info_html: 'The channel can be changed on a per-project basis by creating a project custom field named "Messenger Channel" (without quotes).' + messenger_url_info_html: 'Generate an Incoming WebHook URL from the sessenger service. This URL can be changed on a per-project basis by creating a project custom field named "Messenger URL" (without quotes).' + label_settings_messenger_verify_ssl: Verify SSL + messenger_verify_ssl_info_html: 'If your Messenger service uses an invalid or self-signed SSL certificate, disable it.' + label_settings_post_db: DB entry added? + label_settings_post_db_updates: DB entry updates? + label_settings_post_contact: Contact added? + label_settings_post_contact_updates: Contact updates? + label_settings_post_password: Password added? + label_settings_post_password_updates: Password updates? + label_messenger_db_entry_created: "[%{project_url}] DB entry %{url} created by *%{user}*" + label_messenger_db_entry_updated: "[%{project_url}] DB entry %{url} updated by *%{user}*" + label_messenger_contact_created: "[%{project_url}] Contact %{url} created by *%{user}*" + label_messenger_contact_updated: "[%{project_url}] Contact %{url} updated by *%{user}*" + label_messenger_password_created: "[%{project_url}] Kennwort %{url} created by *%{user}*" + label_messenger_password_updated: "[%{project_url}] Kennwort %{url} updated by *%{user}*" diff --git a/init.rb b/init.rb index aca9f8f..9cab311 100644 --- a/init.rb +++ b/init.rb @@ -7,7 +7,7 @@ Redmine::Plugin.register :redmine_messenger do url 'https://github.com/alphanodes/redmine_messenger' author_url 'https://alphanodes.com/' description 'Messenger integration for Slack, Rocketchat and Mattermost support' - version '0.6.2-dev' + version '0.9.9' requires_redmine version_or_higher: '3.0.0' @@ -16,6 +16,7 @@ Redmine::Plugin.register :redmine_messenger do messenger_channel: 'redmine', messenger_icon: 'https://raw.githubusercontent.com/alphanodes/redmine_messenger/master/assets/images/icon.png', messenger_username: 'robot', + messenger_verify_ssl: '1', display_watchers: '0', auto_mentions: '1', post_updates: '1', @@ -23,6 +24,13 @@ Redmine::Plugin.register :redmine_messenger do updated_include_description: '1', post_private_issues: '1', post_private_notes: '1', - post_wiki_updates: '0' + post_wiki: '0', + post_wiki_updates: '0', + post_db: '0', + post_db_updates: '0', + post_contact: '0', + post_contact_updates: '0', + post_password: '0', + post_password_updates: '0' }, partial: 'settings/messenger_settings' end diff --git a/lib/redmine_messenger.rb b/lib/redmine_messenger.rb index 64475ba..c426ac0 100644 --- a/lib/redmine_messenger.rb +++ b/lib/redmine_messenger.rb @@ -3,11 +3,20 @@ Rails.configuration.to_prepare do # Patches require_dependency 'redmine_messenger/patches/issue_patch' + require_dependency 'redmine_messenger/patches/wiki_page_patch' + + require 'redmine_messenger/patches/contact_patch' if RedmineReporting::REDMINE_CONTACTS_SUPPORT + require 'redmine_messenger/patches/db_entry_patch' if RedmineReporting::REDMINE_DB_SUPPORT + require 'redmine_messenger/patches/password_patch' if RedmineReporting::REDMINE_PASSWORDS_SUPPORT # Hooks require_dependency 'redmine_messenger/hooks' module RedmineMessenger + REDMINE_CONTACTS_SUPPORT = Redmine::Plugin.installed?('redmine_contacts') ? true : false + REDMINE_DB_SUPPORT = Redmine::Plugin.installed?('redmine_db') ? true : false + REDMINE_PASSWORDS_SUPPORT = Redmine::Plugin.installed?('redmine_passwords') ? true : false + def self.settings Setting[:plugin_redmine_messenger].blank? ? {} : Setting[:plugin_redmine_messenger] end diff --git a/lib/redmine_messenger/hooks.rb b/lib/redmine_messenger/hooks.rb index 189c9c8..f3d3f26 100644 --- a/lib/redmine_messenger/hooks.rb +++ b/lib/redmine_messenger/hooks.rb @@ -49,30 +49,5 @@ module RedmineMessenger Messenger.speak msg, channels, attachment, url end - - def controller_wiki_edit_after_save(context = {}) - return unless RedmineMessenger.settings[:post_wiki_updates] == '1' - - project = context[:project] - page = context[:page] - - user = page.content.author - project_url = "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>" - page_url = "<#{Messenger.object_url page}|#{page.title}>" - comment = "[#{project_url}] #{page_url} updated by *#{user}*" - - channels = Messenger.channels_for_project project - url = Messenger.url_for_project project - - return unless channels.present? && url - - attachment = nil - unless page.content.comments.empty? - attachment = {} - attachment[:text] = "#{ERB::Util.html_escape(page.content.comments)}" - end - - Messenger.speak comment, channels, attachment, url - end end end diff --git a/lib/redmine_messenger/patches/contact_patch.rb b/lib/redmine_messenger/patches/contact_patch.rb new file mode 100644 index 0000000..3746716 --- /dev/null +++ b/lib/redmine_messenger/patches/contact_patch.rb @@ -0,0 +1,51 @@ +# Redmine Messenger plugin for Redmine + +module RedmineMessenger + module Patches + module ContactPatch + def self.included(base) + base.send(:include, InstanceMethods) + base.class_eval do + after_create :send_messenger_create + after_update :send_messenger_update + end + end + + module InstanceMethods + def send_messenger_create + return unless RedmineMessenger.settings[:post_contact] == '1' + set_language_if_valid Setting.default_language + + channels = Messenger.channels_for_project project + url = Messenger.url_for_project project + + return unless channels.present? && url + Messenger.speak(l(:label_messenger_contact_created, + project_url: "<#{Messenger.object_url self}|#{ERB::Util.html_escape(project)}>", + url: "<#{Messenger.object_url self}|#{name}>", + user: User.current), + channels, nil, url) + end + + def send_messenger_update + return unless RedmineMessenger.settings[:post_contact_updates] == '1' + set_language_if_valid Setting.default_language + + channels = Messenger.channels_for_project project + url = Messenger.url_for_project project + + return unless channels.present? && url + Messenger.speak(l(:label_messenger_contact_updated, + project_url: "<#{Messenger.object_url self}|#{ERB::Util.html_escape(project)}>", + url: "<#{Messenger.object_url self}|#{name}>", + user: User.current), + channels, nil, url) + end + end + end + end +end + +unless Contact.included_modules.include? RedmineMessenger::Patches::ContactPatch + Contact.send(:include, RedmineMessenger::Patches::ContactPatch) +end diff --git a/lib/redmine_messenger/patches/db_entry_patch.rb b/lib/redmine_messenger/patches/db_entry_patch.rb new file mode 100644 index 0000000..ab2ea6c --- /dev/null +++ b/lib/redmine_messenger/patches/db_entry_patch.rb @@ -0,0 +1,51 @@ +# Redmine Messenger plugin for Redmine + +module RedmineMessenger + module Patches + module DbEntryPatch + def self.included(base) + base.send(:include, InstanceMethods) + base.class_eval do + after_create :send_messenger_create + after_update :send_messenger_update + end + end + + module InstanceMethods + def send_messenger_create + return unless RedmineMessenger.settings[:post_db] == '1' + set_language_if_valid Setting.default_language + + channels = Messenger.channels_for_project project + url = Messenger.url_for_project project + + return unless channels.present? && url + Messenger.speak(l(:label_messenger_db_entry_created, + project_url: "<#{Messenger.object_url self}|#{ERB::Util.html_escape(project)}>", + url: "<#{Messenger.object_url self}|#{name}>", + user: User.current), + channels, nil, url) + end + + def send_messenger_update + return unless RedmineMessenger.settings[:post_db_updates] == '1' + set_language_if_valid Setting.default_language + + channels = Messenger.channels_for_project project + url = Messenger.url_for_project project + + return unless channels.present? && url + Messenger.speak(l(:label_messenger_db_entry_updated, + project_url: "<#{Messenger.object_url self}|#{ERB::Util.html_escape(project)}>", + url: "<#{Messenger.object_url self}|#{name}>", + user: User.current), + channels, nil, url) + end + end + end + end +end + +unless DbEntry.included_modules.include? RedmineMessenger::Patches::DbEntryPatch + DbEntry.send(:include, RedmineMessenger::Patches::DbEntryPatch) +end diff --git a/lib/redmine_messenger/patches/issue_patch.rb b/lib/redmine_messenger/patches/issue_patch.rb index 6836891..fa3d0f1 100644 --- a/lib/redmine_messenger/patches/issue_patch.rb +++ b/lib/redmine_messenger/patches/issue_patch.rb @@ -7,7 +7,7 @@ module RedmineMessenger base.send(:include, InstanceMethods) base.class_eval do after_create :send_messenger_create - after_save :send_messenger_save + after_update :send_messenger_update end end @@ -23,7 +23,9 @@ module RedmineMessenger msg = "[#{ERB::Util.html_escape(project)}] #{ERB::Util.html_escape(author)} created <#{Messenger.object_url(self)}|#{ERB::Util.html_escape(self)}>#{Messenger.mentions description if RedmineMessenger.settings[:auto_mentions] == '1'}" attachment = {} - attachment[:text] = ERB::Util.html_escape(description) if description && RedmineMessenger.settings[:new_include_description] == '1' + if description && RedmineMessenger.settings[:new_include_description] == '1' + attachment[:text] = ERB::Util.html_escape(description) + end attachment[:fields] = [{ title: I18n.t(:field_status), value: ERB::Util.html_escape(status.to_s), @@ -49,7 +51,7 @@ module RedmineMessenger Messenger.speak msg, channels, attachment, url end - def send_messenger_save + def send_messenger_update return if current_journal.nil? channels = Messenger.channels_for_project project @@ -67,7 +69,8 @@ module RedmineMessenger if current_journal.notes && RedmineMessenger.settings[:updated_include_description] == '1' attachment[:text] = ERB::Util.html_escape(current_journal.notes) end - attachment[:fields] = current_journal.details.map { |d| Messenger.detail_to_field d } + fields = current_journal.details.map { |d| Messenger.detail_to_field d } + attachment[:fields] = fields if fields.any? Messenger.speak msg, channels, attachment, url end @@ -76,6 +79,6 @@ module RedmineMessenger end end -unless Issue.included_modules.include? RedmineMessenger::Patches::IssuePatch - Issue.send(:include, RedmineMessenger::Patches::IssuePatch) +unless WikiPage.included_modules.include? RedmineMessenger::Patches::WikiPagePatch + WikiPage.send(:include, RedmineMessenger::Patches::WikiPagePatch) end diff --git a/lib/redmine_messenger/patches/password_patch.rb b/lib/redmine_messenger/patches/password_patch.rb new file mode 100644 index 0000000..e726303 --- /dev/null +++ b/lib/redmine_messenger/patches/password_patch.rb @@ -0,0 +1,51 @@ +# Redmine Messenger plugin for Redmine + +module RedmineMessenger + module Patches + module PasswordPatch + def self.included(base) + base.send(:include, InstanceMethods) + base.class_eval do + after_create :send_messenger_create + after_update :send_messenger_update + end + end + + module InstanceMethods + def send_messenger_create + return unless RedmineMessenger.settings[:post_password] == '1' + set_language_if_valid Setting.default_language + + channels = Messenger.channels_for_project project + url = Messenger.url_for_project project + + return unless channels.present? && url + Messenger.speak(l(:label_messenger_password_created, + project_url: "<#{Messenger.object_url self}|#{ERB::Util.html_escape(project)}>", + url: "<#{Messenger.object_url self}|#{name}>", + user: User.current), + channels, nil, url) + end + + def send_messenger_update + return unless RedmineMessenger.settings[:post_password_updates] == '1' + set_language_if_valid Setting.default_language + + channels = Messenger.channels_for_project project + url = Messenger.url_for_project project + + return unless channels.present? && url + Messenger.speak(l(:label_messenger_password_updated, + project_url: "<#{Messenger.object_url self}|#{ERB::Util.html_escape(project)}>", + url: "<#{Messenger.object_url self}|#{name}>", + user: User.current), + channels, nil, url) + end + end + end + end +end + +unless Password.included_modules.include? RedmineMessenger::Patches::PasswordPatch + Password.send(:include, RedmineMessenger::Patches::PasswordPatch) +end diff --git a/lib/redmine_messenger/patches/wiki_page_patch.rb b/lib/redmine_messenger/patches/wiki_page_patch.rb new file mode 100644 index 0000000..1e3182b --- /dev/null +++ b/lib/redmine_messenger/patches/wiki_page_patch.rb @@ -0,0 +1,58 @@ +# Redmine Messenger plugin for Redmine + +module RedmineMessenger + module Patches + module WikiPagePatch + def self.included(base) + base.send(:include, InstanceMethods) + base.class_eval do + after_create :send_messenger_create + after_update :send_messenger_update + end + end + + module InstanceMethods + def send_messenger_create + return unless RedmineMessenger.settings[:post_wiki] == '1' + + user = User.current + project_url = "<#{Messenger.object_url self}|#{ERB::Util.html_escape(project)}>" + page_url = "<#{Messenger.object_url self}|#{title}>" + comment = "[#{project_url}] #{page_url} created by *#{user}*" + + channels = Messenger.channels_for_project project + url = Messenger.url_for_project project + + return unless channels.present? && url + Messenger.speak comment, channels, nil, url + end + + def send_messenger_update + return unless RedmineMessenger.settings[:post_wiki_updates] == '1' + + user = content.author + project_url = "<#{Messenger.object_url self}|#{ERB::Util.html_escape(project)}>" + page_url = "<#{Messenger.object_url self}|#{title}>" + comment = "[#{project_url}] #{page_url} updated by *#{user}*" + + channels = Messenger.channels_for_project project + url = Messenger.url_for_project project + + return unless channels.present? && url + + attachment = nil + unless content.comments.empty? + attachment = {} + attachment[:text] = ERB::Util.html_escape(content.comments.to_s) + end + + Messenger.speak comment, channels, attachment, url + end + end + end + end +end + +unless Issue.included_modules.include? RedmineMessenger::Patches::IssuePatch + Issue.send(:include, RedmineMessenger::Patches::IssuePatch) +end