Mercurial > hg > soundsoftware-site
diff app/controllers/watchers_controller.rb @ 1298:4f746d8966dd redmine_2.3_integration
Merge from redmine-2.3 branch to create new branch redmine-2.3-integration
author | Chris Cannam |
---|---|
date | Fri, 14 Jun 2013 09:28:30 +0100 |
parents | 622f24f53b42 |
children | e248c7af89ec |
line wrap: on
line diff
--- a/app/controllers/watchers_controller.rb Fri Jun 14 09:07:32 2013 +0100 +++ b/app/controllers/watchers_controller.rb Fri Jun 14 09:28:30 2013 +0100 @@ -1,5 +1,5 @@ # Redmine - project management software -# Copyright (C) 2006-2012 Jean-Philippe Lang +# Copyright (C) 2006-2013 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -16,35 +16,36 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class WatchersController < ApplicationController - before_filter :find_project - before_filter :require_login, :check_project_privacy, :only => [:watch, :unwatch] - before_filter :authorize, :only => [:new, :destroy] + before_filter :require_login, :find_watchables, :only => [:watch, :unwatch] def watch - if @watched.respond_to?(:visible?) && !@watched.visible?(User.current) - render_403 - else - set_watcher(User.current, true) - end + set_watcher(@watchables, User.current, true) end def unwatch - set_watcher(User.current, false) + set_watcher(@watchables, User.current, false) end + before_filter :find_project, :authorize, :only => [:new, :create, :append, :destroy, :autocomplete_for_user] + accept_api_auth :create, :destroy + def new end def create - if params[:watcher].is_a?(Hash) && request.post? - user_ids = params[:watcher][:user_ids] || [params[:watcher][:user_id]] - user_ids.each do |user_id| - Watcher.create(:watchable => @watched, :user_id => user_id) - end + user_ids = [] + if params[:watcher].is_a?(Hash) + user_ids << (params[:watcher][:user_ids] || params[:watcher][:user_id]) + else + user_ids << params[:user_id] + end + user_ids.flatten.compact.uniq.each do |user_id| + Watcher.create(:watchable => @watched, :user_id => user_id) end respond_to do |format| format.html { redirect_to_referer_or {render :text => 'Watcher added.', :layout => true}} format.js + format.api { render_api_ok } end end @@ -56,22 +57,24 @@ end def destroy - @watched.set_watcher(User.find(params[:user_id]), false) if request.post? + @watched.set_watcher(User.find(params[:user_id]), false) respond_to do |format| format.html { redirect_to :back } format.js + format.api { render_api_ok } end end def autocomplete_for_user - @users = User.active.like(params[:q]).find(:all, :limit => 100) + @users = User.active.sorted.like(params[:q]).limit(100).all if @watched @users -= @watched.watcher_users end render :layout => false end -private + private + def find_project if params[:object_type] && params[:object_id] klass = Object.const_get(params[:object_type].camelcase) @@ -85,11 +88,22 @@ render_404 end - def set_watcher(user, watching) - @watched.set_watcher(user, watching) + def find_watchables + klass = Object.const_get(params[:object_type].camelcase) rescue nil + if klass && klass.respond_to?('watched_by') + @watchables = klass.find_all_by_id(Array.wrap(params[:object_id])) + raise Unauthorized if @watchables.any? {|w| w.respond_to?(:visible?) && !w.visible?} + end + render_404 unless @watchables.present? + end + + def set_watcher(watchables, user, watching) + watchables.each do |watchable| + watchable.set_watcher(user, watching) + end respond_to do |format| format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} - format.js { render :partial => 'set_watcher', :locals => {:user => user, :watched => @watched} } + format.js { render :partial => 'set_watcher', :locals => {:user => user, :watched => watchables} } end end end