diff options
| author | Michel Etienne | 2012-07-02 08:11:29 +0200 | 
|---|---|---|
| committer | Michel Etienne | 2012-07-02 08:11:29 +0200 | 
| commit | 0412d82c225ddd47e3c0436ae5d421b1098d2fa0 (patch) | |
| tree | 7ed33590d68d9066fdd416b41f949dd075d209da /app/models/file_validation.rb | |
| parent | 8ccb51a3fd3907388ccaa02652a50af5e2ac08e0 (diff) | |
| download | chouette-core-0412d82c225ddd47e3c0436ae5d421b1098d2fa0.tar.bz2 | |
add file validation
Diffstat (limited to 'app/models/file_validation.rb')
| -rw-r--r-- | app/models/file_validation.rb | 211 | 
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  | 
