Feature #17720 » filter_after_updated_by_and_last_updated_by_v4.patch
| app/models/issue_query.rb | ||
|---|---|---|
| 165 | 165 | |
| 166 | 166 | add_available_filter "issue_id", :type => :integer, :label => :label_issue | 
| 167 | 167 | |
| 168 |     add_available_filter("updated_by", | |
| 169 |       :type => :list, :values => lambda { author_values } | |
| 170 | ) | |
| 171 | ||
| 172 |     add_available_filter("last_updated_by", | |
| 173 |       :type => :list, :values => lambda { author_values } | |
| 174 | ) | |
| 175 | ||
| 168 | 176 |     Tracker.disabled_core_fields(trackers).each {|field| | 
| 169 | 177 | delete_available_filter field | 
| 170 | 178 | } | 
| ... | ... | |
| 463 | 471 | end | 
| 464 | 472 | end | 
| 465 | 473 | |
| 474 | def sql_for_updated_by_field(field, operator, value) | |
| 475 | db_table = Journal.table_name | |
| 476 | ||
| 477 |     query = "#{Issue.table_name}.id IN (SELECT #{db_table}.journalized_id FROM #{db_table} WHERE #{db_table}.journalized_type='Issue' AND #{db_table}.journalized_id = #{Issue.table_name}.id AND " + | |
| 478 | sql_for_field(field, operator, value, db_table, 'user_id') + ')' | |
| 479 | ||
| 480 |     logger.debug("==="*20) | |
| 481 | logger.debug(query) | |
| 482 |     logger.debug("==="*20) | |
| 483 | ||
| 484 | query | |
| 485 | end | |
| 486 | ||
| 487 | def sql_for_last_updated_by_field(field, operator, value) | |
| 488 | db_table = Journal.table_name | |
| 489 | ||
| 490 |     "#{Issue.table_name}.id IN (SELECT max(#{db_table}.journalized_id) FROM #{db_table} WHERE #{db_table}.journalized_type='Issue' AND #{db_table}.created_on = #{Issue.table_name}.updated_on AND #{db_table}.journalized_id = #{Issue.table_name}.id AND " + | |
| 491 | sql_for_field(field, operator, value, db_table, 'user_id') + ')' | |
| 492 | end | |
| 493 | ||
| 466 | 494 |   def sql_for_relations(field, operator, value, options={}) | 
| 467 | 495 | relation_options = IssueRelation::TYPES[field] | 
| 468 | 496 | return relation_options unless relation_options | 
| app/models/query.rb | ||
|---|---|---|
| 798 | 798 | operator = operator_for(field) | 
| 799 | 799 | |
| 800 | 800 | # "me" value substitution | 
| 801 | if %w(assigned_to_id author_id user_id watcher_id).include?(field) | |
| 801 |       if %w(assigned_to_id author_id user_id watcher_id updated_by last_updated_by).include?(field) | |
| 802 | 802 |         if v.delete("me") | 
| 803 | 803 | if User.current.logged? | 
| 804 | 804 | v.push(User.current.id.to_s) | 
| config/locales/en.yml | ||
|---|---|---|
| 369 | 369 | field_default_version: Default version | 
| 370 | 370 | field_remote_ip: IP address | 
| 371 | 371 | field_textarea_font: Font used for text areas | 
| 372 | field_updated_by: Updated by | |
| 373 | field_last_updated_by: Last updated by | |
| 372 | 374 | |
| 373 | 375 | setting_app_title: Application title | 
| 374 | 376 | setting_app_subtitle: Application subtitle | 
| test/fixtures/issues.yml | ||
|---|---|---|
| 2 | 2 | issues_001: | 
| 3 | 3 | created_on: <%= 3.days.ago.to_s(:db) %> | 
| 4 | 4 | project_id: 1 | 
| 5 |   updated_on: <%= 1.day.ago.to_s(:db) %> | |
| 5 |   updated_on: <%= 1.days.ago.to_date.to_s(:db) %> | |
| 6 | 6 | priority_id: 4 | 
| 7 | 7 | subject: Cannot print recipes | 
| 8 | 8 | id: 1 | 
| ... | ... | |
| 96 | 96 | issues_006: | 
| 97 | 97 | created_on: <%= 1.minute.ago.to_s(:db) %> | 
| 98 | 98 | project_id: 5 | 
| 99 |   updated_on: <%= 1.minute.ago.to_s(:db) %> | |
| 99 |   updated_on: <%= 1.days.ago.to_date.to_s(:db) %> | |
| 100 | 100 | priority_id: 4 | 
| 101 | 101 | subject: Issue of a private subproject | 
| 102 | 102 | id: 6 | 
| ... | ... | |
| 252 | 252 | id: 14 | 
| 253 | 253 | created_on: <%= 15.days.ago.to_s(:db) %> | 
| 254 | 254 | project_id: 3 | 
| 255 | updated_on: <%= 15.days.ago.to_s(:db) %> | |
| 255 |   updated_on: <%= 15.days.ago.to_date.to_s(:db) %> | |
| 256 | 256 | priority_id: 5 | 
| 257 | 257 | subject: Private issue on public project | 
| 258 | 258 | fixed_version_id: | 
| test/fixtures/journals.yml | ||
|---|---|---|
| 14 | 14 | user_id: 2 | 
| 15 | 15 | journalized_id: 1 | 
| 16 | 16 | journals_003: | 
| 17 |   created_on: <%= 1.days.ago.to_date.to_s(:db) %> | |
| 17 |   created_on: 2006-07-19 21:09:50 +02:00 | |
| 18 | 18 | notes: "A comment with inline image: !picture.jpg! and a reference to #1 and r2." | 
| 19 | 19 | id: 3 | 
| 20 | 20 | journalized_type: Issue | 
| ... | ... | |
| 29 | 29 | journalized_id: 6 | 
| 30 | 30 | journals_005: | 
| 31 | 31 | id: 5 | 
| 32 | created_on: <%= 1.days.ago.to_date.to_s(:db) %> | |
| 32 |   created_on: <%= 15.days.ago.to_date.to_s(:db) %> | |
| 33 | 33 | notes: "A comment on a private issue." | 
| 34 | 34 | user_id: 2 | 
| 35 | 35 | journalized_type: Issue | 
| 36 | 36 | journalized_id: 14 | 
| 37 | journals_006: | |
| 38 | id: 6 | |
| 39 | created_on: 2006-07-19 21:07:27 +02:00 | |
| 40 | notes: "New updates" | |
| 41 | user_id: 3 | |
| 42 | journalized_type: Issue | |
| 43 | journalized_id: 3 | |
| test/unit/issue_test.rb | ||
|---|---|---|
| 2715 | 2715 | end | 
| 2716 | 2716 | |
| 2717 | 2717 | def test_last_journal_id_without_journals_should_return_nil | 
| 2718 |     assert_nil Issue.find(3).last_journal_id | |
| 2718 |     assert_nil Issue.find(4).last_journal_id | |
| 2719 | 2719 | end | 
| 2720 | 2720 | |
| 2721 | 2721 | def test_journals_after_should_return_journals_with_greater_id | 
| test/unit/query_test.rb | ||
|---|---|---|
| 29 | 29 | :queries, | 
| 30 | 30 | :projects_trackers, | 
| 31 | 31 | :custom_fields_trackers, | 
| 32 | :workflows | |
| 32 |            :workflows, :journals | |
| 33 | 33 | |
| 34 | 34 | def setup | 
| 35 | 35 | User.current = nil | 
| ... | ... | |
| 719 | 719 | end | 
| 720 | 720 | end | 
| 721 | 721 | |
| 722 | def test_filter_updated_by | |
| 723 | query = IssueQuery.new(:name => '_') | |
| 724 | filter_name = "updated_by" | |
| 725 | assert_include filter_name, query.available_filters.keys | |
| 726 | ||
| 727 |     query.filters = {filter_name => {:operator => '=', :values => [2]}} | |
| 728 | assert_equal [1,2,14], find_issues_with_query(query).map(&:id).uniq.sort | |
| 729 | ||
| 730 |     query.filters = {filter_name => {:operator => '=', :values => [4]}} | |
| 731 | assert_equal [], find_issues_with_query(query).map(&:id).uniq.sort | |
| 732 | ||
| 733 |     query.filters = {filter_name => {:operator => '!', :values => [3]}, 'project_id' => {:operator => '=', :values =>[3]}} | |
| 734 | assert_equal [14], find_issues_with_query(query).map(&:id).uniq.sort | |
| 735 | end | |
| 736 | ||
| 737 | def test_filter_updated_by_me | |
| 738 | User.current = User.find(1) | |
| 739 | ||
| 740 |     query = IssueQuery.new(:name => '_', :filters => { "updated_by" => {:operator => '=', :values => ['me']}}) | |
| 741 | assert_equal [1,6], find_issues_with_query(query).map(&:id).uniq.sort | |
| 742 | end | |
| 743 | ||
| 744 | def test_filter_last_updated_by | |
| 745 | query = IssueQuery.new(:name => '_') | |
| 746 | filter_name = "last_updated_by" | |
| 747 | assert_include filter_name, query.available_filters.keys | |
| 748 | ||
| 749 |     query.filters = {filter_name => {:operator => '=', :values => [2]}} | |
| 750 | assert_equal [1,2,14], find_issues_with_query(query).map(&:id).uniq.sort | |
| 751 | ||
| 752 |     query.filters = {filter_name => {:operator => '!', :values => [1,2]}} | |
| 753 | assert_equal [3], find_issues_with_query(query).map(&:id).uniq.sort | |
| 754 | end | |
| 755 | ||
| 722 | 756 | def test_user_custom_field_filtered_on_me | 
| 723 | 757 | User.current = User.find(2) | 
| 724 | 758 | cf = IssueCustomField.create!(:field_format => 'user', :is_for_all => true, :is_filter => true, :name => 'User custom field', :tracker_ids => [1]) |