From ecc2c32f1c42ca5b22d96924c6371c23b12723ac Mon Sep 17 00:00:00 2001 From: Alban Peignier Date: Wed, 6 Jun 2012 19:11:25 +0200 Subject: Add view to manage several Import implementations --- Guardfile | 8 +++---- app/assets/javascripts/imports.js.coffee | 9 +++++++ app/assets/stylesheets/imports.css.scss | 17 ++++++++++++- app/controllers/imports_controller.rb | 24 +++++++++++++++++++ app/helpers/imports_helper.rb | 12 ++++++++++ app/models/csv_import.rb | 10 ++++++++ app/models/import.rb | 41 ++++++++++++++++++++++++++++---- app/models/neptune_import.rb | 2 +- app/views/imports/_fields_csv_import.erb | 1 + app/views/imports/_import.erb | 2 +- app/views/imports/index.html.erb | 2 +- app/views/imports/new.html.erb | 30 ++++++++++++++++------- spec/models/csv_import_spec.rb | 19 +++++++++++++++ spec/models/import_spec.rb | 16 +++++++++++++ spec/requests/referentials_spec.rb | 2 +- spec/views/imports/new.html.erb_spec.rb | 12 +++++++++- 16 files changed, 185 insertions(+), 22 deletions(-) create mode 100644 app/models/csv_import.rb create mode 100644 app/views/imports/_fields_csv_import.erb create mode 100644 spec/models/csv_import_spec.rb 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 %>