aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/export.rb84
-rw-r--r--app/models/export_log_message.rb36
-rw-r--r--app/models/neptune_export.rb7
-rw-r--r--app/models/referential.rb1
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)