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