Merge branch 'rep_quality' of https://git.trustie.net/jacknudt/trustieforge into rep_quality

This commit is contained in:
daiao 2016-09-26 16:22:24 +08:00
commit bfa1f32214
15 changed files with 371 additions and 281 deletions

View File

@ -686,35 +686,6 @@ class ApplicationController < ActionController::Base
:content_type => 'application/atom+xml' :content_type => 'application/atom+xml'
end end
# 项目列表导出Excel功能
def issue_list_xls issues
xls_report = StringIO.new
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet :name => "issues"
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
sheet1.row(0).default_format = blue
sheet1.row(0).concat([l(:issue_xls_id),l(:issue_xls_tracker_id),l(:issue_xls_title),l(:issue_xls_description),l(:issue_xls_status),l(:issue_xls_assign),l(:issue_xls_priority),l(:issue_xls_author),l(:issue_xls_created_at),l(:issue_xls_version),l(:issue_xls_start),l(:issue_xls_due),l(:issue_xls_ratio)])
count_row = 1
issues.each do |issue|
sheet1[count_row,0] = issue.id
sheet1[count_row,1] = issue_tracker_change(issue.tracker_id)
sheet1[count_row,2] = issue.subject
sheet1[count_row,3] = issue.description
sheet1[count_row,4] = issue_status_change(issue.status_id)
sheet1[count_row,5] = issue.assigned_to.try(:show_name)
sheet1[count_row,6] = issue_priority_change(issue.priority_id)
sheet1[count_row,7] = issue.author.show_name
sheet1[count_row,8] = issue.created_on
sheet1[count_row,9] = issue.fixed_version.try(:name)
sheet1[count_row,10] = issue.start_date
sheet1[count_row,11] = issue.due_date
sheet1[count_row,12] = issue_ratio_change(issue.done_ratio, issue.status_id)
count_row += 1
end
book.write xls_report
xls_report.string
end
def issue_ratio_change done_ratio, status_id def issue_ratio_change done_ratio, status_id
if done_ratio == 100 || status_id == 3 if done_ratio == 100 || status_id == 3
"已完成" "已完成"

View File

@ -34,7 +34,7 @@ class RepositoriesController < ApplicationController
before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo, :stats, :quality_analysis] before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo, :stats, :quality_analysis]
before_filter :find_repository, :only => [:edit, :update, :destroy, :committers] before_filter :find_repository, :only => [:edit, :update, :destroy, :committers]
before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo, :to_gitlab, :forked, :project_archive] before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo, :to_gitlab, :forked, :project_archive, :export_rep_static]
before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue]
before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked, :commit_diff, :project_archive, :quality_analysis] before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked, :commit_diff, :project_archive, :quality_analysis]
# 链接gitlab # 链接gitlab
@ -69,6 +69,20 @@ class RepositoriesController < ApplicationController
end end
def export_rep_static
@project = Project.find(params[:id])
gpid = @project.gpid
rev = params[:rev]
cycle = params[:cycle]
respond_to do |format|
format.html
format.xls{
filename = "#{@project.name.to_s}_#{l(:label_issue_list_xls)}_#{@rev}_#{l(:label_rep_xls)}.xls"
send_data(export_rep_xls(gpid, :rev => rev, :cycle => "1"), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename))
}
end
end
def forked def forked
@project = Project.find(params[:id]) @project = Project.find(params[:id])
@repository = Repository.where("project_id =? and type =?", @project.id, "Repository::Gitlab") @repository = Repository.where("project_id =? and type =?", @project.id, "Repository::Gitlab")

View File

@ -63,6 +63,67 @@ module ApplicationHelper
result result
end end
# 项目版本库导出Excel功能
def export_rep_xls(gpid, options = {})
g = Gitlab.client
cycle = params[:cycle]
rev = params[:rev]
# branch = g.branche(gpid, rev)
statics = g.rep_stats(gpid, :rev => rev)
xls_report = StringIO.new
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet :name => "版本库"
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
sheet1.row(0).default_format = blue
sheet1.row(0).concat([l(:rep_branch),l(:rep_author),l(:rep_author_mail),l(:rep_code_add),l(:rep_code_delete),l(:rep_code_modified),l(:rep_sode_time),l(:rep_sode_cycle)])
count_row = 1
statics.each do |static|
user = User.where(:mail => static.email).first
sheet1[count_row,0] = rev
sheet1[count_row,1] = user.nil? ? static.uname : user.show_name
sheet1[count_row,2] = static.email
sheet1[count_row,3] = static.add
sheet1[count_row,4] = static.del
sheet1[count_row,5] = static.changes
sheet1[count_row,6] = Time.now
sheet1[count_row,7] = "1周"
count_row += 1
end
book.write xls_report
xls_report.string
end
# 项目issue列表导出Excel功能
def issue_list_xls issues
xls_report = StringIO.new
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet :name => "issues"
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
sheet1.row(0).default_format = blue
sheet1.row(0).concat([l(:issue_xls_id),l(:issue_xls_tracker_id),l(:issue_xls_title),l(:issue_xls_description),l(:issue_xls_status),l(:issue_xls_assign),l(:issue_xls_priority),l(:issue_xls_author),l(:issue_xls_created_at),l(:issue_xls_version),l(:issue_xls_start),l(:issue_xls_due),l(:issue_xls_ratio)])
count_row = 1
issues.each do |issue|
sheet1[count_row,0] = issue.id
sheet1[count_row,1] = issue_tracker_change(issue.tracker_id)
sheet1[count_row,2] = issue.subject
sheet1[count_row,3] = issue.description
sheet1[count_row,4] = issue_status_change(issue.status_id)
sheet1[count_row,5] = issue.assigned_to.try(:show_name)
sheet1[count_row,6] = issue_priority_change(issue.priority_id)
sheet1[count_row,7] = issue.author.show_name
sheet1[count_row,8] = issue.created_on
sheet1[count_row,9] = issue.fixed_version.try(:name)
sheet1[count_row,10] = issue.start_date
sheet1[count_row,11] = issue.due_date
sheet1[count_row,12] = issue_ratio_change(issue.done_ratio, issue.status_id)
count_row += 1
end
book.write xls_report
xls_report.string
end
# 获取用户单位 # 获取用户单位
# 优先获取高校信息如果改信息不存在则获取occupation # 优先获取高校信息如果改信息不存在则获取occupation
def get_occupation_from_user user def get_occupation_from_user user

View File

@ -1,4 +1,4 @@
<div class="project_r_h"> <div class="project_r_h" style="width:730px;">
<h2 class="project_h2"><%= @query.new_record? ? l(:label_calendar) : h(@query.name) %></h2> <h2 class="project_h2"><%= @query.new_record? ? l(:label_calendar) : h(@query.name) %></h2>
</div> </div>
@ -40,3 +40,7 @@
<% end %> <% end %>
<% html_title(l(:label_calendar)) -%> <% html_title(l(:label_calendar)) -%>
<script>
$("#RSide").css("width","730px");
</script>

View File

@ -1,4 +1,4 @@
<div class="project_r_h"> <div class="project_r_h" style="width:730px;">
<h2 class="project_h2"><% @gantt.view = self %> <h2 class="project_h2"><% @gantt.view = self %>
<%= @query.new_record? ? l(:label_gantt) : h(@query.name) %></h2> <%= @query.new_record? ? l(:label_gantt) : h(@query.name) %></h2>
</div> </div>
@ -320,3 +320,7 @@
$("#draw_progress_line").change(drawGanttHandler); $("#draw_progress_line").change(drawGanttHandler);
}); });
<% end %> <% end %>
<script>
$("#RSide").css("width","730px");
</script>

View File

@ -3,7 +3,7 @@
<% for journal in journals %> <% for journal in journals %>
<div class="ping_C" id='word_li_<%= journal.id.to_s %>'> <div class="ping_C" id='word_li_<%= journal.id.to_s %>'>
<div class="ping_dispic"><%= link_to image_tag(url_to_avatar(journal.user),:width => '46',:height => '46'), user_path(journal.user) %></div> <div class="ping_dispic"><%= link_to image_tag(url_to_avatar(journal.user),:width => '46',:height => '46'), user_path(journal.user) %></div>
<div class="ping_discon" style="width: 610px;" onmouseover="$('#delete_reply_<%=journal.id %>').show();" onmouseout="$('#delete_reply_<%=journal.id %>').hide();"> <div class="ping_discon" style="width: 670px;" onmouseover="$('#delete_reply_<%=journal.id %>').show();" onmouseout="$('#delete_reply_<%=journal.id %>').hide();">
<div class="ping_distop f14"> <div class="ping_distop f14">
<!-- <a style=" font-weight:bold; color:#15bccf; margin-right:30px; background:none;" target="_blank" href="#">gugu01</a> --> <!-- <a style=" font-weight:bold; color:#15bccf; margin-right:30px; background:none;" target="_blank" href="#">gugu01</a> -->
<span><%= link_to journal.user.show_name, user_path(journal.user), :class => 'c_blue fb fl mb10 f14', :target => "_blank" %> <span><%= link_to journal.user.show_name, user_path(journal.user), :class => 'c_blue fb fl mb10 f14', :target => "_blank" %>

View File

@ -15,7 +15,7 @@
<%= import_ke(enable_at: false, prettify: false, init_activity: false) %> <%= import_ke(enable_at: false, prettify: false, init_activity: false) %>
<% end %> <% end %>
<div class="msg_box" id='leave-message' nhname='new_message' style="height:auto;"> <div class="msg_box" id='leave-message' nhname='new_message' style="height:auto; width:728px;">
<% reply_allow = JournalsForMessage.create_by_user? User.current %> <% reply_allow = JournalsForMessage.create_by_user? User.current %>
<h4><%= l(:label_user_response) %></h4> <h4><%= l(:label_user_response) %></h4>
<% if !User.current.logged?%> <% if !User.current.logged?%>
@ -27,7 +27,7 @@
<% else %> <% else %>
<%= form_for('new_form', :method => :post, :html => {:id => 'project_feedback_form', :multipart => true}, <%= form_for('new_form', :method => :post, :html => {:id => 'project_feedback_form', :multipart => true},
:url => {:controller => 'words', :action => 'leave_project_message'}) do |f|%> :url => {:controller => 'words', :action => 'leave_project_message'}) do |f|%>
<%= f.text_area 'project_message', :rows => 3, :cols => 65, <%= f.text_area 'project_message', :rows => 3, :cols => 65, :style => "width:718px",
:placeholder => "#{l(:label_welcome_my_respond)}",:nhname=>'new_message_textarea' %> :placeholder => "#{l(:label_welcome_my_respond)}",:nhname=>'new_message_textarea' %>
<p nhname="contentmsg"></p> <p nhname="contentmsg"></p>
<div class="fl mt10" style="padding-top:5px;" nhname="toolbar_container"></div> <div class="fl mt10" style="padding-top:5px;" nhname="toolbar_container"></div>

View File

@ -1,4 +1,4 @@
<div class="project_r_h"> <div class="project_r_h" style="width:730px;">
<h2 class="project_h2"><%= l(:label_project_tool_response)%></h2> <h2 class="project_h2"><%= l(:label_project_tool_response)%></h2>
</div> </div>
<% reply_allow = JournalsForMessage.create_by_user? User.current %> <% reply_allow = JournalsForMessage.create_by_user? User.current %>
@ -48,3 +48,7 @@ function checkMaxLength() {
</script> </script>
<% html_title(l(:label_project_tool_response)) -%> <% html_title(l(:label_project_tool_response)) -%>
<script>
$("#RSide").css("width","730px");
</script>

View File

@ -16,15 +16,16 @@
<% end%> <% end%>
<% end%> <% end%>
$("div[nhname='pro_setting']").show(); $("div[nhname='pro_setting']").show();
$("#RSide").css('width',"730px");
}); });
</script> </script>
<div class="project_r_h"> <div class="project_r_h" style="width:730px;">
<h2 class="project_h2">配置</h2> <h2 class="project_h2">配置</h2>
</div> </div>
<!--通过admin界面配置不同角色显示不同的模块--> <!--通过admin界面配置不同角色显示不同的模块-->
<div class=" pro_setting" nhname="pro_setting" style="display:none;"> <div nhname="pro_setting" style="display:none; width:730px;">
<div id="pro_st_tb_" class="pro_st_tb_"> <div id="pro_st_tb_" class="pro_st_tb_">
<ul> <ul>
<% show_memu = show_project_memu User.current%> <% show_memu = show_project_memu User.current%>

View File

@ -1,6 +1,6 @@
<%= call_hook(:view_repositories_show_contextual, { :repository => @repository, :project => @project }) %> <%= call_hook(:view_repositories_show_contextual, { :repository => @repository, :project => @project }) %>
<div class="project_r_h"> <div class="project_r_h" style="width:730px;">
<div class="fl"><h2 class="project_h2_repository"><%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %></h2></div> <div class="fl"><h2 class="project_h2_repository"><%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %></h2></div>
</div> </div>
@ -23,3 +23,7 @@
<% end %> <% end %>
<% html_title(l(:label_change_plural)) -%> <% html_title(l(:label_change_plural)) -%>
<script>
$("#RSide").css("width","730px");
</script>

View File

@ -1,5 +1,5 @@
<%#= call_hook(:view_repositories_show_contextual, {:repository => @repository, :project => @project}) %> <%#= call_hook(:view_repositories_show_contextual, {:repository => @repository, :project => @project}) %>
<div class="project_r_h"> <div class="project_r_h" style="width:730px;">
<div class="fl"><h2 class="project_h2_repository"><%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %></h2></div> <div class="fl"><h2 class="project_h2_repository"><%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %></h2></div>
<% unless @entries.nil? %> <% unless @entries.nil? %>
<a href="<%= @zip_path %>" class="btn_zipdown fr" onclick="">ZIP下载</a> <a href="<%= @zip_path %>" class="btn_zipdown fr" onclick="">ZIP下载</a>
@ -48,7 +48,7 @@
<% end %> <% end %>
<div class="cl"></div> <div class="cl"></div>
<div class="recordBanner mt10"> <div class="recordBanner mt10" style="width:730px;">
<% if @changesets && !@changesets.empty? %> <% if @changesets && !@changesets.empty? %>
<% if !user_commit_rep(@changesets_latest_coimmit.author_email).nil? %> <% if !user_commit_rep(@changesets_latest_coimmit.author_email).nil? %>
<%= image_tag(url_to_avatar(user_commit_rep(@changesets_latest_coimmit.author_email)), :width => "25", :height => "25", :class => "fl portraitRadius mt2 ml4 mr5") %> <%= image_tag(url_to_avatar(user_commit_rep(@changesets_latest_coimmit.author_email)), :width => "25", :height => "25", :class => "fl portraitRadius mt2 ml4 mr5") %>
@ -78,9 +78,20 @@
<% end %> <% end %>
<a href="https://<%=Setting.host_name %>/forums/1/memos/1232" >如何提交代码</a> <a href="https://<%=Setting.host_name %>/forums/1/memos/1232" >如何提交代码</a>
<div class="fr">
<%= link_to "代码统计导出excel", {:controller => 'repositories', :action => 'export_rep_static', :format => 'xls', :rev => @rev } %></br>
</div>
<%#= link_to "导出excel", {:controller => 'repositories', :action => 'export_rep_static', :rev => @rev}, :format => 'xls' %>
<!--<a href="<%#=project_issues_path(:project_id => @project, :format => 'xls')%>" class="hw_btn_blue fr" alt="导出EXCEL">导出EXCEL</a>-->
</div> </div>
<%# content_for :header_tags do %> <%# content_for :header_tags do %>
<%#= stylesheet_link_tag "scm" %> <%#= stylesheet_link_tag "scm" %>
<%# end %> <%# end %>
<% html_title(l(:label_repository)) -%> <% html_title(l(:label_repository)) -%>
<script>
$("#RSide").css("width","730px");
</script>

View File

@ -1,4 +1,4 @@
<div class="project_r_h"> <div class="project_r_h" style="width:730px;">
<h2 class="project_h2"><%= l(:label_roadmap) %></h2> <h2 class="project_h2"><%= l(:label_roadmap) %></h2>
</div> </div>
<div class="roadmap"> <div class="roadmap">
@ -24,7 +24,7 @@
<% else %> <% else %>
<% @versions.each do |version| %> <% @versions.each do |version| %>
<div class="roadmap_box"> <div class="roadmap_box" style="width:710px;">
<p><a href="javascript:void(0)" class=" f16 fb c_dblue " target="_blank"> <p><a href="javascript:void(0)" class=" f16 fb c_dblue " target="_blank">
<a href="javascript:void(0)" class=" f16 fb c_dblue " target="_blank"><%= version_anchor(version)%></a> <a href="javascript:void(0)" class=" f16 fb c_dblue " target="_blank"><%= version_anchor(version)%></a>
<%#= link_to_version_show version, :name => version_anchor(version) %> <%#= link_to_version_show version, :name => version_anchor(version) %>
@ -72,3 +72,7 @@
<% html_title(l(:label_roadmap)) %> <% html_title(l(:label_roadmap)) %>
<%= context_menu issues_context_menu_path %> <%= context_menu issues_context_menu_path %>
<script>
$("#RSide").css("width","730px");
</script>

View File

@ -11,7 +11,7 @@
<%= image_tag url_to_avatar(nil),:width => '30',:height => '30' %> <%= image_tag url_to_avatar(nil),:width => '30',:height => '30' %>
<% end %> <% end %>
</div> </div>
<div class="recall_con f14"> <div class="recall_con f14" style="width:650px;">
<% id = 'project_respond_form_'+ reply.id.to_s %> <% id = 'project_respond_form_'+ reply.id.to_s %>
<%= link_to reply.user.show_name, user_path(reply.user) %> <%= link_to reply.user.show_name, user_path(reply.user) %>
<%= l(:label_reply_to)%> <%= l(:label_reply_to)%>

View File

@ -200,6 +200,8 @@ zh:
label_issue_new: 新建问题 label_issue_new: 新建问题
label_query: 自定义查询 label_query: 自定义查询
label_issue_list_xls: Issue列表 label_issue_list_xls: Issue列表
label_rep_xls: 版本库代码统计
label_rep_branch: 分支
# Issue列表 excel导出参数 # Issue列表 excel导出参数
issue_xls_id: ID issue_xls_id: ID
@ -216,6 +218,15 @@ zh:
issue_xls_due: 截止时间 issue_xls_due: 截止时间
issue_xls_ratio: 完成度 issue_xls_ratio: 完成度
# 版本库excel导出
rep_branch: 分支
rep_author: 作者
rep_author_mail: 邮箱
rep_code_add: 添加行数
rep_code_delete: 删除代码
rep_code_modified: 总行数
rep_sode_time: 导出时间
rep_sode_cycle: 周期
# 自定义查询 # 自定义查询
label_query_plural: 自定义查询 label_query_plural: 自定义查询

View File

@ -982,6 +982,7 @@ RedmineApp::Application.routes.draw do
get 'projects/:id/repository/changes(/*path(.:ext))', :to => 'repositories#changes' get 'projects/:id/repository/changes(/*path(.:ext))', :to => 'repositories#changes'
get 'projects/:id/repository/forked', :to => 'repositories#forked' get 'projects/:id/repository/forked', :to => 'repositories#forked'
get 'projects/:id/repository/export_rep_static', :to => 'repositories#export_rep_static'
get 'projects/:id/repository/project_archive', :to => 'repositories#project_archive', :as => 'project_archive' get 'projects/:id/repository/project_archive', :to => 'repositories#project_archive', :as => 'project_archive'
get 'projects/:id/repository/revisions', :to => 'repositories#revisions' get 'projects/:id/repository/revisions', :to => 'repositories#revisions'
get 'projects/:id/repository/revisions/:rev', :to => 'repositories#revision' get 'projects/:id/repository/revisions/:rev', :to => 'repositories#revision'