summaryrefslogtreecommitdiffstats
path: root/app/controllers
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2016-04-09 07:37:49 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2016-04-09 07:37:49 +0000
commit5adc1ddde9b4a353b2d2a499004c2025d6e8847a (patch)
tree157cb8f2a52a443b0b91beb2d43d70733e0e62cc /app/controllers
parentc8c694840d3c16450371141be609fd6b6e023667 (diff)
downloadredmine-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.rb1
-rw-r--r--app/controllers/watchers_controller.rb53
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