Add changelog and db, passwords and contacts support

This commit is contained in:
Alexander Meindl
2017-05-10 16:57:33 +02:00
parent f1257faf83
commit 19dd1712db
13 changed files with 383 additions and 51 deletions

33
CHANGELOG.md Normal file
View File

@@ -0,0 +1,33 @@
Changelog
=========
## 0.9.9
* Fork of redmine_rocketchat, redmine_slack and redmine_mattermost (base functions for all three messenger)
* Locale support added
* Wiki added supported for notification
* Contact added/updated supported for notification (if redmine_contacts is installed)
* Password added/updated supported for notification (if redmine_passwords is installed)
* DB entry added/updated supported for notification (if redmine_db is installed)
* SSL verify can be disabled
* Lots of refactoring and code cleanups
## v0.6.1
unknown changes
## v0.4
unknown changes
## v0.3
unknown changes
## v0.2
unknown changes
## v0.1
unknown changes

View File

@@ -19,7 +19,7 @@ class Messenger
if RedmineMessenger.settings[:messenger_username].present?
params[:username] = RedmineMessenger.settings[:messenger_username]
end
params[:attachments] = [attachment] if attachment
params[:attachments] = [attachment] if attachment && attachment.any?
if icon.present?
if icon.start_with? ':'
@@ -36,7 +36,9 @@ class Messenger
client = HTTPClient.new
client.ssl_config.cert_store.set_default_paths
client.ssl_config.ssl_version = :auto
client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
if RedmineMessenger.settings[:messenger_verify_ssl] != 1
client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
client.post_async url, payload: params.to_json
rescue StandardError => e
Rails.logger.warn("cannot connect to #{url}")

View File

@@ -20,10 +20,21 @@
<%= text_field_tag('settings[messenger_username]', @settings[:messenger_username], size: 30) %>
</p>
<p>
<%= content_tag(:label, l(:label_settings_messenger_verify_ssl)) %>
<%= check_box_tag 'settings[messenger_verify_ssl]', 1, @settings[:messenger_verify_ssl] %>
<em class="info"><%= t(:messenger_verify_ssl_info_html) %></em>
</p>
<br />
<h3><%= l(:label_issue_plural) %></h3>
<p>
<%= content_tag(:label, l(:label_settings_auto_mentions)) %>
<%= check_box_tag 'settings[auto_mentions]', 1, @settings[:auto_mentions] %>
</p>
<p>
<%= 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] %>
</p>
<br />
<h3><%= l(:label_wiki) %></h3>
<p>
<%= content_tag(:label, l(:label_settings_post_wiki)) %>
<%= check_box_tag 'settings[post_wiki]', 1, @settings[:post_wiki] %>
</p>
<p>
<%= content_tag(:label, l(:label_settings_post_wiki_updates)) %>
<%= check_box_tag 'settings[post_wiki_updates]', 1, @settings[:post_wiki_updates] %>
</p>
<% if RedmineReporting::REDMINE_DB_SUPPORT %>
<br />
<h3><%= l(:label_db_entry_plural) %></h3>
<p>
<%= content_tag(:label, l(:label_settings_post_db)) %>
<%= check_box_tag 'settings[post_db]', 1, @settings[:post_db] %>
</p>
<p>
<%= content_tag(:label, l(:label_settings_post_db_updates)) %>
<%= check_box_tag 'settings[post_db_updates]', 1, @settings[:post_db_updates] %>
</p>
<% end %>
<% if RedmineReporting::REDMINE_CONTACTS_SUPPORT %>
<br />
<h3><%= l(:label_contact_plural) %></h3>
<p>
<%= content_tag(:label, l(:label_settings_post_contact)) %>
<%= check_box_tag 'settings[post_contact]', 1, @settings[:post_contact] %>
</p>
<p>
<%= content_tag(:label, l(:label_settings_post_contact_updates)) %>
<%= check_box_tag 'settings[post_contact_updates]', 1, @settings[:post_contact_updates] %>
</p>
<% end %>
<% if RedmineReporting::REDMINE_PASSWORDS_SUPPORT %>
<br />
<h3><%= l(:label_password_plural) %></h3>
<p>
<%= content_tag(:label, l(:label_settings_post_password)) %>
<%= check_box_tag 'settings[post_password]', 1, @settings[:post_password] %>
</p>
<p>
<%= content_tag(:label, l(:label_settings_post_password_updates)) %>
<%= check_box_tag 'settings[post_password_updates]', 1, @settings[:post_password_updates] %>
</p>
<% end %>

View File

@@ -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 <a href="/custom_fields/new?type=ProjectCustomField&custom_field[name]=Rocket.Chat Channel">project custom field</a> named "Messenger Channel" (without quotes).'
messenger_url_info_html: 'Generate an "Incoming WebHook" URL from the <a href="https://rocket.chat/docs/administrator-guides/integrations/">Integrations configuration page on Rocket.Chat</a>. This URL can be changed on a per-project basis by creating a <a href="/custom_fields/new?type=ProjectCustomField&custom_field[name]=Messenger Channel">project custom field</a> 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 <a href="/custom_fields/new?type=ProjectCustomField&custom_field[name]=Rocket.Chat Channel">project custom field</a> named "Messenger Channel" (without quotes).'
messenger_url_info_html: 'Generate an <a target="_blank" href="https://github.com/AlphaNodes/redmine_messenger#prepare-your-messenger-service">Incoming WebHook</a> URL from the sessenger service. This URL can be changed on a per-project basis by creating a <a href="/custom_fields/new?type=ProjectCustomField&custom_field[name]=Messenger Channel">project custom field</a> 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}*"

View File

@@ -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 <a href="/custom_fields/new?type=ProjectCustomField&custom_field[name]=Rocket.Chat Channel">project custom field</a> named "Messenger Channel" (without quotes).'
messenger_url_info_html: 'Generate an "Incoming WebHook" URL from the <a href="https://rocket.chat/docs/administrator-guides/integrations/">Integrations configuration page on Rocket.Chat</a>. This URL can be changed on a per-project basis by creating a <a href="/custom_fields/new?type=ProjectCustomField&custom_field[name]=Messenger Channel">project custom field</a> 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 <a href="/custom_fields/new?type=ProjectCustomField&custom_field[name]=Rocket.Chat Channel">project custom field</a> named "Messenger Channel" (without quotes).'
messenger_url_info_html: 'Generate an <a target="_blank" href="https://github.com/AlphaNodes/redmine_messenger#prepare-your-messenger-service">Incoming WebHook</a> URL from the sessenger service. This URL can be changed on a per-project basis by creating a <a href="/custom_fields/new?type=ProjectCustomField&custom_field[name]=Messenger Channel">project custom field</a> 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}*"

12
init.rb
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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