summaryrefslogtreecommitdiffstats
path: root/app/models/custom_field.rb
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2012-07-24 17:39:30 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2012-07-24 17:39:30 +0000
commitfaab8678d440908a7190a1a4300fdfbca52efe47 (patch)
treebccc396a46494af77a2ba995242f349d92c10f23 /app/models/custom_field.rb
parent44fcc8919d48a93f77bb0f671816c4c70811306e (diff)
downloadredmine-faab8678d440908a7190a1a4300fdfbca52efe47.tar.gz
redmine-faab8678d440908a7190a1a4300fdfbca52efe47.zip
Ability to group and sort the issue list by user/version custom field (#9419).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10073 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/custom_field.rb')
-rw-r--r--app/models/custom_field.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb
index 408b54afb..3373fb8d8 100644
--- a/app/models/custom_field.rb
+++ b/app/models/custom_field.rb
@@ -146,6 +146,8 @@ class CustomField < ActiveRecord::Base
" WHERE cv_sort.customized_type='#{self.class.customized_class.base_class.name}'" +
" AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" +
" AND cv_sort.custom_field_id=#{id} AND cv_sort.value <> '' AND cv_sort.value IS NOT NULL LIMIT 1)"
+ when 'user', 'version'
+ value_class.fields_for_order_statement(value_join_alias)
else
nil
end
@@ -158,15 +160,57 @@ class CustomField < ActiveRecord::Base
case field_format
when 'list', 'date', 'bool', 'int'
order_statement
+ when 'user', 'version'
+ "COALESCE((SELECT cv_sort.value FROM #{CustomValue.table_name} cv_sort" +
+ " WHERE cv_sort.customized_type='#{self.class.customized_class.base_class.name}'" +
+ " AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" +
+ " AND cv_sort.custom_field_id=#{id} LIMIT 1), '')"
+ else
+ nil
+ end
+ end
+
+ def join_for_order_statement
+ case field_format
+ when 'user', 'version'
+ "LEFT OUTER JOIN #{CustomValue.table_name} #{join_alias}" +
+ " ON #{join_alias}.customized_type = '#{self.class.customized_class.base_class.name}'" +
+ " AND #{join_alias}.customized_id = #{self.class.customized_class.table_name}.id" +
+ " AND #{join_alias}.custom_field_id = #{id}" +
+ " AND #{join_alias}.value <> ''" +
+ " AND #{join_alias}.id = (SELECT max(#{join_alias}_2.id) FROM #{CustomValue.table_name} #{join_alias}_2" +
+ " WHERE #{join_alias}_2.customized_type = #{join_alias}.customized_type" +
+ " AND #{join_alias}_2.customized_id = #{join_alias}.customized_id" +
+ " AND #{join_alias}_2.custom_field_id = #{join_alias}.custom_field_id)" +
+ " LEFT OUTER JOIN #{value_class.table_name} #{value_join_alias}" +
+ " ON CAST(#{join_alias}.value as decimal(60,0)) = #{value_join_alias}.id"
else
nil
end
end
+ def join_alias
+ "cf_#{id}"
+ end
+
+ def value_join_alias
+ join_alias + "_" + field_format
+ end
+
def <=>(field)
position <=> field.position
end
+ # Returns the class that values represent
+ def value_class
+ case field_format
+ when 'user', 'version'
+ field_format.classify.constantize
+ else
+ nil
+ end
+ end
+
def self.customized_class
self.name =~ /^(.+)CustomField$/
begin; $1.constantize; rescue nil; end