Feature #43968 » hours_filter_on_issue_query_v2.patch
| app/models/issue_query.rb | ||
|---|---|---|
| 225 | 225 |
add_available_filter "closed_on", :type => :date_past |
| 226 | 226 |
add_available_filter "start_date", :type => :date |
| 227 | 227 |
add_available_filter "due_date", :type => :date |
| 228 |
add_available_filter "estimated_hours", :type => :float
|
|
| 228 |
add_available_filter "estimated_hours", :type => :hour
|
|
| 229 | 229 | |
| 230 | 230 |
if User.current.allowed_to?(:view_time_entries, project, :global => true) |
| 231 |
add_available_filter "spent_time", :type => :float, :label => :label_spent_time
|
|
| 231 |
add_available_filter "spent_time", :type => :hour, :label => :label_spent_time
|
|
| 232 | 232 |
end |
| 233 | 233 | |
| 234 | 234 |
add_available_filter "done_ratio", :type => :integer |
| ... | ... | |
| 531 | 531 |
"#{neg} EXISTS (#{subquery})"
|
| 532 | 532 |
end |
| 533 | 533 | |
| 534 |
def sql_for_estimated_hours_field(field, operator, value) |
|
| 535 |
sql_for_field("estimated_hours", operator, value.map(&:to_hours), Issue.table_name, "estimated_hours")
|
|
| 536 |
end |
|
| 537 | ||
| 534 | 538 |
def sql_for_spent_time_field(field, operator, value) |
| 535 |
first, second = value.first.to_f, value.second.to_f
|
|
| 539 |
first, second = value.first.to_s.to_hours, value.second.to_s.to_hours
|
|
| 536 | 540 |
sql_op = |
| 537 | 541 |
case operator |
| 538 | 542 |
when "=", ">=", "<=" then "#{operator} #{first}"
|
| test/unit/query_test.rb | ||
|---|---|---|
| 272 | 272 |
assert_equal 2, issues.first.id |
| 273 | 273 |
end |
| 274 | 274 | |
| 275 |
def test_operator_is_on_hour |
|
| 276 |
Issue.where(:id => 2).update_all("estimated_hours = 171.2")
|
|
| 277 |
query = IssueQuery.new(:name => '_') |
|
| 278 |
query.add_filter('estimated_hours', '=', ['171:12'])
|
|
| 279 |
issues = find_issues_with_query(query) |
|
| 280 |
assert_equal 1, issues.size |
|
| 281 |
assert_equal 2, issues.first.id |
|
| 282 |
end |
|
| 283 | ||
| 275 | 284 |
def test_operator_is_on_issue_id_should_accept_comma_separated_values |
| 276 | 285 |
query = IssueQuery.new(:name => '_') |
| 277 | 286 |
query.add_filter("issue_id", '=', ['1,3'])
|
| ... | ... | |
| 450 | 459 |
find_issues_with_query(query) |
| 451 | 460 |
end |
| 452 | 461 | |
| 462 |
def test_operator_greater_than_a_hour |
|
| 463 |
query = IssueQuery.new(:project => Project.find(1), :name => '_') |
|
| 464 |
query.add_filter('estimated_hours', '>=', ['40:30'])
|
|
| 465 |
assert query.statement.include?("#{Issue.table_name}.estimated_hours >= 40.5")
|
|
| 466 |
find_issues_with_query(query) |
|
| 467 |
end |
|
| 468 | ||
| 453 | 469 |
def test_operator_greater_than_on_int_custom_field |
| 454 | 470 |
f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true, :trackers => Tracker.all) |
| 455 | 471 |
CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7') |
| ... | ... | |
| 3261 | 3277 |
query.filters = {'spent_time' => {:operator => '>=', :values => ['10']}}
|
| 3262 | 3278 |
assert_equal [1], query.issues.pluck(:id) |
| 3263 | 3279 | |
| 3280 |
query.filters = {'spent_time' => {:operator => '>=', :values => ['10:00']}}
|
|
| 3281 |
assert_equal [1], query.issues.pluck(:id) |
|
| 3282 | ||
| 3264 | 3283 |
query.filters = {'spent_time' => {:operator => '<=', :values => ['10']}}
|
| 3265 | 3284 |
assert_equal [13, 12, 11, 8, 7, 5, 3, 2], query.issues.pluck(:id) |
| 3266 | 3285 | |
| 3286 |
query.filters = {'spent_time' => {:operator => '<=', :values => ['10:00']}}
|
|
| 3287 |
assert_equal [13, 12, 11, 8, 7, 5, 3, 2], query.issues.pluck(:id) |
|
| 3288 | ||
| 3267 | 3289 |
query.filters = {'spent_time' => {:operator => '><', :values => ['1', '2']}}
|
| 3268 | 3290 |
assert_equal [3], query.issues.pluck(:id) |
| 3291 | ||
| 3292 |
query.filters = {'spent_time' => {:operator => '><', :values => ['1:00', '2:00']}}
|
|
| 3293 |
assert_equal [3], query.issues.pluck(:id) |
|
| 3269 | 3294 |
end |
| 3270 | 3295 | |
| 3271 | 3296 |
def test_issues_should_be_in_the_same_order_when_paginating |
| 3272 |
- |
|
| app/models/query.rb | ||
|---|---|---|
| 506 | 506 |
add_filter_error(field, :invalid) |
| 507 | 507 |
end |
| 508 | 508 |
when :hour |
| 509 |
if values_for(field).detect {|v| v.present? && v.to_s.to_hours.nil? }
|
|
| 510 |
add_filter_error(field, :invalid) |
|
| 509 |
case operator_for(field) |
|
| 510 |
when "><" |
|
| 511 |
unless values_for(field).all? {|v| v.present? && !v.to_s.to_hours.nil? }
|
|
| 512 |
add_filter_error(field, :invalid) |
|
| 513 |
end |
|
| 514 |
when "=", ">=", "<=" |
|
| 515 |
if values_for(field).detect {|v| v.present? && v.to_s.to_hours.nil? }
|
|
| 516 |
add_filter_error(field, :invalid) |
|
| 517 |
end |
|
| 511 | 518 |
end |
| 512 | 519 |
when :date, :date_past |
| 513 | 520 |
case operator_for(field) |
| test/unit/query_test.rb | ||
|---|---|---|
| 281 | 281 |
assert_equal 2, issues.first.id |
| 282 | 282 |
end |
| 283 | 283 | |
| 284 |
def test_hour_filter_should_not_accept_non_hour_values |
|
| 285 |
query = IssueQuery.new(:name => '_') |
|
| 286 |
query.add_filter('estimated_hours', '=', ['invalid'])
|
|
| 287 | ||
| 288 |
assert query.has_filter?('estimated_hours')
|
|
| 289 |
assert !query.valid? |
|
| 290 |
end |
|
| 291 | ||
| 292 |
def test_hour_filter_should_not_accept_partially_invalid_hour_values |
|
| 293 |
query = IssueQuery.new(:name => '_') |
|
| 294 |
query.add_filter('estimated_hours', '><', ['1:00', ''])
|
|
| 295 | ||
| 296 |
assert query.has_filter?('estimated_hours')
|
|
| 297 |
assert !query.valid? |
|
| 298 |
end |
|
| 299 | ||
| 284 | 300 |
def test_operator_is_on_issue_id_should_accept_comma_separated_values |
| 285 | 301 |
query = IssueQuery.new(:name => '_') |
| 286 | 302 |
query.add_filter("issue_id", '=', ['1,3'])
|
- « Previous
- 1
- 2
- Next »