]> source.dussan.org Git - redmine.git/commitdiff
Create a journal and send an email when an issue is closed by commit (#609).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 6 Feb 2008 20:02:30 +0000 (20:02 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 6 Feb 2008 20:02:30 +0000 (20:02 +0000)
The redmine user is found using the committer username or email. Otherwise, the journal is created with anonymous user.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1126 e93f8b46-1217-0410-a6f0-8f06a7374b81

24 files changed:
app/models/changeset.rb
lang/bg.yml
lang/cs.yml
lang/de.yml
lang/en.yml
lang/es.yml
lang/fi.yml
lang/fr.yml
lang/he.yml
lang/it.yml
lang/ja.yml
lang/ko.yml
lang/lt.yml
lang/nl.yml
lang/pl.yml
lang/pt-br.yml
lang/pt.yml
lang/ro.yml
lang/ru.yml
lang/sr.yml
lang/sv.yml
lang/zh-tw.yml
lang/zh.yml
test/unit/repository_test.rb

index 1b79104c4ce9f7553be78337d218d80c0b3c0bdc..3703ab927787793740a2bf0bea78ab4e4c651075 100644 (file)
@@ -48,6 +48,7 @@ class Changeset < ActiveRecord::Base
   def after_create
     scan_comment_for_issue_ids
   end
+  require 'pp'
   
   def scan_comment_for_issue_ids
     return if comments.blank?
@@ -79,11 +80,14 @@ class Changeset < ActiveRecord::Base
         # update status of issues
         logger.debug "Issues fixed by changeset #{self.revision}: #{issue_ids.join(', ')}." if logger && logger.debug?
         target_issues.each do |issue|
-          # don't change the status is the issue is already closed
+          # don't change the status is the issue is closed
           next if issue.status.is_closed?
+          user = committer_user || User.anonymous
+          journal = issue.init_journal(user, l(:text_status_changed_by_changeset, "r#{self.revision}"))
           issue.status = fix_status
           issue.done_ratio = done_ratio if done_ratio
           issue.save
+          Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
         end
       end
       referenced_issues += target_issues
@@ -92,6 +96,16 @@ class Changeset < ActiveRecord::Base
     self.issues = referenced_issues.uniq
   end
 
+  # Returns the Redmine User corresponding to the committer
+  def committer_user
+    if committer && committer.strip =~ /^([^<]+)(<(.*)>)?$/
+      username, email = $1.strip, $3
+      u = User.find_by_login(username)
+      u ||= User.find_by_mail(email) unless email.blank?
+      u
+    end
+  end
+  
   # Returns the previous changeset
   def previous
     @previous ||= Changeset.find(:first, :conditions => ['revision < ? AND repository_id = ?', self.revision, self.repository_id], :order => 'revision DESC')
index b783df59200edf2a40cc2bc4e4e3d660f44fda3e..6fb1cf6de6de799d4f038f715217d1f2bd46642f 100644 (file)
@@ -566,3 +566,4 @@ label_general: Основни
 label_repository_plural: Хранилища
 label_associated_revisions: Асоциирани ревизии
 setting_user_format: Потребителски формат
+text_status_changed_by_changeset: Applied in changeset %s.
index cec7d2a318158d0ca11dc1f4f1708d355900cd79..894568f203bada15f09c935cd00009bf22e9adbb 100644 (file)
@@ -566,3 +566,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index a2222af83436ffcb8cada193871e6d69df88a2ec..668c4333c26370d9c570f2d4edf7843ef88f6875 100644 (file)
@@ -566,3 +566,4 @@ default_activity_development: Entwicklung
 enumeration_issue_priorities: Ticket-Prioritäten
 enumeration_doc_categories: Dokumentenkategorien
 enumeration_activities: Aktivitäten (Zeiterfassung)
+text_status_changed_by_changeset: Applied in changeset %s.
index 8c54e1c79b541711a91224013d9abd4e677d1aed..c056c6ce5aaa9159e387ba5a8b139265dff6c302 100644 (file)
@@ -540,6 +540,7 @@ text_issue_category_reassign_to: Reassign issues to this category
 text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
 text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
 text_load_default_configuration: Load the default configuration
+text_status_changed_by_changeset: Applied in changeset %s.
 
 default_role_manager: Manager
 default_role_developper: Developer
index f8cd9e3006c56c96a9b2126b267ae604c0e48249..b80d821782ccd02182247827cb20cd8a11d540c3 100644 (file)
@@ -569,3 +569,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index cf04b23b41c65aa5a665a8713224e408e7335843..3e297932dee2a09452984ae27c92cd8e94a09bd0 100644 (file)
@@ -570,3 +570,4 @@ enumeration_doc_categories: Dokumentin luokat
 enumeration_activities: Aktiviteetit (ajan seuranta)
 label_associated_revisions: Liittyvät versiot
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 7df8ec6227f37f24b09c2fa4bda3637a23479d63..ac615f03cbbf56e9c3cad1e2de989c0c7d075c3c 100644 (file)
@@ -541,6 +541,7 @@ text_issue_category_reassign_to: Réaffecter les demandes à cette catégorie
 text_user_mail_option: "Pour les projets non sélectionnés, vous recevrez seulement des notifications pour ce que vous surveillez ou à quoi vous participez (exemple: demandes dont vous êtes l'auteur ou la personne assignée)."
 text_no_configuration_data: "Les rôles, trackers, statuts et le workflow ne sont pas encore paramétrés.\nIl est vivement recommandé de charger le paramétrage par defaut. Vous pourrez le modifier une fois chargé."
 text_load_default_configuration: Charger le paramétrage par défaut
+text_status_changed_by_changeset: Appliqué par commit %s.
 
 default_role_manager: Manager
 default_role_developper: Développeur
index 7f26341b878d96491c8ef811b06a4c3a7fbf5533..4063d2fcdd80957b71b5f3a55a8128dcb8fe6da7 100644 (file)
@@ -566,3 +566,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 7b27a54cba5b6e1c863bd84a85086332e01b408b..216a1ada4d3eca0d29a43b8005246cd82e13539e 100644 (file)
@@ -566,3 +566,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 0b3926a232b3f3de834f669437708c3f79b5598a..7607b21ded031df99c9e3d739c473119317f332f 100644 (file)
@@ -567,3 +567,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index b9b9542fc5ab4f1b045266b3ce417487c11604aa..31ac5bf9f8fcb02e42356e3f5a6e9af0a83e5950 100644 (file)
@@ -566,3 +566,4 @@ label_general: 일반
 label_repository_plural: 저장소들
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 6f2965353344a73828d86bd8cce9e96d69c92c77..3aa86702a39b988a609ddc635a6ecbb9e6b3068f 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Saugiklos
 error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: %s"
 label_associated_revisions: susijusios revizijos
 setting_user_format: Vartotojo atvaizdavimo formatas
+text_status_changed_by_changeset: Applied in changeset %s.
index c2d692706cf5d1f33120d50d119f6d03b037ee45..c54273873b98494fe254433422f88fd3f0722875 100644 (file)
@@ -567,3 +567,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 0f99628af2622636f3689578bfc4a912c487ffb3..e3fc957b4df6b889df746414a572285b3f0ecb42 100644 (file)
@@ -566,3 +566,4 @@ label_general: Ogólne
 label_repository_plural: Repozytoria
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 3c6fd12658c4e1da0fce90c960120a45baf78395..ce68c5bac1351d79a0bc1fa2abb87a7b66aac320 100644 (file)
@@ -566,3 +566,4 @@ label_general: General
 label_repository_plural: Repositories\r
 label_associated_revisions: Associated revisions\r
 setting_user_format: Users display format\r
+text_status_changed_by_changeset: Applied in changeset %s.\r
index 3b5647d5318602f2808f7468b67fdd7d12604093..2467055994703d520503559ae16c851c66cc7d70 100644 (file)
@@ -566,3 +566,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 2fed755ac706aa9764ac1369f3cdc5631646fe17..97bb794ddd5286d28365891870b9f1d470a0c454 100644 (file)
@@ -566,3 +566,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 44b1664cff4da9593f7b1cf4f962de3b2ff9f752..1358b648df5c9fd77aea62c8d2e7d5acde18faa1 100644 (file)
@@ -567,3 +567,4 @@ default_activity_development: Разработка
 enumeration_issue_priorities: Приоритеты задач
 enumeration_doc_categories: Категории документов
 enumeration_activities: Действия (учет времени)
+text_status_changed_by_changeset: Applied in changeset %s.
index 3132beeecc74ab73a4c0ab64266b791a8f41ff2c..e6a2680049f5ec294fafacdd8e797eea8aa93826 100644 (file)
@@ -567,3 +567,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index b8a9a3a113bdb349cab72a3959a7fa42543dae70..da03bf0ba615b8f3bec7eca3b47c95144953f07a 100644 (file)
@@ -567,3 +567,4 @@ label_general: General
 label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
+text_status_changed_by_changeset: Applied in changeset %s.
index 94631b86d4e44e4ce945546aed87b29527c3b1f1..833e98b0055b13fc0e12210dcec370cc8376df0b 100644 (file)
@@ -566,3 +566,4 @@ default_activity_development: 開發
 enumeration_issue_priorities: 項目重要性
 enumeration_doc_categories: 文件分類
 enumeration_activities: 活動 (time tracking)
+text_status_changed_by_changeset: Applied in changeset %s.
index 70ee8b13784160b861664bc81f3f2857ba465c96..cdaeeaa04aaabe5084447cdac1b73ce6f7ab4625 100644 (file)
@@ -569,3 +569,4 @@ label_general: 一般
 label_repository_plural: 源代码库
 label_associated_revisions: 相关的版本
 setting_user_format: 用户显示格式
+text_status_changed_by_changeset: Applied in changeset %s.
index 5e0432c6060412cb432bac151a916441441118cd..21fb00b80eec7ebd36d6e27a46be5e5bae46dda7 100644 (file)
 require File.dirname(__FILE__) + '/../test_helper'
 
 class RepositoryTest < Test::Unit::TestCase
-  fixtures :projects, :repositories, :issues, :issue_statuses, :changesets, :changes
+  fixtures :projects,
+           :trackers,
+           :projects_trackers,
+           :repositories,
+           :issues,
+           :issue_statuses,
+           :changesets,
+           :changes,
+           :users,
+           :enumerations
   
   def setup
     @repository = Project.find(1).repository
@@ -42,19 +51,35 @@ class RepositoryTest < Test::Unit::TestCase
     Setting.commit_fix_done_ratio = "90"
     Setting.commit_ref_keywords = 'refs , references, IssueID'
     Setting.commit_fix_keywords = 'fixes , closes'
-
+    Setting.default_language = 'en'
+    ActionMailer::Base.deliveries.clear
+    
     # make sure issue 1 is not already closed
-    assert !Issue.find(1).status.is_closed?
+    fixed_issue = Issue.find(1)
+    assert !fixed_issue.status.is_closed?
+    old_status = fixed_issue.status
         
     Repository.scan_changesets_for_issue_ids
     assert_equal [101, 102], Issue.find(3).changeset_ids
     
     # fixed issues
-    fixed_issue = Issue.find(1)
+    fixed_issue.reload
     assert fixed_issue.status.is_closed?
     assert_equal 90, fixed_issue.done_ratio
     assert_equal [101], fixed_issue.changeset_ids
     
+    # issue change
+    journal = fixed_issue.journals.find(:first, :order => 'created_on desc')
+    assert_equal User.find_by_login('dlopper'), journal.user
+    assert_equal 'Applied in changeset r2.', journal.notes
+    
+    # 2 email notifications
+    assert_equal 2, ActionMailer::Base.deliveries.size
+    mail = ActionMailer::Base.deliveries.first
+    assert_kind_of TMail::Mail, mail
+    assert mail.subject.starts_with?("[#{fixed_issue.project.name} - #{fixed_issue.tracker.name} ##{fixed_issue.id}]")
+    assert mail.body.include?("Status changed from #{old_status} to #{fixed_issue.status}")
+    
     # ignoring commits referencing an issue of another project
     assert_equal [], Issue.find(4).changesets
   end