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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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