diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2016-04-09 07:37:49 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2016-04-09 07:37:49 +0000 |
commit | 5adc1ddde9b4a353b2d2a499004c2025d6e8847a (patch) | |
tree | 157cb8f2a52a443b0b91beb2d43d70733e0e62cc /app/controllers | |
parent | c8c694840d3c16450371141be609fd6b6e023667 (diff) | |
download | redmine-5adc1ddde9b4a353b2d2a499004c2025d6e8847a.tar.gz redmine-5adc1ddde9b4a353b2d2a499004c2025d6e8847a.zip |
Allow addition of watchers via bulk edit context menu (#5754).
git-svn-id: http://svn.redmine.org/redmine/trunk@15311 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/controllers')
-rw-r--r-- | app/controllers/context_menus_controller.rb | 1 | ||||
-rw-r--r-- | app/controllers/watchers_controller.rb | 53 |
2 files changed, 33 insertions, 21 deletions
diff --git a/app/controllers/context_menus_controller.rb b/app/controllers/context_menus_controller.rb index 19661f9dc..1e5652d09 100644 --- a/app/controllers/context_menus_controller.rb +++ b/app/controllers/context_menus_controller.rb @@ -32,6 +32,7 @@ class ContextMenusController < ApplicationController @can = {:edit => User.current.allowed_to?(:edit_issues, @projects), :log_time => (@project && User.current.allowed_to?(:log_time, @project)), :copy => User.current.allowed_to?(:copy_issues, @projects) && Issue.allowed_target_projects.any?, + :add_watchers => User.current.allowed_to?(:add_issue_watchers, @projects), :delete => User.current.allowed_to?(:delete_issues, @projects) } if @project diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index 36c8c5c24..37c03cdaa 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -42,7 +42,9 @@ class WatchersController < ApplicationController end users = User.active.visible.where(:id => user_ids.flatten.compact.uniq) users.each do |user| - Watcher.create(:watchable => @watched, :user => user) + @watchables.each do |watchable| + Watcher.create(:watchable => watchable, :user => user) + end end respond_to do |format| format.html { redirect_to_referer_or {render :text => 'Watcher added.', :layout => true}} @@ -62,7 +64,10 @@ class WatchersController < ApplicationController end def destroy - @watched.set_watcher(User.find(params[:user_id]), false) + user = User.find(params[:user_id]) + @watchables.each do |watchable| + watchable.set_watcher(user, false) + end respond_to do |format| format.html { redirect_to :back } format.js @@ -81,30 +86,21 @@ class WatchersController < ApplicationController def find_project if params[:object_type] && params[:object_id] - klass = Object.const_get(params[:object_type].camelcase) - return false unless klass.respond_to?('watched_by') - @watched = klass.find(params[:object_id]) - @project = @watched.project + @watchables = find_objets_from_params + @projects = @watchables.map(&:project).uniq + if @projects.size == 1 + @project = @projects.first + end elsif params[:project_id] @project = Project.visible.find_by_param(params[:project_id]) end - rescue - render_404 end def find_watchables - klass = Object.const_get(params[:object_type].camelcase) rescue nil - if klass && klass.respond_to?('watched_by') - @watchables = klass.where(:id => Array.wrap(params[:object_id])).to_a - raise Unauthorized if @watchables.any? {|w| - if w.respond_to?(:visible?) - !w.visible? - elsif w.respond_to?(:project) && w.project - !w.project.visible? - end - } + @watchables = find_objets_from_params + unless @watchables.present? + render_404 end - render_404 unless @watchables.present? end def set_watcher(watchables, user, watching) @@ -125,9 +121,24 @@ class WatchersController < ApplicationController scope = User.all.limit(100) end users = scope.active.visible.sorted.like(params[:q]).to_a - if @watched - users -= @watched.watcher_users + if @watchables + users -= @watchables.map(&:watcher_users).flatten end users end + + def find_objets_from_params + klass = Object.const_get(params[:object_type].camelcase) rescue nil + return unless klass && klass.respond_to?('watched_by') + + objects = klass.where(:id => Array.wrap(params[:object_id])).to_a + raise Unauthorized if objects.any? do |w| + if w.respond_to?(:visible?) + !w.visible? + elsif w.respond_to?(:project) && w.project + !w.project.visible? + end + end + objects + end end |