Browse Source

Adds ability to filter watched issues (#846).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2456 e93f8b46-1217-0410-a6f0-8f06a7374b81
tags/0.9.0
Jean-Philippe Lang 15 years ago
parent
commit
e1b828de95
37 changed files with 81 additions and 16 deletions
  1. 22
    15
      app/models/query.rb
  2. 1
    0
      lang/bg.yml
  3. 1
    0
      lang/ca.yml
  4. 1
    0
      lang/cs.yml
  5. 1
    0
      lang/da.yml
  6. 1
    0
      lang/de.yml
  7. 1
    0
      lang/en.yml
  8. 1
    0
      lang/es.yml
  9. 1
    0
      lang/fi.yml
  10. 1
    0
      lang/fr.yml
  11. 1
    0
      lang/gl.yml
  12. 1
    0
      lang/he.yml
  13. 1
    0
      lang/hu.yml
  14. 1
    0
      lang/it.yml
  15. 1
    0
      lang/ja.yml
  16. 1
    0
      lang/ko.yml
  17. 1
    0
      lang/lt.yml
  18. 1
    0
      lang/mk.yml
  19. 1
    0
      lang/nl.yml
  20. 1
    0
      lang/no.yml
  21. 1
    0
      lang/pl.yml
  22. 1
    0
      lang/pt-br.yml
  23. 1
    0
      lang/pt.yml
  24. 1
    0
      lang/ro.yml
  25. 1
    0
      lang/ru.yml
  26. 1
    0
      lang/sk.yml
  27. 1
    0
      lang/sl.yml
  28. 1
    0
      lang/sr.yml
  29. 1
    0
      lang/sv.yml
  30. 1
    0
      lang/th.yml
  31. 1
    0
      lang/tr.yml
  32. 1
    0
      lang/uk.yml
  33. 1
    0
      lang/vn.yml
  34. 1
    0
      lang/zh-tw.yml
  35. 1
    0
      lang/zh.yml
  36. 4
    0
      test/fixtures/watchers.yml
  37. 21
    1
      test/unit/query_test.rb

+ 22
- 15
app/models/query.rb View File

@@ -165,6 +165,10 @@ class Query < ActiveRecord::Base
end
@available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty?
@available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty?
if User.current.logged?
@available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
end
if project
# project specific filters
@@ -288,31 +292,34 @@ class Query < ActiveRecord::Base
next if field == "subproject_id"
v = values_for(field).clone
next unless v and !v.empty?
operator = operator_for(field)
# "me" value subsitution
if %w(assigned_to_id author_id watcher_id).include?(field)
v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
end
sql = ''
is_custom_filter = false
if field =~ /^cf_(\d+)$/
# custom field
db_table = CustomValue.table_name
db_field = 'value'
is_custom_filter = true
sql << "#{Issue.table_name}.id IN (SELECT #{Issue.table_name}.id FROM #{Issue.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{$1} WHERE "
sql << sql_for_field(field, operator, v, db_table, db_field, true) + ')'
elsif field == 'watcher_id'
db_table = Watcher.table_name
db_field = 'user_id'
sql << "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND "
sql << sql_for_field(field, '=', v, db_table, db_field) + ')'
else
# regular field
db_table = Issue.table_name
db_field = field
sql << '('
sql << '(' + sql_for_field(field, operator, v, db_table, db_field) + ')'
end
# "me" value subsitution
if %w(assigned_to_id author_id).include?(field)
v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
end
sql = sql + sql_for_field(field, v, db_table, db_field, is_custom_filter)
sql << ')'
filters_clauses << sql
end if filters and valid?
(filters_clauses << project_statement).join(' AND ')
@@ -320,10 +327,10 @@ class Query < ActiveRecord::Base
private
# Helper method to generate the WHERE sql for a +field+ with a +value+
def sql_for_field(field, value, db_table, db_field, is_custom_filter)
# Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+
def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false)
sql = ''
case operator_for field
case operator
when "="
sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
when "!"

+ 1
- 0
lang/bg.yml View File

@@ -706,3 +706,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/ca.yml View File

@@ -707,3 +707,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/cs.yml View File

@@ -711,3 +711,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/da.yml View File

@@ -708,3 +708,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/de.yml View File

@@ -709,3 +709,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/en.yml View File

@@ -188,6 +188,7 @@ field_default_value: Default value
field_comments_sorting: Display comments
field_parent_title: Parent page
field_editable: Editable
field_watcher: Watcher

setting_app_title: Application title
setting_app_subtitle: Application subtitle

+ 1
- 0
lang/es.yml View File

@@ -691,3 +691,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/fi.yml View File

@@ -706,3 +706,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/fr.yml View File

@@ -188,6 +188,7 @@ field_comments_sorting: Afficher les commentaires
field_parent_title: Page parent
field_editable: Modifiable
field_identity_url: URL OpenID
field_watcher: Observateur

setting_app_title: Titre de l'application
setting_app_subtitle: Sous-titre de l'application

+ 1
- 0
lang/gl.yml View File

@@ -691,3 +691,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/he.yml View File

@@ -706,3 +706,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/hu.yml View File

@@ -707,3 +707,4 @@ setting_repository_log_display_limit: Maximum hány revízió jelenjen meg a fá
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/it.yml View File

@@ -706,3 +706,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/ja.yml View File

@@ -707,3 +707,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/ko.yml View File

@@ -706,3 +706,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/lt.yml View File

@@ -708,3 +708,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/mk.yml View File

@@ -708,3 +708,4 @@ text_custom_field_possible_values_info: 'One line for each value'
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/nl.yml View File

@@ -691,3 +691,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/no.yml View File

@@ -707,3 +707,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/pl.yml View File

@@ -725,3 +725,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/pt-br.yml View File

@@ -707,3 +707,4 @@ setting_repository_log_display_limit: Número máximo de revisões exibidas no a
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/pt.yml View File

@@ -708,3 +708,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/ro.yml View File

@@ -706,3 +706,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/ru.yml View File

@@ -741,3 +741,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/sk.yml View File

@@ -711,3 +711,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/sl.yml View File

@@ -708,3 +708,4 @@ text_custom_field_possible_values_info: 'One line for each value'
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/sr.yml View File

@@ -707,3 +707,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/sv.yml View File

@@ -708,3 +708,4 @@ enumeration_activities: Aktiviteter (tidsuppföljning)
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/th.yml View File

@@ -709,3 +709,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/tr.yml View File

@@ -707,3 +707,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/uk.yml View File

@@ -708,3 +708,4 @@ text_custom_field_possible_values_info: 'One line for each value'
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/vn.yml View File

@@ -709,3 +709,4 @@ setting_repository_log_display_limit: Maximum number of revisions displayed on f
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/zh-tw.yml View File

@@ -709,3 +709,4 @@ enumeration_activities: 活動 (時間追蹤)
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 1
- 0
lang/zh.yml View File

@@ -709,3 +709,4 @@ enumeration_activities: 活动(时间跟踪)
field_identity_url: OpenID URL
setting_openid: Allow OpenID login and registration
label_login_with_open_id_option: or login with OpenID
field_watcher: Watcher

+ 4
- 0
test/fixtures/watchers.yml View File

@@ -7,4 +7,8 @@ watchers_002:
watchable_type: Message
watchable_id: 1
user_id: 1
watchers_003:
watchable_type: Issue
watchable_id: 2
user_id: 1

+ 21
- 1
test/unit/query_test.rb View File

@@ -18,7 +18,7 @@
require File.dirname(__FILE__) + '/../test_helper'

class QueryTest < Test::Unit::TestCase
fixtures :projects, :enabled_modules, :users, :members, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :versions, :queries
fixtures :projects, :enabled_modules, :users, :members, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :watchers, :custom_fields, :custom_values, :versions, :queries

def test_custom_fields_for_all_projects_should_be_available_in_global_queries
query = Query.new(:project => nil, :name => '_')
@@ -162,6 +162,26 @@ class QueryTest < Test::Unit::TestCase
find_issues_with_query(query)
end
def test_filter_watched_issues
User.current = User.find(1)
query = Query.new(:name => '_', :filters => { 'watcher_id' => {:operator => '=', :values => ['me']}})
result = find_issues_with_query(query)
assert_not_nil result
assert !result.empty?
assert_equal Issue.visible.watched_by(User.current).sort_by(&:id), result.sort_by(&:id)
User.current = nil
end
def test_filter_unwatched_issues
User.current = User.find(1)
query = Query.new(:name => '_', :filters => { 'watcher_id' => {:operator => '!', :values => ['me']}})
result = find_issues_with_query(query)
assert_not_nil result
assert !result.empty?
assert_equal((Issue.visible - Issue.watched_by(User.current)).sort_by(&:id).size, result.sort_by(&:id).size)
User.current = nil
end
def test_default_columns
q = Query.new
assert !q.columns.empty?

Loading…
Cancel
Save