]> source.dussan.org Git - redmine.git/commitdiff
Adds watchers selection on new issue form (#398). Permission 'add issue watchers...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 22 Dec 2008 19:21:02 +0000 (19:21 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 22 Dec 2008 19:21:02 +0000 (19:21 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2164 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/issues_controller.rb
app/models/mailer.rb
app/views/issues/_form.rhtml
test/functional/issues_controller_test.rb
vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb

index b5009ce3f7be1e571615175f3ef51b0b61e28779..e136582419adb914f14d75e06e621319ad315a85 100644 (file)
@@ -121,7 +121,10 @@ class IssuesController < ApplicationController
       render :nothing => true, :layout => true
       return
     end
-    @issue.attributes = params[:issue]
+    if params[:issue].is_a?(Hash)
+      @issue.attributes = params[:issue]
+      @issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project)
+    end
     @issue.author = User.current
     
     default_status = IssueStatus.default
index 969fcd9ac22bd058904f11532de144f4616b77d9..d9207cd92370a03a351ae50969d9d3c9ebe0cd34 100644 (file)
@@ -28,6 +28,7 @@ class Mailer < ActionMailer::Base
                     'Issue-Author' => issue.author.login
     redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to
     recipients issue.recipients
+    cc(issue.watcher_recipients - @recipients)
     subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}"
     body :issue => issue,
          :issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue)
index 419536feeb027273e87538861752217022ecc08c..dcc55410104d9b7ed221bf3df004a1800b1f5aca 100644 (file)
 <p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
 <% end %>
 
+<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%>
+<p><label>Watchers</label>
+<% @issue.project.users.sort.each do |user| -%>
+<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watcher_user_ids.include?(user.id) %> <%=h user %></label>
+<% end -%>
+</p>
+<% end %>
+
 <%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %>
 
 <%= wikitoolbar_for 'issue_description' %>
index 86340ba63a70bfc2b5092808d0458efa6eb62d0b..49dddf91c829a21c1e1729cad19cccc34beac6a9 100644 (file)
@@ -322,6 +322,30 @@ class IssuesControllerTest < Test::Unit::TestCase
     assert_equal 'activerecord_error_invalid', issue.errors.on(:custom_values)
   end
   
+  def test_post_new_with_watchers
+    @request.session[:user_id] = 2
+    ActionMailer::Base.deliveries.clear
+    
+    assert_difference 'Watcher.count', 2 do
+      post :new, :project_id => 1, 
+                 :issue => {:tracker_id => 1,
+                            :subject => 'This is a new issue with watchers',
+                            :description => 'This is the description',
+                            :priority_id => 5,
+                            :watcher_user_ids => ['2', '3']}
+    end
+    assert_redirected_to 'issues/show'
+    
+    issue = Issue.find_by_subject('This is a new issue with watchers')
+    # Watchers added
+    assert_equal [2, 3], issue.watcher_user_ids.sort
+    assert issue.watched_by?(User.find(3))
+    # Watchers notified
+    mail = ActionMailer::Base.deliveries.last
+    assert_kind_of TMail::Mail, mail
+    assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
+  end
+  
   def test_post_should_preserve_fields_values_on_validation_failure
     @request.session[:user_id] = 2
     post :new, :project_id => 1, 
index 2cb122795997e2b35feff8116a2a5b2b4265ac2c..3d0de0dca3789900580aaaed715136129bdd1698 100644 (file)
@@ -14,6 +14,8 @@ module Redmine
           class_eval do
             has_many :watchers, :as => :watchable, :dependent => :delete_all
             has_many :watcher_users, :through => :watchers, :source => :user
+            
+            attr_protected :watcher_ids, :watcher_user_ids
           end
         end
       end