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 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 | 
