diff options
| -rw-r--r-- | Guardfile | 8 | ||||
| -rw-r--r-- | app/assets/javascripts/imports.js.coffee | 9 | ||||
| -rw-r--r-- | app/assets/stylesheets/imports.css.scss | 17 | ||||
| -rw-r--r-- | app/controllers/imports_controller.rb | 24 | ||||
| -rw-r--r-- | app/helpers/imports_helper.rb | 12 | ||||
| -rw-r--r-- | app/models/csv_import.rb | 10 | ||||
| -rw-r--r-- | app/models/import.rb | 41 | ||||
| -rw-r--r-- | app/models/neptune_import.rb | 2 | ||||
| -rw-r--r-- | app/views/imports/_fields_csv_import.erb | 1 | ||||
| -rw-r--r-- | app/views/imports/_import.erb | 2 | ||||
| -rw-r--r-- | app/views/imports/index.html.erb | 2 | ||||
| -rw-r--r-- | app/views/imports/new.html.erb | 30 | ||||
| -rw-r--r-- | spec/models/csv_import_spec.rb | 19 | ||||
| -rw-r--r-- | spec/models/import_spec.rb | 16 | ||||
| -rw-r--r-- | spec/requests/referentials_spec.rb | 2 | ||||
| -rw-r--r-- | spec/views/imports/new.html.erb_spec.rb | 12 |
16 files changed, 185 insertions, 22 deletions
@@ -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 0d1c54202..6d4fd50e3 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('back'), :back %></li> + <%= form.buttons do %> + <%= form.commit_button true %> + <li><%= t('or') %></li> + <li><%= link_to t('back'), :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 397fbf582..51e68cd13 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 visit referentials_path 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 |
