]> source.dussan.org Git - redmine.git/commitdiff
Added "Float" as a custom field format.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Thu, 25 Oct 2007 17:38:05 +0000 (17:38 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Thu, 25 Oct 2007 17:38:05 +0000 (17:38 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@870 e93f8b46-1217-0410-a6f0-8f06a7374b81

24 files changed:
app/helpers/custom_fields_helper.rb
app/models/custom_field.rb
app/models/custom_value.rb
app/views/custom_fields/_form.rhtml
lang/bg.yml
lang/cs.yml
lang/de.yml
lang/en.yml
lang/es.yml
lang/fr.yml
lang/he.yml
lang/it.yml
lang/ja.yml
lang/nl.yml
lang/pl.yml
lang/pt-br.yml
lang/pt.yml
lang/ro.yml
lang/sr.yml
lang/sv.yml
lang/zh.yml
test/fixtures/custom_fields.yml
test/unit/custom_field_test.rb [new file with mode: 0644]
test/unit/custom_value_test.rb [new file with mode: 0644]

index d6dc586c4bd4741fdb7b27248eede59ba4447523..b1b176107b6a36d20eb29a703399d862b23e43eb 100644 (file)
@@ -24,8 +24,6 @@ module CustomFieldsHelper
     field_id = "custom_fields_#{custom_field.id}"
     
     case custom_field.field_format
-    when "string", "int"
-      text_field 'custom_value', 'value', :name => field_name, :id => field_id
     when "date"
       text_field('custom_value', 'value', :name => field_name, :id => field_id, :size => 10) + 
       calendar_for(field_id)
@@ -35,6 +33,8 @@ module CustomFieldsHelper
       check_box 'custom_value', 'value', :name => field_name, :id => field_id
     when "list"
       select 'custom_value', 'value', custom_field.possible_values, { :include_blank => true }, :name => field_name, :id => field_id
+    else
+      text_field 'custom_value', 'value', :name => field_name, :id => field_id
     end
   end
   
index 751cc85267e6871da64e13f5180bfb3b19c2bf20..81c8aae068630af3094b9f86df6efcfee4df21c7 100644 (file)
@@ -22,9 +22,10 @@ class CustomField < ActiveRecord::Base
   FIELD_FORMATS = { "string" => { :name => :label_string, :order => 1 },
                     "text" => { :name => :label_text, :order => 2 },
                     "int" => { :name => :label_integer, :order => 3 },
-                    "list" => { :name => :label_list, :order => 4 },
-                               "date" => { :name => :label_date, :order => 5 },
-                               "bool" => { :name => :label_boolean, :order => 6 }
+                    "float" => { :name => :label_float, :order => 4 },
+                    "list" => { :name => :label_list, :order => 5 },
+                               "date" => { :name => :label_date, :order => 6 },
+                               "bool" => { :name => :label_boolean, :order => 7 }
   }.freeze
 
   validates_presence_of :name, :field_format
index 6cc4d16bf5755926a363b861a039e497d03e80fc..afe4c1afb7c1d9d669d90c32b4f4d7d890f7a3cc 100644 (file)
@@ -26,13 +26,14 @@ protected
     errors.add(:value, :activerecord_error_too_short) if custom_field.min_length > 0 and value.length < custom_field.min_length and value.length > 0
     errors.add(:value, :activerecord_error_too_long) if custom_field.max_length > 0 and value.length > custom_field.max_length
     case custom_field.field_format
-    when "int"
-      errors.add(:value, :activerecord_error_not_a_number) unless value =~ /^[0-9]*$/  
-    when "date"
+    when 'int'
+      errors.add(:value, :activerecord_error_not_a_number) unless value.blank? || value =~ /^[+-]?\d+$/        
+    when 'float'
+      begin; !value.blank? && Kernel.Float(value); rescue; errors.add(:value, :activerecord_error_invalid) end
+    when 'date'
       errors.add(:value, :activerecord_error_not_a_date) unless value =~ /^\d{4}-\d{2}-\d{2}$/ or value.empty?
-    when "list"
+    when 'list'
       errors.add(:value, :activerecord_error_inclusion) unless custom_field.possible_values.include? value or value.empty?
     end
   end
 end
-
index 32269e3f090cb2bfc4003121d2abcc612be644db..013be9b704f0066c2c37318275464fb665744264 100644 (file)
@@ -13,13 +13,6 @@ function toggle_custom_field_format() {
       Element.hide(p_regexp.parentNode);
       Element.show(p_values);
       break;
-    case "int":
-    case "string":
-    case "text":
-      Element.show(p_length.parentNode);
-      Element.show(p_regexp.parentNode);
-      Element.hide(p_values);
-      break;
     case "date":
     case "bool":
       Element.hide(p_length.parentNode);
@@ -29,7 +22,7 @@ function toggle_custom_field_format() {
     default:
       Element.show(p_length.parentNode);
       Element.show(p_regexp.parentNode);
-      Element.show(p_values);
+      Element.hide(p_values);
       break;
   }
 }
index 0b333e4880bb765fba0e1c9472c583837282352c..c9e5a69b2b1053d9c9b37fa9586a6e7292be747e 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index e947b1172342a03b194db55e00ff0c55d14312e5..f885359fc36fe9849ee1e6dba026e09391c2fc8f 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index 93190fb7385eb8e7a06e95083902855f664f35ce..9649902e7edec26cd3163956f30d5b6c297f93f6 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index 88cbcd73036e5e291b686b229a180fe40f86e335..ec0ee3077c34f805b950632ac455c85dcde7488a 100644 (file)
@@ -259,6 +259,7 @@ label_min_max_length: Min - Max length
 label_list: List
 label_date: Date
 label_integer: Integer
+label_float: Float
 label_boolean: Boolean
 label_string: Text
 label_text: Long text
index f55d5849e4e9eb2c9745750b517ca04bf3ca29c2..4df3e6541c53e5e46096fed16cda15e25db04521 100644 (file)
@@ -535,3 +535,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index 70b60368739415c8f38f437d86348c6745954423..0aeed308bdac19ebce8d5883677c1a374fb21e4e 100644 (file)
@@ -259,6 +259,7 @@ label_min_max_length: Longueurs mini - maxi
 label_list: Liste
 label_date: Date
 label_integer: Entier
+label_float: Nombre décimal
 label_boolean: Booléen
 label_string: Texte
 label_text: Texte long
index 8cefd127f40bb23980dd59e5833ae29383cc8892..dcb9c82f4ea06bff9dc8fcaa2a14093f8b02fcd5 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index 840d298f75a6a126bd8916fc86bd221f52161d59..661d1ef20fa4d55229c5d73f090a4a27b38c0cba 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index fc42cee5243cbcfb79d7b22d32f952ecbcf0fb99..da4c3530f671f2dcc35a245bccc52f87248faf31 100644 (file)
@@ -533,3 +533,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index fc6d9bbebb8d99a64979ab1562e1be6119ce7614..d4b6889ed2d7ce76726351106c1d0199e94930d6 100644 (file)
@@ -533,3 +533,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index 4565b257653794018ade2992fc649b962225abb0..95b4161975b77e93859b4099465aaf12d4e37a6d 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index 942de55aee7e9fa2b9c77f660b8d516f4e3f8538..650c6ebb91a6448b8a5ce6bdcddc8da90c18a7ec 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"\r
 label_user_mail_option_none: "Only for things I watch or I'm involved in"\r
 setting_emails_footer: Emails footer\r
+label_float: Float\r
index 49176d6070262488c633ca5894d2048294b509a0..2bdb571981af0257a5eebe35e3b0107f7a3fe5cf 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index 8e7b8a2bf60628793cce597ba3487e55c6a3db4f..0ef3a90275c40ea45dee5a4b2c9ed3f67d70bcf4 100644 (file)
@@ -532,3 +532,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index d652253198958bd42da75d534640fbe5d320fc50..983798fbe3027de32e00d659b0764fde4207fc20 100644 (file)
@@ -533,3 +533,4 @@ default_activity_development: Razvoj
 enumeration_issue_priorities: Prioriteti kartica
 enumeration_doc_categories: Kategorija dokumenata
 enumeration_activities: Aktivnosti (praćenje vremena))
+label_float: Float
index 878eb144108d8bbf0723bf4c5d8c5e5ec8c065d9..72355c3bb6149eb37eeeb564dc6a5911c49b995d 100644 (file)
@@ -533,3 +533,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index 34e56ea375d685fdc2240831b0d1dde38d3c4949..7d276ab4c5e2dc8ddfb9682157e8c75ff19113d6 100644 (file)
@@ -535,3 +535,4 @@ label_user_mail_option_selected: "For any event on the selected projects only...
 label_user_mail_option_all: "For any event on all my projects"
 label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
+label_float: Float
index fcf52c17a255b02be83f3540bf5f37a6567adaca..ce7509fe9d038d2f61debc657279affb71ded826 100644 (file)
@@ -43,3 +43,15 @@ custom_fields_004:
   id: 4\r
   is_required: false\r
   field_format: string\r
+custom_fields_005: \r
+  name: Money\r
+  min_length: 0\r
+  regexp: ""\r
+  is_for_all: false\r
+  type: UserCustomField\r
+  max_length: 0\r
+  possible_values: ""\r
+  id: 5\r
+  is_required: false\r
+  field_format: float\r
+  
\ No newline at end of file
diff --git a/test/unit/custom_field_test.rb b/test/unit/custom_field_test.rb
new file mode 100644 (file)
index 0000000..1b9c9ae
--- /dev/null
@@ -0,0 +1,32 @@
+# redMine - project management software
+# Copyright (C) 2006-2007  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.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class CustomFieldTest < Test::Unit::TestCase
+  fixtures :custom_fields
+  
+  def test_create
+    field = UserCustomField.new(:name => 'Money money money', :field_format => 'float')
+    assert field.save
+  end
+  
+  def test_destroy
+    field = CustomField.find(1)
+    assert field.destroy
+  end
+end
diff --git a/test/unit/custom_value_test.rb b/test/unit/custom_value_test.rb
new file mode 100644 (file)
index 0000000..24d09fe
--- /dev/null
@@ -0,0 +1,34 @@
+# redMine - project management software
+# Copyright (C) 2006-2007  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.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class CustomValueTest < Test::Unit::TestCase
+  fixtures :custom_fields
+
+  def test_float_field
+    v = CustomValue.new(:customized => User.find(:first), :custom_field => UserCustomField.find_by_name('Money'))
+    v.value = '11.2'
+    assert v.save
+    v.value = ''
+    assert v.save
+    v.value = '-6.250'
+    assert v.save
+    v.value = '6a'
+    assert !v.save
+  end
+end