]> source.dussan.org Git - redmine.git/commitdiff
Add a permission to remove issue watchers (#2450).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 25 Oct 2009 12:11:53 +0000 (12:11 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 25 Oct 2009 12:11:53 +0000 (12:11 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2977 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/watchers_controller.rb
app/helpers/watchers_helper.rb
lib/redmine.rb
test/fixtures/roles.yml
test/functional/watchers_controller_test.rb

index 8e6ee3a9ed3fb3155e5afa124c98190a26a43413..3d4ed54dd9bd674a7889970766c38a41f797a1f6 100644 (file)
@@ -18,7 +18,7 @@
 class WatchersController < ApplicationController
   before_filter :find_project
   before_filter :require_login, :check_project_privacy, :only => [:watch, :unwatch]
-  before_filter :authorize, :only => :new
+  before_filter :authorize, :only => [:new, :destroy]
   
   verify :method => :post,
          :only => [ :watch, :unwatch ],
@@ -48,6 +48,18 @@ class WatchersController < ApplicationController
     render :text => 'Watcher added.', :layout => true
   end
   
+  def destroy
+    @watched.set_watcher(User.find(params[:user_id]), false) if request.post?
+    respond_to do |format|
+      format.html { redirect_to :back }
+      format.js do
+        render :update do |page|
+          page.replace_html 'watchers', :partial => 'watchers/watchers', :locals => {:watched => @watched}
+        end
+      end
+    end
+  end
+  
 private
   def find_project
     klass = Object.const_get(params[:object_type].camelcase)
index f4767ebed2d82eb8d0232c75f24fce3294fd7b03..333b0d2997e1195eecbb47118c1777c194c1e16f 100644 (file)
@@ -36,6 +36,21 @@ module WatchersHelper
   
   # Returns a comma separated list of users watching the given object
   def watchers_list(object)
-    object.watcher_users.collect {|u| content_tag('span', link_to_user(u), :class => 'user') }.join(",\n")
+    remove_allowed = User.current.allowed_to?("delete_#{object.class.name.underscore}_watchers".to_sym, object.project)
+    object.watcher_users.collect do |user|
+      s = content_tag('span', link_to_user(user), :class => 'user')
+      if remove_allowed
+        url = {:controller => 'watchers',
+               :action => 'destroy',
+               :object_type => object.class.to_s.underscore,
+               :object_id => object.id,
+               :user_id => user}
+        s += ' ' + link_to_remote(image_tag('delete.png'),
+                                  {:url => url},
+                                  :href => url_for(url),
+                                  :style => "vertical-align: middle")
+      end
+      s
+    end.join(",\n")
   end
 end
index ed227fddf718db1e469e9c84692adb6ae52a3bca..175e0539fd10556ad2ab59b5399dbd34ae6c6d2d 100644 (file)
@@ -52,6 +52,7 @@ Redmine::AccessControl.map do |map|
     # Watchers
     map.permission :view_issue_watchers, {}
     map.permission :add_issue_watchers, {:watchers => :new}
+    map.permission :delete_issue_watchers, {:watchers => :destroy}
   end
   
   map.project_module :time_tracking do |map|
index 64457c53271e2111e1948d7892dc65298e568da2..08699ff83245769be923696fedb3298206ebd704 100644 (file)
@@ -18,6 +18,7 @@ roles_001:
     - :delete_issues
     - :view_issue_watchers
     - :add_issue_watchers
+    - :delete_issue_watchers
     - :manage_public_queries
     - :save_queries
     - :view_gantt
index 3b48767b96af90c9e66aa9bd91cb760c4b327a83..d36f7831c2ccf0325be018bf9e835e860e2509a2 100644 (file)
@@ -67,4 +67,14 @@ class WatchersControllerTest < ActionController::TestCase
     end
     assert Issue.find(2).watched_by?(User.find(4))
   end
+  
+  def test_remove_watcher
+    @request.session[:user_id] = 2
+    assert_difference('Watcher.count', -1) do
+      xhr :post, :destroy, :object_type => 'issue', :object_id => '2', :user_id => '3'
+      assert_response :success
+      assert_select_rjs :replace_html, 'watchers'
+    end
+    assert !Issue.find(2).watched_by?(User.find(3))
+  end
 end