Redmine”版本库“页面显示评审链接

    安装Code Review插件后,在Redmine的“版本库”页面中,已经评审过的代码会有一个标记,显示有几条评审。但是这只能知道评审的数量,而不能快速跳转的已经评审过的页面。因此,我需要更改Code Review插件的源代码,在页面上显示这个链接。没有链接的“版本库”页面如下图所示:

    很快就发现更改“版本库”页面的代码位于/vendor/plugins/redmine_code_review/apps/views/_update_revisions.html.erb。其中,显示已评审信息的代码如下:

<script type="text/javascript">
<% @changesets.each do |changeset| %>
  <%
  if changeset.review_count > 0
    progress = '<span style="white-space: nowrap">' + progress_bar([changeset.closed_review_pourcent, changeset.completed_review_pourcent],
      :width => '60px',
      :legend => "#{sprintf("%0.1f", changeset.completed_review_pourcent)}%") + '</span>' +
	  '<p class="progress-info">' + "#{changeset.closed_review_count} #{l(:label_closed_issues)}" +
      "   #{changeset.open_review_count} #{l(:label_open_issues)}" + '</p>'
  elsif changeset.assignment_count > 0
    if (changeset.open_assignment_count > 0)
      progress = '<p class="progress-info">' + l(:code_review_assigned) + '</p>'
    else
      progress = '<p class="progress-info">' + l(:code_review_reviewed) + '</p>'
    end
    
  else
    progress = '<p class="progress-info">' + l(:lable_no_code_reviews) + '</p>'
  end
%>

    var count = new ReviewCount(<%=  changeset.review_count %>, <%=  changeset.open_review_count %>, '<%=  progress %>');

    review_counts['revision_<%=changeset.identifier %>'] = count;
<% end %>

    从代码中可以看出,当 changeset.review_count > 0 时,即有这段代码有评审时,需要显示下面的信息,而 changeset.review_count 也就是评审的数量。如果没有评审,就显示 :label_no_code_reviews。对应代码为:

 else
    progress = '<p class="progress-info">' + l(:lable_no_code_reviews) + '</p>'
 end

    我们需要关注的有评审时的情况,也就是:

progress = '<span style="white-space: nowrap">' + progress_bar([changeset.closed_review_pourcent, changeset.completed_review_pourcent],
      :width => '60px',
      :legend => "#{sprintf("%0.1f", changeset.completed_review_pourcent)}%") + '</span>' +
	  '<p class="progress-info">' + "#{changeset.closed_review_count} #{l(:label_closed_issues)}" +
      "   #{changeset.open_review_count} #{l(:label_open_issues)}" + '</p>'

    progress是一个string类型,记录了需要显示的html代码,用于最终显示到页面上。我们这里要把它改成一个链接,通过查看其它地方的代码,可以发现生成链接的Ruby代码是这样的:

link_to(codepath, {:controller => 'code_review', :action => 'show', :id => @project, :review_id => review.id}, :title => review.path)

    其中 codepath 是显示出来的链接地址,为了照顾页面的长度,把过长的链接字段进行了缩短,review.id 和 review.path 是评审的编号和对应代码路径,经过转化之后,这段代码会生成一个HTML形式的链接,当点这个链接的时候,会调用 code_review 的 show 方法,跳转到对应的路径,以下就一段路径的例子:

<a href="/code_review/show/gg?review_id=12" title="/trunk/tmstable/tmstable-console/src/main/webapp/consoes/screen/process.vm">/trunk/tmstable...console/templates/screen/process.vm</a>

    显示一条链接的路径很容易,但是要显示多条路径就比较麻烦了,涉及到信息的存储和table显示。试了好多种方法,最后,终于用如下的代码搞定:

<script type="text/javascript">

<% @changesets.each do |changeset| %>
<%
	if changeset.review_count > 0
		codepath_show = Array.new
		reviewpath_show = Array.new
		reviewid_show = Array.new

		for review in @reviews
			if (changeset.id == review.changeset.id)
				puts "review id:"+review.changeset.id.to_s
			    codepath = review.path
                if (review.path.length > 55)
                    codepath = review.path[0, 15] + '...' + review.path[review.path.length - 35, 35]
				end
				codepath_show << codepath
				reviewpath_show << review.path
				reviewid_show << review.id
            end
		end

		i = 0
		progress = Array.new
		progress<<'<table>'
		while i<changeset.review_count do
			progress<<'<tr><td>'
			progress<<link_to(codepath_show[i], {:controller => 'code_review', :action => 'show', :id => @project, :review_id => reviewid_show[i]}, :title => reviewpath_show[i])
			progress<<'</td></tr>'
			i += 1
		end
		progress<<'</table>'

  elsif changeset.assignment_count > 0
    if (changeset.open_assignment_count > 0)
      progress = '<p class="progress-info">' + l(:code_review_assigned) + '</p>'
    else
      progress = '<p class="progress-info">' + l(:code_review_reviewed) + '</p>'
    end
    
  else
    progress = '<p class="progress-info">' + l(:lable_no_code_reviews) + '</p>'
  end
%>

    var count = new ReviewCount(<%=  changeset.review_count %>, <%=  changeset.open_review_count %>, '<%=  progress %>');

    review_counts['revision_<%=changeset.identifier %>'] = count;
<% end %>

    最后显示效果如下图所示:

posted @ 2011-09-02 11:25  compulsive  阅读(951)  评论(0编辑  收藏  举报