diff --git a/app/models/cost_query/operator.rb b/app/models/cost_query/operator.rb index 307be103f1..d4c5d07288 100644 --- a/app/models/cost_query/operator.rb +++ b/app/models/cost_query/operator.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 " :label_less_or_equal do + new " :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 diff --git a/app/models/cost_query/validation.rb b/app/models/cost_query/validation.rb index 6a941d0d5a..25f2b2f49a 100644 --- a/app/models/cost_query/validation.rb +++ b/app/models/cost_query/validation.rb @@ -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 \ No newline at end of file diff --git a/app/models/cost_query/validation/dates.rb b/app/models/cost_query/validation/dates.rb new file mode 100644 index 0000000000..25b565adf0 --- /dev/null +++ b/app/models/cost_query/validation/dates.rb @@ -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 \ No newline at end of file diff --git a/app/models/cost_query/validation/numbers.rb b/app/models/cost_query/validation/numbers.rb new file mode 100644 index 0000000000..256cf6e541 --- /dev/null +++ b/app/models/cost_query/validation/numbers.rb @@ -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 \ No newline at end of file diff --git a/app/models/cost_query/validation/sql.rb b/app/models/cost_query/validation/sql.rb new file mode 100644 index 0000000000..811b9dddc8 --- /dev/null +++ b/app/models/cost_query/validation/sql.rb @@ -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 \ No newline at end of file