validation api magic. date validation is the only thing implemented, though

git-svn-id: https://dev.finn.de/svn/cockpit/branches/reporting_merge@1838 7926756e-e54e-46e6-9721-ed318f58905e
pull/6827/head
j.wollert 14 years ago committed by jwollert
parent e98365ee0e
commit 4efbd86b88
  1. 18
      app/models/cost_query/operator.rb
  2. 47
      app/models/cost_query/validation.rb
  3. 15
      app/models/cost_query/validation/dates.rb
  4. 7
      app/models/cost_query/validation/numbers.rb
  5. 7
      app/models/cost_query/validation/sql.rb

@ -161,41 +161,33 @@ class CostQuery::Operator
new "y", :label => :label_yes, :arity => 0, :where_clause => "%s IS NOT NULL"
new "n", :label => :label_no, :arity => 0, :where_clause => "%s IS NULL"
new "<d", :label => :label_less_or_equal do
new "<d", :label => :label_less_or_equal, :validate => :dates do
def modify(query, field, value)
return query if value.to_s.empty?
"<".to_operator.modify query, field, quoted_date(value)
end
include CostQuery::Validation::DateValidation
end
new ">d", :label => :label_greater_or_equal do
new ">d", :label => :label_greater_or_equal, :validate => :dates do
def modify(query, field, value)
return query if value.to_s.empty?
">".to_operator.modify query, field, quoted_date(value)
end
include CostQuery::Validation::DateValidation
end
new "<>d", :label => :label_between do
new "<>d", :label => :label_between, :validate => :dates do
def modify(query, field, from, to)
return query if from.to_s.empty? || to.to_s.empty?
query.where "#{field} BETWEEN '#{quoted_date from}' AND '#{quoted_date to}'"
query
end
include CostQuery::Validation::DateValidation
end
new "=d", :label => :label_date_on do
new "=d", :label => :label_date_on, :validate => :dates do
def modify(query, field, value)
return query if value.to_s.empty?
"=".to_operator.modify query, field, quoted_date(value)
end
include CostQuery::Validation::DateValidation
end
new "=_child_projects", :label => :label_is_project_with_subprojects do
@ -280,6 +272,8 @@ class CostQuery::Operator
def initialize(name, values = {}, &block)
@name = name.to_s
validation_methods = values.delete(:validate).to_a || []
register_validations(validation_methods) unless validation_methods.empty?
values.each do |key, value|
metaclass.class_eval { define_method(key) { value } }
end

@ -1,31 +1,38 @@
module CostQuery::Validation
module CostQuery::Validation::DateValidation
include CostQuery::Validation
def validate(*values)
errors.clear
values.all? do |vals|
vals = vals.is_a?(Array) ? vals : [vals]
vals.all? do |val|
begin
!!val.to_dateish
rescue ArgumentError
validate(vals - [val])
errors << "\'#{val}\' is not a valid date!"
false
end
def register_validations(validation_methods)
validation_methods.each do |val_method|
const_name = val_method.to_s.camelize
begin
val_module = CostQuery::Validation.const_get const_name
metaclass.send(:include, val_module)
val_method = "validate_" + val_method.to_s
if method(val_method)
validations << val_method
else
warn "#{val_module.name} does not define #{val_method}"
end
rescue NameError
warn "No Module CostQuery::Validation::#{const_name} found to validate #{val_method}"
end
end
end
def validate(*values)
true
end
def errors
@errors ||= []
@errors
end
def validations
@validations ||= []
@validations
end
def validate(values = [])
errors.clear
return true if validations.empty?
validations.all? do |validation|
send(validation, values) unless values.empty?
end
end
end

@ -0,0 +1,15 @@
module CostQuery::Validation
module Dates
def validate_dates(values = [])
values.all? do |val|
begin
!!val.to_dateish
rescue ArgumentError
validate_dates(values - [val])
errors << "\'#{val}\' is not a valid date!"
false
end
end
end
end
end

@ -0,0 +1,7 @@
module CostQuery::Validation
module Numbers
def validate_numbers(values = [])
raise NotImplementedError, "Haven't done number validation just yet!"
end
end
end

@ -0,0 +1,7 @@
module CostQuery::Validation
module Sql
def validate_sql(values = [])
raise NotImplementedError, "Haven't done SQL validation just yet!"
end
end
end
Loading…
Cancel
Save