|
- # 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 UserScore < ActiveRecord::Base
- belongs_to :user
-
- before_save :correct_score
-
- def self.find_max_file
- self.maximum(:file)
- end
-
- def self.find_min_file
- self.minimum(:file)
- end
-
- def self.find_max_issue
- self.maximum(:issue)
- end
-
- def self.find_min_issue
- self.minimum(:file)
- end
- # 以上类方法目测没用,反正也报错
- # ===============================================================================
-
- # 前略·协同得分
- # operate - 更新操作 类型 symbol
- # user - 计分用户
- #
- # Examples
- #
- # UserScore.joint(:post_message, User.current, nil)
- # # => true #当前用户发帖计分操作成功
- #
- # Returns boolean. 返回积分保存结果
- def self.joint(operate, current_user, target_user, options={})
- current_user, target_user = get_users(current_user, target_user)
- user_score = current_user.user_score_attr
- case operate
- when :post_message # current_user 发帖了 Add Message
- user_score.collaboration = user_score.collaboration.to_i + 2
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} posting a message. options => (#{options.to_s})"
- when :delete_message # current_user 发帖了 Delete Message
- user_score.collaboration = user_score.collaboration.to_i - 2
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} deleting a message. options => (#{options.to_s})"
- when :post_issue # current_user 对 target_user 的缺陷留言了 Add Journal
- user_score.collaboration = user_score.collaboration.to_i + 1
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} posting a issue. options => (#{options.to_s})"
- when :delete_issue # current_user 删除了 对 target_user 的缺陷留言了 Delete Journal
- user_score.collaboration = user_score.collaboration.to_i - 1
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} deleting a issue. options => (#{options.to_s})"
- when :change_issue_status # current_user 更改了缺陷的状态 Changed Issue
- user_score.collaboration = user_score.collaboration.to_i + 1
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} change issue status. options => (#{options.to_s})"
- when :reply_message # current_user 对 target_user 留言的回复 Add Journals_for_messages
- user_score.collaboration = user_score.collaboration.to_i + 1
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} reply message. options => (#{options.to_s})"
- when :reply_message_delete # current_user 删除了对 target_user 留言的回复 delete Journals_for_messages
- user_score.collaboration = user_score.collaboration.to_i - 1
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} delete reply message. options => (#{options.to_s})"
- when :reply_posting # current_user 对 target_user 帖子的回复 Add Message
- user_score.collaboration = user_score.collaboration.to_i + 1
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} reply posting. options => (#{options.to_s})"
- when :reply_deleting # current_user 删除了 对 target_user 帖子的回复 Delete Message
- user_score.collaboration = user_score.collaboration.to_i - 1
- user_score.save
- Rails.logger.info "[UserScore#joint] ===> User: #{current_user} reply deleting. options => (#{options.to_s})"
- else
- Rails.logger.error "[UserScore#joint] ===> #{operate} is not define."
- return false
- end
- rescue => e
- Rails.logger.error "[UserScore#joint] ===> Exception: #{e}."
- end
-
- # 前略·影响力得分
- # operate - 更新操作 类型 symbol
- # user - 计分用户
- #
- # Examples
- #
- # UserScore.influence(:followed_by, user)
- # # => true #当前被关注用户记分成功
- #
- # Returns boolean. 返回积分保存结果
- def self.influence(operate, current_user, target_user, options={})
- current_user, target_user = get_users(current_user, target_user)
- user_score = target_user.user_score_attr
- case operate
- when :followed_by # current_user 关注了target_user Add watcher
- user_score.influence = user_score.influence.to_i + 2
- user_score.save
- Rails.logger.info "[UserScore#influence] ===> User: #{current_user} be followed. options => (#{options.to_s})"
- when :cancel_followed # current_uer 取消了对 target_user的关注 delete watcher
- user_score.influence = user_score.influence.to_i - 2
- user_score.save
- Rails.logger.info "[UserScore#influence] ===> User: #{current_user} canceled followed. options => (#{options.to_s})"
- else
- Rails.logger.error "[UserScore#influence] ===> #{operate} is not define."
- return false
- end
- rescue => e
- Rails.logger.error "[UserScore#influence] ===> Exception: #{e}."
- end
-
- # 前略·技术得分
- # operate - 更新操作 类型 symbol
- # user - 计分用户
- #
- # Examples
- #
- # UserScore.skill(:followed_by, current_user, target_user)
- # # => true #当前current_user对target_user用户帖子的记分成功
- #
- # Returns boolean. 返回积分保存结果
- def self.skill(operate, current_user, target_user, options={})
- current_user, target_user = get_users(current_user, target_user)
- current_user_score = current_user.user_score_attr
- target_user_score = target_user.user_score_attr
- case operate
- # when :treading # current_user 踩了 target_user 的帖子
- # Rails.logger.info "[UserScore#skill] ===> User: #{current_user} treading #{target_user}'s posting. options => (#{options.to_s})"
- when :treaded_by_user # current_user 踩了 target_user 的帖子
- current_user_score.skill = current_user_score.skill.to_i - 2 #踩别人的帖子减2分 add praise_tread
- current_user_score.save
- if current_user.id == target_user.id
- target_user.reload
- target_user_score = target_user.user_score_attr
- end
- level = current_user.get_level
- if level == 1
- target_user_score.skill = target_user_score.skill.to_i - 2 #帖子被一级会员踩-2分 add praise_tread
- target_user_score.save
- elsif level == 2
- target_user_score.skill = target_user_score.skill.to_i - 4 #帖子被二级会员踩-4分 add praise_tread
- target_user_score.save
- elsif level == 3
- target_user_score.skill = target_user_score.skill.to_i - 6 #帖子被三级会员踩-6分 add praise_tread
- target_user_score.save
- end
-
- Rails.logger.info "[UserScore#skill] ===> User: #{current_user} treaded_by #{target_user}. options => (#{options.to_s})"
- when :praised_by_user # current_user 顶了 target_user 的帖子
- level = current_user.get_level
- if level == 1
- target_user_score.skill = target_user_score.skill.to_i + 4 #帖子被一级会员顶+4分 add praise_tread
- target_user_score.save
- elsif level == 2
- target_user_score.skill = target_user_score.skill.to_i + 6 #帖子被二级会员顶+6分 add praise_tread
- target_user_score.save
- elsif level == 3
- target_user_score.skill = target_user_score.skill.to_i + 8 #帖子被三级会员顶+8分 add praise_tread
- target_user_score.save
- end
-
- Rails.logger.info "[UserScore#skill] ===> User: #{current_user} praised_by #{target_user}. options => (#{options.to_s})"
- else
- Rails.logger.error "[UserScore#skill] ===> #{operate} is not define."
- return false
- end
- rescue => e
- Rails.logger.error "[UserScore#skill] ===> Exception: #{e}."
- end
-
- # 前略·项目得分
- # operate - 更新操作 类型 symbol
- # user - 计分用户
- #
- # Examples
- #
- # UserScore.project(:pull_code, current_user)
- # # => true #当前current_user对项目贡献积分成功
- #
- # Returns boolean. 返回积分保存结果
- def self.project(operate, current_user, options={})
- current_user, target_user = get_users(current_user, nil)
- user_score = current_user.try(:user_score_attr)
- return false if current_user.nil?
- case operate
- when :push_code # current_user 提交了代码 changeset
- user_score = user_score.active.to_i + 4
- user_score.save
- Rails.logger.debug "[UserScore#project] ===> User: [#{current_user.id},#{current_user.name}] pushed code one time. options => (#{options.to_s})"
- when :push_document # current_user
- user_score.active = user_score.active.to_i + 4
- user_score.save
- Rails.logger.debug "[UserScore#project] ===> User: [#{current_user.id},#{current_user.name}] pushed a document. options => (#{options.to_s})"
- when :push_file # current_user
- user_score.active = user_score.active.to_i + 4
- user_score.save
- Rails.logger.debug "[UserScore#project] ===> User: [#{current_user.id},#{current_user.name}] pushed a file. options => (#{options.to_s})"
- when :update_issue_ratio # current_user
- user_score.active = user_score.active.to_i + 2
- user_score.save
- Rails.logger.debug "[UserScore#project] ===> User: [#{current_user.id},#{current_user.name}] updated issue ratio. options => (#{options.to_s})"
- when :post_issue # current_user
- user_score.active = user_score.active.to_i + 4
- user_score.save
- Rails.logger.debug "[UserScore#project] ===> User: [#{current_user.id},#{current_user.name}] posting issue. options => (#{options.to_s})"
- else
- Rails.logger.error "[UserScore#project] ===> #{operate} is not define."
- return false
- end
- rescue => e
- Rails.logger.error "[UserScore#project] ===> Exception: #{e}."
- end
-
- private
-
- def self.get_users(current_user, target_user)
- cUser = (current_user.kind_of?User) ? current_user : User.find_by_id(current_user)
- tUser = (target_user.kind_of?User) ? target_user : User.find_by_id(target_user)
-
- [cUser, tUser]
- end
-
- #修正分数
- #分数小于0时修正为0
- #分数大于等于0时不修正 -by zjc
- def correct_score
- if !self.collaboration.nil? && self.collaboration < 0
- self.collaboration = 0
- end
- if !self.influence.nil? && self.influence < 0
- self.influence = 0
- end
- if !self.skill.nil? && self.skill < 0
- self.skill = 0
- end
- if !self.active.nil? && self.active < 0
- self.active = 0
- end
- end
- end
|