aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Guardfile8
-rw-r--r--app/assets/javascripts/imports.js.coffee9
-rw-r--r--app/assets/stylesheets/imports.css.scss17
-rw-r--r--app/controllers/imports_controller.rb24
-rw-r--r--app/helpers/imports_helper.rb12
-rw-r--r--app/models/csv_import.rb10
-rw-r--r--app/models/import.rb41
-rw-r--r--app/models/neptune_import.rb2
-rw-r--r--app/views/imports/_fields_csv_import.erb1
-rw-r--r--app/views/imports/_import.erb2
-rw-r--r--app/views/imports/index.html.erb2
-rw-r--r--app/views/imports/new.html.erb30
-rw-r--r--spec/models/csv_import_spec.rb19
-rw-r--r--spec/models/import_spec.rb16
-rw-r--r--spec/requests/referentials_spec.rb2
-rw-r--r--spec/views/imports/new.html.erb_spec.rb12
16 files changed, 185 insertions, 22 deletions
diff --git a/Guardfile b/Guardfile
index 1cba9ca4a..8f357db7d 100644
--- a/Guardfile
+++ b/Guardfile
@@ -1,10 +1,10 @@
# A sample Guardfile
# More info at https://github.com/guard/guard#readme
-guard 'rspec', :version => 2 do
- watch(%r{^spec/.+_spec\.rb$})
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
- watch('spec/spec_helper.rb') { "spec" }
+guard 'rspec', :version => 2, :notification => false do
+ watch(%r{^spec/.+_spec\.rb$})
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
+ watch('spec/spec_helper.rb') { "spec" }
# Rails example
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
diff --git a/app/assets/javascripts/imports.js.coffee b/app/assets/javascripts/imports.js.coffee
index 761567942..7fb49e44d 100644
--- a/app/assets/javascripts/imports.js.coffee
+++ b/app/assets/javascripts/imports.js.coffee
@@ -1,3 +1,12 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
+
+jQuery ->
+ $('#import_type_submit').hide()
+
+ import_type_change = (event) ->
+ import_type = $("select option:selected").attr("value")
+ $(form).toggle($(form).is("#" + import_type + "_new")) for form in $('form.import')
+
+ $('#import_type').change(import_type_change)
diff --git a/app/assets/stylesheets/imports.css.scss b/app/assets/stylesheets/imports.css.scss
index bdc3a65cd..91acae72d 100644
--- a/app/assets/stylesheets/imports.css.scss
+++ b/app/assets/stylesheets/imports.css.scss
@@ -34,4 +34,19 @@
padding: 0 20px;
}
}
-} \ No newline at end of file
+}
+
+#workspace.imports.new form.import_new {
+ padding: 0.5em 0;
+ margin-top: -0.5em;
+ margin-bottom: 1em;
+
+ label {
+ display: block;
+ width: 25%;
+ float: left;
+ }
+ select {
+ width: 25%;
+ }
+}
diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb
index 7e33b8c26..06017da7d 100644
--- a/app/controllers/imports_controller.rb
+++ b/app/controllers/imports_controller.rb
@@ -2,14 +2,38 @@ class ImportsController < ChouetteController
respond_to :html, :xml, :json
belongs_to :referential
+ def new
+ new! do
+ available_imports
+ end
+ end
+
def create
create! do |success, failure|
+ available_imports
success.html { redirect_to referential_imports_path(@referential) }
end
end
protected
+ def available_imports
+ @available_imports ||= Import.types.collect do |type|
+ unless @import.type == type
+ @referential.imports.build :type => type
+ else
+ @import
+ end
+ end
+ end
+
+ # FIXME why #resource_id is nil ??
+ def build_resource
+ super.tap do |import|
+ import.referential_id = @referential.id
+ end
+ end
+
def collection
@imports ||= end_of_association_chain.paginate(:page => params[:page])
end
diff --git a/app/helpers/imports_helper.rb b/app/helpers/imports_helper.rb
index 2811dcbec..4b829fe98 100644
--- a/app/helpers/imports_helper.rb
+++ b/app/helpers/imports_helper.rb
@@ -1,2 +1,14 @@
+# -*- coding: utf-8 -*-
module ImportsHelper
+
+ def fields_for_import_type(form)
+ partial_name = "fields_#{form.object.type.underscore}"
+
+ begin
+ render :partial => partial_name, :locals => { :form => form }
+ rescue ActionView::MissingTemplate
+ ""
+ end
+ end
+
end
diff --git a/app/models/csv_import.rb b/app/models/csv_import.rb
new file mode 100644
index 000000000..be3c08743
--- /dev/null
+++ b/app/models/csv_import.rb
@@ -0,0 +1,10 @@
+class CsvImport < Import
+
+ validates_presence_of :objectid_prefix
+ option :objectid_prefix
+
+ def import_options
+ super.merge(:format => :csv, :objectid_prefix => objectid_prefix)
+ end
+
+end
diff --git a/app/models/import.rb b/app/models/import.rb
index b08f8e8f3..c96d2fdad 100644
--- a/app/models/import.rb
+++ b/app/models/import.rb
@@ -13,10 +13,35 @@ class Import < ActiveRecord::Base
serialize :options
- after_initialize :define_options
+ def self.option(name)
+ name = name.to_s
- def define_options
- self.options = {}
+ 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
+
+ def self.types
+ # if Rails.env.development? and subclasses.blank?
+ # Dir[File.expand_path("../*_import.rb", __FILE__)].each do |f|
+ # require f
+ # end
+ # end
+
+ unless Rails.env.development?
+ subclasses.map(&:to_s)
+ else
+ # FIXME
+ %w{NeptuneImport CsvImport}
+ end
end
def loader
@@ -64,7 +89,7 @@ class Import < ActiveRecord::Base
end
def import_options
- {}
+ { :import_id => self.id }
end
def import
@@ -86,4 +111,12 @@ class Import < ActiveRecord::Base
log_messages.create :key => status
end
+ def self.new(attributes = {}, options = {}, &block)
+ if self == Import
+ Object.const_get(attributes.delete(:type) || "NeptuneImport").new(attributes, options)
+ else
+ super
+ end
+ end
+
end
diff --git a/app/models/neptune_import.rb b/app/models/neptune_import.rb
index f00947129..11282b306 100644
--- a/app/models/neptune_import.rb
+++ b/app/models/neptune_import.rb
@@ -1,7 +1,7 @@
class NeptuneImport < Import
def import_options
- { :format => :neptune }
+ super.merge(:format => :neptune)
end
end
diff --git a/app/views/imports/_fields_csv_import.erb b/app/views/imports/_fields_csv_import.erb
new file mode 100644
index 000000000..6c40674b4
--- /dev/null
+++ b/app/views/imports/_fields_csv_import.erb
@@ -0,0 +1 @@
+<%= form.input :objectid_prefix %>
diff --git a/app/views/imports/_import.erb b/app/views/imports/_import.erb
index 6ccd5bb23..7723badc0 100644
--- a/app/views/imports/_import.erb
+++ b/app/views/imports/_import.erb
@@ -1,4 +1,4 @@
-<%= div_for(import) do %>
+<%= div_for(import, :class => :import) do %>
<%= link_to(referential_import_path(@referential, import), :class => "preview") do %>
<%= image_tag "import-#{import.status}.png" %>
<% end %>
diff --git a/app/views/imports/index.html.erb b/app/views/imports/index.html.erb
index 9bda3ffb5..454dcd813 100644
--- a/app/views/imports/index.html.erb
+++ b/app/views/imports/index.html.erb
@@ -7,7 +7,7 @@
<%= will_paginate @imports, :container => false %>
</div>
<div class="imports paginated_content">
- <%= render @imports %>
+ <%= render :partial => "import", :collection => @imports %>
</div>
<div class="pagination">
<%= will_paginate @imports, :container => false %>
diff --git a/app/views/imports/new.html.erb b/app/views/imports/new.html.erb
index 02ad61ede..1b797b0d6 100644
--- a/app/views/imports/new.html.erb
+++ b/app/views/imports/new.html.erb
@@ -1,13 +1,27 @@
<%= title_tag t(".title") %>
-<%= semantic_form_for [@referential, @import] do |form| %>
- <%= form.inputs do %>
- <%= form.input :resources, :as => :file %>
- <% end %>
+<%= form_for([@referential, @import], :as => :import, :url => new_referential_import_path(@referential), :method => :get) do |form| %>
+ <%= form.label :type %>
+ <%= form.collection_select :type, Import.types, :to_s, :to_s %>
+ <%= form.submit "Sélectionner", :id => "import_type_submit" %>
+<% end %>
+
+<% @available_imports.each do |import| %>
+ <%= semantic_form_for [@referential, import], :as => :import, :url => referential_imports_path(@referential), :html => { :id => "#{import.type}_new", :style => ('display: none' unless @import == import)} do |form| %>
+
+ <%= form.inputs do %>
+ <%= fields_for_import_type form %>
+ <% end %>
+
+ <%= form.inputs do %>
+ <%= form.input :type, :as => :hidden %>
+ <%= form.input :resources, :as => :file %>
+ <% end %>
- <%= form.buttons do %>
- <%= form.commit_button true %>
- <li><%= t('or') %></li>
- <li><%= link_to t('cancel'), :back %></li>
+ <%= form.buttons do %>
+ <%= form.commit_button true %>
+ <li><%= t('or') %></li>
+ <li><%= link_to t('cancel'), :back %></li>
+ <% end %>
<% end %>
<% end %>
diff --git a/spec/models/csv_import_spec.rb b/spec/models/csv_import_spec.rb
new file mode 100644
index 000000000..e169afb5f
--- /dev/null
+++ b/spec/models/csv_import_spec.rb
@@ -0,0 +1,19 @@
+require 'spec_helper'
+
+describe CsvImport do
+
+ describe "#objectid_prefix" do
+
+ it "should be included in options" do
+ subject.objectid_prefix = "dummy"
+ subject.options.should include "objectid_prefix" => "dummy"
+ end
+
+ it "should be included in import_options" do
+ subject.objectid_prefix = "dummy"
+ subject.import_options.should include :objectid_prefix => "dummy"
+ end
+
+ end
+
+end
diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb
index f0b76c15e..f0a66eb4d 100644
--- a/spec/models/import_spec.rb
+++ b/spec/models/import_spec.rb
@@ -42,4 +42,20 @@ describe Import do
end
+ describe ".types" do
+
+ it "should return available Import implementations" do
+ Import.types.should =~ %w{NeptuneImport CsvImport}
+ end
+
+ end
+
+ describe ".new" do
+
+ it "should use type attribute to create a subclass" do
+ Import.new(:type => "NeptuneImport").should be_an_instance_of(NeptuneImport)
+ end
+
+ end
+
end
diff --git a/spec/requests/referentials_spec.rb b/spec/requests/referentials_spec.rb
index 64a1a26dd..54e63c33c 100644
--- a/spec/requests/referentials_spec.rb
+++ b/spec/requests/referentials_spec.rb
@@ -13,7 +13,7 @@ describe "Referentials" do
context "when several referentials exist" do
- let(:referentials) { Array.new(2) { create(:referential) } }
+ let!(:referentials) { Array.new(2) { create(:referential) } }
it "should show n referentials" do
pending
diff --git a/spec/views/imports/new.html.erb_spec.rb b/spec/views/imports/new.html.erb_spec.rb
index a31539279..f12932353 100644
--- a/spec/views/imports/new.html.erb_spec.rb
+++ b/spec/views/imports/new.html.erb_spec.rb
@@ -1,5 +1,15 @@
require 'spec_helper'
describe "imports/new.html.erb" do
- pending "add some examples to (or delete) #{__FILE__}"
+
+ let!(:referential) { assign(:referential, create(:referential)) }
+ let!(:import) { assign(:import, NeptuneImport.new) }
+
+ let!(:available_imports) { assign(:available_imports, []) }
+
+ it "should display a select to choose import type" do
+ render
+ rendered.should have_selector("select", :name => "import[type]")
+ end
+
end