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|
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}
@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
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
@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
end
self
end
-
- def issue_custom_fields
- if project
- project.all_issue_custom_fields
- else
- IssueCustomField.where(:is_for_all => true)
- end
- end
end