Project

General

Profile

Feature #38568 » enable_to_display_file_count_and_total_file_size_on_issues_list.patch

Takenori TAKAKI, 2023-05-19 08:15

View differences:

app/helpers/queries_helper.rb
277 277
        link_to_if(value > 0, format_hours(value), project_time_entries_path(item.project, :issue_id => "~#{item.id}"))
278 278
      when :attachments
279 279
        value.to_a.map {|a| format_object(a)}.join(" ").html_safe
280
      when :attachments_filesize
281
        value == 0 ? '' : number_to_human_size(value)
280 282
      else
281 283
        format_object(value)
282 284
      end
app/models/issue.rb
1188 1188
    @watchers_count ||= self.watchers.count(:id)
1189 1189
  end
1190 1190

  
1191
  def attachments_count
1192
    @attachments_count ||= self.attachments.count(:id)
1193
  end
1194

  
1195
  def attachments_filesize
1196
    @attachments_filesize ||= self.attachments.sum(:filesize)
1197
  end
1198

  
1191 1199
  # Preloads relations for a collection of issues
1192 1200
  def self.load_relations(issues)
1193 1201
    if issues.any?
app/models/issue_query.rb
54 54
          " AND #{Watcher.table_name}.watchable_id = #{Issue.table_name}.id), 0)"
55 55
        end,
56 56
      :default_order => 'desc'),
57
    QueryColumn.new(
58
      :attachments_count,
59
      :sortable =>
60
        lambda do
61
          "COALESCE((SELECT COUNT(author_id) FROM #{Attachment.table_name}" \
62
          " WHERE #{Attachment.table_name}.container_type = 'Issue'" \
63
          " AND #{Attachment.table_name}.container_id = #{Issue.table_name}.id), 0)"
64
        end,
65
      :default_order => 'desc'),
66
    QueryColumn.new(
67
      :attachments_filesize,
68
      :sortable =>
69
        lambda do
70
          "COALESCE((SELECT SUM(filesize) FROM #{Attachment.table_name}" \
71
          " WHERE #{Attachment.table_name}.container_type = 'Issue'" \
72
          " AND #{Attachment.table_name}.container_id = #{Issue.table_name}.id), 0)"
73
        end,
74
      :default_order => 'desc'),
57 75
    QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date", :groupable => true),
58 76
    QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date", :groupable => true),
59 77
    QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours",
config/locales/en.yml
370 370
  field_editable: Editable
371 371
  field_watcher: Watcher
372 372
  field_watchers_count: Watchers count
373
  field_attachments_count: Files count
374
  field_attachments_filesize: Total file size
373 375
  field_content: Content
374 376
  field_group_by: Group results by
375 377
  field_sharing: Sharing
config/locales/ja.yml
329 329
  field_editable: 編集可能
330 330
  field_watcher: ウォッチャー
331 331
  field_watchers_count: ウォッチ数
332
  field_attachments_count: 添付ファイル数
333
  field_attachments_filesize: 添付ファイル合計サイズ
332 334
  field_content: 内容
333 335
  field_group_by: グループ条件
334 336
  field_sharing: 共有
test/functional/issues_controller_test.rb
1388 1388
    assert_equal [2, 1, 0], issues_in_list.map {|issue| issue.watchers_count}.first(3)
1389 1389
  end
1390 1390

  
1391
  def test_index_sort_by_attachments_count_and_filesize
1392
    user = User.find(2)
1393
    file = uploaded_test_file("testfile.txt", "text/plain")
1394
    Attachment.delete_all
1395
    2.times.each do
1396
      a = Attachment.new(:container => Issue.find(1), :file => file, :author => user)
1397
      a.filesize = 0.5.megabyte
1398
      a.save!
1399
    end
1400
    a = Attachment.new(:container => Issue.find(2), :file => file, :author => user)
1401
    a.filesize = 2.megabyte
1402
    a.save!
1403
    # sort by attachments count
1404
    get(:index, :params => {:sort => 'attachments_count:desc'})
1405
    assert_response :success
1406
    assert_equal [2, 1, 0], issues_in_list.map {|issue| issue.attachments_count}.first(3)
1407
    # sort by attachments filesize
1408
    get(:index, :params => {:sort => 'attachments_filesize:desc'})
1409
    assert_response :success
1410
    assert_equal [2.megabyte, 1.megabyte, 0], issues_in_list.map {|issue| issue.attachments_filesize}.first(3)
1411
  end
1412

  
1391 1413
  def test_index_sort_by_user_custom_field
1392 1414
    cf = IssueCustomField.
1393 1415
           create!(
test/unit/issue_test.rb
3532 3532
    end
3533 3533
    assert_equal 2, issue.watchers_count
3534 3534
  end
3535

  
3536
  def test_attachments_count_and_filesize
3537
    issue = Issue.generate!
3538
    user = User.find(2)
3539
    attachments_filesize = 2.times.collect do
3540
      a = Attachment.new(:container => issue,
3541
                         :file => uploaded_test_file("testfile.txt", "text/plain"),
3542
                         :author => user)
3543
      a.save! && a
3544
    end.sum{ |a| a.filesize }
3545
    assert_equal 2, issue.attachments_count
3546
    assert_equal attachments_filesize, issue.attachments_filesize
3547
  end
3535 3548
end
(2-2/2)