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.
		
		
		
		
		
			
		
			
				
					
					
						
							341 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
	
	
							341 lines
						
					
					
						
							10 KiB
						
					
					
				| # 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
 | |
|     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
 |