Skip to content
This repository was archived by the owner on Jul 4, 2020. It is now read-only.

Commit 1dcb30f

Browse files
committed
WIP Improve import process
1 parent 29c1ea8 commit 1dcb30f

21 files changed

Lines changed: 194 additions & 45 deletions

app/controllers/imports_controller.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,25 @@ def create
99
@import = Import.new(import_params)
1010
if @import.save
1111
ProcessImportJob.perform_later @import
12+
# ImportOffenders.call(@import)
1213
redirect_to new_import_path
1314
else
1415
render :new
1516
end
1617
end
1718

19+
def errors_log
20+
send_data Import.last.error_log, type: 'text', disposition: 'inline'
21+
end
22+
1823
private
1924

2025
def import_params
21-
params.require(:import).permit(:offenders_file)
26+
params.require(:import).permit(:offenders_file_1,
27+
:offenders_file_2,
28+
:offenders_file_3,
29+
:offenders_file_4,
30+
:offenders_file_5,
31+
:offenders_file_6)
2232
end
2333
end

app/models/import.rb

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,74 @@
11
class Import < ActiveRecord::Base
2-
mount_uploader :offenders_file, FileUploader
2+
mount_uploader :offenders_file_1, FileUploader
3+
mount_uploader :offenders_file_2, FileUploader
4+
mount_uploader :offenders_file_3, FileUploader
5+
mount_uploader :offenders_file_4, FileUploader
6+
mount_uploader :offenders_file_5, FileUploader
7+
mount_uploader :offenders_file_6, FileUploader
38

4-
validates :offenders_file, presence: true
5-
validate :offenders_file_uniqueness
9+
validates :offenders_file_1, presence: true
610

7-
after_create :create_upload
11+
validate :offenders_file_1_uniqueness
12+
validate :offenders_file_2_uniqueness
13+
validate :offenders_file_3_uniqueness
14+
validate :offenders_file_4_uniqueness
15+
validate :offenders_file_5_uniqueness
16+
validate :offenders_file_6_uniqueness
17+
18+
after_create :create_uploads
819

920
private
1021

11-
def create_upload
12-
Upload.create(md5: offenders_file.md5)
22+
def create_uploads
23+
Upload.create(md5: offenders_file_1.md5)
24+
Upload.create(md5: offenders_file_2.md5) if offenders_file_2
25+
Upload.create(md5: offenders_file_3.md5) if offenders_file_3
26+
Upload.create(md5: offenders_file_4.md5) if offenders_file_4
27+
Upload.create(md5: offenders_file_5.md5) if offenders_file_5
28+
Upload.create(md5: offenders_file_6.md5) if offenders_file_6
29+
end
30+
31+
def offenders_file_1_uniqueness
32+
return unless Upload.where(md5: offenders_file_1.md5).any?
33+
errors[:base] << 'Offenders file 1 has already been uploaded'
34+
end
35+
36+
def offenders_file_2_uniqueness
37+
return unless offenders_file_2.present?
38+
return unless Upload.where(md5: offenders_file_2.md5).any?
39+
errors[:base] << 'Offenders file 2 has already been uploaded'
40+
end
41+
42+
def offenders_file_3_uniqueness
43+
return unless offenders_file_3.present?
44+
return unless Upload.where(md5: offenders_file_3.md5).any?
45+
errors[:base] << 'Offenders file 3 has already been uploaded'
46+
end
47+
48+
def offenders_file_4_uniqueness
49+
return unless offenders_file_4.present?
50+
return unless Upload.where(md5: offenders_file_4.md5).any?
51+
errors[:base] << 'Offenders file 4 has already been uploaded'
52+
end
53+
54+
def offenders_file_5_uniqueness
55+
return unless offenders_file_5.present?
56+
return unless Upload.where(md5: offenders_file_5.md5).any?
57+
errors[:base] << 'Offenders file 5 has already been uploaded'
58+
end
59+
60+
def offenders_file_6_uniqueness
61+
return unless offenders_file_6.present?
62+
return unless Upload.where(md5: offenders_file_6.md5).any?
63+
errors[:base] << 'Offenders file 6 has already been uploaded'
1364
end
1465

15-
def offenders_file_uniqueness
16-
return unless Upload.where(md5: offenders_file.md5).any?
17-
errors[:base] << 'This file has already been uploaded'
66+
def offender_files_md5s
67+
[offenders_file_1.md5,
68+
offenders_file_2.md5,
69+
offenders_file_3.md5,
70+
offenders_file_4.md5,
71+
offenders_file_5.md5,
72+
offenders_file_6.md5].compact
1873
end
1974
end

app/services/import_offenders.rb

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,36 @@ module ImportOffenders
22
module_function
33

44
def call(import)
5-
errors = ParseOffenders.call(import.offenders_file.file.file)
6-
if errors.any?
5+
report_log, errors_log = report_and_errors(import)
6+
if errors_log.any?
77
import.update_attribute(:status, :failed)
8-
import.update_attribute(:error_log, errors.to_json)
8+
import.update_attribute(:error_log, errors_log.join("\n"))
99
NotificationMailer.import_failed(import).deliver_later
1010
else
1111
import.update_attribute(:status, :successful)
1212
Import.where('id != ?', import.id).destroy_all
1313
end
14+
import.update_attribute(:report_log, report_log.join("\n"))
15+
end
16+
17+
private
18+
19+
def self.report_and_errors(import)
20+
report_log = []
21+
errors_log = []
22+
23+
1.upto(6).each do |n|
24+
file = import.public_send("offenders_file_#{n}").file
25+
next unless file
26+
errors = ParseOffenders.call(file.file)
27+
if errors.any?
28+
report_log << "File #{file.filename} failed to import at #{Time.current}"
29+
errors_log << "There were some errors in file #{file.filename}"
30+
errors_log << errors.join("\n")
31+
else
32+
report_log << "File #{file.filename} imported at #{Time.current}"
33+
end
34+
end
35+
[report_log, errors_log]
1436
end
1537
end

app/views/imports/_last_import.html.haml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@
1010
%thead
1111
%tr
1212
%th
13-
File
14-
%th
15-
Date
13+
Report
1614
%tbody
17-
%tr
18-
%td
19-
= last_import.offenders_file.file.filename
20-
%td
21-
= last_import.created_at.strftime('%d/%m/%Y %H:%M:%S')
15+
- last_import.report_log&.each_line do |file_log|
16+
%tr
17+
%td
18+
= file_log
19+
- if last_import.error_log
20+
= link_to 'Download error log', errors_log_imports_path

app/views/imports/new.html.haml

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,35 @@
77
New import
88

99
= form_for @import, html: { multipart: true } do |f|
10-
= f.hidden_field :offenders_file
10+
= f.hidden_field :offenders_file_1
11+
= f.hidden_field :offenders_file_2
12+
= f.hidden_field :offenders_file_3
13+
= f.hidden_field :offenders_file_4
14+
= f.hidden_field :offenders_file_5
15+
= f.hidden_field :offenders_file_6
1116

1217
.form-group
13-
!= f.label :offenders_file, class: 'form-label'
14-
!= f.file_field :offenders_file, class: 'form-control'
18+
!= f.label :offenders_file_1, class: 'form-label'
19+
!= f.file_field :offenders_file_1, class: 'form-control'
20+
21+
.form-group
22+
!= f.label :offenders_file_2, class: 'form-label'
23+
!= f.file_field :offenders_file_2, class: 'form-control'
24+
25+
.form-group
26+
!= f.label :offenders_file_3, class: 'form-label'
27+
!= f.file_field :offenders_file_3, class: 'form-control'
28+
29+
.form-group
30+
!= f.label :offenders_file_4, class: 'form-label'
31+
!= f.file_field :offenders_file_4, class: 'form-control'
32+
33+
.form-group
34+
!= f.label :offenders_file_5, class: 'form-label'
35+
!= f.file_field :offenders_file_5, class: 'form-control'
36+
37+
.form-group
38+
!= f.label :offenders_file_6, class: 'form-label'
39+
!= f.file_field :offenders_file_6, class: 'form-control'
1540

1641
= f.submit 'Import', class: "button"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
- if @import
22
%p
3-
= "An error occurred while importing offenders file: #{@import.offenders_file}, on: #{@import.created_at}"
3+
= "An error occurred while importing offenders file: #{@import.offenders_file_1}, on: #{@import.created_at}"
44
%p
55
= @error

config/routes.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
root to: 'home#show'
1515

1616
resources :services
17-
resources :imports, only: [:new, :create]
17+
resources :imports, only: [:new, :create] do
18+
get 'errors_log', on: :collection
19+
end
1820

1921
namespace :api, format: :json do
2022
scope module: :v1, constraints: ApiConstraint.new(version: 1) do
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class AddMultipleImportFiles < ActiveRecord::Migration[5.0]
2+
def change
3+
rename_column :imports, :offenders_file, :offenders_file_1
4+
add_column :imports, :offenders_file_2, :string
5+
add_column :imports, :offenders_file_3, :string
6+
add_column :imports, :offenders_file_4, :string
7+
add_column :imports, :offenders_file_5, :string
8+
add_column :imports, :offenders_file_6, :string
9+
remove_column :imports, :identities_file
10+
add_column :imports, :report_log, :text
11+
end
12+
end

db/schema.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema.define(version: 20170725104015) do
13+
ActiveRecord::Schema.define(version: 20170810231950) do
1414

1515
# These are extensions that must be enabled in order to support this database
1616
enable_extension "plpgsql"
@@ -43,12 +43,17 @@
4343
end
4444

4545
create_table "imports", force: :cascade do |t|
46-
t.string "offenders_file"
47-
t.string "identities_file"
48-
t.string "status", default: "in_progress"
46+
t.string "offenders_file_1"
47+
t.string "status", default: "in_progress"
4948
t.datetime "created_at"
5049
t.datetime "updated_at"
5150
t.text "error_log"
51+
t.string "offenders_file_2"
52+
t.string "offenders_file_3"
53+
t.string "offenders_file_4"
54+
t.string "offenders_file_5"
55+
t.string "offenders_file_6"
56+
t.text "report_log"
5257
end
5358

5459
create_table "nicknames", force: :cascade do |t|

spec/features/upload_nomis_export_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
scenario 'upload a NOMIS export' do
1111
visit new_import_path
1212

13-
attach_file('import_offenders_file', Rails.root.join('spec', 'fixtures', 'files', 'data.csv'))
13+
attach_file('import_offenders_file_1', Rails.root.join('spec', 'fixtures', 'files', 'data_1.csv'))
1414

1515
click_button 'Import'
1616

@@ -24,7 +24,7 @@
2424
scenario 'shows an error' do
2525
visit new_import_path
2626

27-
attach_file('import_offenders_file', Rails.root.join('spec', 'fixtures', 'files', 'data.txt'))
27+
attach_file('import_offenders_file_1', Rails.root.join('spec', 'fixtures', 'files', 'data.txt'))
2828

2929
click_button 'Import'
3030

0 commit comments

Comments
 (0)