diff options
| author | Michel Etienne | 2012-06-07 14:25:34 +0200 |
|---|---|---|
| committer | Michel Etienne | 2012-06-07 14:25:34 +0200 |
| commit | 6e19b591d5ca4304feedd4bc7dbe5e4e9dd5fb5d (patch) | |
| tree | 35d96ace6fe6ad1f44a4e55cf47ac40b7c4d0fba /app/models | |
| parent | 99be0398f6f9826d6250bc061c721854bef07674 (diff) | |
| parent | ba29325c18776daa28615b88eb6d75e874341b66 (diff) | |
| download | chouette-core-6e19b591d5ca4304feedd4bc7dbe5e4e9dd5fb5d.tar.bz2 | |
Merge branch 'master' of chouette.dryade.priv:/srv/git/chouette2
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/export.rb | 84 | ||||
| -rw-r--r-- | app/models/export_log_message.rb | 36 | ||||
| -rw-r--r-- | app/models/neptune_export.rb | 7 | ||||
| -rw-r--r-- | app/models/referential.rb | 1 |
4 files changed, 128 insertions, 0 deletions
diff --git a/app/models/export.rb b/app/models/export.rb new file mode 100644 index 000000000..a202e77ef --- /dev/null +++ b/app/models/export.rb @@ -0,0 +1,84 @@ +class Export < ActiveRecord::Base + + belongs_to :referential + validates_presence_of :referential_id + + validates_inclusion_of :status, :in => %w{ pending completed failed } + + has_many :log_messages, :class_name => "ExportLogMessage", :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 + + @@root = "#{Rails.root}/tmp/exports" + cattr_accessor :root + + after_destroy :destroy_file + def destroy_file + FileUtils.rm file if File.exists? file + end + + def file + "#{root}/#{id}.zip" + end + + def name + "#{self.class.model_name.human} #{id}" + end + + def export_options + { :export_id => self.id, :output_file => file } + end + + before_validation :define_default_attributes, :on => :create + def define_default_attributes + self.status ||= "pending" + end + + after_create :delayed_export + def delayed_export + delay.export + end + + def export + FileUtils.mkdir_p root + + begin + log_messages.create :key => :started + + # TODO + # Make real export here + + update_attribute :status, "completed" + rescue => e + Rails.logger.error "Export #{id} failed : #{e}, #{e.backtrace}" + update_attribute :status, "failed" + end + + log_messages.create :key => status + end + + def self.new(attributes = {}, options = {}, &block) + if self == Export + Object.const_get(attributes.delete(:type) || "NeptuneExport").new(attributes, options) + else + super + end + end + +end diff --git a/app/models/export_log_message.rb b/app/models/export_log_message.rb new file mode 100644 index 000000000..61068689c --- /dev/null +++ b/app/models/export_log_message.rb @@ -0,0 +1,36 @@ +class ExportLogMessage < ActiveRecord::Base + belongs_to :export + + acts_as_list :scope => :export + + validates_presence_of :key + validates_inclusion_of :severity, :in => %w{info warning error} + + def arguments=(arguments) + write_attribute :arguments, (arguments.to_json if arguments.present?) + end + + def arguments + @decoded_arguments ||= + begin + if (stored_arguments = raw_attributes).present? + ActiveSupport::JSON.decode stored_arguments + else + {} + end + end + end + + def raw_attributes + read_attribute(:arguments) + end + + before_validation :define_default_attributes, :on => :create + def define_default_attributes + self.severity ||= "info" + end + + def full_message + I18n.translate key, arguments.symbolize_keys.merge(:scope => "export_log_messages.messages") + end +end diff --git a/app/models/neptune_export.rb b/app/models/neptune_export.rb new file mode 100644 index 000000000..fd429101c --- /dev/null +++ b/app/models/neptune_export.rb @@ -0,0 +1,7 @@ +class NeptuneExport < Export + + def export_options + super.merge(:format => :neptune) + end + +end diff --git a/app/models/referential.rb b/app/models/referential.rb index 2d6d5b8d5..3f4a62bb6 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -9,6 +9,7 @@ class Referential < ActiveRecord::Base validates_format_of :prefix, :with => %r{\A[0-9a-zA-Z_]+\Z} has_many :imports, :dependent => :destroy + has_many :exports, :dependent => :destroy def human_attribute_name(*args) self.class.human_attribute_name(*args) |
