Feature #9309 » add-query-description-with-migration.patch
app/controllers/queries_controller.rb | ||
---|---|---|
133 | 133 |
@query.column_names = nil if params[:default_columns] |
134 | 134 |
@query.sort_criteria = (params[:query] && params[:query][:sort_criteria]) || @query.sort_criteria |
135 | 135 |
@query.name = params[:query] && params[:query][:name] |
136 |
@query.description = params[:query] && params[:query][:description] |
|
136 | 137 |
if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin? |
137 | 138 |
@query.visibility = (params[:query] && params[:query][:visibility]) || Query::VISIBILITY_PRIVATE |
138 | 139 |
@query.role_ids = params[:query] && params[:query][:role_ids] |
app/helpers/queries_helper.rb | ||
---|---|---|
502 | 502 |
content_tag('li', |
503 | 503 |
link_to(query.name, |
504 | 504 |
url_params.merge(:query_id => query), |
505 |
:class => css) + |
|
505 |
:class => css, |
|
506 |
:title => query.description) + |
|
506 | 507 |
clear_link.html_safe) |
507 | 508 |
end.join("\n").html_safe, |
508 | 509 |
:class => 'queries' |
app/models/query.rb | ||
---|---|---|
262 | 262 | |
263 | 263 |
validates_presence_of :name |
264 | 264 |
validates_length_of :name, :maximum => 255 |
265 |
validates_length_of :description, :maximum => 255 |
|
265 | 266 |
validates :visibility, :inclusion => {:in => [VISIBILITY_PUBLIC, VISIBILITY_ROLES, VISIBILITY_PRIVATE]} |
266 | 267 |
validate :validate_query_filters |
267 | 268 |
validate do |query| |
app/views/admin/projects.html.erb | ||
---|---|---|
3 | 3 |
</div> |
4 | 4 | |
5 | 5 |
<h2><%= @query.new_record? ? l(:label_project_plural) : @query.name %></h2> |
6 |
<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description) : '' %> |
|
6 | 7 | |
7 | 8 |
<%= form_tag(admin_projects_path(@project, nil), :method => :get, :id => 'query_form') do %> |
8 | 9 |
<%= hidden_field_tag 'admin_projects', '1' %> |
app/views/calendars/show.html.erb | ||
---|---|---|
1 | 1 |
<h2><%= @query.new_record? ? l(:label_calendar) : @query.name %></h2> |
2 |
<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description) : '' %> |
|
2 | 3 | |
3 | 4 |
<%= form_tag({:controller => 'calendars', :action => 'show', :project_id => @project}, |
4 | 5 |
:method => :get, :id => 'query_form') do %> |
app/views/gantts/show.html.erb | ||
---|---|---|
3 | 3 |
</div> |
4 | 4 | |
5 | 5 |
<h2><%= @query.new_record? ? l(:label_gantt) : @query.name %></h2> |
6 |
<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description) : '' %> |
|
6 | 7 | |
7 | 8 |
<%= form_tag({:controller => 'gantts', :action => 'show', |
8 | 9 |
:project_id => @project, :month => params[:month], |
app/views/issues/index.html.erb | ||
---|---|---|
19 | 19 | |
20 | 20 |
<h2><%= @query.new_record? ? l(:label_issue_plural) : @query.name %></h2> |
21 | 21 |
<% html_title(@query.new_record? ? l(:label_issue_plural) : @query.name) %> |
22 |
<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description) : '' %> |
|
22 | 23 | |
23 | 24 |
<%= form_tag(_project_issues_path(@project), :method => :get, :id => 'query_form') do %> |
24 | 25 |
<%= render :partial => 'queries/query_form' %> |
app/views/projects/index.html.erb | ||
---|---|---|
5 | 5 |
</div> |
6 | 6 | |
7 | 7 |
<h2><%= @query.new_record? ? l(:label_project_plural) : @query.name %></h2> |
8 |
<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description) : '' %> |
|
8 | 9 | |
9 | 10 |
<%= form_tag(projects_path(@project, nil), :method => :get, :id => 'query_form') do %> |
10 | 11 |
<%= render :partial => 'queries/query_form' %> |
app/views/queries/_form.html.erb | ||
---|---|---|
8 | 8 | |
9 | 9 |
<p><label for="query_name"><%=l(:field_name)%></label> |
10 | 10 |
<%= text_field 'query', 'name', :size => 80 %></p> |
11 |
<p><label for="query_description"><%=l(:field_description)%></label> |
|
12 |
<%= text_field 'query', 'description', :size => 80 %></p> |
|
11 | 13 | |
12 | 14 |
<% if User.current.admin? || |
13 | 15 |
User.current.allowed_to?(:manage_public_queries, @query.project) %> |
app/views/timelog/index.html.erb | ||
---|---|---|
14 | 14 |
</div> |
15 | 15 | |
16 | 16 |
<h2><%= @query.new_record? ? l(:label_spent_time) : @query.name %></h2> |
17 |
<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description) : '' %> |
|
17 | 18 | |
18 | 19 |
<%= form_tag(_time_entries_path(@project, nil), :method => :get, :id => 'query_form') do %> |
19 | 20 |
<%= render :partial => 'date_range' %> |
app/views/users/index.html.erb | ||
---|---|---|
8 | 8 |
</div> |
9 | 9 | |
10 | 10 |
<h2><%= @query.new_record? ? l(:label_user_plural) : @query.name %></h2> |
11 |
<%= @query.persisted? && @query.description.present? ? content_tag('p', @query.description) : '' %> |
|
11 | 12 | |
12 | 13 |
<%= form_tag(users_path, method: :get, id: 'query_form') do %> |
13 | 14 |
<%= render partial: 'queries/query_form' %> |
db/migrate/20240213101801_add_queries_description.rb | ||
---|---|---|
1 |
class AddQueriesDescription < ActiveRecord::Migration[6.1] |
|
2 |
def up |
|
3 |
add_column :queries, :description, :string, :after => :name |
|
4 |
end |
|
5 | ||
6 |
def down |
|
7 |
remove_column :queries, :description |
|
8 |
end |
|
9 |
end |
test/fixtures/queries.yml | ||
---|---|---|
5 | 5 |
project_id: 1 |
6 | 6 |
visibility: 2 |
7 | 7 |
name: Multiple custom fields query |
8 |
description: Description for Multiple custom fields query |
|
8 | 9 |
filters: | |
9 | 10 |
--- |
10 | 11 |
cf_1: |
... | ... | |
28 | 29 |
project_id: 1 |
29 | 30 |
visibility: 0 |
30 | 31 |
name: Private query for cookbook |
32 |
description: Description for Private query for cookbook |
|
31 | 33 |
filters: | |
32 | 34 |
--- |
33 | 35 |
tracker_id: |
... | ... | |
47 | 49 |
project_id: |
48 | 50 |
visibility: 0 |
49 | 51 |
name: Private query for all projects |
52 |
description: Description for Private query for all projects |
|
50 | 53 |
filters: | |
51 | 54 |
--- |
52 | 55 |
tracker_id: |
... | ... | |
62 | 65 |
project_id: |
63 | 66 |
visibility: 2 |
64 | 67 |
name: Public query for all projects |
68 |
description: Description for Public query for all projects |
|
65 | 69 |
filters: | |
66 | 70 |
--- |
67 | 71 |
tracker_id: |
... | ... | |
77 | 81 |
project_id: |
78 | 82 |
visibility: 2 |
79 | 83 |
name: Open issues by priority and tracker |
84 |
description: Description for Oepn issues by priority and tracker |
|
80 | 85 |
filters: | |
81 | 86 |
--- |
82 | 87 |
status_id: |
... | ... | |
98 | 103 |
project_id: |
99 | 104 |
visibility: 2 |
100 | 105 |
name: Open issues grouped by tracker |
106 |
description: Description for Open issues grouped by tracker |
|
101 | 107 |
filters: | |
102 | 108 |
--- |
103 | 109 |
status_id: |
... | ... | |
118 | 124 |
project_id: 2 |
119 | 125 |
visibility: 2 |
120 | 126 |
name: Public query for project 2 |
127 |
description: Description for Public query for project 2 |
|
121 | 128 |
filters: | |
122 | 129 |
--- |
123 | 130 |
tracker_id: |
... | ... | |
133 | 140 |
project_id: 2 |
134 | 141 |
visibility: 0 |
135 | 142 |
name: Private query for project 2 |
143 |
description: Description for Private query for project 2 |
|
136 | 144 |
filters: | |
137 | 145 |
--- |
138 | 146 |
tracker_id: |
... | ... | |
148 | 156 |
project_id: |
149 | 157 |
visibility: 2 |
150 | 158 |
name: Open issues grouped by list custom field |
159 |
description: Description for Open issues grouped by list custom field |
|
151 | 160 |
filters: | |
152 | 161 |
--- |
153 | 162 |
status_id: |
... | ... | |
168 | 177 |
project_id: 1 |
169 | 178 |
visibility: 2 |
170 | 179 |
name: My spent time |
180 |
description: Description for My spent time |
|
171 | 181 |
filters: | |
172 | 182 |
--- |
173 | 183 |
user_id: |
... | ... | |
187 | 197 |
type: ProjectQuery |
188 | 198 |
visibility: 2 |
189 | 199 |
name: Projects as list |
200 |
description: Description for Projects as list |
|
190 | 201 |
filters: | |
191 | 202 |
--- |
192 | 203 |
id: |
... | ... | |
205 | 216 |
type: ProjectQuery |
206 | 217 |
visibility: 1 |
207 | 218 |
name: My bookmarks |
219 |
description: Description for My bookmarks |
|
208 | 220 |
filters: | |
209 | 221 |
--- |
210 | 222 |
id: |
test/functional/calendars_controller_test.rb | ||
---|---|---|
155 | 155 |
end |
156 | 156 | |
157 | 157 |
def test_show_should_run_custom_queries |
158 |
@query = IssueQuery.create!(:name => 'Calendar Query', :visibility => IssueQuery::VISIBILITY_PUBLIC)
|
|
158 |
query = IssueQuery.create!(:name => 'Calendar Query', :description => 'Description for Calendar Query', :visibility => IssueQuery::VISIBILITY_PUBLIC)
|
|
159 | 159 |
get( |
160 | 160 |
:show, |
161 | 161 |
:params => { |
162 |
:query_id => @query.id
|
|
162 |
:query_id => query.id |
|
163 | 163 |
} |
164 | 164 |
) |
165 | 165 |
assert_response :success |
166 |
assert_select 'h2', :text => 'Calendar Query' |
|
166 |
assert_select 'h2', :text => query.name |
|
167 |
assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name |
|
167 | 168 |
end |
168 | 169 | |
169 | 170 |
def test_cross_project_calendar |
test/functional/gantts_controller_test.rb | ||
---|---|---|
118 | 118 |
assert_response :success |
119 | 119 |
end |
120 | 120 | |
121 |
def test_show_should_run_custom_query |
|
122 |
query = IssueQuery.create!(:name => 'Gantt Query', :description => 'Description for Gantt Query', :visibility => IssueQuery::VISIBILITY_PUBLIC) |
|
123 |
get( |
|
124 |
:show, |
|
125 |
:params => { |
|
126 |
:query_id => query.id |
|
127 |
} |
|
128 |
) |
|
129 |
assert_response :success |
|
130 |
assert_select 'h2', :text => query.name |
|
131 |
assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name |
|
132 |
end |
|
133 | ||
121 | 134 |
def test_gantt_should_work_cross_project |
122 | 135 |
get :show |
123 | 136 |
assert_response :success |
test/functional/issues_controller_test.rb | ||
---|---|---|
359 | 359 |
assert_select 'a.query.selected', 1 |
360 | 360 |
# assert link properties |
361 | 361 |
assert_select( |
362 |
'a.query.selected[href=?]', |
|
362 |
'a.query.selected[title=?][href=?]', |
|
363 |
'Description for Oepn issues by priority and tracker', |
|
363 | 364 |
'/projects/ecookbook/issues?query_id=5', |
364 | 365 |
:text => "Open issues by priority and tracker" |
365 | 366 |
) |
test/functional/projects_controller_test.rb | ||
---|---|---|
252 | 252 |
assert_select ".total-for-cf-#{field.id} span.value", :text => '9' |
253 | 253 |
end |
254 | 254 | |
255 |
def test_index_with_query |
|
256 |
query = ProjectQuery.find(11) |
|
257 |
get :index, :params => { :query_id => query.id } |
|
258 |
assert_response :success |
|
259 |
assert_select 'h2', :text => query.name |
|
260 |
assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name |
|
261 |
end |
|
262 | ||
255 | 263 |
def test_index_should_retrieve_default_query |
256 | 264 |
query = ProjectQuery.find(11) |
257 | 265 |
ProjectQuery.stubs(:default).returns query |
... | ... | |
260 | 268 |
@request.session[:user_id] = user_id |
261 | 269 |
get :index |
262 | 270 |
assert_select 'h2', text: query.name |
271 |
assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name |
|
263 | 272 |
end |
264 | 273 |
end |
265 | 274 |
test/functional/queries_controller_test.rb | ||
---|---|---|
328 | 328 |
assert_equal [['due_date', 'desc'], ['tracker', 'asc']], query.sort_criteria |
329 | 329 |
end |
330 | 330 | |
331 |
def test_create_with_description |
|
332 |
@request.session[:user_id] = 2 |
|
333 |
assert_difference '::Query.count', 1 do |
|
334 |
post( |
|
335 |
:create, |
|
336 |
:params => { |
|
337 |
:project_id => 'ecookbook', |
|
338 |
:query => { |
|
339 |
:name => 'test_new_with_description', :description => 'Description for test_new_with_description' |
|
340 |
} |
|
341 |
} |
|
342 |
) |
|
343 |
end |
|
344 |
q = Query.find_by_name("test_new_with_description") |
|
345 |
assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q |
|
346 | ||
347 |
assert_equal 'Description for test_new_with_description', q.description |
|
348 |
end |
|
349 | ||
331 | 350 |
def test_create_with_failure |
332 | 351 |
@request.session[:user_id] = 2 |
333 | 352 |
assert_no_difference '::Query.count' do |
... | ... | |
659 | 678 |
end |
660 | 679 |
end |
661 | 680 | |
681 |
def test_edit_description |
|
682 |
@request.session[:user_id] = 1 |
|
683 |
get(:edit, :params => {:id => 5}) |
|
684 |
assert_response :success |
|
685 | ||
686 |
assert_select 'input[name="query[description]"][value=?]', 'Description for Oepn issues by priority and tracker' |
|
687 |
end |
|
688 | ||
662 | 689 |
def test_edit_invalid_query |
663 | 690 |
@request.session[:user_id] = 2 |
664 | 691 |
get(:edit, :params => {:id => 99}) |
... | ... | |
744 | 771 |
assert Query.find_by_name('test_project_query_updated') |
745 | 772 |
end |
746 | 773 | |
774 |
def test_update_description |
|
775 |
@request.session[:user_id] = 1 |
|
776 |
q = Query.find(5) |
|
777 |
put( |
|
778 |
:update, |
|
779 |
:params => { |
|
780 |
:id => q.id, |
|
781 |
:query => { |
|
782 |
:name => q.name, |
|
783 |
:description => 'query description updated' |
|
784 |
} |
|
785 |
} |
|
786 |
) |
|
787 |
assert_redirected_to :controller => 'issues', :action => 'index', :query_id => q.id |
|
788 |
assert_equal 'query description updated', Query.find(5).description |
|
789 |
end |
|
790 | ||
747 | 791 |
def test_update_with_failure |
748 | 792 |
@request.session[:user_id] = 1 |
749 | 793 |
put( |
test/functional/timelog_controller_test.rb | ||
---|---|---|
1682 | 1682 |
end |
1683 | 1683 | |
1684 | 1684 |
def test_index_with_query |
1685 |
query = TimeEntryQuery.new(:project_id => 1, :name => 'Time Entry Query', :visibility => 2) |
|
1685 |
query = TimeEntryQuery.new(:project_id => 1, :name => 'Time Entry Query', :description => 'Description for Time Entry Query', :visibility => 2)
|
|
1686 | 1686 |
query.save! |
1687 | 1687 |
@request.session[:user_id] = 2 |
1688 | 1688 | |
1689 | 1689 |
get :index, :params => {:project_id => 'ecookbook', :query_id => query.id} |
1690 | 1690 |
assert_response :success |
1691 | 1691 |
assert_select 'h2', :text => query.name |
1692 |
assert_select '#sidebar a.selected', :text => query.name
|
|
1692 |
assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name
|
|
1693 | 1693 |
end |
1694 | 1694 | |
1695 | 1695 |
def test_index_atom_feed |
test/functional/users_controller_test.rb | ||
---|---|---|
189 | 189 |
assert_select 'tr#user-1', 1 |
190 | 190 |
end |
191 | 191 | |
192 |
def test_index_with_query |
|
193 |
query = UserQuery.create!(:name => 'My User Query', :description => 'Description for My User Query', :visibility => UserQuery::VISIBILITY_PUBLIC) |
|
194 |
get :index, :params => { :query_id => query.id } |
|
195 |
assert_response :success |
|
196 | ||
197 |
assert_select 'h2', :text => query.name |
|
198 |
assert_select '#sidebar a.query.selected[title=?]', query.description, :text => query.name |
|
199 |
end |
|
200 | ||
192 | 201 |
def test_index_csv |
193 | 202 |
with_settings :default_language => 'en' do |
194 | 203 |
user = User.logged.status(1).first |