socialforge/app/services/users_service.rb

344 lines
12 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#coding=utf-8
class UsersService
include ApplicationHelper
include AccountHelper
include AvatarHelper
include CoursesHelper
include ApiHelper
include WordsHelper
#将用户注册的功能函数写这里
#参数约定
#成功返回注册后的User实例失败直接抛异常
def register(params)
@user = User.new
@user.admin = false
@user.register
@user.login = params[:login]
@user.mail = params[:mail]
password = params[:password]
password_confirmation = params[:password_confirmation]
should_confirmation_password = params[:should_confirmation_password]
if !password.blank? && !password_confirmation.blank? && should_confirmation_password
@user.password, @user.password_confirmation = password, password_confirmation
elsif !password.blank? && !should_confirmation_password
@user.password = password
else
@user.password = ""
end
case Setting.self_registration
when '1'
@user = email_activation_register(@user)
when '3'
@user = automatically_register(@user)
else
@user = administrator_manually__register(@user)
end
if @user.id != nil
ue = @user.user_extensions ||= UserExtensions.new
ue.user_id = @user.id
ue.save
end
@user
#img_url = url_to_avatar(@user)
#gender = @user.user_extensions.gender.nil? ? 0 : @user.user_extensions.gender
#work_unit = get_user_work_unit @user
#location = get_user_location @user
#{:id => @user.id, :img_url => img_url, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction}
end
# 自动注册功能 FOR邮件邀请
def register_auto(login, mail, password, first_name, last_name, gender)
mail_notification = "day"
@user = User.new
@user.admin = false
@user.register
@user.login = login
@user.mail = mail
@user.firstname = first_name
@user.lastname = last_name
@user.mail_notification = mail_notification
password_confirmation = password
should_confirmation_password = true
if !password.blank? && !password_confirmation.blank? && should_confirmation_password
@user.password, @user.password_confirmation = password, password_confirmation
elsif !password.blank? && !should_confirmation_password
@user.password = password
else
@user.password = ""
end
@user = automatically_register_lock(@user)
if @user.id != nil
ue = @user.user_extensions ||= UserExtensions.new
ue.gender = gender
ue.user_id = @user.id
ue.save
end
@user
end
#显示用户
#id用户id
def show_user(params)
@user = User.find(params[:id])
img_url = "/images/"+url_to_avatar(@user)
gender = @user.user_extensions.gender.nil? ? 0 : @user.user_extensions.gender
work_unit = get_user_work_unit @user
location = get_user_location @user
{:id => @user.id, :img_url => img_url,:realname => @user.realname, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction}
end
#忘记密码
def lost_password params
user = ::User.find_by_mail(params[:mail].to_s)
# user not found or not active
unless user && user.active?
raise l(:notice_account_unknown_email,:locale => 'zh')
end
# user cannot change its password
unless user.change_password_allowed?
raise l(:notice_can_t_change_password,:locale => user.language)
return
end
# create a new token for password recovery
token = Token.new(:user => user, :action => "recovery")
if token.save
Mailer.run.lost_password(token)
return l(:notice_account_lost_email_sent,:locale => user.language)
end
end
#编辑用户
#gender 1female 0male 其他male
def edit_user params
@user = User.find(params[:id])
fileio = params[:file]
@se = @user.extensions
if @user.user_extensions.identity == 0 || @user.user_extensions.identity == 1
@se.school_id = params[:occupation]
elsif @user.user_extensions.identity == 3
@se.occupation = params[:occupation]
elsif @user.user_extensions.identity == 2
@user.firstname = params[:occupation]
end
@se.brief_introduction = params[:brief_introduction]
@se.gender = params[:gender]
@se.location = params[:province] if params[:province]
@se.location_city = params[:city] if params[:city]
raise @se.errors.full_message unless @se.save
unless fileio.nil?
file = fileio[:tempfile]
diskfile=disk_filename(@user.class.to_s, @user.id)
@image_file = fileio[:name]
@urlfile='/' << File.join("images", "avatars", avatar_directory(@user.class.to_s), avatar_filename(@user.id, @image_file))
path = File.dirname(diskfile)
unless File.directory?(path)
FileUtils.mkdir_p(path)
end
File.rename(file.path, @urlfile)
begin
f = Magick::ImageList.new(diskfile)
# gif格式不再做大小处理
if f.format != 'GIF'
width = 300.0
proportion = (width/f[0].columns)
height = (f[0].rows*proportion)
f.resize_to_fill!(width, height)
f.write(diskfile)
end
rescue Exception => e
logger.error "[Error] avatar : users_service#edit_user ===> #{e}"
end
end
#img_url = url_to_avatar(@user)
#gender = @user.user_extensions.gender.nil? ? 0 : @user.user_extensions.gender
#work_unit = get_user_work_unit @user
#location = get_user_location @user
#{:id => @user.id, :img_url => img_url, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction}
@user
end
# 获取某个用户的所有留言信息
def get_all_messages params
user = User.find(params[:user_id])
jours = user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC').page(params[:page] || 1).per(10)
jours.update_all(:is_readed => true, :status => false)
jours.each do |journal|
fetch_user_leaveWord_reply(journal).update_all(:is_readed => true, :status => false)
end
jours
end
# 回复用户
def reply_user_messages params,current_user
user = User.find(params[:user_id])
m_parent_id = params[:parent_id]
author_id = current_user.id
reply_id = params[:ref_user_id]
ref_message_id = params[:ref_message_id]
content = params[:content]
options = {:user_id => author_id, # 作者id
:status => true,
:m_parent_id => m_parent_id,# 父留言id
:m_reply_id => ref_message_id, # 子留言 id
:reply_id => reply_id, # 被留言用户id
:notes => content,
:is_readed => false}
if(params[:type] == 1)
user.add_jour(nil, nil,nil,options)
elsif(params[:type] == 2)
Course.find(params[:course_id]).journals_for_messages.build(options).save! unless params[:course_id].nil?
else
end
end
# 给用户留言
def leave_message params,current_user
obj = User.find(params[:user_id]).add_jour(current_user, params[:content], 0)
obj
end
#关注列表
def user_watcher params
@user = User.find(params[:id])
User.watched_by(@user.id)
end
#用户课程列表
def user_courses_list params,current_user
@user = User.find(params[:id])
if !current_user.admin? && !@user.active?
raise '404'
return
end
if current_user == @user || current_user.admin?
membership = @user.coursememberships.all
else
membership = @user.coursememberships.all(:conditions => Course.visible_condition(current_user))
end
membership.sort! {|older, newer| newer.created_on <=> older.created_on }
course_list = []
membership.each do |mp|
course_list << {:course => mp.course,:img_url => "/images/"+url_to_avatar(mp.course),:current_user_is_member => current_user.member_of_course?(mp.course),:current_user_is_teacher => is_course_teacher(current_user,mp.course)}
end
course_list
end
#修改密码
def change_password params
ActiveRecord::Base.transaction do
@current_user = User.find(params[:current_user_id])
if @current_user.check_password?(params[:password])
@current_user.password, @current_user.password_confirmation = params[:new_password], params[:new_password_confirmation]
@current_user.save
# 修改密码同步gitlab密码修改
unless @current_user.gid.nil?
begin
g = Gitlab.client
g.edit_user(@current_user.gid, :password => params[:new_password])
rescue Exception => e
logger.error "change users password failed! ===> #{e}"
end
end
#raise @current_user.errors.full_message
#return @current_user
else
raise l(:notice_account_wrong_password,:locale => 'zh')
end
@current_user
end
end
#搜索用户
def search_user params
status = params[:status] || 1
has = {
"show_changesets" => true
}
scope = User.logged.status(status)
search_by = params[:search_by] ? params[:search_by] : "0"
if params[:is_search_assitant].nil?
#modify by yutao 2015/5/18 没有params[:user_id]参数时去掉"id not in (?)"条件(bug:#2270) start
#say by yutao: params[:user_id]这个是指谁发起的搜索么? 如果是 这个值貌似应该从session获取 怪怪的赶脚-_-!
if params[:name].present?
if !params[:user_id].nil?
watcher = User.watched_by(params[:user_id])
watcher.push(params[:user_id])
scope = scope.where("id not in (?)",watcher)
end
#scope = scope.like(params[:name],search_by)
scope = scope.where("( LOWER(login) LIKE ? or LOWER(concat(lastname, firstname)) LIKE ? or LOWER(mail) LIKE ? )",
"%#{params[:name]}%","%#{params[:name]}%","%#{params[:name]}%")
end
#modify by yutao 2015/5/18 没有params[:user_id]参数时去掉"id not in (?)"条件 end
else
teachers = searchTeacherAndAssistant(Course.find(params[:course_id]))
scope = scope.where("id not in (?)",teachers.map{|t| t.user_id}).like(params[:name],search_by) if params[:name].present?
end
scope
end
# 课程留言中与我相关的回复
def my_course_messages params,current_user
#找到我所有的课程
@user = current_user
if !current_user.admin? && !@user.active?
raise '404'
return
end
if current_user == @user || current_user.admin?
membership = @user.coursememberships.all
end
# membership.sort! {|older, newer| newer.created_on <=> older.created_on }
message_list = []
membership.each do |mp|
#课程轮询找到与我相关的回复
message_list << mp.course.journals_for_messages.where("reply_id = ?",current_user.id)
end
message_list
end
# 获取与我相关的留言:我的留言,回复我的留言
def my_personal_messages params,current_user
jours = current_user.journals_for_messages.where('m_parent_id is null or reply_id = ?',current_user.id)
jours.update_all(:is_readed => true, :status => false)
jours
end
# 所有的与我相关
def reply_my_messages params,current_user
jours = my_personal_messages params,current_user
jours1 = my_course_messages params,current_user
my_jours = []
my_jours << jours << jours1
my_jours.flatten!.sort! {|older, newer| newer.created_on <=> older.created_on }
my_jours_arr = Kaminari.paginate_array(my_jours, total_count: my_jours.count).page(params[:page] || 1).per(10)
my_jours_arr
end
def wechat_unbind uw
user = uw.user
#发重新绑定的微信模版消息
type = "login"
title = "尊敬的用户,您已解除绑定。"
key1 = "个人原因"
remark = "点击进入重新绑定。"
ws = WechatService.new
ws.rebind_notice user.id, type, user.id, title, key1,format_time(Time.now), remark
uw.user_id = nil
uw.delete
end
end