Project

General

Profile

Feature #43968 ยป hours_filter_on_issue_query.patch

Kenta Kumojima, 2026-04-17 15:51

View differences:

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
    (1-1/1)