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 ],
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)
# 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
# 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|
- :delete_issues
- :view_issue_watchers
- :add_issue_watchers
+ - :delete_issue_watchers
- :manage_public_queries
- :save_queries
- :view_gantt
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