aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.lock7
-rw-r--r--app/models/import.rb39
-rw-r--r--config/initializers/apartment.rb2
-rw-r--r--db/migrate/20120516172252_create_delayed_jobs.rb22
-rwxr-xr-xscript/delayed_job5
6 files changed, 69 insertions, 8 deletions
diff --git a/Gemfile b/Gemfile
index 20f7ecee6..d4d584cfd 100644
--- a/Gemfile
+++ b/Gemfile
@@ -35,6 +35,8 @@ gem 'ninoxe', :git => 'git://chouette.dryade.priv/ninoxe' #, :path => '~/Project
gem 'acts_as_list', '0.1.6'
gem 'composite_primary_keys', '4.1.2'
+gem 'delayed_job_active_record'
+
# Gems used only for assets and not required
# in production environments by default.
group :assets do
diff --git a/Gemfile.lock b/Gemfile.lock
index b6b129246..9c79ce4e0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -121,6 +121,11 @@ GEM
composite_primary_keys (4.1.2)
activerecord (~> 3.1)
database_cleaner (0.7.2)
+ delayed_job (3.0.2)
+ activesupport (~> 3.0)
+ delayed_job_active_record (0.3.2)
+ activerecord (> 2.1.0)
+ delayed_job (~> 3.0.0)
devise (2.0.4)
bcrypt-ruby (~> 3.0)
orm_adapter (~> 0.0.3)
@@ -161,6 +166,7 @@ GEM
jruby-openssl (0.7.6.1)
bouncy-castle-java (>= 1.5.0146.1)
jruby-rack (1.1.5)
+ json (1.7.3)
json (1.7.3-java)
launchy (2.1.0)
addressable (~> 2.2.6)
@@ -311,6 +317,7 @@ DEPENDENCIES
coffee-script-source
composite_primary_keys (= 4.1.2)
database_cleaner
+ delayed_job_active_record
devise
factory_girl_rails (= 1.7)
formtastic (= 2.0.2)
diff --git a/app/models/import.rb b/app/models/import.rb
index a2a7e9afa..ec6caa660 100644
--- a/app/models/import.rb
+++ b/app/models/import.rb
@@ -26,19 +26,44 @@ class Import < ActiveRecord::Base
self.status ||= "pending"
end
- after_create :import
+ after_create :delayed_import
+ def delayed_import
+ save_resources
+ delay.import
+ end
+
+ @@root = "#{Rails.root}/tmp/imports"
+ 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}.zip"
+ end
+
def import
begin
- with_original_filename do |file|
- # chouette-command checks the file extension (and requires .zip) :(
- loader.import file
+ if resources
+ with_original_filename do |file|
+ # chouette-command checks the file extension (and requires .zip) :(
+ loader.import file
+ end
+ else
+ loader.import saved_resources
end
update_attribute :status, "completed"
- rescue
+ rescue => e
+ Rails.logger.error "Import #{id} failed : #{e}, #{e.backtrace}"
update_attribute :status, "failed"
end
end
-
-
end
diff --git a/config/initializers/apartment.rb b/config/initializers/apartment.rb
index eaecaeac5..be6b7e933 100644
--- a/config/initializers/apartment.rb
+++ b/config/initializers/apartment.rb
@@ -1,6 +1,6 @@
Apartment.configure do |config|
# set your options (described below) here
- config.excluded_models = ["Referential", "User", "Import"] # these models will not be multi-tenanted, but remain in the global (public) namespace
+ config.excluded_models = ["Referential", "User", "Import", "Delayed::Backend::ActiveRecord::Job"] # these models will not be multi-tenanted, but remain in the global (public) namespace
# Dynamically get database names to migrate
config.database_names = lambda{ Referential.select(:slug).map(&:slug) }
diff --git a/db/migrate/20120516172252_create_delayed_jobs.rb b/db/migrate/20120516172252_create_delayed_jobs.rb
new file mode 100644
index 000000000..e7841608c
--- /dev/null
+++ b/db/migrate/20120516172252_create_delayed_jobs.rb
@@ -0,0 +1,22 @@
+class CreateDelayedJobs < ActiveRecord::Migration
+ def self.up
+ create_table :delayed_jobs, :force => true do |table|
+ table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue
+ table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually.
+ table.text :handler # YAML-encoded string of the object that will do work
+ table.text :last_error # reason for last failure (See Note below)
+ table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
+ table.datetime :locked_at # Set when a client is working on this object
+ table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
+ table.string :locked_by # Who is working on this object (if locked)
+ table.string :queue # The name of the queue this job is in
+ table.timestamps
+ end
+
+ add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority'
+ end
+
+ def self.down
+ drop_table :delayed_jobs
+ end
+end
diff --git a/script/delayed_job b/script/delayed_job
new file mode 100755
index 000000000..edf195985
--- /dev/null
+++ b/script/delayed_job
@@ -0,0 +1,5 @@
+#!/usr/bin/env ruby
+
+require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
+require 'delayed/command'
+Delayed::Command.new(ARGV).daemonize