##// END OF EJS Templates
Merged r14388 (#19842)....
Jean-Philippe Lang -
r14021:b54924d48bae
parent child
Show More
@@ -48,17 +48,14 class QueriesController < ApplicationController
48 @query = IssueQuery.new
48 @query = IssueQuery.new
49 @query.user = User.current
49 @query.user = User.current
50 @query.project = @project
50 @query.project = @project
51 @query.visibility = IssueQuery::VISIBILITY_PRIVATE unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
52 @query.build_from_params(params)
51 @query.build_from_params(params)
53 end
52 end
54
53
55 def create
54 def create
56 @query = IssueQuery.new(params[:query])
55 @query = IssueQuery.new
57 @query.user = User.current
56 @query.user = User.current
58 @query.project = params[:query_is_for_all] ? nil : @project
57 @query.project = @project
59 @query.visibility = IssueQuery::VISIBILITY_PRIVATE unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
58 update_query_from_params
60 @query.build_from_params(params)
61 @query.column_names = nil if params[:default_columns]
62
59
63 if @query.save
60 if @query.save
64 flash[:notice] = l(:notice_successful_create)
61 flash[:notice] = l(:notice_successful_create)
@@ -72,11 +69,7 class QueriesController < ApplicationController
72 end
69 end
73
70
74 def update
71 def update
75 @query.attributes = params[:query]
72 update_query_from_params
76 @query.project = nil if params[:query_is_for_all]
77 @query.visibility = IssueQuery::VISIBILITY_PRIVATE unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
78 @query.build_from_params(params)
79 @query.column_names = nil if params[:default_columns]
80
73
81 if @query.save
74 if @query.save
82 flash[:notice] = l(:notice_successful_update)
75 flash[:notice] = l(:notice_successful_update)
@@ -107,6 +100,20 private
107 render_404
100 render_404
108 end
101 end
109
102
103 def update_query_from_params
104 @query.project = params[:query_is_for_all] ? nil : @project
105 @query.build_from_params(params)
106 @query.column_names = nil if params[:default_columns]
107 @query.sort_criteria = params[:query] && params[:query][:sort_criteria]
108 @query.name = params[:query] && params[:query][:name]
109 if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin?
110 @query.visibility = (params[:query] && params[:query][:visibility]) || IssueQuery::VISIBILITY_PRIVATE
111 else
112 @query.visibility = IssueQuery::VISIBILITY_PRIVATE
113 end
114 @query
115 end
116
110 def redirect_to_issues(options)
117 def redirect_to_issues(options)
111 if params[:gantt]
118 if params[:gantt]
112 if @project
119 if @project
@@ -487,7 +487,9 class Query < ActiveRecord::Base
487 if arg.is_a?(Hash)
487 if arg.is_a?(Hash)
488 arg = arg.keys.sort.collect {|k| arg[k]}
488 arg = arg.keys.sort.collect {|k| arg[k]}
489 end
489 end
490 c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, (o == 'desc' || o == false) ? 'desc' : 'asc']}
490 if arg
491 c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, (o == 'desc' || o == false) ? 'desc' : 'asc']}
492 end
491 write_attribute(:sort_criteria, c)
493 write_attribute(:sort_criteria, c)
492 end
494 end
493
495
@@ -7,21 +7,20
7 <p><label for="query_name"><%=l(:field_name)%></label>
7 <p><label for="query_name"><%=l(:field_name)%></label>
8 <%= text_field 'query', 'name', :size => 80 %></p>
8 <%= text_field 'query', 'name', :size => 80 %></p>
9
9
10 <% if User.current.admin? || User.current.allowed_to?(:manage_public_queries, @project) %>
10 <% if User.current.admin? || User.current.allowed_to?(:manage_public_queries, @query.project) %>
11 <p><label><%=l(:field_visible)%></label>
11 <p><label><%=l(:field_visible)%></label>
12 <label class="block"><%= radio_button 'query', 'visibility', Query::VISIBILITY_PRIVATE %> <%= l(:label_visibility_private) %></label>
12 <label class="block"><%= radio_button 'query', 'visibility', Query::VISIBILITY_PRIVATE %> <%= l(:label_visibility_private) %></label>
13 <label class="block"><%= radio_button 'query', 'visibility', Query::VISIBILITY_PUBLIC %> <%= l(:label_visibility_public) %></label>
13 <label class="block"><%= radio_button 'query', 'visibility', Query::VISIBILITY_ROLES %> <%= l(:label_visibility_roles) %>:</label>
14 <label class="block"><%= radio_button 'query', 'visibility', Query::VISIBILITY_ROLES %> <%= l(:label_visibility_roles) %>:</label>
14 <% Role.givable.sorted.each do |role| %>
15 <% Role.givable.sorted.each do |role| %>
15 <label class="block role-visibility"><%= check_box_tag 'query[role_ids][]', role.id, @query.roles.include?(role), :id => nil %> <%= role.name %></label>
16 <label class="block role-visibility"><%= check_box_tag 'query[role_ids][]', role.id, @query.roles.include?(role), :id => nil %> <%= role.name %></label>
16 <% end %>
17 <% end %>
17 <label class="block"><%= radio_button 'query', 'visibility', Query::VISIBILITY_PUBLIC %> <%= l(:label_visibility_public) %></label>
18 <%= hidden_field_tag 'query[role_ids][]', '' %>
18 <%= hidden_field_tag 'query[role_ids][]', '' %>
19 </p>
19 </p>
20 <% end %>
20 <% end %>
21
21
22 <p><label for="query_is_for_all"><%=l(:field_is_for_all)%></label>
22 <p><label for="query_is_for_all"><%=l(:field_is_for_all)%></label>
23 <%= check_box_tag 'query_is_for_all', 1, @query.project.nil?,
23 <%= check_box_tag 'query_is_for_all', 1, @query.project.nil?, :class => (User.current.admin? ? '' : 'disable-unless-private') %></p>
24 :disabled => (!@query.new_record? && (@query.project.nil? || (@query.is_public? && !User.current.admin?))) %></p>
25
24
26 <% unless params[:gantt] %>
25 <% unless params[:gantt] %>
27 <fieldset><legend><%= l(:label_options) %></legend>
26 <fieldset><legend><%= l(:label_options) %></legend>
@@ -80,8 +79,11
80 <%= javascript_tag do %>
79 <%= javascript_tag do %>
81 $(document).ready(function(){
80 $(document).ready(function(){
82 $("input[name='query[visibility]']").change(function(){
81 $("input[name='query[visibility]']").change(function(){
83 var checked = $('#query_visibility_1').is(':checked');
82 var roles_checked = $('#query_visibility_1').is(':checked');
84 $("input[name='query[role_ids][]'][type=checkbox]").attr('disabled', !checked);
83 var private_checked = $('#query_visibility_0').is(':checked');
84 $("input[name='query[role_ids][]'][type=checkbox]").attr('disabled', !roles_checked);
85 if (!private_checked) $("input.disable-unless-private").attr('checked', false);
86 $("input.disable-unless-private").attr('disabled', !private_checked);
85 }).trigger('change');
87 }).trigger('change');
86 });
88 });
87 <% end %>
89 <% end %>
@@ -83,7 +83,7 class QueriesControllerTest < ActionController::TestCase
83 :fields => ["status_id", "assigned_to_id"],
83 :fields => ["status_id", "assigned_to_id"],
84 :operators => {"assigned_to_id" => "=", "status_id" => "o"},
84 :operators => {"assigned_to_id" => "=", "status_id" => "o"},
85 :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
85 :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]},
86 :query => {"name" => "test_new_project_private_query", "visibility" => "2"}
86 :query => {"name" => "test_new_project_private_query", "visibility" => "0"}
87
87
88 q = Query.find_by_name('test_new_project_private_query')
88 q = Query.find_by_name('test_new_project_private_query')
89 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
89 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
@@ -98,7 +98,7 class QueriesControllerTest < ActionController::TestCase
98 :fields => ["status_id", "assigned_to_id"],
98 :fields => ["status_id", "assigned_to_id"],
99 :operators => {"assigned_to_id" => "=", "status_id" => "o"},
99 :operators => {"assigned_to_id" => "=", "status_id" => "o"},
100 :values => { "assigned_to_id" => ["me"], "status_id" => ["1"]},
100 :values => { "assigned_to_id" => ["me"], "status_id" => ["1"]},
101 :query => {"name" => "test_new_global_private_query", "visibility" => "2"},
101 :query => {"name" => "test_new_global_private_query", "visibility" => "0"},
102 :c => ["", "tracker", "subject", "priority", "category"]
102 :c => ["", "tracker", "subject", "priority", "category"]
103
103
104 q = Query.find_by_name('test_new_global_private_query')
104 q = Query.find_by_name('test_new_global_private_query')
@@ -119,6 +119,7 class QueriesControllerTest < ActionController::TestCase
119
119
120 q = Query.find_by_name('test_new_global_query')
120 q = Query.find_by_name('test_new_global_query')
121 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => nil, :query_id => q
121 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => nil, :query_id => q
122 assert !q.is_public?
122 assert !q.has_filter?(:status_id)
123 assert !q.has_filter?(:status_id)
123 assert_equal ['assigned_to_id'], q.filters.keys
124 assert_equal ['assigned_to_id'], q.filters.keys
124 assert q.valid?
125 assert q.valid?
@@ -186,13 +187,73 class QueriesControllerTest < ActionController::TestCase
186 assert_equal false, query.draw_progress_line
187 assert_equal false, query.draw_progress_line
187 end
188 end
188
189
190 def test_create_project_public_query_should_force_private_without_manage_public_queries_permission
191 @request.session[:user_id] = 3
192 query = new_record(Query) do
193 post :create,
194 :project_id => 'ecookbook',
195 :query => {"name" => "name", "visibility" => "2"}
196 assert_response 302
197 end
198 assert_not_nil query.project
199 assert_equal Query::VISIBILITY_PRIVATE, query.visibility
200 end
201
202 def test_create_global_public_query_should_force_private_without_manage_public_queries_permission
203 @request.session[:user_id] = 3
204 query = new_record(Query) do
205 post :create,
206 :project_id => 'ecookbook', :query_is_for_all => '1',
207 :query => {"name" => "name", "visibility" => "2"}
208 assert_response 302
209 end
210 assert_nil query.project
211 assert_equal Query::VISIBILITY_PRIVATE, query.visibility
212 end
213
214 def test_create_project_public_query_with_manage_public_queries_permission
215 @request.session[:user_id] = 2
216 query = new_record(Query) do
217 post :create,
218 :project_id => 'ecookbook',
219 :query => {"name" => "name", "visibility" => "2"}
220 assert_response 302
221 end
222 assert_not_nil query.project
223 assert_equal Query::VISIBILITY_PUBLIC, query.visibility
224 end
225
226 def test_create_global_public_query_should_force_private_with_manage_public_queries_permission
227 @request.session[:user_id] = 2
228 query = new_record(Query) do
229 post :create,
230 :project_id => 'ecookbook', :query_is_for_all => '1',
231 :query => {"name" => "name", "visibility" => "2"}
232 assert_response 302
233 end
234 assert_nil query.project
235 assert_equal Query::VISIBILITY_PRIVATE, query.visibility
236 end
237
238 def test_create_global_public_query_by_admin
239 @request.session[:user_id] = 1
240 query = new_record(Query) do
241 post :create,
242 :project_id => 'ecookbook', :query_is_for_all => '1',
243 :query => {"name" => "name", "visibility" => "2"}
244 assert_response 302
245 end
246 assert_nil query.project
247 assert_equal Query::VISIBILITY_PUBLIC, query.visibility
248 end
249
189 def test_edit_global_public_query
250 def test_edit_global_public_query
190 @request.session[:user_id] = 1
251 @request.session[:user_id] = 1
191 get :edit, :id => 4
252 get :edit, :id => 4
192 assert_response :success
253 assert_response :success
193 assert_template 'edit'
254 assert_template 'edit'
194 assert_select 'input[name=?][value="2"][checked=checked]', 'query[visibility]'
255 assert_select 'input[name=?][value="2"][checked=checked]', 'query[visibility]'
195 assert_select 'input[name=query_is_for_all][type=checkbox][checked=checked][disabled=disabled]'
256 assert_select 'input[name=query_is_for_all][type=checkbox][checked=checked]'
196 end
257 end
197
258
198 def test_edit_global_private_query
259 def test_edit_global_private_query
@@ -201,7 +262,7 class QueriesControllerTest < ActionController::TestCase
201 assert_response :success
262 assert_response :success
202 assert_template 'edit'
263 assert_template 'edit'
203 assert_select 'input[name=?]', 'query[visibility]', 0
264 assert_select 'input[name=?]', 'query[visibility]', 0
204 assert_select 'input[name=query_is_for_all][type=checkbox][checked=checked][disabled=disabled]'
265 assert_select 'input[name=query_is_for_all][type=checkbox][checked=checked]'
205 end
266 end
206
267
207 def test_edit_project_private_query
268 def test_edit_project_private_query
@@ -210,7 +271,7 class QueriesControllerTest < ActionController::TestCase
210 assert_response :success
271 assert_response :success
211 assert_template 'edit'
272 assert_template 'edit'
212 assert_select 'input[name=?]', 'query[visibility]', 0
273 assert_select 'input[name=?]', 'query[visibility]', 0
213 assert_select 'input[name=query_is_for_all][type=checkbox]:not([checked]):not([disabled])'
274 assert_select 'input[name=query_is_for_all][type=checkbox]:not([checked])'
214 end
275 end
215
276
216 def test_edit_project_public_query
277 def test_edit_project_public_query
@@ -219,7 +280,7 class QueriesControllerTest < ActionController::TestCase
219 assert_response :success
280 assert_response :success
220 assert_template 'edit'
281 assert_template 'edit'
221 assert_select 'input[name=?][value="2"][checked=checked]', 'query[visibility]'
282 assert_select 'input[name=?][value="2"][checked=checked]', 'query[visibility]'
222 assert_select 'input[name=query_is_for_all][type=checkbox][disabled=disabled]:not([checked])'
283 assert_select 'input[name=query_is_for_all][type=checkbox]:not([checked])'
223 end
284 end
224
285
225 def test_edit_sort_criteria
286 def test_edit_sort_criteria
@@ -180,6 +180,15 class ActiveSupport::TestCase
180 ActiveRecord::Base.connection.quoted_date(date)
180 ActiveRecord::Base.connection.quoted_date(date)
181 end
181 end
182
182
183 # Asserts that a new record for the given class is created
184 # and returns it
185 def new_record(klass, &block)
186 assert_difference "#{klass}.count" do
187 yield
188 end
189 klass.order(:id => :desc).first
190 end
191
183 def assert_save(object)
192 def assert_save(object)
184 saved = object.save
193 saved = object.save
185 message = "#{object.class} could not be saved"
194 message = "#{object.class} could not be saved"
General Comments 0
You need to be logged in to leave comments. Login now