Added Messenger plugin.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
33
plugins/redmine_messenger/lib/redmine_messenger.rb
Normal file
33
plugins/redmine_messenger/lib/redmine_messenger.rb
Normal file
@@ -0,0 +1,33 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
VERSION = '1.0.15'
|
||||
REDMINE_CONTACTS_SUPPORT = Redmine::Plugin.installed? 'redmine_contacts'
|
||||
REDMINE_DB_SUPPORT = Redmine::Plugin.installed? 'redmine_db'
|
||||
|
||||
include RedminePluginKit::PluginBase
|
||||
|
||||
class << self
|
||||
private
|
||||
|
||||
def setup
|
||||
# Patches
|
||||
loader.add_patch %w[Issue
|
||||
Project
|
||||
WikiPage]
|
||||
|
||||
loader.add_patch 'Contact' if RedmineMessenger::REDMINE_CONTACTS_SUPPORT
|
||||
loader.add_patch 'DbEntry' if RedmineMessenger::REDMINE_DB_SUPPORT
|
||||
loader.add_patch 'Password' if Redmine::Plugin.installed? 'redmine_passwords'
|
||||
|
||||
# Helper
|
||||
loader.add_helper [{ controller: 'Projects', helper: 'MessengerProjects' }]
|
||||
|
||||
# Global helpers
|
||||
loader.add_global_helper RedmineMessenger::Helpers
|
||||
|
||||
# Apply patches and helper
|
||||
loader.apply!
|
||||
end
|
||||
end
|
||||
end
|
||||
19
plugins/redmine_messenger/lib/redmine_messenger/helpers.rb
Normal file
19
plugins/redmine_messenger/lib/redmine_messenger/helpers.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
module Helpers
|
||||
def project_messenger_options(active)
|
||||
options_for_select({ l(:label_messenger_settings_default) => '0',
|
||||
l(:label_messenger_settings_disabled) => '1',
|
||||
l(:label_messenger_settings_enabled) => '2' }, active)
|
||||
end
|
||||
|
||||
def project_setting_messenger_default_value(value)
|
||||
if Messenger.default_project_setting @project, value
|
||||
l :label_messenger_settings_enabled
|
||||
else
|
||||
l :label_messenger_settings_disabled
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,65 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
module Hooks
|
||||
class ModelHook < Redmine::Hook::Listener
|
||||
def after_plugins_loaded(_context = {})
|
||||
return if Rails.version < '6.0'
|
||||
|
||||
RedmineMessenger.setup!
|
||||
end
|
||||
|
||||
def model_changeset_scan_commit_for_issue_ids_pre_issue_update(context = {})
|
||||
issue = context[:issue]
|
||||
journal = issue.current_journal
|
||||
changeset = context[:changeset]
|
||||
|
||||
channels = Messenger.channels_for_project issue.project
|
||||
url = Messenger.url_for_project issue.project
|
||||
|
||||
return unless channels.present? && url && issue.changes.any? && Messenger.setting_for_project(issue.project, :post_updates)
|
||||
return if issue.is_private? && !Messenger.setting_for_project(issue.project, :post_private_issues)
|
||||
|
||||
msg = "[#{Messenger.markup_format issue.project}] " \
|
||||
"#{Messenger.markup_format journal.user.to_s} updated <#{Messenger.object_url issue}|#{Messenger.markup_format issue}>"
|
||||
|
||||
repository = changeset.repository
|
||||
|
||||
if Setting.host_name.to_s =~ %r{/\A(https?://)?(.+?)(:(\d+))?(/.+)?\z/i}
|
||||
host = Regexp.last_match 2
|
||||
port = Regexp.last_match 4
|
||||
prefix = Regexp.last_match 5
|
||||
revision_url = Rails.application.routes.url_for(
|
||||
controller: 'repositories',
|
||||
action: 'revision',
|
||||
id: repository.project,
|
||||
repository_id: repository.identifier_param,
|
||||
rev: changeset.revision,
|
||||
host: host,
|
||||
protocol: Setting.protocol,
|
||||
port: port,
|
||||
script_name: prefix
|
||||
)
|
||||
else
|
||||
revision_url = Rails.application.routes.url_for(
|
||||
controller: 'repositories',
|
||||
action: 'revision',
|
||||
id: repository.project,
|
||||
repository_id: repository.identifier_param,
|
||||
rev: changeset.revision,
|
||||
host: Setting.host_name,
|
||||
protocol: Setting.protocol
|
||||
)
|
||||
end
|
||||
|
||||
attachment = {}
|
||||
attachment[:text] = ll(Setting.default_language,
|
||||
:text_status_changed_by_changeset,
|
||||
"<#{revision_url}|#{Messenger.markup_format changeset.comments}>")
|
||||
attachment[:fields] = journal.details.map { |d| Messenger.detail_to_field d }
|
||||
|
||||
Messenger.speak msg, channels, url, attachment: attachment, project: repository.project
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,64 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
module Patches
|
||||
module ContactPatch
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
include InstanceMethods
|
||||
|
||||
after_create_commit :send_messenger_create
|
||||
after_update_commit :send_messenger_update
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
def send_messenger_create
|
||||
return unless Messenger.setting_for_project project, :post_contact
|
||||
return if is_private? && !Messenger.setting_for_project(project, :post_private_contacts)
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
return unless channels.present? && url
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
Messenger.speak l(:label_messenger_contact_created,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: Messenger.url_markdown(self, name),
|
||||
user: User.current),
|
||||
channels, url, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
|
||||
def send_messenger_update
|
||||
return unless Messenger.setting_for_project project, :post_contact_updates
|
||||
return if is_private? && !Messenger.setting_for_project(project, :post_private_contacts)
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
return unless channels.present? && url
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
Messenger.speak l(:label_messenger_contact_updated,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: Messenger.url_markdown(self, name),
|
||||
user: User.current),
|
||||
channels, url, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,64 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
module Patches
|
||||
module DbEntryPatch
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
include InstanceMethods
|
||||
|
||||
after_create_commit :send_messenger_create
|
||||
after_update_commit :send_messenger_update
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
def send_messenger_create
|
||||
return unless Messenger.setting_for_project project, :post_db
|
||||
return if is_private? && !Messenger.setting_for_project(project, :post_private_db)
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
return unless channels.present? && url
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
Messenger.speak l(:label_messenger_db_entry_created,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: Messenger.url_markdown(self, name),
|
||||
user: User.current),
|
||||
channels, url, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
|
||||
def send_messenger_update
|
||||
return unless Messenger.setting_for_project project, :post_db_updates
|
||||
return if is_private? && !Messenger.setting_for_project(project, :post_private_db)
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
return unless channels.present? && url
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
Messenger.speak l(:label_messenger_db_entry_updated,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: Messenger.url_markdown(self, name),
|
||||
user: User.current),
|
||||
channels, url, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,141 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
module Patches
|
||||
module IssuePatch
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
include InstanceMethods
|
||||
|
||||
after_create_commit :send_messenger_create
|
||||
after_update_commit :send_messenger_update
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
def send_messenger_create
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
if Messenger.setting_for_project project, :messenger_direct_users_messages
|
||||
messenger_to_be_notified.each do |user|
|
||||
channels.append "@#{user.login}" unless user == author
|
||||
end
|
||||
end
|
||||
|
||||
return unless channels.present? && url
|
||||
return if is_private? && !Messenger.setting_for_project(project, :post_private_issues)
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
attachment = {}
|
||||
if description.present? && Messenger.setting_for_project(project, :new_include_description)
|
||||
attachment[:text] = Messenger.markup_format description
|
||||
end
|
||||
attachment[:fields] = [{ title: I18n.t(:field_status),
|
||||
value: Messenger.markup_format(status.to_s),
|
||||
short: true },
|
||||
{ title: I18n.t(:field_priority),
|
||||
value: Messenger.markup_format(priority.to_s),
|
||||
short: true }]
|
||||
if assigned_to.present?
|
||||
attachment[:fields] << { title: I18n.t(:field_assigned_to),
|
||||
value: Messenger.markup_format(assigned_to.to_s),
|
||||
short: true }
|
||||
end
|
||||
|
||||
attachments.each do |att|
|
||||
attachment[:fields] << { title: I18n.t(:label_attachment),
|
||||
value: "<#{Messenger.object_url att}|#{ERB::Util.html_escape att.filename}>",
|
||||
short: true }
|
||||
end
|
||||
|
||||
if RedmineMessenger.setting?(:display_watchers) && watcher_users.count.positive?
|
||||
attachment[:fields] << {
|
||||
title: I18n.t(:field_watcher),
|
||||
value: Messenger.markup_format(watcher_users.join(', ')),
|
||||
short: true
|
||||
}
|
||||
end
|
||||
|
||||
Messenger.speak l(:label_messenger_issue_created,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: send_messenger_mention_url(project, description),
|
||||
user: author),
|
||||
channels, url, attachment: attachment, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
|
||||
def send_messenger_update
|
||||
return if current_journal.nil?
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
if Messenger.setting_for_project project, :messenger_direct_users_messages
|
||||
messenger_to_be_notified.each do |user|
|
||||
channels.append "@#{user.login}" unless user == current_journal.user
|
||||
end
|
||||
end
|
||||
|
||||
return unless channels.present? && url && Messenger.setting_for_project(project, :post_updates)
|
||||
return if is_private? && !Messenger.setting_for_project(project, :post_private_issues)
|
||||
return if current_journal.private_notes? && !Messenger.setting_for_project(project, :post_private_notes)
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
attachment = {}
|
||||
if Messenger.setting_for_project project, :updated_include_description
|
||||
attachment_text = Messenger.attachment_text_from_journal current_journal
|
||||
attachment[:text] = attachment_text if attachment_text.present?
|
||||
end
|
||||
|
||||
fields = current_journal.details.map { |d| Messenger.detail_to_field d, project }
|
||||
if current_journal.notes.present?
|
||||
fields << { title: I18n.t(:label_comment),
|
||||
value: Messenger.markup_format(current_journal.notes),
|
||||
short: false }
|
||||
end
|
||||
fields << { title: I18n.t(:field_is_private), short: true } if current_journal.private_notes?
|
||||
fields.compact!
|
||||
attachment[:fields] = fields if fields.any?
|
||||
|
||||
Messenger.speak l(:label_messenger_issue_updated,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: send_messenger_mention_url(project, description),
|
||||
user: current_journal.user),
|
||||
channels, url, attachment: attachment, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def messenger_to_be_notified
|
||||
to_be_notified = (notified_users + notified_watchers).compact
|
||||
to_be_notified.uniq
|
||||
end
|
||||
|
||||
def send_messenger_mention_url(project, text)
|
||||
mention_to = ''
|
||||
if Messenger.setting_for_project(project, :auto_mentions) ||
|
||||
Messenger.textfield_for_project(project, :default_mentions).present?
|
||||
mention_to = Messenger.mentions project, text
|
||||
end
|
||||
if current_journal.nil?
|
||||
"<#{Messenger.object_url self}|#{Messenger.markup_format self}>#{mention_to}"
|
||||
else
|
||||
"<#{Messenger.object_url self}#change-#{current_journal.id}|#{Messenger.markup_format self}>#{mention_to}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,64 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
module Patches
|
||||
module PasswordPatch
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
include InstanceMethods
|
||||
|
||||
after_create_commit :send_messenger_create
|
||||
after_update_commit :send_messenger_update
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
def send_messenger_create
|
||||
return unless Messenger.setting_for_project project, :post_password
|
||||
return if is_private?
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
return unless channels.present? && url
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
Messenger.speak l(:label_messenger_password_created,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: Messenger.url_markdown(self, name),
|
||||
user: User.current),
|
||||
channels, url, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
|
||||
def send_messenger_update
|
||||
return unless Messenger.setting_for_project project, :post_password_updates
|
||||
return if is_private?
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
return unless channels.present? && url
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
Messenger.speak l(:label_messenger_password_updated,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: Messenger.url_markdown(self, name),
|
||||
user: User.current),
|
||||
channels, url, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
module Patches
|
||||
module ProjectPatch
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_one :messenger_setting, dependent: :destroy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,68 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module RedmineMessenger
|
||||
module Patches
|
||||
module WikiPagePatch
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
include InstanceMethods
|
||||
|
||||
after_create_commit :send_messenger_create
|
||||
after_update_commit :send_messenger_update
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
def send_messenger_create
|
||||
return unless Messenger.setting_for_project project, :post_wiki
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
return unless channels.present? && url
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
Messenger.speak l(:label_messenger_wiki_created,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: Messenger.url_markdown(self, title),
|
||||
user: User.current),
|
||||
channels, url, project: project
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
|
||||
def send_messenger_update
|
||||
return unless Messenger.setting_for_project project, :post_wiki_updates
|
||||
|
||||
channels = Messenger.channels_for_project project
|
||||
url = Messenger.url_for_project project
|
||||
|
||||
return unless channels.present? && url
|
||||
|
||||
initial_language = ::I18n.locale
|
||||
begin
|
||||
set_language_if_valid Setting.default_language
|
||||
|
||||
attachment = nil
|
||||
if !content.nil? && content.comments.present?
|
||||
attachment = {}
|
||||
attachment[:text] = Messenger.markup_format content.comments.to_s
|
||||
end
|
||||
|
||||
Messenger.speak l(:label_messenger_wiki_updated,
|
||||
project_url: Messenger.project_url_markdown(project),
|
||||
url: Messenger.url_markdown(self, title),
|
||||
user: content.author),
|
||||
channels, url, project: project, attachment: attachment
|
||||
ensure
|
||||
::I18n.locale = initial_language
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user