summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2017-04-03 14:04:04 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2017-04-03 14:04:04 +0000
commit6c4b73b448fa4cc1614a1bec93beeaaacdb62510 (patch)
tree329d9ca82c9c28f28270c5e00e430692ec8b5c86
parent857696c3c61d329c82cd0d4f0ba8ae6b001aac2f (diff)
downloadredmine-6c4b73b448fa4cc1614a1bec93beeaaacdb62510.tar.gz
redmine-6c4b73b448fa4cc1614a1bec93beeaaacdb62510.zip
Query through multiple projects by issue custom field not possible anymore (#25501).
git-svn-id: http://svn.redmine.org/redmine/trunk@16467 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/models/issue_query.rb8
-rw-r--r--app/models/project.rb17
-rw-r--r--app/models/query.rb9
-rw-r--r--app/models/time_entry_query.rb8
4 files changed, 27 insertions, 15 deletions
diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb
index 9f3bf290d..5ca76a5bc 100644
--- a/app/models/issue_query.rb
+++ b/app/models/issue_query.rb
@@ -164,10 +164,7 @@ class IssueQuery < Query
:values => lambda { subproject_values }
end
-
- issue_custom_fields = project ? project.all_issue_custom_fields : IssueCustomField.where(:is_for_all => true)
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|
@@ -186,10 +183,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}
diff --git a/app/models/project.rb b/app/models/project.rb
index 3d8878ca2..a425d8ca7 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -325,6 +325,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
@@ -579,6 +580,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
diff --git a/app/models/query.rb b/app/models/query.rb
index a0f1969e3..863bdbc4a 100644
--- a/app/models/query.rb
+++ b/app/models/query.rb
@@ -551,6 +551,15 @@ class Query < ActiveRecord::Base
Version.sort_by_status(versions).collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s, l("version_status_#{s.status}")] }
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
diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb
index 656415d66..eab1113e2 100644
--- a/app/models/time_entry_query.rb
+++ b/app/models/time_entry_query.rb
@@ -218,12 +218,4 @@ class TimeEntryQuery < Query
joins.compact!
joins.any? ? joins.join(' ') : nil
end
-
- def issue_custom_fields
- if project
- project.all_issue_custom_fields
- else
- IssueCustomField.where(:is_for_all => true)
- end
- end
end