OSDN Git Service

Add filters on cross-project issue list for custom fields marked as 'For all projects'.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 22 Jun 2008 15:35:11 +0000 (15:35 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 22 Jun 2008 15:35:11 +0000 (15:35 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1576 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/query.rb
test/fixtures/custom_fields.yml
test/unit/query_test.rb

index 77893bc..4c72e23 100644 (file)
@@ -166,31 +166,20 @@ class Query < ActiveRecord::Base
     @available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty?
   
     if project
-      # project specific filters      
-      @available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => @project.issue_categories.collect{|s| [s.name, s.id.to_s] } }
+      # project specific filters
+      unless @project.issue_categories.empty?
+        @available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => @project.issue_categories.collect{|s| [s.name, s.id.to_s] } }
+      end
       unless @project.versions.empty?
         @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.versions.sort.collect{|s| [s.name, s.id.to_s] } }
       end
       unless @project.active_children.empty?
         @available_filters["subproject_id"] = { :type => :list_subprojects, :order => 13, :values => @project.active_children.collect{|s| [s.name, s.id.to_s] } }
       end
-      @project.all_custom_fields.select(&:is_filter?).each do |field|
-        case field.field_format
-        when "text"
-          options = { :type => :text, :order => 20 }
-        when "list"
-          options = { :type => :list_optional, :values => field.possible_values, :order => 20}
-        when "date"
-          options = { :type => :date, :order => 20 }
-        when "bool"
-          options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]], :order => 20 }
-        else
-          options = { :type => :string, :order => 20 }
-        end          
-        @available_filters["cf_#{field.id}"] = options.merge({ :name => field.name })
-      end
-      # remove category filter if no category defined
-      @available_filters.delete "category_id" if @available_filters["category_id"][:values].empty?
+      add_custom_fields_filters(@project.all_custom_fields)
+    else
+      # global filters for cross project issue list
+      add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
     end
     @available_filters
   end
@@ -368,4 +357,26 @@ class Query < ActiveRecord::Base
     
     (project_clauses + filters_clauses).join(' AND ')
   end
+  
+  private
+  
+  def add_custom_fields_filters(custom_fields)
+    @available_filters ||= {}
+    
+    custom_fields.select(&:is_filter?).each do |field|
+      case field.field_format
+      when "text"
+        options = { :type => :text, :order => 20 }
+      when "list"
+        options = { :type => :list_optional, :values => field.possible_values, :order => 20}
+      when "date"
+        options = { :type => :date, :order => 20 }
+      when "bool"
+        options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]], :order => 20 }
+      else
+        options = { :type => :string, :order => 20 }
+      end
+      @available_filters["cf_#{field.id}"] = options.merge({ :name => field.name })
+    end
+  end
 end
index 3a9e79a..9d88bc6 100644 (file)
@@ -30,6 +30,7 @@ custom_fields_003:
   min_length: 0\r
   regexp: ""\r
   is_for_all: false\r
+  is_filter: true\r
   type: ProjectCustomField\r
   max_length: 0\r
   possible_values: Stable|Beta|Alpha|Planning\r
index 147bfbe..3f77cd8 100644 (file)
@@ -20,6 +20,12 @@ require File.dirname(__FILE__) + '/../test_helper'
 class QueryTest < Test::Unit::TestCase
   fixtures :projects, :users, :members, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries
 
+  def test_custom_fields_for_all_projects_should_be_available_in_global_queries
+    query = Query.new(:project => nil, :name => '_')
+    assert query.available_filters.has_key?('cf_1')
+    assert !query.available_filters.has_key?('cf_3')
+  end
+  
   def test_query_with_multiple_custom_fields
     query = Query.find(1)
     assert query.valid?