Class: CustomField

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/custom_field.rb

Overview

– copyright ChiliProject is a project management system.

Copyright (C) 2010-2013 the ChiliProject Team

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.

See doc/COPYRIGHT.rdoc for more details. ++

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attributes = nil) ⇒ CustomField


25
26
27
28
# File 'app/models/custom_field.rb', line 25

def initialize(attributes = nil)
  super
  self.possible_values ||= []
end

Class Method Details

.customized_classObject


133
134
135
136
# File 'app/models/custom_field.rb', line 133

def self.customized_class
  self.name =~ /^(.+)CustomField$/
  begin; $1.constantize; rescue nil; end
end

.for_allObject

to move in project_custom_field


139
140
141
# File 'app/models/custom_field.rb', line 139

def self.for_all
  find(:all, :conditions => ["is_for_all=?", true], :order => 'position')
end

Instance Method Details

#<=>(field) ⇒ Object


129
130
131
# File 'app/models/custom_field.rb', line 129

def <=>(field)
  position <=> field.position
end

#before_validationObject


30
31
32
33
34
# File 'app/models/custom_field.rb', line 30

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


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'app/models/custom_field.rb', line 84

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
    when 'user', 'version'
      casted = (value.blank? ? nil : field_format.classify.constantize.find_by_id(value.to_i))
    end
  end
  casted
end

#order_statementObject

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.


108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'app/models/custom_field.rb', line 108

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(obj = nil) ⇒ Object


66
67
68
69
70
71
72
73
# File 'app/models/custom_field.rb', line 66

def possible_values(obj=nil)
  case field_format
  when 'user'
    possible_values_options(obj).collect(&:last)
  else
    read_attribute :possible_values
  end
end

#possible_values=(arg) ⇒ Object

Makes possible_values accept a multiline string


76
77
78
79
80
81
82
# File 'app/models/custom_field.rb', line 76

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

#possible_values_options(obj = nil) ⇒ Object


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'app/models/custom_field.rb', line 48

def possible_values_options(obj=nil)
  case field_format
  when 'user', 'version'
    if obj.respond_to?(:project) && obj.project
      case field_format
      when 'user'
        obj.project.users.sort.collect {|u| [u.to_s, u.id.to_s]}
      when 'version'
        obj.project.versions.sort.collect {|u| [u.to_s, u.id.to_s]}
      end
    else
      []
    end
  else
    read_attribute :possible_values
  end
end

#type_nameObject


143
144
145
# File 'app/models/custom_field.rb', line 143

def type_name
  nil
end

#validateObject


36
37
38
39
40
41
42
43
44
45
46
# File 'app/models/custom_field.rb', line 36

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