]> source.dussan.org Git - redmine.git/commitdiff
Merged r16467 (#25501).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Thu, 6 Apr 2017 17:11:49 +0000 (17:11 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Thu, 6 Apr 2017 17:11:49 +0000 (17:11 +0000)
git-svn-id: http://svn.redmine.org/redmine/branches/3.3-stable@16505 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue_query.rb
app/models/project.rb
app/models/query.rb
app/models/time_entry_query.rb

index 01302cfb09e5e74b16e872177f7fef45ccb6d183..42d6df40fa70c5e859b86dac4f0f92a6eb707830 100644 (file)
@@ -236,7 +236,6 @@ class IssueQuery < Query
     end
 
     add_custom_fields_filters(issue_custom_fields)
-
     add_associations_custom_fields_filters :project, :author, :assigned_to, :fixed_version
 
     IssueRelation::TYPES.each do |relation_type, options|
@@ -255,10 +254,7 @@ class IssueQuery < Query
   def available_columns
     return @available_columns if @available_columns
     @available_columns = self.class.available_columns.dup
-    @available_columns += (project ?
-                            project.all_issue_custom_fields :
-                            IssueCustomField
-                           ).visible.collect {|cf| QueryCustomFieldColumn.new(cf) }
+    @available_columns += issue_custom_fields.visible.collect {|cf| QueryCustomFieldColumn.new(cf) }
 
     if User.current.allowed_to?(:view_time_entries, project, :global => true)
       index = @available_columns.find_index {|column| column.name == :total_estimated_hours}
index 42413924a625ff102ac891bcc464ff55afcc70b7..60143ea8f0776d5c369df0b6162edadb88afe42d 100644 (file)
@@ -324,6 +324,7 @@ class Project < ActiveRecord::Base
     @shared_versions = nil
     @rolled_up_versions = nil
     @rolled_up_trackers = nil
+    @rolled_up_custom_fields = nil
     @all_issue_custom_fields = nil
     @all_time_entry_custom_fields = nil
     @to_param = nil
@@ -572,6 +573,22 @@ class Project < ActiveRecord::Base
     end
   end
 
+  # Returns a scope of all custom fields enabled for issues of the project
+  # and its subprojects
+  def rolled_up_custom_fields
+    if leaf?
+      all_issue_custom_fields
+    else
+      @rolled_up_custom_fields ||= IssueCustomField.
+        sorted.
+        where("is_for_all = ? OR EXISTS (SELECT 1" +
+          " FROM #{table_name_prefix}custom_fields_projects#{table_name_suffix} cfp" +
+          " JOIN #{Project.table_name} p ON p.id = cfp.project_id" +
+          " WHERE cfp.custom_field_id = #{CustomField.table_name}.id" +
+          " AND p.lft >= ? AND p.rgt <= ?)", true, lft, rgt)
+    end
+  end
+
   def project
     self
   end
index 2d646a295fd10692728dd4aa03b6bf6dec07a960..a6d32f102c1df9bd7d76a5c6649e14a7e5e51a79 100644 (file)
@@ -340,6 +340,15 @@ class Query < ActiveRecord::Base
     @all_projects_values = values
   end
 
+  # Returns a scope of issue custom fields that are available as columns or filters
+  def issue_custom_fields
+    if project
+      project.rolled_up_custom_fields
+    else
+      IssueCustomField.all
+    end
+  end
+
   # Adds available filters
   def initialize_available_filters
     # implemented by sub-classes
index 148c657c09229dbfcd8327ecd8098198d80c4b51..b34a0483fff31490894e472566773f93909da28e 100644 (file)
@@ -140,12 +140,4 @@ class TimeEntryQuery < Query
     end
     self
   end
-
-  def issue_custom_fields
-    if project
-      project.all_issue_custom_fields
-    else
-      IssueCustomField.where(:is_for_all => true)
-    end
-  end
 end