350 lines
10 KiB
Ruby
350 lines
10 KiB
Ruby
# encoding: utf-8
|
|
#
|
|
# 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.
|
|
|
|
module UserScoreHelper
|
|
def calculate_collaboration_count(user)
|
|
issue_c = 0
|
|
issues = Issue.where('author_id = ?', user.id)
|
|
issues.each do |issue|
|
|
issue_c = issue_c + issue.journals.where("user_id <> ?", user.id).count
|
|
end
|
|
issue_c = issue_c + Journal.where("user_id = ?", user.id).count
|
|
############################
|
|
memos = Memo.where('author_id = ? AND parent_id IS NOT NULL', user.id)
|
|
|
|
memos.each do |m|
|
|
if Memo.find(m.parent_id).author.id != user.id
|
|
issue_c = issue_c + 1
|
|
else
|
|
issue_c = issue_c - 1
|
|
end
|
|
end
|
|
|
|
|
|
pmemos = Memo.where('author_id = ? AND parent_id IS NULL', user.id)
|
|
pmemos.each do |pm|
|
|
issue_c = issue_c + pm.replies_count
|
|
end
|
|
############################
|
|
|
|
issue_c = issue_c + JournalsForMessage.where('user_id = ? AND reply_id IS NOT NULL AND reply_id <> ?', user.id, user.id).count + JournalsForMessage.where('reply_id = ? AND user_id <> ?', user.id, user.id).count
|
|
|
|
|
|
|
|
return issue_c
|
|
end
|
|
|
|
def calculate_influence_count(user)
|
|
watcher_count = Watcher.where("watchable_type = 'principal' AND watchable_id = ?", user.id).count
|
|
end
|
|
|
|
|
|
|
|
|
|
def calculate_skill_count(user)
|
|
|
|
praise_count_l0 = 0
|
|
praise_count_l1 = 0
|
|
praise_count_l2 = 0
|
|
tread_count_l0 = 0
|
|
tread_count_l1 = 0
|
|
tread_count_l2 = 0
|
|
issues = Issue.where('author_id = ?', user.id)
|
|
issues.each do |i|
|
|
pts = PraiseTread.where('praise_tread_object_id = ?', i.id)
|
|
pts.each do |p|
|
|
templevel = calculate_level(User.find(p.user_id))
|
|
|
|
if templevel.to_i == 0
|
|
if p.praise_or_tread == 1
|
|
praise_count_l0 = praise_count_l0 + 1
|
|
else
|
|
tread_count_l0 = tread_count_l0 + 1
|
|
end
|
|
end
|
|
if templevel.to_i == 1
|
|
if p.praise_or_tread == 1
|
|
praise_count_l1 = praise_count_l1 + 1
|
|
else
|
|
tread_count_l1 = tread_count_l1 + 1
|
|
end
|
|
end
|
|
if templevel.to_i == 2
|
|
if p.praise_or_tread == 1
|
|
praise_count_l2 = praise_count_l2 + 1
|
|
else
|
|
tread_count_l2 + tread_count_l2 + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
bids = Bid.where('author_id = ?', user.id)
|
|
bids.each do |b|
|
|
ptcs = PraiseTread.where('praise_tread_object_id = ?', b.id)
|
|
ptcs.each do |p|
|
|
templevel = calculate_level(User.find(p.user_id))
|
|
|
|
if templevel.to_i == 0
|
|
if p.praise_or_tread == 1
|
|
praise_count_l0 = praise_count_l0 + 1
|
|
else
|
|
tread_count_l0 = tread_count_l0 + 1
|
|
end
|
|
end
|
|
if templevel.to_i == 1
|
|
if p.praise_or_tread == 1
|
|
praise_count_l1 = praise_count_l1 + 1
|
|
else
|
|
tread_count_l1 = tread_count_l1 + 1
|
|
end
|
|
end
|
|
if templevel.to_i == 2
|
|
if p.praise_or_tread == 1
|
|
praise_count_l2 = praise_count_l2 + 1
|
|
else
|
|
tread_count_l2 + tread_count_l2 + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
contests = Contest.where('author_id = ?', user.id)
|
|
contests.each do |c|
|
|
ptcs = PraiseTread.where('praise_tread_object_id = ?', c.id)
|
|
ptcs.each do |p|
|
|
templevel = calculate_level(User.find(p.user_id))
|
|
|
|
if templevel.to_i == 0
|
|
if p.praise_or_tread == 1
|
|
praise_count_l0 = praise_count_l0 + 1
|
|
else
|
|
tread_count_l0 = tread_count_l0 + 1
|
|
end
|
|
end
|
|
if templevel.to_i == 1
|
|
if p.praise_or_tread == 1
|
|
praise_count_l1 = praise_count_l1 + 1
|
|
else
|
|
tread_count_l1 = tread_count_l1 + 1
|
|
end
|
|
end
|
|
if templevel.to_i == 2
|
|
if p.praise_or_tread == 1
|
|
praise_count_l2 = praise_count_l2 + 1
|
|
else
|
|
tread_count_l2 + tread_count_l2 + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
# case level
|
|
# when 0 skill_score = praise_count - 0.5 * tread_count
|
|
# when 1 skill_score = 2 * praise_count - 1.5 * tread_count
|
|
# when 2 skill_socre = 3 * praise_count - 2.5 * tread_count
|
|
# when 3 skill_socre = 4 * praise_count - 3.5 * tread_count
|
|
# when 4 skill_socre = 5 * praise_count - 4.5 * tread_count
|
|
# end
|
|
|
|
skill_score = 2 * praise_count_l0.to_f + 3 * praise_count_l1.to_f + 4 * praise_count_l2.to_f
|
|
- 1 * tread_count_l0.to_f - 1.5 * tread_count_l1.to_f - 2 * tread_count_l2.to_f
|
|
|
|
tread_user_count = PraiseTread.where('praise_or_tread = ? AND user_id = ?', 0, user.id).count
|
|
|
|
skill_score = skill_score.to_f - tread_user_count.to_f
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return skill_score
|
|
|
|
|
|
|
|
end
|
|
|
|
def calculate_level(user)
|
|
commit_count = user.changesets.count
|
|
max_praise_num = 0
|
|
|
|
|
|
issues = Issue.where('author_id = ?', user.id)
|
|
issues.each do |i|
|
|
ptcs = PraiseTreadCache.where('object_id = ?', i.id)
|
|
ptcs.each do |p|
|
|
if p.praise_num.to_i > max_praise_num.to_i
|
|
max_praise_num = p.praise_num
|
|
end
|
|
end
|
|
end
|
|
|
|
bids = Bid.where('author_id = ?', user.id)
|
|
bids.each do |b|
|
|
ptcs = PraiseTreadCache.where('object_id = ?', b.id)
|
|
ptcs.each do |p|
|
|
if p.praise_num.to_i > max_praise_num.to_i
|
|
max_praise_num = p.praise_num
|
|
end
|
|
end
|
|
end
|
|
|
|
contests = Contest.where('author_id = ?', user.id)
|
|
contests.each do |c|
|
|
ptcs = PraiseTreadCache.where('object_id = ?', c.id)
|
|
ptcs.each do |p|
|
|
if p.praise_num.to_i > max_praise_num.to_i
|
|
max_praise_num = p.praise_num
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
best_answer_num = 0
|
|
|
|
isManager = 0
|
|
members = Member.where('user_id = ?', user.id)
|
|
members.each do |m|
|
|
#roles = m.member_roles
|
|
#roles.each do |r|
|
|
# if r.role_id == 3
|
|
# isManager = 1
|
|
# end
|
|
#end
|
|
@membership = m.memberships.all(:conditions => Project.visible_condition(User.current))
|
|
@membership.each do |membership|
|
|
#拥有编辑项目权限的可操作该项目
|
|
if m.allowed_to?({:controller => "projects", :action => "edit"}, membership.project, :global => false)
|
|
isManager = 1
|
|
end
|
|
end
|
|
|
|
|
|
end
|
|
|
|
level = 0
|
|
|
|
if max_praise_num > 4
|
|
level = 1
|
|
end
|
|
if commit_count > 0 and commit_count < 101
|
|
level = 1
|
|
end
|
|
if commit_count > 100 or isManager == 1
|
|
level = 2
|
|
end
|
|
|
|
return level
|
|
|
|
end
|
|
|
|
def calculate_activity_count(user)
|
|
# commit_count = user.changesets.count
|
|
# issue_details_count = 0
|
|
# issues = Issue.where('assigned_to_id = ?', user.id)
|
|
# issues.each do |issue|
|
|
# change_count = issue.journals.where("prop_key = ?", "done_ratio").count
|
|
# issue_details_count = change_count + issue_details_count
|
|
# end
|
|
# file_count = user.file_commit.count
|
|
# issue_count = Issue.where('author_id = ?', user.id).count
|
|
#f = user.user_score.file
|
|
#i = user.user_score.issue
|
|
#f_max = UserScore.find_max_file
|
|
#f_min = UserScore.find_min_file
|
|
#i_max = UserScore.find_max_issue
|
|
#i_min = UserScore.find_min_issue
|
|
#score = 100 * ((f - f_min)/(f_max - f_min) + (i - i_min)/(i_max - i_min))
|
|
end
|
|
|
|
def calculate_file(user)
|
|
file_count = user.file_commit.count
|
|
issue_count = Issue.where('author_id = ?', user.id).count
|
|
return (file_count + issue_count)
|
|
end
|
|
|
|
def calculate_issue(user)
|
|
commit_count = user.changesets.count
|
|
|
|
issue_details_count = 0
|
|
issues = Issue.where('assigned_to_id = ?', user.id)
|
|
|
|
change_count = 0
|
|
issues.each do |issue|
|
|
js = issue.journals
|
|
js.each do |j|
|
|
change_count = change_count + j.details.where("prop_key = ?", "done_ratio").count
|
|
end
|
|
|
|
|
|
issue_details_count = change_count + issue_details_count
|
|
end
|
|
|
|
return (commit_count + issue_details_count)
|
|
|
|
end
|
|
|
|
|
|
def calculate_attachments(user)
|
|
attachments = Attachment.where("container_type IS NOT NULL AND container_type <> 'Issue' AND author_id = ?", user.id).count
|
|
|
|
return attachments
|
|
|
|
end
|
|
|
|
def calculate_user_score(user)
|
|
collaboration = calculate_collaboration_count(user)
|
|
influence = calculate_influence_count(user)
|
|
skill = calculate_skill_count(user)
|
|
activity = calculate_activity_count(user)
|
|
file = calculate_file(user)
|
|
issue = calculate_issue(user)
|
|
level = calculate_level(user)
|
|
#user.user_score << UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill,
|
|
# :activity => activity, :file => file, :issue => issue, :level => level)
|
|
UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill,
|
|
:activity => activity, :file => file, :issue => issue, :level => level)
|
|
end
|
|
|
|
def update_user_score(user)
|
|
collaboration = calculate_collaboration_count(user)
|
|
influence = calculate_influence_count(user)
|
|
skill = calculate_skill_count(user)
|
|
file = calculate_file(user)
|
|
issue = calculate_issue(user)
|
|
|
|
##activity = calculate_activity_count(user)
|
|
|
|
level = calculate_level(user)
|
|
user.user_score.update_attributes(:collaboration => collaboration, :influence => influence, :skill => skill,
|
|
:activity => activity, :file => file, :issue => issue, :level => level)
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|