You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgfqe6ch8/app/controllers/watchers_controller.rb

324 lines
12 KiB

6 years ago
# 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