From 7fd5910d50fceaff49e97540c1ca2328ee736610 Mon Sep 17 00:00:00 2001 From: Zer00CooL Date: Thu, 11 Apr 2019 01:39:05 +0200 Subject: [PATCH 01/24] fr.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nouveau fichier de langue pour redmine_messenger en français. --- config/locales/fr.yml | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 config/locales/fr.yml diff --git a/config/locales/fr.yml b/config/locales/fr.yml new file mode 100644 index 0000000..c4f4c8a --- /dev/null +++ b/config/locales/fr.yml @@ -0,0 +1,55 @@ +# French strings +fr: + default_mentionsl_info: Personnes à notifier par défaut, séparées par des virgules (@all, @here) + error_messenger_invalid_url: n'est pas une URL valide + label_messenger_contact_created: "[%{project_url}] Le contact %{url} créé par *%{user}*" + label_messenger_contact_updated: "[%{project_url}] Le contact %{url} mis à jour par *%{user}*" + label_messenger_db_entry_created: "[%{project_url}] Entrée de base de données %{url} créée par *%{user}*" + label_messenger_db_entry_updated: "[%{project_url}] Entrée de base de données %{url} mis à jour par *%{user}*" + label_messenger_default_not_visible: Le paramètre par défaut n'est pas visible pour des raisons de sécurité + label_messenger_issue_created: "[%{project_url}] Ticket %{url} créé par *%{user}*" + label_messenger_issue_updated: "[%{project_url}] Ticket %{url} mis à jour par *%{user}*" + label_messenger_password_created: "[%{project_url}] Mot de passe %{url} créé par *%{user}*" + label_messenger_password_updated: "[%{project_url}] Mot de passe %{url} mis à jour par *%{user}*" + label_messenger_project_text_field_info: Laissez ce champ vide pour le système par défaut. + label_messenger_setting: Paramètres de messagerie + label_messenger_settings_default: Choix de l'option + label_messenger_settings_disabled: Désactivé + label_messenger_settings_enabled: Activé + label_messenger_wiki_created: "[%{project_url}] Wiki %{url} créé par *%{user}*" + label_messenger_wiki_updated: "[%{project_url}] Wiki %{url} mis à jour par *%{user}*" + label_messenger: Messenger + label_settings_auto_mentions: Convert names to mentions ? + label_settings_default_mentions: Default people for mentions + label_settings_display_watchers: Afficher l'utilisateur assigné au ticket ? + label_settings_messenger_channel: Messenger - Nom du salon + label_settings_messenger_icon: Messenger - Icône affiché + label_settings_messenger_url: Messenger - URL WebHook entrant + label_settings_messenger_username: Messenger - Nom du robot + label_settings_messenger_verify_ssl: Vérifier SSL + label_settings_new_include_description: Description du nouveau ticket ? + label_settings_post_contact_updates: Mises à jour de contact ? + label_settings_post_contact: Contact ajouté ? + label_settings_post_db_updates: Mises à jour des entrées de base de données ? + label_settings_post_db: Entrée de base de données ajoutée ? + label_settings_post_password_updates: Mises à jour du mot de passe ? + label_settings_post_password: Mot de passe ajouté ? + label_settings_post_private_contacts: Contacts privés ? + label_settings_post_private_db: Entrées de base de données privées ? + label_settings_post_private_issues: Mises à jour des tickets privés? + label_settings_post_private_notes: Mises à jour des notes privées ? + label_settings_post_updates: Publier pour chaque mises à jour ? + label_settings_post_wiki_updates: Mises à jour du wiki ? + label_settings_post_wiki: Post Wiki ajouté ? + label_settings_updated_include_description: Description suite à une mise à jour ? + messenger_channel_info_html: 'Vous devez spécifier le canal à utiliser. Vous pouvez définir plusieurs canaux, séparés par une virgule.' + messenger_contacts_intro: Activer les modifications pour les contacts à envoyer au canal Messenger prédéfini. + messenger_db_intro: Activer les modifications pour la base de données à envoyer au canal Messenger prédéfini. + messenger_issue_intro: Activer les modifications pour les tickets à envoyer au canal Messenger prédéfini. + messenger_passwords_intro: Activez les modifications pour les mots de passe devant être envoyés au canal Messenger prédéfini. + messenger_settings_intro: "Laissez l'URL de Messenger dans la zone d'administration vide afin de ne pas envoyer de messages de Redmine à Messenger. Peu importe ce que vous avez configuré ici. Si vous souhaitez envoyer des messages de tous les projets Redmine à Messenger, renseignez l’URL. Les messages seront envoyés au canal spécifique. Si vous souhaitez uniquement être averti par certains des projets (pas tous), laissez l'URL du messager ici vide et accédez à la configuration du projet spécifique." + messenger_settings_project_intro: "Si vous laissez vide l'URL de Messenger dans la zone d'administration au cas où vous ne seriez pas averti globalement de toutes les modifications apportées au projet, vous pouvez configurer votre URL Messenger dans les paramètres du projet." + messenger_url_info_html: 'Générer une Incoming WebHook URL du service de messagerie. Laissez-le vide si vous souhaitez uniquement activer des projets spécifiques avec des paramètres de projet.' + messenger_verify_ssl_info_html: 'Si votre service Messenger utilise un certificat SSL non valide ou auto-signé, désactivez-le.' + messenger_wiki_intro: Activez les modifications pour les wikis à envoyer au canal Messenger prédéfini. +permission_manage_messenger: Gérer messenger From 56fa966d9237a173f1306a245341c03c14575d02 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Thu, 11 Apr 2019 10:32:42 +0200 Subject: [PATCH 02/24] Fix test for new fr translation and some cleanups --- .rubocop.yml | 5 +++++ .travis.yml | 2 +- CHANGELOG.md | 5 +++++ Gemfile | 5 +++++ README.md | 2 +- app/models/messenger.rb | 4 ++-- config/locales/fr.yml | 26 +++++++++++++------------- init.rb | 2 +- test/unit/i18n_test.rb | 2 +- 9 files changed, 34 insertions(+), 19 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 6ed2290..673f19f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,3 +1,5 @@ +require: rubocop-performance + Rails: Enabled: true @@ -39,6 +41,9 @@ Rails/CreateTableWithTimestamps: Rails/ApplicationRecord: Enabled: false +Performance/ChainArrayAllocation: + Enabled: true + Style/AutoResourceCleanup: Enabled: true diff --git a/.travis.yml b/.travis.yml index 82c33fc..c414d11 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: ruby rvm: - - 2.4.5 + - 2.4.6 - 2.3.8 - 2.2.10 diff --git a/CHANGELOG.md b/CHANGELOG.md index 481746e..ab4f861 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========= +1.0.4 +----- + +- Frensh translation added - thanks to @ZerooCool + 1.0.3 ----- diff --git a/Gemfile b/Gemfile index e7117a8..7b2d552 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,7 @@ gem 'slim-rails' gem 'validate_url' + +group :test do + gem 'rubocop', require: false + gem 'rubocop-performance', require: false +end diff --git a/README.md b/README.md index d556d79..c66fc68 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Requirements ------------ * Redmine version >= 3.0.0 -* Ruby version >= 2.1.5 +* Ruby version >= 2.2.10 Installation diff --git a/app/models/messenger.rb b/app/models/messenger.rb index 429c5de..afbf8b5 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -114,7 +114,7 @@ class Messenger if !pm.nil? && pm.messenger_channel.present? return [] if pm.messenger_channel == '-' - return pm.messenger_channel.split(',').map(&:strip).uniq + return pm.messenger_channel.split(',').map(&:strip).uniq! end default_project_channels(proj) end @@ -126,7 +126,7 @@ class Messenger # system based if RedmineMessenger.settings[:messenger_channel].present? && RedmineMessenger.settings[:messenger_channel] != '-' - return RedmineMessenger.settings[:messenger_channel].split(',').map(&:strip).uniq + return RedmineMessenger.settings[:messenger_channel].split(',').map(&:strip).uniq! end [] diff --git a/config/locales/fr.yml b/config/locales/fr.yml index c4f4c8a..5bb0068 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -2,22 +2,22 @@ fr: default_mentionsl_info: Personnes à notifier par défaut, séparées par des virgules (@all, @here) error_messenger_invalid_url: n'est pas une URL valide - label_messenger_contact_created: "[%{project_url}] Le contact %{url} créé par *%{user}*" - label_messenger_contact_updated: "[%{project_url}] Le contact %{url} mis à jour par *%{user}*" - label_messenger_db_entry_created: "[%{project_url}] Entrée de base de données %{url} créée par *%{user}*" - label_messenger_db_entry_updated: "[%{project_url}] Entrée de base de données %{url} mis à jour par *%{user}*" + label_messenger_contact_created: "[%{project_url}] Le contact %{url} créé par *%{user}*" + label_messenger_contact_updated: "[%{project_url}] Le contact %{url} mis à jour par *%{user}*" + label_messenger_db_entry_created: "[%{project_url}] Entrée de base de données %{url} créée par *%{user}*" + label_messenger_db_entry_updated: "[%{project_url}] Entrée de base de données %{url} mis à jour par *%{user}*" label_messenger_default_not_visible: Le paramètre par défaut n'est pas visible pour des raisons de sécurité - label_messenger_issue_created: "[%{project_url}] Ticket %{url} créé par *%{user}*" - label_messenger_issue_updated: "[%{project_url}] Ticket %{url} mis à jour par *%{user}*" - label_messenger_password_created: "[%{project_url}] Mot de passe %{url} créé par *%{user}*" - label_messenger_password_updated: "[%{project_url}] Mot de passe %{url} mis à jour par *%{user}*" + label_messenger_issue_created: "[%{project_url}] Ticket %{url} créé par *%{user}*" + label_messenger_issue_updated: "[%{project_url}] Ticket %{url} mis à jour par *%{user}*" + label_messenger_password_created: "[%{project_url}] Mot de passe %{url} créé par *%{user}*" + label_messenger_password_updated: "[%{project_url}] Mot de passe %{url} mis à jour par *%{user}*" label_messenger_project_text_field_info: Laissez ce champ vide pour le système par défaut. label_messenger_setting: Paramètres de messagerie label_messenger_settings_default: Choix de l'option label_messenger_settings_disabled: Désactivé label_messenger_settings_enabled: Activé - label_messenger_wiki_created: "[%{project_url}] Wiki %{url} créé par *%{user}*" - label_messenger_wiki_updated: "[%{project_url}] Wiki %{url} mis à jour par *%{user}*" + label_messenger_wiki_created: "[%{project_url}] Wiki %{url} créé par *%{user}*" + label_messenger_wiki_updated: "[%{project_url}] Wiki %{url} mis à jour par *%{user}*" label_messenger: Messenger label_settings_auto_mentions: Convert names to mentions ? label_settings_default_mentions: Default people for mentions @@ -47,9 +47,9 @@ fr: messenger_db_intro: Activer les modifications pour la base de données à envoyer au canal Messenger prédéfini. messenger_issue_intro: Activer les modifications pour les tickets à envoyer au canal Messenger prédéfini. messenger_passwords_intro: Activez les modifications pour les mots de passe devant être envoyés au canal Messenger prédéfini. - messenger_settings_intro: "Laissez l'URL de Messenger dans la zone d'administration vide afin de ne pas envoyer de messages de Redmine à Messenger. Peu importe ce que vous avez configuré ici. Si vous souhaitez envoyer des messages de tous les projets Redmine à Messenger, renseignez l’URL. Les messages seront envoyés au canal spécifique. Si vous souhaitez uniquement être averti par certains des projets (pas tous), laissez l'URL du messager ici vide et accédez à la configuration du projet spécifique." - messenger_settings_project_intro: "Si vous laissez vide l'URL de Messenger dans la zone d'administration au cas où vous ne seriez pas averti globalement de toutes les modifications apportées au projet, vous pouvez configurer votre URL Messenger dans les paramètres du projet." + messenger_settings_intro: "Laissez l'URL de Messenger dans la zone d'administration vide afin de ne pas envoyer de messages de Redmine à Messenger. Peu importe ce que vous avez configuré ici. Si vous souhaitez envoyer des messages de tous les projets Redmine à Messenger, renseignez l’URL. Les messages seront envoyés au canal spécifique. Si vous souhaitez uniquement être averti par certains des projets (pas tous), laissez l'URL du messager ici vide et accédez à la configuration du projet spécifique." + messenger_settings_project_intro: "Si vous laissez vide l'URL de Messenger dans la zone d'administration au cas où vous ne seriez pas averti globalement de toutes les modifications apportées au projet, vous pouvez configurer votre URL Messenger dans les paramètres du projet." messenger_url_info_html: 'Générer une Incoming WebHook URL du service de messagerie. Laissez-le vide si vous souhaitez uniquement activer des projets spécifiques avec des paramètres de projet.' messenger_verify_ssl_info_html: 'Si votre service Messenger utilise un certificat SSL non valide ou auto-signé, désactivez-le.' messenger_wiki_intro: Activez les modifications pour les wikis à envoyer au canal Messenger prédéfini. -permission_manage_messenger: Gérer messenger + permission_manage_messenger: Gérer messenger diff --git a/init.rb b/init.rb index 08b93ac..eb71ac6 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, Discord, Rocketchat and Mattermost support' - version '1.0.3' + version '1.0.4' requires_redmine version_or_higher: '3.0.0' diff --git a/test/unit/i18n_test.rb b/test/unit/i18n_test.rb index 1c9baae..cccaa19 100644 --- a/test/unit/i18n_test.rb +++ b/test/unit/i18n_test.rb @@ -22,7 +22,7 @@ class I18nTest < ActiveSupport::TestCase 'config', 'locales', '*.yml')].size - assert_equal lang_files_count, 3 + assert_equal lang_files_count, 4 valid_languages.each do |lang| assert set_language_if_valid(lang) end From 8c60b1ae0bf9123a7b129cac831ae00092acabf3 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Thu, 11 Apr 2019 10:37:24 +0200 Subject: [PATCH 03/24] Because of bundler version conflict switch back to ruby 2.4.5 on travis --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c414d11..6167ffa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: ruby rvm: - - 2.4.6 + - 2.4.5 - 2.3.8 - 2.2.10 @@ -10,7 +10,6 @@ env: - REDMINE_VER=3.4-stable DB=postgresql sudo: true -cache: bundler addons: postgresql: "9.6" From c670b5606d9d2130e9f44a746286e266a3bcc137 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Thu, 11 Apr 2019 14:55:28 +0200 Subject: [PATCH 04/24] Fix channel settings --- app/models/messenger.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/messenger.rb b/app/models/messenger.rb index afbf8b5..578fe20 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -114,7 +114,7 @@ class Messenger if !pm.nil? && pm.messenger_channel.present? return [] if pm.messenger_channel == '-' - return pm.messenger_channel.split(',').map(&:strip).uniq! + return pm.messenger_channel.split(',').map!(&:strip).uniq end default_project_channels(proj) end @@ -126,7 +126,7 @@ class Messenger # system based if RedmineMessenger.settings[:messenger_channel].present? && RedmineMessenger.settings[:messenger_channel] != '-' - return RedmineMessenger.settings[:messenger_channel].split(',').map(&:strip).uniq! + return RedmineMessenger.settings[:messenger_channel].split(',').map!(&:strip).uniq end [] From bf8d2d3d4d28e7f32926148c3032c61a68f834b5 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Wed, 15 May 2019 20:06:35 +0200 Subject: [PATCH 05/24] Ruby 2.3.x or newer is required. Bump to 1.0.5 --- .rubocop.yml | 5 ++++- .travis.yml | 2 +- CHANGELOG.md | 6 ++++++ README.md | 2 +- app/models/messenger.rb | 2 +- init.rb | 4 +++- lib/redmine_messenger/patches/issue_patch.rb | 2 +- 7 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 673f19f..5fa131f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,7 +4,7 @@ Rails: Enabled: true AllCops: - TargetRubyVersion: 2.2 + TargetRubyVersion: 2.3 TargetRailsVersion: 5.2 Metrics/AbcSize: @@ -47,6 +47,9 @@ Performance/ChainArrayAllocation: Style/AutoResourceCleanup: Enabled: true +Style/FrozenStringLiteralComment: + Enabled: false + Style/Documentation: Enabled: false diff --git a/.travis.yml b/.travis.yml index 6167ffa..5a826f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,9 @@ language: ruby rvm: + - 2.5.3 - 2.4.5 - 2.3.8 - - 2.2.10 env: - REDMINE_VER=4.0-stable DB=postgresql diff --git a/CHANGELOG.md b/CHANGELOG.md index ab4f861..aea29fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========= +1.0.5 +----- + +- ruby 2.3.x or newer is required + + 1.0.4 ----- diff --git a/README.md b/README.md index c66fc68..6174479 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Requirements ------------ * Redmine version >= 3.0.0 -* Ruby version >= 2.2.10 +* Ruby version >= 2.3.0 Installation diff --git a/app/models/messenger.rb b/app/models/messenger.rb index 578fe20..7683021 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -29,7 +29,7 @@ class Messenger username = Messenger.textfield_for_project(options[:project], :messenger_username) params[:username] = username if username.present? - params[:attachments] = [options[:attachment]] if options[:attachment] && options[:attachment].any? + params[:attachments] = [options[:attachment]] if options[:attachment]&.any? icon = Messenger.textfield_for_project(options[:project], :messenger_icon) if icon.present? diff --git a/init.rb b/init.rb index eb71ac6..5c215ae 100644 --- a/init.rb +++ b/init.rb @@ -1,3 +1,5 @@ +raise "\n\033[31mredmine_messenger requires ruby 2.3 or newer. Please update your ruby version.\033[0m" if RUBY_VERSION < '2.3' + require 'redmine' require 'redmine_messenger' @@ -7,7 +9,7 @@ Redmine::Plugin.register :redmine_messenger do url 'https://github.com/alphanodes/redmine_messenger' author_url 'https://alphanodes.com/' description 'Messenger integration for Slack, Discord, Rocketchat and Mattermost support' - version '1.0.4' + version '1.0.5' requires_redmine version_or_higher: '3.0.0' diff --git a/lib/redmine_messenger/patches/issue_patch.rb b/lib/redmine_messenger/patches/issue_patch.rb index 25164bb..73dca00 100644 --- a/lib/redmine_messenger/patches/issue_patch.rb +++ b/lib/redmine_messenger/patches/issue_patch.rb @@ -35,7 +35,7 @@ module RedmineMessenger short: true } end - if RedmineMessenger.setting?(:display_watchers) && watcher_users.count > 0 + if RedmineMessenger.setting?(:display_watchers) && watcher_users.count.positive? attachment[:fields] << { title: I18n.t(:field_watcher), value: ERB::Util.html_escape(watcher_users.join(', ')), From c7a9f0c8da77fb95eb791303c1f71b6c9d60e8b4 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Mon, 3 Jun 2019 21:11:13 +0200 Subject: [PATCH 06/24] remove rubocop from Gemfile, till redmine 4 is required --- Gemfile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Gemfile b/Gemfile index 7b2d552..e7117a8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,2 @@ gem 'slim-rails' gem 'validate_url' - -group :test do - gem 'rubocop', require: false - gem 'rubocop-performance', require: false -end From 96f9e93e315804d536149ef7fe02608e5ccadf5b Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Sun, 7 Jul 2019 17:07:38 +0200 Subject: [PATCH 07/24] Add notice to use right directory name --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6174479..df38ce9 100644 --- a/README.md +++ b/README.md @@ -66,10 +66,11 @@ Installation Install ``redmine_messenger`` plugin for `Redmine` cd $REDMINE_ROOT - git clone git://github.com/alphanodes/redmine_messenger.git plugins/redmine_messenger + git clone https://github.com/AlphaNodes/redmine_messenger.git plugins/redmine_messenger bundle install --without development test bundle exec rake redmine:plugins:migrate RAILS_ENV=production +Make sure that the directory is named `redmine_messenger` (you cannot use another name for it)! Restart Redmine (application server) and you should see the plugin show up in the Plugins page. Under the configuration options, set the Messenger API URL to the URL for an Incoming WebHook integration in your Messenger account and also set the Messenger From 543f8ff49b5989d2447b444ee69162c18c3fec76 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Wed, 7 Aug 2019 20:32:17 +0200 Subject: [PATCH 08/24] Add mysql for travis tests --- .rubocop.yml | 3 +- .travis.yml | 33 ++++++++++++------ CHANGELOG.md | 2 +- Gemfile | 6 ++++ README.md | 2 +- init.rb | 13 ++++++-- lib/redmine_messenger.rb | 46 ++++++++++++++------------ test/support/database-mysql-travis.yml | 8 +++++ 8 files changed, 75 insertions(+), 38 deletions(-) create mode 100644 test/support/database-mysql-travis.yml diff --git a/.rubocop.yml b/.rubocop.yml index 5fa131f..f6bb2ef 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,4 +1,5 @@ -require: rubocop-performance +require: + - rubocop-performance Rails: Enabled: true diff --git a/.travis.yml b/.travis.yml index 5a826f2..4d2a924 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,33 @@ language: ruby +dist: xenial rvm: - - 2.5.3 - - 2.4.5 - - 2.3.8 + - 2.6.3 + - 2.5.5 + - 2.4.6 + +services: + - mysql + - postgresql env: - REDMINE_VER=4.0-stable DB=postgresql - REDMINE_VER=3.4-stable DB=postgresql + - REDMINE_VER=4.0-stable DB=mysql + - REDMINE_VER=3.4-stable DB=mysql sudo: true -addons: - postgresql: "9.6" +matrix: + exclude: + - rvm: 2.6.3 + env: REDMINE_VER=3.4-stable DB=mysql + - rvm: 2.6.3 + env: REDMINE_VER=3.4-stable DB=postgresql + - rvm: 2.5.5 + env: REDMINE_VER=3.4-stable DB=mysql + - rvm: 2.5.5 + env: REDMINE_VER=3.4-stable DB=postgresql notifications: webhooks: @@ -26,6 +41,7 @@ before_install: - export REDMINE_GIT_REPO=git://github.com/redmine/redmine.git - export REDMINE_PATH=$HOME/redmine - export BUNDLE_GEMFILE=$REDMINE_PATH/Gemfile + - export RAILS_ENV=test - git clone $REDMINE_GIT_REPO $REDMINE_PATH - cd $REDMINE_PATH - if [[ "$REDMINE_VER" != "master" ]]; then git checkout -b $REDMINE_VER origin/$REDMINE_VER; fi @@ -34,12 +50,7 @@ before_install: - cp $TRAVIS_BUILD_DIR/test/support/database-$DB-travis.yml $REDMINE_PATH/config/database.yml before_script: - # - bundle exec rake redmine:load_default_data REDMINE_LANG=en - # - bundle exec rake db:structure:dump - - psql -c 'create database travis_ci_test;' -U postgres - # - bundle exec rake db:create - - bundle exec rake db:migrate - - bundle exec rake redmine:plugins:migrate + - bundle exec rake db:create db:migrate redmine:plugins:migrate script: - export SKIP_COVERAGE=1 diff --git a/CHANGELOG.md b/CHANGELOG.md index aea29fb..e8e2408 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Changelog 1.0.5 ----- -- ruby 2.3.x or newer is required +- ruby 2.4.x or newer is required 1.0.4 diff --git a/Gemfile b/Gemfile index e7117a8..cd397d6 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,8 @@ gem 'slim-rails' gem 'validate_url' + +group :development, :test do + gem 'brakeman', require: false + gem 'rubocop', require: false + gem 'rubocop-performance', require: false +end diff --git a/README.md b/README.md index df38ce9..bf9d036 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Requirements ------------ * Redmine version >= 3.0.0 -* Ruby version >= 2.3.0 +* Ruby version >= 2.4.0 Installation diff --git a/init.rb b/init.rb index 5c215ae..71d20e2 100644 --- a/init.rb +++ b/init.rb @@ -1,7 +1,6 @@ raise "\n\033[31mredmine_messenger requires ruby 2.3 or newer. Please update your ruby version.\033[0m" if RUBY_VERSION < '2.3' -require 'redmine' -require 'redmine_messenger' +require_dependency 'redmine_messenger' Redmine::Plugin.register :redmine_messenger do name 'Redmine Messenger' @@ -41,3 +40,13 @@ Redmine::Plugin.register :redmine_messenger do post_password_updates: '0' }, partial: 'settings/messenger_settings' end + +begin + if ActiveRecord::Base.connection.table_exists?(Setting.table_name) + Rails.configuration.to_prepare do + RedmineMessenger.setup + end + end +rescue ActiveRecord::NoDatabaseError + Rails.logger.error 'database not created yet' +end diff --git a/lib/redmine_messenger.rb b/lib/redmine_messenger.rb index 32e1869..2476a13 100644 --- a/lib/redmine_messenger.rb +++ b/lib/redmine_messenger.rb @@ -1,11 +1,27 @@ -Rails.configuration.to_prepare do - module RedmineMessenger - REDMINE_CONTACTS_SUPPORT = Redmine::Plugin.installed?('redmine_contacts') ? true : false - REDMINE_DB_SUPPORT = Redmine::Plugin.installed?('redmine_db') ? true : false - # this does not work at the moment, because redmine loads passwords after messener plugin - REDMINE_PASSWORDS_SUPPORT = Redmine::Plugin.installed?('redmine_passwords') ? true : false +module RedmineMessenger + REDMINE_CONTACTS_SUPPORT = Redmine::Plugin.installed?('redmine_contacts') ? true : false + REDMINE_DB_SUPPORT = Redmine::Plugin.installed?('redmine_db') ? true : false + # this does not work at the moment, because redmine loads passwords after messener plugin + REDMINE_PASSWORDS_SUPPORT = Redmine::Plugin.installed?('redmine_passwords') ? true : false - def self.settings + class << self + def setup + # Patches + Issue.send(:include, RedmineMessenger::Patches::IssuePatch) + WikiPage.send(:include, RedmineMessenger::Patches::WikiPagePatch) + ProjectsController.send :helper, MessengerProjectsHelper + Contact.send(:include, RedmineMessenger::Patches::ContactPatch) if RedmineMessenger::REDMINE_CONTACTS_SUPPORT + DbEntry.send(:include, RedmineMessenger::Patches::DbEntryPatch) if RedmineMessenger::REDMINE_DB_SUPPORT + Password.send(:include, RedmineMessenger::Patches::PasswordPatch) if Redmine::Plugin.installed?('redmine_passwords') + + # Global helpers + ActionView::Base.send :include, RedmineMessenger::Helpers + + # Hooks + require_dependency 'redmine_messenger/hooks' + end + + def settings if Setting[:plugin_redmine_messenger].class == Hash if Rails.version >= '5.2' # convert Rails 4 data @@ -21,24 +37,10 @@ Rails.configuration.to_prepare do end end - def self.setting?(value) + def setting?(value) return true if settings[value].to_i == 1 false end end - - # Patches - Issue.send(:include, RedmineMessenger::Patches::IssuePatch) - WikiPage.send(:include, RedmineMessenger::Patches::WikiPagePatch) - ProjectsController.send :helper, MessengerProjectsHelper - Contact.send(:include, RedmineMessenger::Patches::ContactPatch) if RedmineMessenger::REDMINE_CONTACTS_SUPPORT - DbEntry.send(:include, RedmineMessenger::Patches::DbEntryPatch) if RedmineMessenger::REDMINE_DB_SUPPORT - Password.send(:include, RedmineMessenger::Patches::PasswordPatch) if Redmine::Plugin.installed?('redmine_passwords') - - # Global helpers - ActionView::Base.send :include, RedmineMessenger::Helpers - - # Hooks - require_dependency 'redmine_messenger/hooks' end diff --git a/test/support/database-mysql-travis.yml b/test/support/database-mysql-travis.yml new file mode 100644 index 0000000..2acc077 --- /dev/null +++ b/test/support/database-mysql-travis.yml @@ -0,0 +1,8 @@ +test: + adapter: mysql2 + database: travis_ci_test + host: localhost + username: root + password: + pool: 5 + encoding: utf8mb4 From b68d2d9f6fb91466d15cfc6d4961aa973a13bd27 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Sun, 22 Dec 2019 09:05:18 +0100 Subject: [PATCH 09/24] Working on Redmine 4.1 support; drop Redmine 3.x support --- .rubocop.yml | 20 ++++++++++------ .travis.yml | 26 +++++---------------- CHANGELOG.md | 7 ++++++ Gemfile | 2 -- README.md | 2 +- db/migrate/001_create_messenger_settings.rb | 2 +- db/migrate/002_add_default_mentions.rb | 2 +- db/migrate/003_add_private_settings.rb | 2 +- init.rb | 4 ++-- lib/redmine_messenger.rb | 23 +++++++----------- test/unit/i18n_test.rb | 6 +---- 11 files changed, 42 insertions(+), 54 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index f6bb2ef..8bdfaf5 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,5 +1,6 @@ require: - rubocop-performance + - rubocop-rails Rails: Enabled: true @@ -15,32 +16,37 @@ Metrics/BlockLength: Max: 60 Metrics/ClassLength: - Max: 500 + Enabled: false Metrics/CyclomaticComplexity: Max: 20 -Metrics/LineLength: +Layout/LineLength: Max: 140 Metrics/MethodLength: Max: 60 Metrics/ModuleLength: - Max: 500 + Enabled: false Metrics/PerceivedComplexity: Max: 25 -Rails/SkipsModelValidations: +Rails/ApplicationJob: + Enabled: false + +Rails/ApplicationRecord: Enabled: false Rails/CreateTableWithTimestamps: Enabled: false -# we drop this, if we drop Rails 4.2 support -Rails/ApplicationRecord: - Enabled: false +Rails/HelperInstanceVariable: + Enabled: false + +Rails/SkipsModelValidations: + Enabled: false Performance/ChainArrayAllocation: Enabled: true diff --git a/.travis.yml b/.travis.yml index 4d2a924..89e34b9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,9 +2,9 @@ language: ruby dist: xenial rvm: - - 2.6.3 - - 2.5.5 - - 2.4.6 + - 2.6.5 + - 2.5.7 + - 2.4.9 services: - mysql @@ -12,23 +12,12 @@ services: env: - REDMINE_VER=4.0-stable DB=postgresql - - REDMINE_VER=3.4-stable DB=postgresql + - REDMINE_VER=master DB=postgresql - REDMINE_VER=4.0-stable DB=mysql - - REDMINE_VER=3.4-stable DB=mysql + - REDMINE_VER=master DB=mysql sudo: true -matrix: - exclude: - - rvm: 2.6.3 - env: REDMINE_VER=3.4-stable DB=mysql - - rvm: 2.6.3 - env: REDMINE_VER=3.4-stable DB=postgresql - - rvm: 2.5.5 - env: REDMINE_VER=3.4-stable DB=mysql - - rvm: 2.5.5 - env: REDMINE_VER=3.4-stable DB=postgresql - notifications: webhooks: urls: @@ -54,7 +43,4 @@ before_script: script: - export SKIP_COVERAGE=1 - - if [[ "$REDMINE_VER" == "master" ]]; then bundle exec rake redmine:plugins:test:units NAME=$PLUGIN_NAME; fi - - if [[ "$REDMINE_VER" == "master" ]]; then bundle exec rake redmine:plugins:test:functionals NAME=$PLUGIN_NAME; fi - - if [[ "$REDMINE_VER" == "master" ]]; then bundle exec rake redmine:plugins:test:integration NAME=$PLUGIN_NAME; fi - - if [[ "$REDMINE_VER" != "master" ]]; then bundle exec rake redmine:plugins:test NAME=$PLUGIN_NAME RUBYOPT="-W0"; fi + - bundle exec rake redmine:plugins:test NAME=$PLUGIN_NAME RUBYOPT="-W0" diff --git a/CHANGELOG.md b/CHANGELOG.md index e8e2408..8651367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========= +1.0.6 +----- + +- Redmine 4 is required +- Redmine 4.1 support + + 1.0.5 ----- diff --git a/Gemfile b/Gemfile index cd397d6..474e102 100644 --- a/Gemfile +++ b/Gemfile @@ -3,6 +3,4 @@ gem 'validate_url' group :development, :test do gem 'brakeman', require: false - gem 'rubocop', require: false - gem 'rubocop-performance', require: false end diff --git a/README.md b/README.md index bf9d036..f54f17b 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Go to Rocket.Chat documentation [Incoming WebHook Scripting](https://rocket.chat Requirements ------------ -* Redmine version >= 3.0.0 +* Redmine version >= 4.0.0 * Ruby version >= 2.4.0 diff --git a/db/migrate/001_create_messenger_settings.rb b/db/migrate/001_create_messenger_settings.rb index 0fe489a..392db49 100644 --- a/db/migrate/001_create_messenger_settings.rb +++ b/db/migrate/001_create_messenger_settings.rb @@ -1,4 +1,4 @@ -class CreateMessengerSettings < Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2] +class CreateMessengerSettings < ActiveRecord::Migration[4.2] def change create_table :messenger_settings do |t| t.references :project, null: false, index: true diff --git a/db/migrate/002_add_default_mentions.rb b/db/migrate/002_add_default_mentions.rb index 1412e78..3f5221f 100644 --- a/db/migrate/002_add_default_mentions.rb +++ b/db/migrate/002_add_default_mentions.rb @@ -1,4 +1,4 @@ -class AddDefaultMentions < Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2] +class AddDefaultMentions < ActiveRecord::Migration[4.2] def change add_column :messenger_settings, :default_mentions, :string end diff --git a/db/migrate/003_add_private_settings.rb b/db/migrate/003_add_private_settings.rb index bd89d42..f9194c3 100644 --- a/db/migrate/003_add_private_settings.rb +++ b/db/migrate/003_add_private_settings.rb @@ -1,4 +1,4 @@ -class AddPrivateSettings < Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2] +class AddPrivateSettings < ActiveRecord::Migration[4.2] def change add_column :messenger_settings, :post_private_contacts, :integer, default: 0, null: false add_column :messenger_settings, :post_private_db, :integer, default: 0, null: false diff --git a/init.rb b/init.rb index 71d20e2..29e0ea9 100644 --- a/init.rb +++ b/init.rb @@ -8,9 +8,9 @@ Redmine::Plugin.register :redmine_messenger do url 'https://github.com/alphanodes/redmine_messenger' author_url 'https://alphanodes.com/' description 'Messenger integration for Slack, Discord, Rocketchat and Mattermost support' - version '1.0.5' + version '1.0.6' - requires_redmine version_or_higher: '3.0.0' + requires_redmine version_or_higher: '4.0.0' permission :manage_messenger, projects: :settings, messenger_settings: :update diff --git a/lib/redmine_messenger.rb b/lib/redmine_messenger.rb index 2476a13..8de5dc5 100644 --- a/lib/redmine_messenger.rb +++ b/lib/redmine_messenger.rb @@ -7,15 +7,15 @@ module RedmineMessenger class << self def setup # Patches - Issue.send(:include, RedmineMessenger::Patches::IssuePatch) - WikiPage.send(:include, RedmineMessenger::Patches::WikiPagePatch) + Issue.include RedmineMessenger::Patches::IssuePatch + WikiPage.include RedmineMessenger::Patches::WikiPagePatch ProjectsController.send :helper, MessengerProjectsHelper - Contact.send(:include, RedmineMessenger::Patches::ContactPatch) if RedmineMessenger::REDMINE_CONTACTS_SUPPORT - DbEntry.send(:include, RedmineMessenger::Patches::DbEntryPatch) if RedmineMessenger::REDMINE_DB_SUPPORT - Password.send(:include, RedmineMessenger::Patches::PasswordPatch) if Redmine::Plugin.installed?('redmine_passwords') + Contact.include(RedmineMessenger::Patches::ContactPatch) if RedmineMessenger::REDMINE_CONTACTS_SUPPORT + DbEntry.include(RedmineMessenger::Patches::DbEntryPatch) if RedmineMessenger::REDMINE_DB_SUPPORT + Password.include(RedmineMessenger::Patches::PasswordPatch) if Redmine::Plugin.installed?('redmine_passwords') # Global helpers - ActionView::Base.send :include, RedmineMessenger::Helpers + ActionView::Base.include RedmineMessenger::Helpers # Hooks require_dependency 'redmine_messenger/hooks' @@ -23,14 +23,9 @@ module RedmineMessenger def settings if Setting[:plugin_redmine_messenger].class == Hash - if Rails.version >= '5.2' - # convert Rails 4 data - new_settings = ActiveSupport::HashWithIndifferentAccess.new(Setting[:plugin_redmine_messenger]) - Setting.plugin_redmine_messenger = new_settings - new_settings - else - ActionController::Parameters.new(Setting[:plugin_redmine_messenger]) - end + new_settings = ActiveSupport::HashWithIndifferentAccess.new(Setting[:plugin_redmine_messenger]) + Setting.plugin_redmine_messenger = new_settings + new_settings else # Rails 5 uses ActiveSupport::HashWithIndifferentAccess Setting[:plugin_redmine_messenger] diff --git a/test/unit/i18n_test.rb b/test/unit/i18n_test.rb index cccaa19..8e2dbda 100644 --- a/test/unit/i18n_test.rb +++ b/test/unit/i18n_test.rb @@ -17,11 +17,7 @@ class I18nTest < ActiveSupport::TestCase end def test_locales_validness - lang_files_count = Dir[Rails.root.join('plugins', - 'redmine_messenger', - 'config', - 'locales', - '*.yml')].size + lang_files_count = Dir[Rails.root.join('plugins/redmine_messenger/config/locales/*.yml')].size assert_equal lang_files_count, 4 valid_languages.each do |lang| assert set_language_if_valid(lang) From 0e9235875b551726905d5a54e2d35201cbe44d27 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Sun, 22 Dec 2019 10:08:18 +0100 Subject: [PATCH 10/24] #43 documentation has been added for older redmine --- CHANGELOG.md | 2 +- README.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8651367..d8c0d83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Changelog 1.0.6 ----- -- Redmine 4 is required +- Redmine 4 is required. Use git tag 1.0.5, if you use an older version. - Redmine 4.1 support diff --git a/README.md b/README.md index f54f17b..ad35605 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ Requirements * Redmine version >= 4.0.0 * Ruby version >= 2.4.0 +If you want to use it with Redmine 3.x, use git tag 1.0.5 Installation ------------ From 94a09c0803548b0b9632a2fea0f297e54325805c Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Thu, 26 Dec 2019 15:08:38 +0100 Subject: [PATCH 11/24] #40 fixed status and priority information --- .rubocop.yml | 4 ++-- lib/redmine_messenger/patches/issue_patch.rb | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8bdfaf5..886aabb 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -10,10 +10,10 @@ AllCops: TargetRailsVersion: 5.2 Metrics/AbcSize: - Max: 65 + Enabled: false Metrics/BlockLength: - Max: 60 + Enabled: false Metrics/ClassLength: Enabled: false diff --git a/lib/redmine_messenger/patches/issue_patch.rb b/lib/redmine_messenger/patches/issue_patch.rb index 73dca00..a86ef74 100644 --- a/lib/redmine_messenger/patches/issue_patch.rb +++ b/lib/redmine_messenger/patches/issue_patch.rb @@ -68,12 +68,13 @@ module RedmineMessenger end fields = current_journal.details.map { |d| Messenger.detail_to_field d } - if status_id != status_id_was + if saved_change_to_status_id? fields << { title: I18n.t(:field_status), value: ERB::Util.html_escape(status.to_s), short: true } end - if priority_id != priority_id_was + + if saved_change_to_priority_id? fields << { title: I18n.t(:field_priority), value: ERB::Util.html_escape(priority.to_s), short: true } From 0ae4da5e4020f1820c7436ba44aab461bf796013 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Thu, 26 Dec 2019 15:35:20 +0100 Subject: [PATCH 12/24] #35 fixed description info --- lib/redmine_messenger/patches/issue_patch.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/redmine_messenger/patches/issue_patch.rb b/lib/redmine_messenger/patches/issue_patch.rb index a86ef74..a0df5b1 100644 --- a/lib/redmine_messenger/patches/issue_patch.rb +++ b/lib/redmine_messenger/patches/issue_patch.rb @@ -63,8 +63,8 @@ module RedmineMessenger set_language_if_valid Setting.default_language attachment = {} - if current_journal.notes.present? && Messenger.setting_for_project(project, :updated_include_description) - attachment[:text] = Messenger.markup_format(current_journal.notes) + if saved_change_to_description? && Messenger.setting_for_project(project, :updated_include_description) + attachment[:text] = Messenger.markup_format(description) end fields = current_journal.details.map { |d| Messenger.detail_to_field d } @@ -88,7 +88,7 @@ module RedmineMessenger Messenger.speak(l(:label_messenger_issue_updated, project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", - url: send_messenger_mention_url(project, current_journal.notes), + url: send_messenger_mention_url(project, description), user: current_journal.user), channels, url, attachment: attachment, project: project) end From 49b282e63834a7b05c33f869656889e8ebb8f4de Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Thu, 26 Dec 2019 17:24:28 +0100 Subject: [PATCH 13/24] #38 fix problem with escaping --- app/models/messenger.rb | 446 +++++++++--------- lib/redmine_messenger/hooks.rb | 4 +- .../patches/contact_patch.rb | 4 +- .../patches/db_entry_patch.rb | 4 +- lib/redmine_messenger/patches/issue_patch.rb | 20 +- .../patches/password_patch.rb | 4 +- .../patches/wiki_page_patch.rb | 4 +- 7 files changed, 248 insertions(+), 238 deletions(-) diff --git a/app/models/messenger.rb b/app/models/messenger.rb index 7683021..cdefda6 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -3,251 +3,261 @@ require 'net/http' class Messenger include Redmine::I18n - def self.markup_format(text) - # TODO: output format should be markdown, but at the moment there is no - # solution without using pandoc (http://pandoc.org/), which requires - # packages on os level - # - # Redmine::WikiFormatting.html_parser.to_text(text) - ERB::Util.html_escape(text) - end + class << self + def markup_format(text) + # TODO: output format should be markdown, but at the moment there is no + # solution without using pandoc (http://pandoc.org/), which requires + # packages on os level + # + # Redmine::WikiFormatting.html_parser.to_text(text) - def self.default_url_options - { only_path: true, script_name: Redmine::Utils.relative_url_root } - end + text = text.to_s + text.gsub!('&', '&') + text.gsub!('<', '<') + text.gsub!('>', '>') - def self.speak(msg, channels, url, options) - url ||= RedmineMessenger.settings[:messenger_url] - - return if url.blank? - return if channels.blank? - - params = { - text: msg, - link_names: 1 - } - - username = Messenger.textfield_for_project(options[:project], :messenger_username) - params[:username] = username if username.present? - params[:attachments] = [options[:attachment]] if options[:attachment]&.any? - - icon = Messenger.textfield_for_project(options[:project], :messenger_icon) - if icon.present? - if icon.start_with? ':' - params[:icon_emoji] = icon - else - params[:icon_url] = icon - end + text end - channels.each do |channel| - uri = URI(url) - params[:channel] = channel - http_options = { use_ssl: uri.scheme == 'https' } - http_options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE unless RedmineMessenger.setting?(:messenger_verify_ssl) + def default_url_options + { only_path: true, script_name: Redmine::Utils.relative_url_root } + end - begin - req = Net::HTTP::Post.new(uri) - req.set_form_data(payload: params.to_json) - Net::HTTP.start(uri.hostname, uri.port, http_options) do |http| - response = http.request(req) - Rails.logger.warn(response) unless [Net::HTTPSuccess, Net::HTTPRedirection, Net::HTTPOK].include? response + def speak(msg, channels, url, options) + url ||= RedmineMessenger.settings[:messenger_url] + + return if url.blank? + return if channels.blank? + + params = { + text: msg, + link_names: 1 + } + + username = Messenger.textfield_for_project(options[:project], :messenger_username) + params[:username] = username if username.present? + params[:attachments] = [options[:attachment]] if options[:attachment]&.any? + + icon = Messenger.textfield_for_project(options[:project], :messenger_icon) + if icon.present? + if icon.start_with? ':' + params[:icon_emoji] = icon + else + params[:icon_url] = icon + end + end + + channels.each do |channel| + uri = URI(url) + params[:channel] = channel + http_options = { use_ssl: uri.scheme == 'https' } + http_options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE unless RedmineMessenger.setting?(:messenger_verify_ssl) + + begin + req = Net::HTTP::Post.new(uri) + req.set_form_data(payload: params.to_json) + Net::HTTP.start(uri.hostname, uri.port, http_options) do |http| + response = http.request(req) + Rails.logger.warn(response) unless [Net::HTTPSuccess, Net::HTTPRedirection, Net::HTTPOK].include? response + end + rescue StandardError => e + Rails.logger.warn("cannot connect to #{url}") + Rails.logger.warn(e) end - rescue StandardError => e - Rails.logger.warn("cannot connect to #{url}") - Rails.logger.warn(e) end end - end - def self.object_url(obj) - 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) - Rails.application.routes.url_for(obj.event_url(host: host, protocol: Setting.protocol, port: port, script_name: prefix)) - else - Rails.application.routes.url_for(obj.event_url(host: Setting.host_name, protocol: Setting.protocol, script_name: '')) - end - end - - def self.url_for_project(proj) - return if proj.blank? - - # project based - pm = MessengerSetting.find_by(project_id: proj.id) - return pm.messenger_url if !pm.nil? && pm.messenger_url.present? - - # parent project based - parent_url = url_for_project(proj.parent) - return parent_url if parent_url.present? - # system based - return RedmineMessenger.settings[:messenger_url] if RedmineMessenger.settings[:messenger_url].present? - - nil - end - - def self.textfield_for_project(proj, config) - return if proj.blank? - - # project based - pm = MessengerSetting.find_by(project_id: proj.id) - return pm.send(config) if !pm.nil? && pm.send(config).present? - - default_textfield(proj, config) - end - - def self.default_textfield(proj, config) - # parent project based - parent_field = textfield_for_project(proj.parent, config) - return parent_field if parent_field.present? - return RedmineMessenger.settings[config] if RedmineMessenger.settings[config].present? - - '' - end - - def self.channels_for_project(proj) - return [] if proj.blank? - - # project based - pm = MessengerSetting.find_by(project_id: proj.id) - if !pm.nil? && pm.messenger_channel.present? - return [] if pm.messenger_channel == '-' - - return pm.messenger_channel.split(',').map!(&:strip).uniq - end - default_project_channels(proj) - end - - def self.default_project_channels(proj) - # parent project based - parent_channel = channels_for_project(proj.parent) - return parent_channel if parent_channel.present? - # system based - if RedmineMessenger.settings[:messenger_channel].present? && - RedmineMessenger.settings[:messenger_channel] != '-' - return RedmineMessenger.settings[:messenger_channel].split(',').map!(&:strip).uniq + def object_url(obj) + 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) + Rails.application.routes.url_for(obj.event_url(host: host, protocol: Setting.protocol, port: port, script_name: prefix)) + else + Rails.application.routes.url_for(obj.event_url(host: Setting.host_name, protocol: Setting.protocol, script_name: '')) + end end - [] - end + def url_for_project(proj) + return if proj.blank? - def self.setting_for_project(proj, config) - return false if proj.blank? + # project based + pm = MessengerSetting.find_by(project_id: proj.id) + return pm.messenger_url if !pm.nil? && pm.messenger_url.present? - @setting_found = 0 - # project based - pm = MessengerSetting.find_by(project_id: proj.id) - unless pm.nil? || pm.send(config).zero? - @setting_found = 1 - return false if pm.send(config) == 1 - return true if pm.send(config) == 2 - # 0 = use system based settings + # parent project based + parent_url = url_for_project(proj.parent) + return parent_url if parent_url.present? + # system based + return RedmineMessenger.settings[:messenger_url] if RedmineMessenger.settings[:messenger_url].present? + + nil end - default_project_setting(proj, config) - end - def self.default_project_setting(proj, config) - if proj.present? && proj.parent.present? - parent_setting = setting_for_project(proj.parent, config) - return parent_setting if @setting_found == 1 + def textfield_for_project(proj, config) + return if proj.blank? + + # project based + pm = MessengerSetting.find_by(project_id: proj.id) + return pm.send(config) if !pm.nil? && pm.send(config).present? + + default_textfield(proj, config) end - # system based - return true if RedmineMessenger.settings[config].present? && RedmineMessenger.setting?(config) - false - end + def default_textfield(proj, config) + # parent project based + parent_field = textfield_for_project(proj.parent, config) + return parent_field if parent_field.present? + return RedmineMessenger.settings[config] if RedmineMessenger.settings[config].present? - def self.detail_to_field(detail) - field_format = nil - key = nil - escape = true + '' + end - if detail.property == 'cf' - key = CustomField.find(detail.prop_key).name rescue nil - title = key - field_format = CustomField.find(detail.prop_key).field_format rescue nil - elsif detail.property == 'attachment' - key = 'attachment' - title = I18n.t :label_attachment - else - key = detail.prop_key.to_s.sub('_id', '') - title = if key == 'parent' - I18n.t "field_#{key}_issue" + def channels_for_project(proj) + return [] if proj.blank? + + # project based + pm = MessengerSetting.find_by(project_id: proj.id) + if !pm.nil? && pm.messenger_channel.present? + return [] if pm.messenger_channel == '-' + + return pm.messenger_channel.split(',').map!(&:strip).uniq + end + default_project_channels(proj) + end + + def setting_for_project(proj, config) + return false if proj.blank? + + @setting_found = 0 + # project based + pm = MessengerSetting.find_by(project_id: proj.id) + unless pm.nil? || pm.send(config).zero? + @setting_found = 1 + return false if pm.send(config) == 1 + return true if pm.send(config) == 2 + # 0 = use system based settings + end + default_project_setting(proj, config) + end + + def default_project_setting(proj, config) + if proj.present? && proj.parent.present? + parent_setting = setting_for_project(proj.parent, config) + return parent_setting if @setting_found == 1 + end + # system based + return true if RedmineMessenger.settings[config].present? && RedmineMessenger.setting?(config) + + false + end + + def detail_to_field(detail) + field_format = nil + key = nil + escape = true + + if detail.property == 'cf' + key = CustomField.find(detail.prop_key).name rescue nil + title = key + field_format = CustomField.find(detail.prop_key).field_format rescue nil + elsif detail.property == 'attachment' + key = 'attachment' + title = I18n.t :label_attachment + else + key = detail.prop_key.to_s.sub('_id', '') + title = if key == 'parent' + I18n.t "field_#{key}_issue" + else + I18n.t "field_#{key}" + end + end + + short = true + value = detail.value.to_s + + case key + when 'title', 'subject', 'description' + short = false + when 'tracker' + tracker = Tracker.find(detail.value) + value = tracker.to_s if tracker.present? + when 'project' + project = Project.find(detail.value) + value = project.to_s if project.present? + when 'status' + status = IssueStatus.find(detail.value) + value = status.to_s if status.present? + when 'priority' + priority = IssuePriority.find(detail.value) + value = priority.to_s if priority.present? + when 'category' + category = IssueCategory.find(detail.value) + value = category.to_s if category.present? + when 'assigned_to' + user = User.find(detail.value) + value = user.to_s if user.present? + when 'fixed_version' + fixed_version = Version.find(detail.value) + value = fixed_version.to_s if fixed_version.present? + when 'attachment' + attachment = Attachment.find(detail.prop_key) + value = "<#{Messenger.object_url attachment}|#{markup_format(attachment.filename)}>" if attachment.present? + escape = false + when 'parent' + issue = Issue.find(detail.value) + value = "<#{Messenger.object_url issue}|#{markup_format(issue)}>" if issue.present? + escape = false + end + + if detail.property == 'cf' && field_format == 'version' + version = Version.find(detail.value) + value = version.to_s if version.present? + end + + value = if value.present? + if escape + markup_format(value) + else + value + end else - I18n.t "field_#{key}" + '-' end + + result = { title: title, value: value } + result[:short] = true if short + result end - short = true - value = detail.value.to_s - - case key - when 'title', 'subject', 'description' - short = false - when 'tracker' - tracker = Tracker.find(detail.value) - value = tracker.to_s if tracker.present? - when 'project' - project = Project.find(detail.value) - value = project.to_s if project.present? - when 'status' - status = IssueStatus.find(detail.value) - value = status.to_s if status.present? - when 'priority' - priority = IssuePriority.find(detail.value) - value = priority.to_s if priority.present? - when 'category' - category = IssueCategory.find(detail.value) - value = category.to_s if category.present? - when 'assigned_to' - user = User.find(detail.value) - value = user.to_s if user.present? - when 'fixed_version' - fixed_version = Version.find(detail.value) - value = fixed_version.to_s if fixed_version.present? - when 'attachment' - attachment = Attachment.find(detail.prop_key) - value = "<#{Messenger.object_url attachment}|#{ERB::Util.html_escape(attachment.filename)}>" if attachment.present? - escape = false - when 'parent' - issue = Issue.find(detail.value) - value = "<#{Messenger.object_url issue}|#{ERB::Util.html_escape(issue)}>" if issue.present? - escape = false + def mentions(project, text) + names = [] + Messenger.textfield_for_project(project, :default_mentions) + .split(',').each { |m| names.push m.strip } + names += extract_usernames(text) unless text.nil? + names.present? ? ' To: ' + names.uniq.join(', ') : nil end - if detail.property == 'cf' && field_format == 'version' - version = Version.find(detail.value) - value = version.to_s if version.present? + private + + def extract_usernames(text) + text = '' if text.nil? + # messenger usernames may only contain lowercase letters, numbers, + # dashes, dots and underscores and must start with a letter or number. + text.scan(/@[a-z0-9][a-z0-9_\-.]*/).uniq end - value = if value.present? - if escape - ERB::Util.html_escape(value) - else - value - end - else - '-' - end + def default_project_channels(proj) + # parent project based + parent_channel = channels_for_project(proj.parent) + return parent_channel if parent_channel.present? + # system based + if RedmineMessenger.settings[:messenger_channel].present? && + RedmineMessenger.settings[:messenger_channel] != '-' + return RedmineMessenger.settings[:messenger_channel].split(',').map!(&:strip).uniq + end - result = { title: title, value: value } - result[:short] = true if short - result - end - - def self.mentions(project, text) - names = [] - Messenger.textfield_for_project(project, :default_mentions) - .split(',').each { |m| names.push m.strip } - names += extract_usernames(text) unless text.nil? - names.present? ? ' To: ' + names.uniq.join(', ') : nil - end - - def self.extract_usernames(text) - text = '' if text.nil? - # messenger usernames may only contain lowercase letters, numbers, - # dashes, dots and underscores and must start with a letter or number. - text.scan(/@[a-z0-9][a-z0-9_\-.]*/).uniq + [] + end end end diff --git a/lib/redmine_messenger/hooks.rb b/lib/redmine_messenger/hooks.rb index c651366..bc191eb 100644 --- a/lib/redmine_messenger/hooks.rb +++ b/lib/redmine_messenger/hooks.rb @@ -11,7 +11,7 @@ module RedmineMessenger 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 = "[#{ERB::Util.html_escape(issue.project)}] #{ERB::Util.html_escape(journal.user.to_s)} updated <#{Messenger.object_url issue}|#{ERB::Util.html_escape(issue)}>" + 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 @@ -43,7 +43,7 @@ module RedmineMessenger end attachment = {} - attachment[:text] = ll(Setting.default_language, :text_status_changed_by_changeset, "<#{revision_url}|#{ERB::Util.html_escape(changeset.comments)}>") + 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) diff --git a/lib/redmine_messenger/patches/contact_patch.rb b/lib/redmine_messenger/patches/contact_patch.rb index eb874d3..f7aaa92 100644 --- a/lib/redmine_messenger/patches/contact_patch.rb +++ b/lib/redmine_messenger/patches/contact_patch.rb @@ -22,7 +22,7 @@ module RedmineMessenger return unless channels.present? && url Messenger.speak(l(:label_messenger_contact_created, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: "<#{Messenger.object_url self}|#{name}>", user: User.current), channels, url, project: project) @@ -40,7 +40,7 @@ module RedmineMessenger return unless channels.present? && url Messenger.speak(l(:label_messenger_contact_updated, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: "<#{Messenger.object_url self}|#{name}>", user: User.current), channels, url, project: project) diff --git a/lib/redmine_messenger/patches/db_entry_patch.rb b/lib/redmine_messenger/patches/db_entry_patch.rb index 6f55fae..813c083 100644 --- a/lib/redmine_messenger/patches/db_entry_patch.rb +++ b/lib/redmine_messenger/patches/db_entry_patch.rb @@ -22,7 +22,7 @@ module RedmineMessenger return unless channels.present? && url Messenger.speak(l(:label_messenger_db_entry_created, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: "<#{Messenger.object_url self}|#{name}>", user: User.current), channels, url, project: project) @@ -40,7 +40,7 @@ module RedmineMessenger return unless channels.present? && url Messenger.speak(l(:label_messenger_db_entry_updated, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: "<#{Messenger.object_url self}|#{name}>", user: User.current), channels, url, project: project) diff --git a/lib/redmine_messenger/patches/issue_patch.rb b/lib/redmine_messenger/patches/issue_patch.rb index a0df5b1..ae62779 100644 --- a/lib/redmine_messenger/patches/issue_patch.rb +++ b/lib/redmine_messenger/patches/issue_patch.rb @@ -24,27 +24,27 @@ module RedmineMessenger attachment[:text] = Messenger.markup_format(description) end attachment[:fields] = [{ title: I18n.t(:field_status), - value: ERB::Util.html_escape(status.to_s), + value: Messenger.markup_format(status.to_s), short: true }, { title: I18n.t(:field_priority), - value: ERB::Util.html_escape(priority.to_s), + value: Messenger.markup_format(priority.to_s), short: true }] if assigned_to.present? attachment[:fields] << { title: I18n.t(:field_assigned_to), - value: ERB::Util.html_escape(assigned_to.to_s), + value: Messenger.markup_format(assigned_to.to_s), short: true } end if RedmineMessenger.setting?(:display_watchers) && watcher_users.count.positive? attachment[:fields] << { title: I18n.t(:field_watcher), - value: ERB::Util.html_escape(watcher_users.join(', ')), + value: Messenger.markup_format(watcher_users.join(', ')), short: true } end Messenger.speak(l(:label_messenger_issue_created, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: send_messenger_mention_url(project, description), user: author), channels, url, attachment: attachment, project: project) @@ -70,24 +70,24 @@ module RedmineMessenger fields = current_journal.details.map { |d| Messenger.detail_to_field d } if saved_change_to_status_id? fields << { title: I18n.t(:field_status), - value: ERB::Util.html_escape(status.to_s), + value: Messenger.markup_format(status.to_s), short: true } end if saved_change_to_priority_id? fields << { title: I18n.t(:field_priority), - value: ERB::Util.html_escape(priority.to_s), + value: Messenger.markup_format(priority.to_s), short: true } end if assigned_to.present? fields << { title: I18n.t(:field_assigned_to), - value: ERB::Util.html_escape(assigned_to.to_s), + value: Messenger.markup_format(assigned_to.to_s), short: true } end attachment[:fields] = fields if fields.any? Messenger.speak(l(:label_messenger_issue_updated, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: send_messenger_mention_url(project, description), user: current_journal.user), channels, url, attachment: attachment, project: project) @@ -101,7 +101,7 @@ module RedmineMessenger Messenger.textfield_for_project(project, :default_mentions).present? mention_to = Messenger.mentions(project, text) end - "<#{Messenger.object_url(self)}|#{ERB::Util.html_escape(self)}>#{mention_to}" + "<#{Messenger.object_url(self)}|#{Messenger.markup_format(self)}>#{mention_to}" end end end diff --git a/lib/redmine_messenger/patches/password_patch.rb b/lib/redmine_messenger/patches/password_patch.rb index 31c855e..6dea40a 100644 --- a/lib/redmine_messenger/patches/password_patch.rb +++ b/lib/redmine_messenger/patches/password_patch.rb @@ -22,7 +22,7 @@ module RedmineMessenger return unless channels.present? && url Messenger.speak(l(:label_messenger_password_created, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: "<#{Messenger.object_url self}|#{name}>", user: User.current), channels, url, project: project) @@ -40,7 +40,7 @@ module RedmineMessenger return unless channels.present? && url Messenger.speak(l(:label_messenger_password_updated, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: "<#{Messenger.object_url self}|#{name}>", user: User.current), channels, url, project: project) diff --git a/lib/redmine_messenger/patches/wiki_page_patch.rb b/lib/redmine_messenger/patches/wiki_page_patch.rb index 5288bac..d67d8eb 100644 --- a/lib/redmine_messenger/patches/wiki_page_patch.rb +++ b/lib/redmine_messenger/patches/wiki_page_patch.rb @@ -21,7 +21,7 @@ module RedmineMessenger return unless channels.present? && url Messenger.speak(l(:label_messenger_wiki_created, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: "<#{Messenger.object_url self}|#{title}>", user: User.current), channels, url, project: project) @@ -44,7 +44,7 @@ module RedmineMessenger end Messenger.speak(l(:label_messenger_wiki_updated, - project_url: "<#{Messenger.object_url project}|#{ERB::Util.html_escape(project)}>", + project_url: "<#{Messenger.object_url project}|#{Messenger.markup_format(project)}>", url: "<#{Messenger.object_url self}|#{title}>", user: content.author), channels, url, project: project, attachment: attachment) From 9be229f1c4676ac85a277e2a48ec21a35eaed9e5 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Thu, 26 Dec 2019 17:42:36 +0100 Subject: [PATCH 14/24] Add rubocop to travis --- .rubocop.yml | 20 +------------------- .travis.yml | 2 ++ app/models/messenger.rb | 4 ++-- lib/redmine_messenger/hooks.rb | 7 +++++-- test/support/Gemfile.local | 3 +++ 5 files changed, 13 insertions(+), 23 deletions(-) create mode 100644 test/support/Gemfile.local diff --git a/.rubocop.yml b/.rubocop.yml index 886aabb..287f769 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -9,30 +9,12 @@ AllCops: TargetRubyVersion: 2.3 TargetRailsVersion: 5.2 -Metrics/AbcSize: +Metrics: Enabled: false -Metrics/BlockLength: - Enabled: false - -Metrics/ClassLength: - Enabled: false - -Metrics/CyclomaticComplexity: - Max: 20 - Layout/LineLength: Max: 140 -Metrics/MethodLength: - Max: 60 - -Metrics/ModuleLength: - Enabled: false - -Metrics/PerceivedComplexity: - Max: 25 - Rails/ApplicationJob: Enabled: false diff --git a/.travis.yml b/.travis.yml index 89e34b9..971a6fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,7 @@ before_install: - git clone $REDMINE_GIT_REPO $REDMINE_PATH - cd $REDMINE_PATH - if [[ "$REDMINE_VER" != "master" ]]; then git checkout -b $REDMINE_VER origin/$REDMINE_VER; fi + - if [[ "$REDMINE_VER" != "master" ]]; then cp $TRAVIS_BUILD_DIR/test/support/Gemfile.local $REDMINE_PATH; fi - ln -s $TRAVIS_BUILD_DIR $REDMINE_PATH/plugins/$PLUGIN_NAME - cp $TRAVIS_BUILD_DIR/test/support/additional_environment.rb $REDMINE_PATH/config/ - cp $TRAVIS_BUILD_DIR/test/support/database-$DB-travis.yml $REDMINE_PATH/config/database.yml @@ -43,4 +44,5 @@ before_script: script: - export SKIP_COVERAGE=1 + - if [[ "$REDMINE_VER" != "master" ]] && [[ "$DB" == "postgresql" ]]; then rubocop plugins/$PLUGIN_NAME; fi - bundle exec rake redmine:plugins:test NAME=$PLUGIN_NAME RUBYOPT="-W0" diff --git a/app/models/messenger.rb b/app/models/messenger.rb index cdefda6..69d665d 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -158,9 +158,9 @@ class Messenger escape = true if detail.property == 'cf' - key = CustomField.find(detail.prop_key).name rescue nil + key = CustomField.find(detail.prop_key)&.name title = key - field_format = CustomField.find(detail.prop_key).field_format rescue nil + field_format = CustomField.find(detail.prop_key)&.field_format elsif detail.property == 'attachment' key = 'attachment' title = I18n.t :label_attachment diff --git a/lib/redmine_messenger/hooks.rb b/lib/redmine_messenger/hooks.rb index bc191eb..1b0a62d 100644 --- a/lib/redmine_messenger/hooks.rb +++ b/lib/redmine_messenger/hooks.rb @@ -11,7 +11,8 @@ module RedmineMessenger 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)}>" + 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 @@ -43,7 +44,9 @@ module RedmineMessenger end attachment = {} - attachment[:text] = ll(Setting.default_language, :text_status_changed_by_changeset, "<#{revision_url}|#{Messenger.markup_format(changeset.comments)}>") + 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) diff --git a/test/support/Gemfile.local b/test/support/Gemfile.local new file mode 100644 index 0000000..aad214b --- /dev/null +++ b/test/support/Gemfile.local @@ -0,0 +1,3 @@ +gem 'rubocop', require: false +gem 'rubocop-performance', require: false +gem 'rubocop-rails', require: false From 7cba13f8cd3acc72da19837462eff348b7bbfba3 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Thu, 26 Dec 2019 18:25:19 +0100 Subject: [PATCH 15/24] Fix custom fields --- app/models/messenger.rb | 11 ++++++++--- lib/redmine_messenger/patches/contact_patch.rb | 4 ++-- lib/redmine_messenger/patches/db_entry_patch.rb | 4 ++-- lib/redmine_messenger/patches/issue_patch.rb | 4 ++-- lib/redmine_messenger/patches/password_patch.rb | 4 ++-- lib/redmine_messenger/patches/wiki_page_patch.rb | 4 ++-- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/app/models/messenger.rb b/app/models/messenger.rb index 69d665d..98656ac 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -156,14 +156,19 @@ class Messenger field_format = nil key = nil escape = true + value = detail.value.to_s if detail.property == 'cf' key = CustomField.find(detail.prop_key)&.name - title = key - field_format = CustomField.find(detail.prop_key)&.field_format + unless key.nil? + title = key + field_format = CustomField.find(detail.prop_key)&.field_format + value = IssuesController.helpers.format_value(detail.value, detail.custom_field) if detail.value.present? + end elsif detail.property == 'attachment' key = 'attachment' title = I18n.t :label_attachment + value = detail.value.to_s else key = detail.prop_key.to_s.sub('_id', '') title = if key == 'parent' @@ -171,10 +176,10 @@ class Messenger else I18n.t "field_#{key}" end + value = detail.value.to_s end short = true - value = detail.value.to_s case key when 'title', 'subject', 'description' diff --git a/lib/redmine_messenger/patches/contact_patch.rb b/lib/redmine_messenger/patches/contact_patch.rb index f7aaa92..532f50e 100644 --- a/lib/redmine_messenger/patches/contact_patch.rb +++ b/lib/redmine_messenger/patches/contact_patch.rb @@ -4,8 +4,8 @@ module RedmineMessenger def self.included(base) base.send(:include, InstanceMethods) base.class_eval do - after_create :send_messenger_create - after_update :send_messenger_update + after_create_commit :send_messenger_create + after_update_commit :send_messenger_update end end diff --git a/lib/redmine_messenger/patches/db_entry_patch.rb b/lib/redmine_messenger/patches/db_entry_patch.rb index 813c083..1ec5211 100644 --- a/lib/redmine_messenger/patches/db_entry_patch.rb +++ b/lib/redmine_messenger/patches/db_entry_patch.rb @@ -4,8 +4,8 @@ module RedmineMessenger def self.included(base) base.send(:include, InstanceMethods) base.class_eval do - after_create :send_messenger_create - after_update :send_messenger_update + after_create_commit :send_messenger_create + after_update_commit :send_messenger_update end end diff --git a/lib/redmine_messenger/patches/issue_patch.rb b/lib/redmine_messenger/patches/issue_patch.rb index ae62779..d8b1a66 100644 --- a/lib/redmine_messenger/patches/issue_patch.rb +++ b/lib/redmine_messenger/patches/issue_patch.rb @@ -4,8 +4,8 @@ module RedmineMessenger def self.included(base) base.send(:include, InstanceMethods) base.class_eval do - after_create :send_messenger_create - after_update :send_messenger_update + after_create_commit :send_messenger_create + after_update_commit :send_messenger_update end end diff --git a/lib/redmine_messenger/patches/password_patch.rb b/lib/redmine_messenger/patches/password_patch.rb index 6dea40a..b71139b 100644 --- a/lib/redmine_messenger/patches/password_patch.rb +++ b/lib/redmine_messenger/patches/password_patch.rb @@ -4,8 +4,8 @@ module RedmineMessenger def self.included(base) base.send(:include, InstanceMethods) base.class_eval do - after_create :send_messenger_create - after_update :send_messenger_update + after_create_commit :send_messenger_create + after_update_commit :send_messenger_update end end diff --git a/lib/redmine_messenger/patches/wiki_page_patch.rb b/lib/redmine_messenger/patches/wiki_page_patch.rb index d67d8eb..1486d8e 100644 --- a/lib/redmine_messenger/patches/wiki_page_patch.rb +++ b/lib/redmine_messenger/patches/wiki_page_patch.rb @@ -4,8 +4,8 @@ module RedmineMessenger def self.included(base) base.send(:include, InstanceMethods) base.class_eval do - after_create :send_messenger_create - after_update :send_messenger_update + after_create_commit :send_messenger_create + after_update_commit :send_messenger_update end end From d027d77141e868bbe972c6642c79b6a761a02657 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Fri, 27 Dec 2019 06:23:47 +0100 Subject: [PATCH 16/24] Add administrator link to project settings --- app/views/messenger_settings/_show.html.slim | 109 +++++----- .../settings/_messenger_settings.html.slim | 190 +++++++++--------- 2 files changed, 152 insertions(+), 147 deletions(-) diff --git a/app/views/messenger_settings/_show.html.slim b/app/views/messenger_settings/_show.html.slim index c8ba65d..9e7f8d7 100644 --- a/app/views/messenger_settings/_show.html.slim +++ b/app/views/messenger_settings/_show.html.slim @@ -1,12 +1,17 @@ -.box.tabular.messenger_settings - - @messenger_setting = MessengerSetting.find_or_create(@project.id) - = labelled_form_for :setting, - @messenger_setting, - url: project_messenger_setting_path(project_id: @project), - method: :put, - class: 'tabular' do |f| - = error_messages_for 'messenger_setting' - .box += error_messages_for 'messenger_setting' + +- @messenger_setting = MessengerSetting.find_or_create(@project.id) += labelled_form_for :setting, + @messenger_setting, + url: project_messenger_setting_path(project_id: @project), + method: :put, + class: 'tabular' do |f| + + fieldset#messenger_settings.box.tabular + - if User.current.admin? + .contextual + = link_to l(:label_administration), plugin_settings_path(id: 'redmine_messenger'), class: 'icon icon-settings' + .info = t(:messenger_settings_project_intro) br p @@ -21,50 +26,50 @@ = render partial: 'messenger_settings/messenger_text', locals: { f: f, mf: :messenger_username, size: 30 } = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :messenger_verify_ssl } + fieldset#messenger_settings.box.tabular + legend = l(:label_issue_plural) + .info = t(:messenger_issue_intro) + br + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :auto_mentions } + = render partial: 'messenger_settings/messenger_text', locals: { f: f, mf: :default_mentions, size: 30 } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :display_watchers } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_updates } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :new_include_description } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :updated_include_description } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_private_issues } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_private_notes } + + fieldset#messenger_settings.box.tabular + legend = l(:label_wiki) + .info = t(:messenger_wiki_intro) + br + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_wiki } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_wiki_updates } + + - if RedmineMessenger::REDMINE_DB_SUPPORT && User.current.allowed_to?(:view_db_entries, @project) + fieldset#messenger_settings.box.tabular + legend = l(:label_db_entry_plural) + .info = t(:messenger_db_intro) br - h3 = l(:label_issue_plural) - .info = t(:messenger_issue_intro) + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_db } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_db_updates } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_private_db } + + - if RedmineMessenger::REDMINE_CONTACTS_SUPPORT && User.current.allowed_to?(:view_contacts, @project) + fieldset#messenger_settings.box.tabular + legend = l(:label_contact_plural) + .info = t(:messenger_contacts_intro) br - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :auto_mentions } - = render partial: 'messenger_settings/messenger_text', locals: { f: f, mf: :default_mentions, size: 30 } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :display_watchers } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_updates } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :new_include_description } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :updated_include_description } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_private_issues } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_private_notes } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_contact } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_contact_updates } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_private_contacts } - br - h3 = l(:label_wiki) - .info = t(:messenger_wiki_intro) - br - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_wiki } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_wiki_updates } + - if Redmine::Plugin.installed?('redmine_passwords') && User.current.allowed_to?(:view_passwords, @project) + fieldset#messenger_settings.box.tabular + legend = l(:label_settings_post_password) + .info = t(:messenger_passwords_intro) + br + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password_updates } - - if RedmineMessenger::REDMINE_DB_SUPPORT && User.current.allowed_to?(:view_db_entries, @project) - br - h3 = l(:label_db_entry_plural) - .info = t(:messenger_db_intro) - br - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_db } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_db_updates } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_private_db } - - - if RedmineMessenger::REDMINE_CONTACTS_SUPPORT && User.current.allowed_to?(:view_contacts, @project) - br - h3 = l(:label_contact_plural) - .info = t(:messenger_contacts_intro) - br - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_contact } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_contact_updates } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_private_contacts } - - - if Redmine::Plugin.installed?('redmine_passwords') && User.current.allowed_to?(:view_passwords, @project) - br - h3 = l(:label_settings_post_password) - .info = t(:messenger_passwords_intro) - br - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password_updates } - - = submit_tag l(:button_save) + = submit_tag l(:button_save) diff --git a/app/views/settings/_messenger_settings.html.slim b/app/views/settings/_messenger_settings.html.slim index 0e1a31a..6742cab 100644 --- a/app/views/settings/_messenger_settings.html.slim +++ b/app/views/settings/_messenger_settings.html.slim @@ -1,105 +1,105 @@ -- @settings = ActionController::Parameters.new(@settings) unless Rails.version >= '5.2' - .info = t(:messenger_settings_intro) br -p - = content_tag(:label, l(:label_settings_messenger_url)) - = text_field_tag('settings[messenger_url]', @settings[:messenger_url], size: 60, placeholder: 'https://webhook.url') - em.info = t(:messenger_url_info_html) -p - = content_tag(:label, l(:label_settings_messenger_icon)) - = text_field_tag('settings[messenger_icon]', @settings[:messenger_icon], size: 60) -p - = content_tag(:label, l(:label_settings_messenger_channel)) - = text_field_tag('settings[messenger_channel]', @settings[:messenger_channel], size: 30, placeholder: 'redmine') - em.info = t(:messenger_channel_info_html) -p - = content_tag(:label, l(:label_settings_messenger_username)) - = text_field_tag('settings[messenger_username]', @settings[:messenger_username], size: 30) -p - = content_tag(:label, l(:label_settings_messenger_verify_ssl)) - = check_box_tag 'settings[messenger_verify_ssl]', 1, @settings[:messenger_verify_ssl].to_i == 1 - em.info = t(:messenger_verify_ssl_info_html) -br -h3 = l(:label_issue_plural) -.info = t(:messenger_issue_intro) -br -p - = content_tag(:label, l(:label_settings_auto_mentions)) - = check_box_tag 'settings[auto_mentions]', 1, @settings[:auto_mentions].to_i == 1 -p - = content_tag(:label, l(:label_settings_default_mentions)) - = text_field_tag('settings[default_mentions]', @settings[:default_mentions], size: 30) - em.info = t(:default_mentionsl_info) -p - = content_tag(:label, l(:label_settings_display_watchers)) - = check_box_tag 'settings[display_watchers]', 1, @settings[:display_watchers].to_i == 1 -p - = content_tag(:label, l(:label_settings_post_updates)) - = check_box_tag 'settings[post_updates]', 1, @settings[:post_updates].to_i == 1 -p - = content_tag(:label, l(:label_settings_new_include_description)) - = check_box_tag 'settings[new_include_description]', 1, @settings[:new_include_description].to_i == 1 -p - = content_tag(:label, l(:label_settings_updated_include_description)) - = check_box_tag 'settings[updated_include_description]', 1, @settings[:updated_include_description].to_i == 1 -p - = content_tag(:label, l(:label_settings_post_private_issues)) - = check_box_tag 'settings[post_private_issues]', 1, @settings[:post_private_issues].to_i == 1 -p - = content_tag(:label, l(:label_settings_post_private_notes)) - = check_box_tag 'settings[post_private_notes]', 1, @settings[:post_private_notes].to_i == 1 +fieldset#messenger_settings.box.tabular + p + = content_tag(:label, l(:label_settings_messenger_url)) + = text_field_tag('settings[messenger_url]', @settings[:messenger_url], size: 60, placeholder: 'https://webhook.url') + em.info = t(:messenger_url_info_html) + p + = content_tag(:label, l(:label_settings_messenger_icon)) + = text_field_tag('settings[messenger_icon]', @settings[:messenger_icon], size: 60) + p + = content_tag(:label, l(:label_settings_messenger_channel)) + = text_field_tag('settings[messenger_channel]', @settings[:messenger_channel], size: 30, placeholder: 'redmine') + em.info = t(:messenger_channel_info_html) + p + = content_tag(:label, l(:label_settings_messenger_username)) + = text_field_tag('settings[messenger_username]', @settings[:messenger_username], size: 30) + p + = content_tag(:label, l(:label_settings_messenger_verify_ssl)) + = check_box_tag 'settings[messenger_verify_ssl]', 1, @settings[:messenger_verify_ssl].to_i == 1 + em.info = t(:messenger_verify_ssl_info_html) -br -h3 = l(:label_wiki) -.info = t(:messenger_wiki_intro) -br -p - = content_tag(:label, l(:label_settings_post_wiki)) - = check_box_tag 'settings[post_wiki]', 1, @settings[:post_wiki].to_i == 1 -p - = content_tag(:label, l(:label_settings_post_wiki_updates)) - = check_box_tag 'settings[post_wiki_updates]', 1, @settings[:post_wiki_updates].to_i == 1 +fieldset#messenger_settings.box.tabular + legend = l(:label_issue_plural) + .info = t(:messenger_issue_intro) + br + p + = content_tag(:label, l(:label_settings_auto_mentions)) + = check_box_tag 'settings[auto_mentions]', 1, @settings[:auto_mentions].to_i == 1 + p + = content_tag(:label, l(:label_settings_default_mentions)) + = text_field_tag('settings[default_mentions]', @settings[:default_mentions], size: 30) + em.info = t(:default_mentionsl_info) + p + = content_tag(:label, l(:label_settings_display_watchers)) + = check_box_tag 'settings[display_watchers]', 1, @settings[:display_watchers].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_updates)) + = check_box_tag 'settings[post_updates]', 1, @settings[:post_updates].to_i == 1 + p + = content_tag(:label, l(:label_settings_new_include_description)) + = check_box_tag 'settings[new_include_description]', 1, @settings[:new_include_description].to_i == 1 + p + = content_tag(:label, l(:label_settings_updated_include_description)) + = check_box_tag 'settings[updated_include_description]', 1, @settings[:updated_include_description].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_private_issues)) + = check_box_tag 'settings[post_private_issues]', 1, @settings[:post_private_issues].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_private_notes)) + = check_box_tag 'settings[post_private_notes]', 1, @settings[:post_private_notes].to_i == 1 + +fieldset#messenger_settings.box.tabular + legend = l(:label_wiki) + .info = t(:messenger_wiki_intro) + br + p + = content_tag(:label, l(:label_settings_post_wiki)) + = check_box_tag 'settings[post_wiki]', 1, @settings[:post_wiki].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_wiki_updates)) + = check_box_tag 'settings[post_wiki_updates]', 1, @settings[:post_wiki_updates].to_i == 1 - if RedmineMessenger::REDMINE_DB_SUPPORT - br - h3 = l(:label_db_entry_plural) - .info = t(:messenger_db_intro) - br - p - = content_tag(:label, l(:label_settings_post_db)) - = check_box_tag 'settings[post_db]', 1, @settings[:post_db].to_i == 1 - p - = content_tag(:label, l(:label_settings_post_db_updates)) - = check_box_tag 'settings[post_db_updates]', 1, @settings[:post_db_updates].to_i == 1 - p - = content_tag(:label, l(:label_settings_post_private_db)) - = check_box_tag 'settings[post_private_db]', 1, @settings[:post_private_db].to_i == 1 + fieldset#messenger_settings.box.tabular + legend = l(:label_db_entry_plural) + .info = t(:messenger_db_intro) + br + p + = content_tag(:label, l(:label_settings_post_db)) + = check_box_tag 'settings[post_db]', 1, @settings[:post_db].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_db_updates)) + = check_box_tag 'settings[post_db_updates]', 1, @settings[:post_db_updates].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_private_db)) + = check_box_tag 'settings[post_private_db]', 1, @settings[:post_private_db].to_i == 1 - if RedmineMessenger::REDMINE_CONTACTS_SUPPORT - br - h3 = l(:label_contact_plural) - .info = t(:messenger_contacts_intro) - br - p - = content_tag(:label, l(:label_settings_post_contact)) - = check_box_tag 'settings[post_contact]', 1, @settings[:post_contact].to_i == 1 - p - = content_tag(:label, l(:label_settings_post_contact_updates)) - = check_box_tag 'settings[post_contact_updates]', 1, @settings[:post_contact_updates].to_i == 1 - p - = content_tag(:label, l(:label_settings_post_private_contacts)) - = check_box_tag 'settings[post_private_contacts]', 1, @settings[:post_private_contacts].to_i == 1 + fieldset#messenger_settings.box.tabular + legend = l(:label_contact_plural) + .info = t(:messenger_contacts_intro) + br + p + = content_tag(:label, l(:label_settings_post_contact)) + = check_box_tag 'settings[post_contact]', 1, @settings[:post_contact].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_contact_updates)) + = check_box_tag 'settings[post_contact_updates]', 1, @settings[:post_contact_updates].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_private_contacts)) + = check_box_tag 'settings[post_private_contacts]', 1, @settings[:post_private_contacts].to_i == 1 - if Redmine::Plugin.installed?('redmine_passwords') - br - h3 = l(:label_password_plural) - .info = t(:messenger_passwords_intro) - br - p - = content_tag(:label, l(:label_settings_post_password)) - = check_box_tag 'settings[post_password]', 1, @settings[:post_password].to_i == 1 - p - = content_tag(:label, l(:label_settings_post_password_updates)) - = check_box_tag 'settings[post_password_updates]', 1, @settings[:post_password_updates].to_i == 1 + fieldset#messenger_settings.box.tabular + legend = l(:label_password_plural) + .info = t(:messenger_passwords_intro) + br + p + = content_tag(:label, l(:label_settings_post_password)) + = check_box_tag 'settings[post_password]', 1, @settings[:post_password].to_i == 1 + p + = content_tag(:label, l(:label_settings_post_password_updates)) + = check_box_tag 'settings[post_password_updates]', 1, @settings[:post_password_updates].to_i == 1 From 8b1fad1745195de40cbad2679efec0f80fa13025 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Fri, 27 Dec 2019 07:57:33 +0100 Subject: [PATCH 17/24] Fix template for password fieldset --- app/views/messenger_settings/_show.html.slim | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/messenger_settings/_show.html.slim b/app/views/messenger_settings/_show.html.slim index 9e7f8d7..b5fd3df 100644 --- a/app/views/messenger_settings/_show.html.slim +++ b/app/views/messenger_settings/_show.html.slim @@ -66,10 +66,10 @@ - if Redmine::Plugin.installed?('redmine_passwords') && User.current.allowed_to?(:view_passwords, @project) fieldset#messenger_settings.box.tabular - legend = l(:label_settings_post_password) - .info = t(:messenger_passwords_intro) - br - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password } - = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password_updates } + legend = l(:label_settings_post_password) + .info = t(:messenger_passwords_intro) + br + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password } + = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password_updates } = submit_tag l(:button_save) From 3a9101eda9d5bf15a551e5deb0b8afce91a3a9b7 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Fri, 27 Dec 2019 07:59:43 +0100 Subject: [PATCH 18/24] Fix password label --- app/views/messenger_settings/_show.html.slim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/messenger_settings/_show.html.slim b/app/views/messenger_settings/_show.html.slim index b5fd3df..ba63e2d 100644 --- a/app/views/messenger_settings/_show.html.slim +++ b/app/views/messenger_settings/_show.html.slim @@ -66,7 +66,7 @@ - if Redmine::Plugin.installed?('redmine_passwords') && User.current.allowed_to?(:view_passwords, @project) fieldset#messenger_settings.box.tabular - legend = l(:label_settings_post_password) + legend = l(:label_password_plural) .info = t(:messenger_passwords_intro) br = render partial: 'messenger_settings/messenger_select', locals: { f: f, mf: :post_password } From 2563b8007cb87f88699c55505b0613b08ce7d345 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Tue, 31 Dec 2019 13:43:06 +0100 Subject: [PATCH 19/24] Fix another problem with notes --- app/models/messenger.rb | 1 - lib/redmine_messenger/patches/issue_patch.rb | 13 +++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/models/messenger.rb b/app/models/messenger.rb index 98656ac..babbfe9 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -37,7 +37,6 @@ class Messenger username = Messenger.textfield_for_project(options[:project], :messenger_username) params[:username] = username if username.present? params[:attachments] = [options[:attachment]] if options[:attachment]&.any? - icon = Messenger.textfield_for_project(options[:project], :messenger_icon) if icon.present? if icon.start_with? ':' diff --git a/lib/redmine_messenger/patches/issue_patch.rb b/lib/redmine_messenger/patches/issue_patch.rb index d8b1a66..5764d07 100644 --- a/lib/redmine_messenger/patches/issue_patch.rb +++ b/lib/redmine_messenger/patches/issue_patch.rb @@ -63,8 +63,17 @@ module RedmineMessenger set_language_if_valid Setting.default_language attachment = {} - if saved_change_to_description? && Messenger.setting_for_project(project, :updated_include_description) - attachment[:text] = Messenger.markup_format(description) + if Messenger.setting_for_project(project, :updated_include_description) + attachment[:text] = Messenger.markup_format(description) if saved_change_to_description? + + if current_journal.notes.present? + if attachment[:text].present? + attachment[:text] << content_tag('p', l(:label_comment)) + attachment[:text] << Messenger.markup_format(current_journal.notes) + else + attachment[:text] = Messenger.markup_format(current_journal.notes) + end + end end fields = current_journal.details.map { |d| Messenger.detail_to_field d } From 8e4bc584d7a1729e4cc25dc3f8230ca8921d4f37 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Tue, 31 Dec 2019 13:45:16 +0100 Subject: [PATCH 20/24] Update documentationg --- CHANGELOG.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8c0d83..5732a99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Changelog - Redmine 4 is required. Use git tag 1.0.5, if you use an older version. - Redmine 4.1 support - +- Fix problems with changed fields, description and notes 1.0.5 ----- diff --git a/README.md b/README.md index ad35605..1ba4ca0 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ Install ``redmine_messenger`` plugin for `Redmine` cd $REDMINE_ROOT git clone https://github.com/AlphaNodes/redmine_messenger.git plugins/redmine_messenger - bundle install --without development test + bundle update bundle exec rake redmine:plugins:migrate RAILS_ENV=production Make sure that the directory is named `redmine_messenger` (you cannot use another name for it)! From 43b5ad945a921654cdd88e95023ed9d1670dec58 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Tue, 31 Dec 2019 13:50:14 +0100 Subject: [PATCH 21/24] Add bug to Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5732a99..789ed22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Changelog - Redmine 4 is required. Use git tag 1.0.5, if you use an older version. - Redmine 4.1 support - Fix problems with changed fields, description and notes +- fix problems with quotes #38 1.0.5 ----- From b0977a54e84213f2eb010d7da910abe6faec36d9 Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Wed, 1 Jan 2020 18:40:00 +0100 Subject: [PATCH 22/24] Add uninstall test to travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 971a6fc..2b2c7da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,3 +46,4 @@ script: - export SKIP_COVERAGE=1 - if [[ "$REDMINE_VER" != "master" ]] && [[ "$DB" == "postgresql" ]]; then rubocop plugins/$PLUGIN_NAME; fi - bundle exec rake redmine:plugins:test NAME=$PLUGIN_NAME RUBYOPT="-W0" + - bundle exec rake redmine:plugins:migrate NAME=$PLUGIN_NAME VERSION=0 From b2e7cca6391f47c2728f2c869152c6e671e16dfa Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Tue, 7 Jan 2020 08:33:58 +0100 Subject: [PATCH 23/24] #38 fix for Redmine 4.1 for frozen string --- app/models/messenger.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/messenger.rb b/app/models/messenger.rb index babbfe9..f56a63b 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -1,4 +1,5 @@ require 'net/http' +require 'uri' class Messenger include Redmine::I18n @@ -11,7 +12,7 @@ class Messenger # # Redmine::WikiFormatting.html_parser.to_text(text) - text = text.to_s + text = +text.to_s text.gsub!('&', '&') text.gsub!('<', '<') text.gsub!('>', '>') @@ -51,13 +52,12 @@ class Messenger params[:channel] = channel http_options = { use_ssl: uri.scheme == 'https' } http_options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE unless RedmineMessenger.setting?(:messenger_verify_ssl) - begin req = Net::HTTP::Post.new(uri) req.set_form_data(payload: params.to_json) Net::HTTP.start(uri.hostname, uri.port, http_options) do |http| response = http.request(req) - Rails.logger.warn(response) unless [Net::HTTPSuccess, Net::HTTPRedirection, Net::HTTPOK].include? response + Rails.logger.warn(response.inspect) unless [Net::HTTPSuccess, Net::HTTPRedirection, Net::HTTPOK].include? response end rescue StandardError => e Rails.logger.warn("cannot connect to #{url}") From 164bc700e11d66144e2d18b90ef4bc4f479d95dd Mon Sep 17 00:00:00 2001 From: Alexander Meindl Date: Tue, 7 Jan 2020 13:22:53 +0100 Subject: [PATCH 24/24] Fix bug with assigned_to field twice and fallback values, if objects do not exist anymore --- app/models/messenger.rb | 49 +++++++++++--------- lib/redmine_messenger/patches/issue_patch.rb | 6 +-- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/app/models/messenger.rb b/app/models/messenger.rb index f56a63b..638df89 100644 --- a/app/models/messenger.rb +++ b/app/models/messenger.rb @@ -184,41 +184,39 @@ class Messenger when 'title', 'subject', 'description' short = false when 'tracker' - tracker = Tracker.find(detail.value) - value = tracker.to_s if tracker.present? + value = object_field_value(Tracker, detail.value) when 'project' - project = Project.find(detail.value) - value = project.to_s if project.present? + value = object_field_value(Project, detail.value) when 'status' - status = IssueStatus.find(detail.value) - value = status.to_s if status.present? + value = object_field_value(IssueStatus, detail.value) when 'priority' - priority = IssuePriority.find(detail.value) - value = priority.to_s if priority.present? + value = object_field_value(IssuePriority, detail.value) when 'category' - category = IssueCategory.find(detail.value) - value = category.to_s if category.present? + value = object_field_value(IssueCategory, detail.value) when 'assigned_to' - user = User.find(detail.value) - value = user.to_s if user.present? + value = object_field_value(User, detail.value) when 'fixed_version' - fixed_version = Version.find(detail.value) - value = fixed_version.to_s if fixed_version.present? + value = object_field_value(Version, detail.value) when 'attachment' attachment = Attachment.find(detail.prop_key) - value = "<#{Messenger.object_url attachment}|#{markup_format(attachment.filename)}>" if attachment.present? - escape = false + value = if attachment.present? + escape = false + "<#{Messenger.object_url attachment}|#{markup_format(attachment.filename)}>" + else + detail.prop_key.to_s + end + when 'parent' issue = Issue.find(detail.value) - value = "<#{Messenger.object_url issue}|#{markup_format(issue)}>" if issue.present? - escape = false - end - - if detail.property == 'cf' && field_format == 'version' - version = Version.find(detail.value) - value = version.to_s if version.present? + value = if issue.present? + escape = false + "<#{Messenger.object_url issue}|#{markup_format(issue)}>" + else + detail.value.to_s + end end + value = object_field_value(Version, detail.value) if detail.property == 'cf' && field_format == 'version' value = if value.present? if escape markup_format(value) @@ -244,6 +242,11 @@ class Messenger private + def object_field_value(klass, id) + obj = klass.find_by(id: id) + obj.nil? ? id.to_s : obj.to_s + end + def extract_usernames(text) text = '' if text.nil? # messenger usernames may only contain lowercase letters, numbers, diff --git a/lib/redmine_messenger/patches/issue_patch.rb b/lib/redmine_messenger/patches/issue_patch.rb index 5764d07..dcada8d 100644 --- a/lib/redmine_messenger/patches/issue_patch.rb +++ b/lib/redmine_messenger/patches/issue_patch.rb @@ -88,11 +88,7 @@ module RedmineMessenger value: Messenger.markup_format(priority.to_s), short: true } end - if assigned_to.present? - fields << { title: I18n.t(:field_assigned_to), - value: Messenger.markup_format(assigned_to.to_s), - short: true } - end + attachment[:fields] = fields if fields.any? Messenger.speak(l(:label_messenger_issue_updated,