aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/file_validation.rb
diff options
context:
space:
mode:
authorMichel Etienne2012-07-02 08:11:29 +0200
committerMichel Etienne2012-07-02 08:11:29 +0200
commit0412d82c225ddd47e3c0436ae5d421b1098d2fa0 (patch)
tree7ed33590d68d9066fdd416b41f949dd075d209da /app/models/file_validation.rb
parent8ccb51a3fd3907388ccaa02652a50af5e2ac08e0 (diff)
downloadchouette-core-0412d82c225ddd47e3c0436ae5d421b1098d2fa0.tar.bz2
add file validation
Diffstat (limited to 'app/models/file_validation.rb')
-rw-r--r--app/models/file_validation.rb211
1 files changed, 211 insertions, 0 deletions
diff --git a/app/models/file_validation.rb b/app/models/file_validation.rb
new file mode 100644
index 000000000..26f2b2e90
--- /dev/null
+++ b/app/models/file_validation.rb
@@ -0,0 +1,211 @@
+class FileValidation < ActiveRecord::Base
+ validates_presence_of :resources
+
+ validates_inclusion_of :status, :in => %w{ pending completed failed }
+
+ attr_accessor :resources,:uncheck_count,:ok_count,:warning_count,:error_count,:fatal_count,:log_message_tree
+ attr_accessor :validator
+
+ has_many :log_messages, :class_name => "FileValidationLogMessage", :order => :position, :dependent => :destroy
+
+ serialize :options
+
+ def self.option(name)
+ name = name.to_s
+
+ define_method(name) do
+ self.options[name]
+ end
+
+ define_method("#{name}=") do |prefix|
+ self.options[name] = prefix
+ end
+ end
+
+ def options
+ read_attribute(:options) || write_attribute(:options, {})
+ end
+
+ option :test3_1_minimal_distance
+ option :test3_2_minimal_distance
+ option :test3_2_polygon_points
+ option :test3_7_minimal_distance
+ option :test3_7_maximal_distance
+ option :test3_8a_minimal_speed
+ option :test3_8a_maximal_speed
+ option :test3_8b_minimal_speed
+ option :test3_8b_maximal_speed
+ option :test3_8c_minimal_speed
+ option :test3_8c_maximal_speed
+ option :test3_8d_minimal_speed
+ option :test3_8d_maximal_speed
+ option :test3_9_minimal_speed
+ option :test3_9_maximal_speed
+ option :test3_10_minimal_distance
+ option :test3_15_minimal_time
+ option :test3_16_1_maximal_time
+ option :test3_16_3a_maximal_time
+ option :test3_16_3b_maximal_time
+ option :test3_21a_minimal_speed
+ option :test3_21a_maximal_speed
+ option :test3_21b_minimal_speed
+ option :test3_21b_maximal_speed
+ option :test3_21c_minimal_speed
+ option :test3_21c_maximal_speed
+ option :test3_21d_minimal_speed
+ option :test3_21d_maximal_speed
+ option :projection_reference
+
+ def validator
+ @validator ||= ::Chouette::FileValidator.new("public")
+ end
+
+ def with_original_filename
+ Dir.mktmpdir do |tmp_dir|
+ tmp_link = File.join(tmp_dir, resources.original_filename)
+ FileUtils.ln_s resources.path, tmp_link
+ yield tmp_link
+ end
+ end
+
+ before_validation :define_default_attributes, :on => :create
+ def define_default_attributes
+ self.status ||= "pending"
+ end
+
+ after_validation :extract_file_type, :on => :create
+ def extract_file_type
+ if !resources.original_filename.nil?
+ self.file_type = resources.original_filename.rpartition(".").last
+ self.file_name = resources.original_filename
+ end
+ end
+
+ after_create :delayed_validate
+ def delayed_validate
+ save_resources
+ delay.validate
+ end
+
+ @@root = "#{Rails.root}/tmp/validations"
+ cattr_accessor :root
+
+ def save_resources
+ FileUtils.mkdir_p root
+ FileUtils.cp resources.path, saved_resources
+ end
+
+ after_destroy :destroy_resources
+ def destroy_resources
+ FileUtils.rm saved_resources if File.exists? saved_resources
+ end
+
+ def saved_resources
+ "#{root}/#{id}.#{file_type}"
+ end
+
+ def name
+ "#{FileValidation.model_name.humanize} #{id}"
+ end
+
+ def validation_options
+ { :validation_id => self.id ,
+ :file_format => self.file_type ,
+ :test3_1_minimal_distance => self.test3_1_minimal_distance ,
+ :test3_2_minimal_distance => self.test3_2_minimal_distance ,
+ :test3_2_polygon_points => self.test3_2_polygon_points ,
+ :test3_7_minimal_distance => self.test3_7_minimal_distance ,
+ :test3_7_maximal_distance => self.test3_7_maximal_distance ,
+ :test3_8a_minimal_speed => self.test3_8a_minimal_speed ,
+ :test3_8a_maximal_speed => self.test3_8a_maximal_speed ,
+ :test3_8b_minimal_speed => self.test3_8b_minimal_speed ,
+ :test3_8b_maximal_speed => self.test3_8b_maximal_speed ,
+ :test3_8c_minimal_speed => self.test3_8c_minimal_speed ,
+ :test3_8c_maximal_speed => self.test3_8c_maximal_speed ,
+ :test3_8d_minimal_speed => self.test3_8d_minimal_speed ,
+ :test3_8d_maximal_speed => self.test3_8d_maximal_speed ,
+ :test3_9_minimal_speed => self.test3_9_minimal_speed ,
+ :test3_9_maximal_speed => self.test3_9_maximal_speed ,
+ :test3_10_minimal_distance => self.test3_10_minimal_distance ,
+ :test3_15_minimal_time => self.test3_15_minimal_time ,
+ :test3_16_1_maximal_time => self.test3_16_1_maximal_time ,
+ :test3_16_3a_maximal_time => self.test3_16_3a_maximal_time ,
+ :test3_16_3b_maximal_time => self.test3_16_3b_maximal_time ,
+ :test3_21a_minimal_speed => self.test3_21a_minimal_speed ,
+ :test3_21a_maximal_speed => self.test3_21a_maximal_speed ,
+ :test3_21b_minimal_speed => self.test3_21b_minimal_speed ,
+ :test3_21b_maximal_speed => self.test3_21b_maximal_speed ,
+ :test3_21c_minimal_speed => self.test3_21c_minimal_speed ,
+ :test3_21c_maximal_speed => self.test3_21c_maximal_speed ,
+ :test3_21d_minimal_speed => self.test3_21d_minimal_speed ,
+ :test3_21d_maximal_speed => self.test3_21d_maximal_speed ,
+ :projection_reference => self.projection_reference
+ }
+ end
+
+ def validate
+ begin
+ # log_messages.create :key => :started
+ if resources
+ with_original_filename do |file|
+ # chouette-command checks the file extension (and requires .zip) :(
+ validator.validate file, validation_options
+ end
+ else
+ validator.validate saved_resources, validation_options
+ end
+ update_attribute :status, "completed"
+ rescue => e
+ Rails.logger.error "Validation #{id} failed : #{e}, #{e.backtrace}"
+ update_attribute :status, "failed"
+ end
+ # log_messages.create :key => status
+ end
+
+ after_find :compute_tests
+ def compute_tests
+ if status == 'completed'
+ self.uncheck_count = 0
+ self.ok_count = 0
+ self.warning_count = 0
+ self.error_count = 0
+ self.fatal_count = 0
+ self.log_message_tree = Array.new
+ father1=nil
+ father2=nil
+ father3=nil
+ log_messages.each do |message|
+ if message.level == 1
+ self.log_message_tree << message
+ father1=message
+ elsif message.level == 2
+ father1.add_child message
+ father2=message
+ elsif message.level == 3
+ father2.add_child message
+ father3=message
+ if message.severity == 'uncheck'
+ self.uncheck_count += 1
+ end
+ if message.severity == 'ok'
+ self.ok_count += 1
+ end
+ if message.severity == 'warning'
+ self.warning_count += 1
+ end
+ if message.severity == 'error'
+ self.error_count += 1
+ end
+ if message.severity == 'fatal'
+ self.fatal_count += 1
+ end
+ elsif message.level == 4
+ father3.add_child message
+ end
+ end
+ end
+
+ end
+
+
+end