From 3e14c3017c037d93e562c3697cf50224dced7b50 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sat, 5 Jan 2013 16:09:15 +0000 Subject: [PATCH] Adds a custom validator for dates (#12736). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11124 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/issue.rb | 10 ++-------- app/models/version.rb | 9 +-------- lib/redmine/core_ext/active_record.rb | 11 +++++++++++ test/unit/version_test.rb | 2 ++ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/models/issue.rb b/app/models/issue.rb index 2d9228b1d..8a0ef7fa8 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -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 diff --git a/app/models/version.rb b/app/models/version.rb index 50225f362..e7651ad23 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -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 diff --git a/lib/redmine/core_ext/active_record.rb b/lib/redmine/core_ext/active_record.rb index b18f95cd9..69bf76adc 100644 --- a/lib/redmine/core_ext/active_record.rb +++ b/lib/redmine/core_ext/active_record.rb @@ -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 diff --git a/test/unit/version_test.rb b/test/unit/version_test.rb index ecc0d227e..fa695fea6 100644 --- a/test/unit/version_test.rb +++ b/test/unit/version_test.rb @@ -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'), -- 2.39.5