diff options
| author | Zog | 2018-02-14 09:44:02 +0100 |
|---|---|---|
| committer | Johan Van Ryseghem | 2018-02-20 09:50:28 +0100 |
| commit | ee002e5aef7e5bb8b818b56ed54b6c68d074110e (patch) | |
| tree | 4ae0b7afde9f4d32649c2254494fef0cb381b17e /app/models | |
| parent | 02091277c1ca384f4445af017cf3f82df60b7078 (diff) | |
| download | chouette-core-ee002e5aef7e5bb8b818b56ed54b6c68d074110e.tar.bz2 | |
Refs #5924 @1H; Add `before` actions
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/chouette/stop_area.rb | 8 | ||||
| -rw-r--r-- | app/models/simple_importer.rb | 87 |
2 files changed, 61 insertions, 34 deletions
diff --git a/app/models/chouette/stop_area.rb b/app/models/chouette/stop_area.rb index 5afe63747..c85a8b37d 100644 --- a/app/models/chouette/stop_area.rb +++ b/app/models/chouette/stop_area.rb @@ -370,6 +370,14 @@ module Chouette !activated? end + def activate + self.deleted_at = nil + end + + def deactivate + self.deleted_at = Time.now + end + def activate! update_attribute :deleted_at, nil end diff --git a/app/models/simple_importer.rb b/app/models/simple_importer.rb index 46c513732..760b98610 100644 --- a/app/models/simple_importer.rb +++ b/app/models/simple_importer.rb @@ -50,52 +50,62 @@ class SimpleImporter < ActiveRecord::Base status = :success statuses = "" log "#{"%#{padding}d" % 0}/#{number_of_lines}", clear: true - CSV.foreach(filepath, self.configuration.csv_options) do |row| - @current_record = self.configuration.find_record row - self.configuration.columns.each do |col| - @current_attribute = col[:attribute] - val = col[:value] - if val.nil? || val.is_a?(Proc) - if row.has_key? col.name - if val.is_a?(Proc) - val = instance_exec(row[col.name], &val) + ActiveRecord::Base.transaction do + self.configuration.before_actions(:all).each &:call + + CSV.foreach(filepath, self.configuration.csv_options) do |row| + @current_record = self.configuration.find_record row + self.configuration.columns.each do |col| + @current_attribute = col[:attribute] + val = col[:value] + if val.nil? || val.is_a?(Proc) + if row.has_key? col.name + if val.is_a?(Proc) + val = instance_exec(row[col.name], &val) + else + val = row[col.name] + end else - val = row[col.name] + self.journal.push({event: :column_not_found, message: "Column not found: #{col.name}", kind: :warning}) + status = :success_with_warnings end - else - self.journal.push({event: :column_not_found, message: "Column not found: #{col.name}", kind: :warning}) - status = :success_with_warnings end + @current_record.send "#{@current_attribute}=", val if val end - @current_record.send "#{@current_attribute}=", val if val - end - fail_with_error ->(){ @current_record.errors.messages } do - new_record = @current_record.new_record? - @current_record.save! - self.journal.push({event: (new_record ? :creation : :update), kind: :log}) - statuses += new_record ? colorize("✓", :green) : colorize("-", :orange) - end - self.configuration.columns.each do |col| - if col.name && @resolution_queue.any? - val = @current_record.send col[:attribute] - (@resolution_queue.delete([col.name, val]) || []).each do |res| - record = res[:record] - attribute = res[:attribute] - value = res[:block].call(val, record) - record.send "#{attribute}=", value - record.save! + fail_with_error ->(){ @current_record.errors.messages } do + new_record = @current_record.new_record? + self.configuration.before_actions(:each_save).each do |action| + action.call @current_record + end + ### This could fail if the record has a mandatory relation which is not yet resolved + ### TODO: do not attempt to save if the current record if waiting for resolution + ### and fail at the end if there remains unresolved relations + @current_record.save! + self.journal.push({event: (new_record ? :creation : :update), kind: :log}) + statuses += new_record ? colorize("✓", :green) : colorize("-", :orange) + end + self.configuration.columns.each do |col| + if col.name && @resolution_queue.any? + val = @current_record.send col[:attribute] + (@resolution_queue.delete([col.name, val]) || []).each do |res| + record = res[:record] + attribute = res[:attribute] + value = res[:block].call(val, record) + record.send "#{attribute}=", value + record.save! + end end end + current_line += 1 + log "#{"%#{padding}d" % current_line}/#{number_of_lines}: #{statuses}", clear: true end - current_line += 1 - log "#{"%#{padding}d" % current_line}/#{number_of_lines}: #{statuses}", clear: true end self.update_attribute :status, status rescue FailedImport self.update_attribute :status, :failed ensure - self.save + self.save! end protected @@ -107,7 +117,6 @@ class SimpleImporter < ActiveRecord::Base msg = msg.call if msg.is_a?(Proc) log "\nFAILED: \n errors: #{msg}\n exception: #{e.message}\n#{e.backtrace.join("\n")}", color: :red self.journal.push({message: msg, error: e.message, event: :error, kind: :error}) - self.save raise FailedImport end end @@ -191,6 +200,16 @@ class SimpleImporter < ActiveRecord::Base @columns.push Column.new({attribute: attribute, value: value}) end + def before group=:all, &block + @before ||= Hash.new{|h, k| h[k] = []} + @before[group].push block + end + + def before_actions group=:all + @before ||= Hash.new{|h, k| h[k] = []} + @before[group] + end + class Column attr_accessor :name def initialize opts={} |
