bigdir/plugins/redmine_code_review/lib/code_review_changeset_patch.rb

173 lines
5.5 KiB
Ruby

# Code Review plugin for Redmine
# Copyright (C) 2009-2011 Haruyuki Iida
#
# 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.
require_dependency 'changeset'
module CodeReviewChangesetPatch
def self.included(base) # :nodoc:
base.send(:include, ChangesetInstanceMethodsCodeReview)
base.class_eval do
unloadable # Send unloadable so it will not be unloaded in development
has_many :code_review_assignments, :dependent => :destroy
alias_method_chain :scan_comment_for_issue_ids, :code_review
end
end
end
module ChangesetInstanceMethodsCodeReview
#
# for review issues
#
def review_count
return @review_count if @review_count
@review_count = 0
filechanges.each{|change|
@review_count += change.review_count
}
return @review_count
end
def open_review_count
return @open_review_count if @open_review_count
@open_review_count = 0
filechanges.each{|change|
@open_review_count += change.open_review_count
}
return @open_review_count
end
def review_issues
return @review_issues if @review_issues
filechanges.each{|change|
unless @review_issues
@review_issues = change.code_reviews.collect{|issue| issue}
else
@review_issues = @review_issues + change.code_reviews.collect{|issue| issue}
end
@review_issues
}
end
def closed_review_count
review_count - open_review_count
end
def closed_review_pourcent
if review_count == 0
0
else
closed_review_count * 100.0 / review_count
end
end
def completed_review_pourcent
if review_count == 0
0
elsif open_review_count == 0
100
else
@completed_review_pourcent ||= (closed_review_count * 100 +
CodeReview.sum("#{Issue.table_name}.done_ratio",
:joins => "left join #{Change.table_name} on change_id = #{Change.table_name}.id left join #{Changeset.table_name} on #{Change.table_name}.changeset_id = #{Changeset.table_name}.id " +
"left join #{Issue.table_name} on issue_id = #{Issue.table_name}.id " +
"left join #{IssueStatus.table_name} on #{Issue.table_name}.status_id = #{IssueStatus.table_name}.id",
:conditions => ["#{Changeset.table_name}.id = ? AND #{IssueStatus.table_name}.is_closed = ?", id, false]).to_f) / review_count
end
end
#
# for assignment issues
#
def assignment_count
#return @assignment_count if @assignment_count
@assignment_count = code_review_assignments.length
filechanges.each{|change|
@assignment_count += change.assignment_count
}
return @assignment_count
end
def open_assignment_count
return @open_assignment_count if @open_assignment_count
@open_assignment_count = code_review_assignments.select {|assignment|
!assignment.is_closed?
}.length
filechanges.each{|change|
@open_assignment_count += change.open_assignment_count
}
return @open_assignment_count
end
def assignment_issues
return @assignment_issues if @assignment_issues
@assignment_issues = code_review_assignments
filechanges.each{|change|
@assignment_issues = @assignment_issues + change.code_review_assignments.collect{|issue| issue}
}
@assignment_issues
end
def closed_assignment_count
assignment_count - open_assignment_count
end
def closed_assignment_pourcent
if assignment_count == 0
0
else
closed_assignment_count * 100.0 / assignment_count
end
end
def completed_assignment_pourcent
if assignment_count == 0
0
elsif open_assignment_count == 0
100
else
@completed_assignment_pourcent ||= (closed_assignment_count * 100 +
CodeReviewAssignment.sum("#{Issue.table_name}.done_ratio",
:joins => "left join #{Change.table_name} on change_id = #{Change.table_name}.id left join #{Changeset.table_name} on #{Change.table_name}.changeset_id = #{Changeset.table_name}.id " +
"left join #{Issue.table_name} on issue_id = #{Issue.table_name}.id " +
"left join #{IssueStatus.table_name} on #{Issue.table_name}.status_id = #{IssueStatus.table_name}.id",
:conditions => ["#{Changeset.table_name}.id = ? AND #{IssueStatus.table_name}.is_closed = ?", id, false]).to_f) / assignment_count
end
end
#
# changeset作成時にレビューの自動アサインを行う
#
def scan_comment_for_issue_ids_with_code_review
ret = scan_comment_for_issue_ids_without_code_review
project = repository.project if repository
return ret unless project
return ret unless project.module_enabled?('code_review')
setting = CodeReviewProjectSetting.find_or_create(project)
auto_assign = setting.auto_assign_settings
return ret unless auto_assign.enabled?
return unless auto_assign.match_with_changeset?(self)
CodeReviewAssignment.create_with_changeset(self)
ret
end
end