diff --git a/db/schema.rb b/db/schema.rb index 63c44ab9..6fe265d6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180301162116) do +ActiveRecord::Schema.define(version: 20180314112813) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/decidim-census/app/controllers/decidim/census/admin/censuses_controller.rb b/decidim-census/app/controllers/decidim/census/admin/censuses_controller.rb index b8485c64..e9386cf8 100644 --- a/decidim-census/app/controllers/decidim/census/admin/censuses_controller.rb +++ b/decidim-census/app/controllers/decidim/census/admin/censuses_controller.rb @@ -9,10 +9,10 @@ class CensusesController < Decidim::Admin::ApplicationController before_action :show_instructions, unless: :census_authorization_active_in_organization? + before_action :set_status, on: %i(show create) def show authorize! :show, CensusDatum - @status = Status.new(current_organization) end def create @@ -21,10 +21,11 @@ def create data = CsvData.new(params[:file].path) CensusDatum.insert_all(current_organization, data.values) RemoveDuplicatesJob.perform_later(current_organization) + @invalid_rows = data.errors flash[:notice] = t('.success', count: data.values.count, errors: data.errors.count) end - redirect_to censuses_path + render :show end def destroy @@ -39,6 +40,10 @@ def show_instructions render :instructions end + def set_status + @status = Status.new(current_organization) + end + def census_authorization_active_in_organization? (current_organization.available_authorizations & CENSUS_AUTHORIZATIONS).any? end diff --git a/decidim-census/app/models/decidim/census/csv_data.rb b/decidim-census/app/models/decidim/census/csv_data.rb index 31fff236..c703876a 100644 --- a/decidim-census/app/models/decidim/census/csv_data.rb +++ b/decidim-census/app/models/decidim/census/csv_data.rb @@ -24,7 +24,7 @@ def process_row(row) if id_document.present? && !date.nil? values << [id_document, date] else - errors << row + errors << { line: $., data: row } end end diff --git a/decidim-census/app/views/decidim/census/admin/censuses/_invalid_rows.html.erb b/decidim-census/app/views/decidim/census/admin/censuses/_invalid_rows.html.erb new file mode 100644 index 00000000..69a4825f --- /dev/null +++ b/decidim-census/app/views/decidim/census/admin/censuses/_invalid_rows.html.erb @@ -0,0 +1,35 @@ +
+
+

+ <%= t('admin.new.errors.title', scope: 'decidim.census') %> +

+
+
+
+ + + + + + + + + <% @invalid_rows.each do |row| %> + + + + + <% end %> + +
+ <%= t('admin.new.errors.data.line', scope: 'decidim.census') %> + + <%= t('admin.new.errors.data.data', scope: 'decidim.census') %> +
+ <%= row[:line] %> + + <%= row[:data].fields.join(';') %> +
+
+
+
diff --git a/decidim-census/app/views/decidim/census/admin/censuses/show.html.erb b/decidim-census/app/views/decidim/census/admin/censuses/show.html.erb index e1601501..5267baab 100644 --- a/decidim-census/app/views/decidim/census/admin/censuses/show.html.erb +++ b/decidim-census/app/views/decidim/census/admin/censuses/show.html.erb @@ -1,3 +1,4 @@ +<%= render 'invalid_rows' if @invalid_rows.present? %>
@@ -7,11 +8,11 @@
<% if @status.count > 0 %> -

<%= t('decidim.census.admin.show.data', count: @status.count, +

<%= t('decidim.census.admin.show.data', count: @status.count, due_date: l(@status.last_import_at, format: :long)) %>

- <%= link_to t('decidim.census.admin.destroy.title'), - censuses_path, + <%= link_to t('decidim.census.admin.destroy.title'), + censuses_path, method: :delete, class: 'button alert', data: { confirm: t('decidim.census.admin.destroy.confirm') } %> @@ -21,7 +22,6 @@
-

@@ -37,7 +37,3 @@ <% end %>

- - - - diff --git a/decidim-census/config/locales/ca.yml b/decidim-census/config/locales/ca.yml index 7b170d95..7f597c56 100644 --- a/decidim-census/config/locales/ca.yml +++ b/decidim-census/config/locales/ca.yml @@ -46,3 +46,8 @@ ca: title: Pujar un nou cens file: Arxiu excel .csv amb les dades del cens submit: Carrega + errors: + title: Errors en la importació + data: + line: Línia + data: Dades diff --git a/decidim-census/config/locales/en.yml b/decidim-census/config/locales/en.yml index ddaec8d8..15a65555 100644 --- a/decidim-census/config/locales/en.yml +++ b/decidim-census/config/locales/en.yml @@ -46,3 +46,8 @@ en: title: Upload a new census file: Excel .csv file with census data submit: Upload file + errors: + title: Import errors + data: + line: Line + data: Data diff --git a/decidim-census/config/locales/es.yml b/decidim-census/config/locales/es.yml index 0b5875ca..dacde308 100644 --- a/decidim-census/config/locales/es.yml +++ b/decidim-census/config/locales/es.yml @@ -46,3 +46,8 @@ es: title: Subir un nuevo censo file: Archivo excel .csv con los datos del censo submit: Subir archivo + errors: + title: Errores en la importación + data: + line: Línea + data: Datos diff --git a/decidim-census/spec/controllers/censuses_controller_spec.rb b/decidim-census/spec/controllers/censuses_controller_spec.rb index 6e343b07..e8876430 100644 --- a/decidim-census/spec/controllers/censuses_controller_spec.rb +++ b/decidim-census/spec/controllers/censuses_controller_spec.rb @@ -36,7 +36,7 @@ # Don't know why don't prepend with `spec/fixtures` automatically file = fixture_file_upload('spec/fixtures/files/data1.csv') post :create, params: { file: file } - expect(response).to have_http_status(:redirect) + expect(response).to render_template(:show) expect(Decidim::Census::CensusDatum.count).to be 3 expect(Decidim::Census::CensusDatum.first.id_document) @@ -44,6 +44,16 @@ expect(Decidim::Census::CensusDatum.last.id_document) .to eq encode_id_document('3333C') end + + it 'fails to import some data' do + sign_in user + + file = fixture_file_upload('spec/fixtures/files/with-errors.csv') + post :create, params: { file: file } + + expect(response).to render_template(:show) + expect(assigns(:invalid_rows).count).to be 3 + end end describe 'POST #delete_all' do