| 
							
								 | 
							
							# Redmine - project management software
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 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
 | 
						
						
						
						
							 | 
							
								 | 
							
							# as published by the Free Software Foundation; either version 2
 | 
						
						
						
						
							 | 
							
								 | 
							
							# of the License, or (at your option) any later version.
 | 
						
						
						
						
							 | 
							
								 | 
							
							#
 | 
						
						
						
						
							 | 
							
								 | 
							
							# This program is distributed in the hope that it will be useful,
 | 
						
						
						
						
							 | 
							
								 | 
							
							# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						
						
						
						
							 | 
							
								 | 
							
							# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						
						
						
						
							 | 
							
								 | 
							
							# GNU General Public License for more details.
 | 
						
						
						
						
							 | 
							
								 | 
							
							#
 | 
						
						
						
						
							 | 
							
								 | 
							
							# You should have received a copy of the GNU General Public License
 | 
						
						
						
						
							 | 
							
								 | 
							
							# along with this program; if not, write to the Free Software
 | 
						
						
						
						
							 | 
							
								 | 
							
							# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
						
						
						
						
							 | 
							
								 | 
							
							class WatchersController < ApplicationController
 | 
						
						
						
						
							 | 
							
								 | 
							
							  before_filter :require_login#, :find_watchables, :only => [:watch, :unwatch]
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  helper :users
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def watch
 | 
						
						
						
						
							 | 
							
								 | 
							
							    s = WatchesService.new
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if params[:action_name] == 'watch'
 | 
						
						
						
						
							 | 
							
								 | 
							
							      limit = 10
 | 
						
						
						
						
							 | 
							
								 | 
							
							      query = User.watched_by(params[:target_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @obj_count = query.count
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @obj_pages = Paginator.new @obj_count,limit,params['page']
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @list = query.order("#{Watcher.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @action = 'watch'
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:action_name] == 'fans'
 | 
						
						
						
						
							 | 
							
								 | 
							
							      limit = 10
 | 
						
						
						
						
							 | 
							
								 | 
							
							      query = User.find(params[:target_id]).watcher_users
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @obj_count = query.count
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @obj_pages = Paginator.new @obj_count,limit,params['page']
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @list = query.order("#{Watcher.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @action = 'fans'
 | 
						
						
						
						
							 | 
							
								 | 
							
							    else
 | 
						
						
						
						
							 | 
							
								 | 
							
							      if params[:target_id] && params[:user_watcher].blank?
 | 
						
						
						
						
							 | 
							
								 | 
							
							        watchables = s.watch params.merge(:current_user_id => User.current.id)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user = User.find(params[:target_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							        watch_query = User.watched_by(@user.id)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user_watchlist_count = watch_query.count
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user_watchlist = watch_query.order("#{Watcher.table_name}.id desc").limit(12)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        fan_query = @user.watcher_users
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user_fanlist_count = fan_query.count
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user_fanlist = fan_query.order("#{Watcher.table_name}.id desc").limit(12)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if params[:object_type] == 'project'
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @project = Project.find(params[:object_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:user_watcher] == "user_fanslist"
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched = User.find(params[:target_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @user = User.find(params[:object_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched.add_watcher(@user)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js{redirect_to user_fanslist_user_path(User.current)}
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:shixun_id].present?
 | 
						
						
						
						
							 | 
							
								 | 
							
							      # @watched = User.find(params[:target_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      # @user = User.find(params[:object_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      # @watched.add_watcher(@user)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @shixun = Shixun.find(params[:shixun_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js{redirect_to collaborators_shixun_path(@shixun, :page => params['page'])}
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:project_id].present?
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched = User.find(params[:target_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @user = User.find(params[:object_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched.add_watcher(@user)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @project = Project.find(params[:project_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js{redirect_to project_member_path(@project, :page => params['page'])}
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    else
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.html { redirect_to_referer_or {render :text => (true ? 'Watcher added.' : 'Watcher removed.'), :layout => true} }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js { render :partial => 'set_watcher',
 | 
						
						
						
						
							 | 
							
								 | 
							
							                           :locals => {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               :user => User.current,
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               :watched => watchables,
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               :params => params,
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               :opt =>'add',
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               :list => @list,
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               :action_name => params[:action_name],
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               :page => params[:page],
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               :count => @obj_count
 | 
						
						
						
						
							 | 
							
								 | 
							
							                           }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							  rescue Exception => e
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if e.message == "404"
 | 
						
						
						
						
							 | 
							
								 | 
							
							      render_404
 | 
						
						
						
						
							 | 
							
								 | 
							
							    else
 | 
						
						
						
						
							 | 
							
								 | 
							
							      raise e
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    #set_watcher(@watchables, User.current, true)
 | 
						
						
						
						
							 | 
							
								 | 
							
							  end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def unwatch
 | 
						
						
						
						
							 | 
							
								 | 
							
							    s = WatchesService.new
 | 
						
						
						
						
							 | 
							
								 | 
							
							    watchables = s.unwatch  params.merge(:current_user_id => User.current.id)
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if params[:action_name] == 'watch'
 | 
						
						
						
						
							 | 
							
								 | 
							
							      limit = 10
 | 
						
						
						
						
							 | 
							
								 | 
							
							      query = User.watched_by(params[:target_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @obj_count = query.count()
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @obj_pages = Paginator.new @obj_count,limit,params['page']
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @list = query.order("#{Watcher.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all()
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @action = 'watch'
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:action_name] == 'fans'
 | 
						
						
						
						
							 | 
							
								 | 
							
							      limit = 10
 | 
						
						
						
						
							 | 
							
								 | 
							
							      query = User.find(params[:target_id]).watcher_users
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @obj_count = query.count()
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @obj_pages = Paginator.new @obj_count,limit,params['page']
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @list = query.order("#{Watcher.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all()
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @action = 'fans'
 | 
						
						
						
						
							 | 
							
								 | 
							
							    else
 | 
						
						
						
						
							 | 
							
								 | 
							
							      if params[:target_id] && params[:user_watcher].blank?
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user = User.find(params[:target_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							        watch_query = User.watched_by(@user.id)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user_watchlist_count = watch_query.count()
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user_watchlist = watch_query.order("#{Watcher.table_name}.id desc").limit(12)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        fan_query = @user.watcher_users
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user_fanlist_count = fan_query.count()
 | 
						
						
						
						
							 | 
							
								 | 
							
							        @user_fanlist = fan_query.order("#{Watcher.table_name}.id desc").limit(12)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if params[:object_type] == 'project'
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @project = Project.find(params[:object_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:user_watcher] == "user_watchlist"
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched = User.find(params[:target_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @user = User.find(params[:object_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched.remove_watcher(@user)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js{redirect_to user_watchlist_user_path(User.current)}
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:user_watcher] == "user_fanslist"
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched = User.find(params[:target_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @user = User.find(params[:object_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched.remove_watcher(@user)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js{redirect_to user_fanslist_user_path(User.current)}
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:shixun_id].present?
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched = User.find(params[:target_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @user = User.find(params[:object_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched.remove_watcher(@user)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @shixun = Shixun.find(params[:shixun_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js{redirect_to collaborators_shixun_path(@shixun, :page => params['page'])}
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:project_id].present?
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched = User.find(params[:target_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @user = User.find(params[:object_id].to_i)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @watched.remove_watcher(@user)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @project = Project.find(params[:project_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js{redirect_to project_member_path(@project, :page => params['page'])}
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    else
 | 
						
						
						
						
							 | 
							
								 | 
							
							      respond_to do |format|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.html { redirect_to_referer_or {render :text => (false ? 'Watcher added.' : 'Watcher removed.'), :layout => true}}
 | 
						
						
						
						
							 | 
							
								 | 
							
							        format.js { render :partial => 'set_watcher', :locals => {:user => User.current, :watched => watchables,:params=>params,:opt=>'delete',:list=>@list,:action_name=>params[:action_name],:page=>params[:page],:count=>@obj_count} }
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							  rescue Exception => e
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if e.message == "404"
 | 
						
						
						
						
							 | 
							
								 | 
							
							      render_404
 | 
						
						
						
						
							 | 
							
								 | 
							
							    else
 | 
						
						
						
						
							 | 
							
								 | 
							
							      raise e
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    #set_watcher(@watchables, User.current, false)
 | 
						
						
						
						
							 | 
							
								 | 
							
							  end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def join
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if User.current.logged?
 | 
						
						
						
						
							 | 
							
								 | 
							
							      course = Project.find(params[:object_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      if params[:course_password] == '123'
 | 
						
						
						
						
							 | 
							
								 | 
							
							      members = []
 | 
						
						
						
						
							 | 
							
								 | 
							
							      members << Member.new(:role_ids => [5], :user_id => User.current.id)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      course.members << members
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							      StudentsForCourse.create(:student_id => User.current.id, :course_id => params[:object_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      else
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    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_join', :locals => {:user => User.current, :course => Project.find(params[:object_id])} }
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							  end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def unjoin
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if User.current.logged?
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @member = Member.where('project_id = ? and user_id = ?', params[:object_id], User.current.id)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @member.first.destroy
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							      joined = StudentsForCourse.where('student_id = ? and course_id = ?', User.current.id, params[:object_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							      joined.each do |join|
 | 
						
						
						
						
							 | 
							
								 | 
							
							        join.destroy
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    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_join', :locals => {:user => User.current, :course => Project.find(params[:object_id])} }
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							  end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  before_filter :find_project, :authorize, :only => [:new, :create, :append, :destroy, :autocomplete_for_user]
 | 
						
						
						
						
							 | 
							
								 | 
							
							  accept_api_auth :create, :destroy
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def new
 | 
						
						
						
						
							 | 
							
								 | 
							
							  end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def create
 | 
						
						
						
						
							 | 
							
								 | 
							
							    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
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def append
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if params[:watcher].is_a?(Hash)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      user_ids = params[:watcher][:user_ids] || [params[:watcher][:user_id]]
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @users = User.active.find_all_by_id(user_ids)
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							  end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  # params  user_watcher 用户关注列表
 | 
						
						
						
						
							 | 
							
								 | 
							
							  #         user_fans    用户粉丝列表
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def destroy
 | 
						
						
						
						
							 | 
							
								 | 
							
							    @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.sorted.like(params[:q]).limit(100).all
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if @watched
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @users -= @watched.watcher_users
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							    render :layout => false
 | 
						
						
						
						
							 | 
							
								 | 
							
							  end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  private
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  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
 | 
						
						
						
						
							 | 
							
								 | 
							
							    elsif params[:project_id]
 | 
						
						
						
						
							 | 
							
								 | 
							
							      @project = Project.visible.find_by_param(params[:project_id])
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							  rescue
 | 
						
						
						
						
							 | 
							
								 | 
							
							    render_404
 | 
						
						
						
						
							 | 
							
								 | 
							
							    end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  def find_watchables
 | 
						
						
						
						
							 | 
							
								 | 
							
							    #根据参数获取关注对象的类型(user、project)
 | 
						
						
						
						
							 | 
							
								 | 
							
							    klass = Object.const_get(params[:object_type].camelcase) rescue nil
 | 
						
						
						
						
							 | 
							
								 | 
							
							    #判断获取的对象类型能否响应‘watched_by’方法
 | 
						
						
						
						
							 | 
							
								 | 
							
							    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)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      #  @user = watchable     # added by william
 | 
						
						
						
						
							 | 
							
								 | 
							
							      if watching
 | 
						
						
						
						
							 | 
							
								 | 
							
							        # 修改 user和project的状态
 | 
						
						
						
						
							 | 
							
								 | 
							
							        if watchable.instance_of?(User)
 | 
						
						
						
						
							 | 
							
								 | 
							
							          #写user_statuses表
 | 
						
						
						
						
							 | 
							
								 | 
							
							          UserStatus.find_by_user_id(watchable.id).update_watchers_count(1)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        elsif watchable.instance_of?(Project)
 | 
						
						
						
						
							 | 
							
								 | 
							
							          #写project_statuese表
 | 
						
						
						
						
							 | 
							
								 | 
							
							           ProjectStatus.find_by_project_id(watchable.id).update_watchers_count(1)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        end
 | 
						
						
						
						
							 | 
							
								 | 
							
							      else
 | 
						
						
						
						
							 | 
							
								 | 
							
							        # 修改 user和project的状态
 | 
						
						
						
						
							 | 
							
								 | 
							
							        if watchable.instance_of?(User)
 | 
						
						
						
						
							 | 
							
								 | 
							
							          #写user_statuses表
 | 
						
						
						
						
							 | 
							
								 | 
							
							         UserStatus.find_by_user_id(watchable.id).update_watchers_count(-1)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        elsif watchable.instance_of?(Project)
 | 
						
						
						
						
							 | 
							
								 | 
							
							          #写project_statuese表 :project_status
 | 
						
						
						
						
							 | 
							
								 | 
							
							          ProjectStatus.find_by_project_id(watchable.id).update_watchers_count(-1)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        end
 | 
						
						
						
						
							 | 
							
								 | 
							
							      end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							    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 => watchables} }
 | 
						
						
						
						
							 | 
							
								 | 
							
							   end
 | 
						
						
						
						
							 | 
							
								 | 
							
							  end
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							end
 |