Class: CustomField
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- CustomField
- Defined in:
- app/models/custom_field.rb
Overview
redMine - project management software Copyright © 2006 Jean-Philippe Lang
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Direct Known Subclasses
DocumentCategoryCustomField, GroupCustomField, IssueCustomField, IssuePriorityCustomField, ProjectCustomField, TimeEntryActivityCustomField, TimeEntryCustomField, UserCustomField, VersionCustomField
Class Method Summary collapse
- .customized_class ⇒ Object
-
.for_all ⇒ Object
to move in project_custom_field.
Instance Method Summary collapse
- #<=>(field) ⇒ Object
- #before_validation ⇒ Object
- #cast_value(value) ⇒ Object
-
#initialize(attributes = nil) ⇒ CustomField
constructor
A new instance of CustomField.
-
#order_statement ⇒ Object
Returns a ORDER BY clause that can used to sort customized objects by their value of the custom field.
-
#possible_values=(arg) ⇒ Object
Makes possible_values accept a multiline string.
- #type_name ⇒ Object
- #validate ⇒ Object
Constructor Details
#initialize(attributes = nil) ⇒ CustomField
Returns a new instance of CustomField.
28 29 30 31 |
# File 'app/models/custom_field.rb', line 28 def initialize(attributes = nil) super self.possible_values ||= [] end |
Class Method Details
.customized_class ⇒ Object
107 108 109 110 |
# File 'app/models/custom_field.rb', line 107 def self.customized_class self.name =~ /^(.+)CustomField$/ begin; $1.constantize; rescue nil; end end |
.for_all ⇒ Object
to move in project_custom_field
113 114 115 |
# File 'app/models/custom_field.rb', line 113 def self.for_all find(:all, :conditions => ["is_for_all=?", true], :order => 'position') end |
Instance Method Details
#<=>(field) ⇒ Object
103 104 105 |
# File 'app/models/custom_field.rb', line 103 def <=>(field) position <=> field.position end |
#before_validation ⇒ Object
33 34 35 36 37 |
# File 'app/models/custom_field.rb', line 33 def before_validation # make sure these fields are not searchable self.searchable = false if %w(int float date bool).include?(field_format) true end |
#cast_value(value) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'app/models/custom_field.rb', line 60 def cast_value(value) casted = nil unless value.blank? case field_format when 'string', 'text', 'list' casted = value when 'date' casted = begin; value.to_date; rescue; nil end when 'bool' casted = (value == '1' ? true : false) when 'int' casted = value.to_i when 'float' casted = value.to_f end end casted end |
#order_statement ⇒ Object
Returns a ORDER BY clause that can used to sort customized objects by their value of the custom field. Returns false, if the custom field can not be used for sorting.
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'app/models/custom_field.rb', line 82 def order_statement case field_format when 'string', 'text', 'list', 'date', 'bool' # COALESCE is here to make sure that blank and NULL values are sorted equally "COALESCE((SELECT cv_sort.value FROM #{CustomValue.table_name} cv_sort" + " WHERE cv_sort.customized_type='#{self.class.customized_class.name}'" + " AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" + " AND cv_sort.custom_field_id=#{id} LIMIT 1), '')" when 'int', 'float' # Make the database cast values into numeric # Postgresql will raise an error if a value can not be casted! # CustomValue validations should ensure that it doesn't occur "(SELECT CAST(cv_sort.value AS decimal(60,3)) FROM #{CustomValue.table_name} cv_sort" + " WHERE cv_sort.customized_type='#{self.class.customized_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)" else nil end end |
#possible_values=(arg) ⇒ Object
Makes possible_values accept a multiline string
52 53 54 55 56 57 58 |
# File 'app/models/custom_field.rb', line 52 def possible_values=(arg) if arg.is_a?(Array) write_attribute(:possible_values, arg.compact.collect(&:strip).select {|v| !v.blank?}) else self.possible_values = arg.to_s.split(/[\n\r]+/) end end |
#type_name ⇒ Object
117 118 119 |
# File 'app/models/custom_field.rb', line 117 def type_name nil end |
#validate ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 |
# File 'app/models/custom_field.rb', line 39 def validate if self.field_format == "list" errors.add(:possible_values, :blank) if self.possible_values.nil? || self.possible_values.empty? errors.add(:possible_values, :invalid) unless self.possible_values.is_a? Array end # validate default value v = CustomValue.new(:custom_field => self.clone, :value => default_value, :customized => nil) v.custom_field.is_required = false errors.add(:default_value, :invalid) unless v.valid? end |