summaryrefslogtreecommitdiffstats
path: root/sonar-server
diff options
context:
space:
mode:
authorFabrice Bellingard <bellingard@gmail.com>2011-04-08 18:12:07 +0200
committerFabrice Bellingard <bellingard@gmail.com>2011-04-20 08:49:57 +0200
commit0c84e708498524c37ba00e941a1d63e04a3a2607 (patch)
treecd0fc8021bb68450ea9436f20f914c18fdf4b390 /sonar-server
parentb248b5c93ae39b52bd77508559862c7885dedec0 (diff)
downloadsonarqube-0c84e708498524c37ba00e941a1d63e04a3a2607.tar.gz
sonarqube-0c84e708498524c37ba00e941a1d63e04a3a2607.zip
[SONAR-2327] First implementation of the review service
Diffstat (limited to 'sonar-server')
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/controllers/reviews_controller.rb188
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/helpers/reviews_helper.rb40
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/models/review.rb7
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb1
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_form_comment.html.erb2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_list.html.erb (renamed from sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_index.html.erb)0
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_comment_result.js.rjs2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_result.js.rjs2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/reviews/index.html.erb45
10 files changed, 206 insertions, 83 deletions
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/reviews_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/reviews_controller.rb
index 464bfdde0ce..8dea0fb9b63 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/reviews_controller.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/reviews_controller.rb
@@ -20,88 +20,118 @@
class ReviewsController < ApplicationController
- SECTION=Navigation::SECTION_RESOURCE
-
- verify :method => :post, :only => [ :create, :create_comment ], :redirect_to => { :action => :error_not_post }
-
- def index
- reviews = findReviewsForRuleFailure params[:rule_failure_id]
- render :partial => "index", :locals => { :reviews => reviews }
- end
-
- def form
- @review = Review.new
- @review.rule_failure_id = params[:violation_id]
- @review.user = current_user
- @review.severity = Review.default_severity
- @review_comment = ReviewComment.new
- @review_comment.review_text = ""
- render :partial => "form"
- end
-
- def form_comment
- @review_comment = ReviewComment.new
- @review_comment.user = current_user
- @review_comment.review_id = params[:review_id]
- @review_comment.review_text = ""
- @rule_failure_id = params[:rule_failure_id]
- render :partial => "form_comment"
- end
-
- def create
- unless hasRightsToCreate? params[:review][:rule_failure_id]
- render :text => "<b>Cannot create the review</b> : access denied."
- return
- end
-
- @review = Review.new(params[:review])
- @review.user = current_user
- @review.status = Review.default_status
- @review.review_type = Review.default_type
- @review_comment = ReviewComment.new(params[:review_comment])
- @review_comment.user = current_user
- @review.review_comments << @review_comment
- if @review.valid?
- @review.save
- @reviews = findReviewsForRuleFailure @review.rule_failure_id
- end
- render "create_result"
- end
-
- def create_comment
- unless hasRightsToCreate? params[:rule_failure_id]
- render :text => "<b>Cannot create the comment</b> : access denied."
- return
- end
-
+ SECTION=Navigation::SECTION_HOME
+
+ verify :method => :post, :only => [ :create, :create_comment ], :redirect_to => { :action => :error_not_post }
+
+ def index
+ init_params
+
+ @reviews = []
+ unless params.blank?
+ @reviews = Review.find :all, :conditions => ['status=?', @statuses]
+ end
+ end
+
+ def list
+ reviews = findReviewsForRuleFailure params[:rule_failure_id]
+ render :partial => "index", :locals => { :reviews => reviews }
+ end
+
+ def form
+ @review = Review.new
+ @review.rule_failure_id = params[:violation_id]
+ @review.user = current_user
+ @review.severity = Review.default_severity
+ @review_comment = ReviewComment.new
+ @review_comment.review_text = ""
+ render :partial => "form"
+ end
+
+ def form_comment
+ @review_comment = ReviewComment.new
+ @review_comment.user = current_user
+ @review_comment.review_id = params[:review_id]
+ @review_comment.review_text = ""
+ @rule_failure_id = params[:rule_failure_id]
+ render :partial => "form_comment"
+ end
+
+ def create
+ unless hasRightsToCreate? params[:review][:rule_failure_id]
+ render :text => "<b>Cannot create the review</b> : access denied."
+ return
+ end
+
+ @review = Review.new(params[:review])
+ @review.user = current_user
+ @review.status = Review.default_status
+ @review.review_type = Review.default_type
+ @review_comment = ReviewComment.new(params[:review_comment])
+ @review_comment.user = current_user
+ @review.review_comments << @review_comment
+ if @review.valid?
+ @review.save
+ @reviews = findReviewsForRuleFailure @review.rule_failure_id
+ end
+ render "create_result"
+ end
+
+ def create_comment
+ unless hasRightsToCreate? params[:rule_failure_id]
+ render :text => "<b>Cannot create the comment</b> : access denied."
+ return
+ end
+
@review_comment = ReviewComment.new(params[:review_comment])
@review_comment.user = current_user
@rule_failure_id = params[:rule_failure_id]
if @review_comment.valid?
- @review_comment.save
- @reviews = findReviewsForRuleFailure @rule_failure_id
- end
+ @review_comment.save
+ @reviews = findReviewsForRuleFailure @rule_failure_id
+ end
render "create_comment_result"
- end
-
- private
-
- def findReviewsForRuleFailure ( rule_failure_id )
- return Review.find :all, :conditions => ['rule_failure_id=?', rule_failure_id]
- end
-
- def hasRightsToCreate? ( rule_failure_id )
- return false unless current_user
-
- project = RuleFailure.find( rule_failure_id, :include => ['snapshot'] ).snapshot.root_project
- unless has_role?(:user, project)
- return false
- end
- return true
- end
-
- def error_not_post
- render :text => "Create actions must use POST method."
- end
-
+ end
+
+
+ ## -------------- PRIVATE -------------- ##
+ private
+
+ def init_params
+ users = User.find :all
+ @user_names = [["Any", ""]]
+ users.each do |user|
+ @user_names << [user.name, user.id.to_s]
+ end
+ @review_authors = filter_any(params[:review_authors]) || [""]
+ @comment_authors = filter_any(params[:comment_authors]) || [""]
+ @severities = filter_any(params[:severities]) || [""]
+ @statuses = filter_any(params[:statuses]) || ["open"]
+ end
+
+ def filter_any(array)
+ if array && array.size>1 && array.include?('')
+ array=[''] #keep only 'any'
+ end
+ array
+ end
+
+ def findReviewsForRuleFailure ( rule_failure_id )
+ return Review.find :all, :conditions => ['rule_failure_id=?', rule_failure_id]
+ end
+
+ def hasRightsToCreate? ( rule_failure_id )
+ return false unless current_user
+
+ project = RuleFailure.find( rule_failure_id, :include => ['snapshot'] ).snapshot.root_project
+ unless has_role?(:user, project)
+ return false
+ end
+ return true
+ end
+
+ def error_not_post
+ render :text => "Create actions must use POST method."
+ end
+
end
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/helpers/reviews_helper.rb b/sonar-server/src/main/webapp/WEB-INF/app/helpers/reviews_helper.rb
new file mode 100644
index 00000000000..c615c99a82f
--- /dev/null
+++ b/sonar-server/src/main/webapp/WEB-INF/app/helpers/reviews_helper.rb
@@ -0,0 +1,40 @@
+#
+# Sonar, entreprise quality control tool.
+# Copyright (C) 2008-2011 SonarSource
+# mailto:contact AT sonarsource DOT com
+#
+# Sonar is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 3 of the License, or (at your option) any later version.
+#
+# Sonar 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with Sonar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+#
+module ReviewsHelper
+
+ def self.severity_options_with_any
+ severity_ops = []
+ severity_ops << ["Any", ""]
+ Review.severity_options.each do |severity|
+ severity_ops << severity
+ end
+ return severity_ops
+ end
+
+ def self.status_options_with_any
+ status_ops = []
+ status_ops << ["Any", ""]
+ Review.status_options.each do |status|
+ status_ops << status
+ end
+ return status_ops
+ end
+
+end
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/review.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/review.rb
index 2e42efb6f15..6fc2db26717 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/models/review.rb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/models/review.rb
@@ -60,5 +60,12 @@ class Review < ActiveRecord::Base
severity_ops << ["Blocker", SEVERITY_BLOCKER]
return severity_ops
end
+
+ def self.status_options
+ status_ops = []
+ status_ops << ["Open", STATUS_OPEN]
+ status_ops << ["Closed", STATUS_CLOSED]
+ return status_ops
+ end
end
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb
index fe683319266..e6ab11b5d22 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_layout.html.erb
@@ -26,6 +26,7 @@
<ul>
<% if selected_section==Navigation::SECTION_HOME %>
<li class="<%= 'selected' if controller.controller_path=='filters' -%>"><a href="<%= ApplicationController.root_context -%>/filters/index">Filters</a></li>
+ <li class="<%= 'selected' if controller.controller_path=='reviews' -%>"><a href="<%= ApplicationController.root_context -%>/reviews/index">Reviews</a></li>
<li class="<%= 'selected' if controller.controller_path=='dependencies' -%>"><a href="<%= ApplicationController.root_context -%>/dependencies/index">Dependencies</a></li>
<% controller.java_facade.getPages(Navigation::SECTION_HOME, nil, nil, nil).each do |page|
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb
index 1b1bdeee331..6ac4247163f 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb
@@ -32,7 +32,7 @@
<% end %>
<div id="reviewFailure<%= violation.id -%>" style="padding:5px; background:white; display:<%= displayReviewFailureDiv -%>">
- <%= render :partial => "reviews/index", :locals => { :reviews => violation.reviews } %>
+ <%= render :partial => "reviews/list", :locals => { :reviews => violation.reviews } %>
</div>
</td>
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_form_comment.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_form_comment.html.erb
index 6bf3b47b6eb..ea5710840cb 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_form_comment.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_form_comment.html.erb
@@ -9,7 +9,7 @@
<%= submit_to_remote 'create_btn', 'Add comment',
:url => { :action => 'create_comment', :rule_failure_id => @rule_failure_id } %>
<%= submit_to_remote 'cancel_btn', 'Cancel',
- :url => { :action => 'index', :rule_failure_id => @rule_failure_id.to_s },
+ :url => { :action => 'list', :rule_failure_id => @rule_failure_id.to_s },
:update => { :success => "reviewFailure" + @rule_failure_id.to_s } %>
<%= f.error_messages :header_message => "Can't save the comment", :message => "", :header_tag => :h3%>
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_index.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_list.html.erb
index 2fbbd000238..2fbbd000238 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_index.html.erb
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/_list.html.erb
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_comment_result.js.rjs b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_comment_result.js.rjs
index ba5a4d8fb53..0c4c474c601 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_comment_result.js.rjs
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_comment_result.js.rjs
@@ -1,5 +1,5 @@
if @reviews
- page.replace_html "reviewFailure" + @rule_failure_id.to_s, :partial => "index", :locals => { :reviews => @reviews }
+ page.replace_html "reviewFailure" + @rule_failure_id.to_s, :partial => "list", :locals => { :reviews => @reviews }
else
page.replace_html "createComment" + @review_comment.review_id.to_s, :partial => "form_comment"
end \ No newline at end of file
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_result.js.rjs b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_result.js.rjs
index bdf20061a89..0a771dac806 100644
--- a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_result.js.rjs
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/create_result.js.rjs
@@ -1,6 +1,6 @@
if @reviews
page.hide "createReviewLink" + @review.rule_failure_id.to_s
- page.replace_html "reviewFailure" + @review.rule_failure_id.to_s, :partial => "index", :locals => { :reviews => @reviews }
+ page.replace_html "reviewFailure" + @review.rule_failure_id.to_s, :partial => "list", :locals => { :reviews => @reviews }
else
page.replace_html "reviewFailure" + @review.rule_failure_id.to_s, :partial => "form"
end \ No newline at end of file
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/index.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/index.html.erb
new file mode 100644
index 00000000000..9394ad52c41
--- /dev/null
+++ b/sonar-server/src/main/webapp/WEB-INF/app/views/reviews/index.html.erb
@@ -0,0 +1,45 @@
+<h1>Reviews</h1>
+
+<div class="tabs-panel marginbottom10 background-gray">
+ <% form_tag({:action => 'index'}, {:method => 'get'}) do %>
+ <table class="spaced" id="search_table">
+ <tr>
+ <td class="left" valign="top" width="1%" nowrap>
+ <span class="note">Created by</span><br/>
+ <%= select_tag "review_authors", options_for_select(@user_names, @review_authors), :multiple => true, :size => 6 %>
+ </td>
+ <td class="left" valign="top" width="1%" nowrap>
+ <span class="note">Commented by</span><br/>
+ <%= select_tag "comment_authors", options_for_select(@user_names, @comment_authors), :multiple => true, :size => 6 %>
+ </td>
+ <td class="left" valign="top" width="1%" nowrap>
+ <span class="note">Severity</span><br/>
+ <%= select_tag "severities", options_for_select(ReviewsHelper.severity_options_with_any, @severities), :multiple => true, :size => 6 %>
+ </td>
+ <td class="left" valign="top" width="1%" nowrap>
+ <span class="note">Status</span><br/>
+ <%= select_tag "statuses", options_for_select(ReviewsHelper.status_options_with_any, @statuses), :multiple => true, :size => 6 %>
+ </td>
+ <td class="left" valign="top" >
+ <br/>
+ <%= submit_tag "Search", :id => 'submit_search' %>
+ </td>
+ </tr>
+ </table>
+ <% end %>
+</div>
+
+<div id="reviewList">
+<%
+ unless @reviews.blank?
+ @reviews.each do |review|
+%>
+
+ <%= render :partial => "reviews/view", :locals => { :review => review } %>
+
+<%
+ end
+ end
+%>
+<div>
+