]> source.dussan.org Git - redmine.git/commitdiff
Adds a custom validator for dates (#12736).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 5 Jan 2013 16:09:15 +0000 (16:09 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 5 Jan 2013 16:09:15 +0000 (16:09 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11124 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue.rb
app/models/version.rb
lib/redmine/core_ext/active_record.rb
test/unit/version_test.rb

index 2d9228b1d8feb998ea76f6bcce261158f3962c97..8a0ef7fa8148b5630df858b36d443c7f22b55d50 100644 (file)
@@ -68,6 +68,8 @@ class Issue < ActiveRecord::Base
   validates_length_of :subject, :maximum => 255
   validates_inclusion_of :done_ratio, :in => 0..100
   validates_numericality_of :estimated_hours, :allow_nil => true
+  validates :start_date, :date => true
+  validates :due_date, :date => true
   validate :validate_issue, :validate_required_fields
 
   scope :visible, lambda {|*args|
@@ -532,14 +534,6 @@ class Issue < ActiveRecord::Base
   end
 
   def validate_issue
-    if due_date.nil? && @attributes['due_date'].present?
-      errors.add :due_date, :not_a_date
-    end
-
-    if start_date.nil? && @attributes['start_date'].present?
-      errors.add :start_date, :not_a_date
-    end
-
     if due_date && start_date && due_date < start_date
       errors.add :due_date, :greater_than_start_date
     end
index 50225f362eb7df8ecdd396d1c8533902be908b67..e7651ad2372a71ebbc007f9142a695b357cffc58 100644 (file)
@@ -30,10 +30,9 @@ class Version < ActiveRecord::Base
   validates_presence_of :name
   validates_uniqueness_of :name, :scope => [:project_id]
   validates_length_of :name, :maximum => 60
-  validates_format_of :effective_date, :with => /\A\d{4}-\d{2}-\d{2}\z/, :message => :not_a_date, :allow_nil => true
+  validates :effective_date, :date => true
   validates_inclusion_of :status, :in => VERSION_STATUSES
   validates_inclusion_of :sharing, :in => VERSION_SHARINGS
-  validate :validate_version
 
   scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
   scope :open, lambda { where(:status => 'open') }
@@ -287,10 +286,4 @@ class Version < ActiveRecord::Base
       progress
     end
   end
-
-  def validate_version
-    if effective_date.nil? && @attributes['effective_date'].present?
-      errors.add :effective_date, :not_a_date
-    end
-  end
 end
index b18f95cd963d40b81aaa1d53bff10453cb969c70..69bf76adc1473dfcb7eac1df353e19ab6d523440 100644 (file)
@@ -38,3 +38,14 @@ module ActiveRecord
     end
   end
 end
+
+class DateValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    before_type_cast = record.attributes_before_type_cast[attribute.to_s]
+    if before_type_cast.is_a?(String) && before_type_cast.present?
+      unless before_type_cast =~ /\A\d{4}-\d{2}-\d{2}\z/ && value
+        record.errors.add attribute, :not_a_date
+      end
+    end
+  end
+end
index ecc0d227e842b8c41973883086bfc6a299e13286..fa695fea6af38009747a96b700249205502ec173 100644 (file)
@@ -37,6 +37,8 @@ class VersionTest < ActiveSupport::TestCase
     assert !v.valid?
     v.effective_date = '2012-31-11'
     assert !v.valid?
+    v.effective_date = '-2012-31-11'
+    assert !v.valid?
     v.effective_date = 'ABC'
     assert !v.valid?
     assert_include I18n.translate('activerecord.errors.messages.not_a_date'),