ntq_excelsior 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4443b707f72d72748af1e8d5c728aef25ea2f7175704f653bebf2b1897ea1784
4
- data.tar.gz: 7fdc4700b25c1d5773638186fb5e22f2afd9fa956cf755a5f4c6eccf4fb4f5d3
3
+ metadata.gz: a5a967c15c3f10e6a7e22795e99b73d9be8e2ba2c98ea756672f587bf2c0c348
4
+ data.tar.gz: 6a90997fc04c6a6b7a45cc38d27be78be86266c90dec229427fb71f72f556adc
5
5
  SHA512:
6
- metadata.gz: eb6b8a3fbe5ccf2ef25eb5ae3156e40c33fe8d3d67dda073b44a986fe0d4003e6a13ccd871868f2823259e06bd3b89a8c05fac433410927bdcd4337110aacdda
7
- data.tar.gz: d0e1c3218ca3f1d85d627a35e594772df18cbe87ba7d6af5e37ad4932c4bb2acfa5823896e6e62457286b9125aefa57435bcdb0f2d450e7ca7a494f68df74b48
6
+ metadata.gz: d26fe0bd71a850e06cc17941700c4d9b0abe6f1b7d329d3bc74e872b1cd138f359d8357a98e67278f63be585073ae46dc3e70de83dde800a5bf5cc22073960fa
7
+ data.tar.gz: be8aa18475f1a4520ca5ad4aa22eb6b06bb98c564a6ef7c26d35a95b8650055e5bddc745a5ba24684f95ffc6288157d37a288ed9be6d076ede64f2337ac6acf1
data/README.md CHANGED
@@ -87,9 +87,39 @@ send_data stream, type: 'application/xlsx', filename: "filename.xlsx"
87
87
  ```ruby
88
88
  class UserImporter < NtqExcelsior::Importer
89
89
 
90
- model_klass User
90
+ model_klass "User"
91
+
92
+ primary_key :email
93
+
94
+ # autosave false
95
+
96
+ structure [{
97
+ header: "Email",
98
+ description: "Email de l'utilisateur a créer ou modifier",
99
+ required: true,
100
+ },
101
+ {
102
+ header: "Actif",
103
+ description: "Utilisateur activé",
104
+ required: true,
105
+ values: [
106
+ {
107
+ header: "True",
108
+ description: "Activé",
109
+ }, {
110
+ header: "False",
111
+ description: "Inactivé",
112
+ }
113
+ ]
114
+ }, {
115
+ header: "Prénom",
116
+ required: true,
117
+ }, {
118
+ header: "Nom",
119
+ required: true,
120
+ }]
91
121
 
92
- primary_key :id
122
+ sample_file "/import_samples/users.xlsx"
93
123
 
94
124
  schema({
95
125
  email: 'Email',
@@ -112,6 +142,11 @@ class UserImporter < NtqExcelsior::Importer
112
142
  end
113
143
  end
114
144
  end
145
+
146
+ importer = UserImporter.new
147
+ importer.file = file
148
+ result = importer.import
149
+ # { success_count: 2, error_lines: [] }
115
150
  ```
116
151
 
117
152
  ## Development
@@ -7,6 +7,14 @@ module NtqExcelsior
7
7
 
8
8
  class << self
9
9
 
10
+ def autosave(value = nil)
11
+ @autosave ||= value
12
+ end
13
+
14
+ def autoset(value = nil)
15
+ @autoset ||= value
16
+ end
17
+
10
18
  def spreadsheet_options(value = nil)
11
19
  @spreadsheet_options ||= value
12
20
  end
@@ -61,10 +69,10 @@ module NtqExcelsior
61
69
  spreadsheet.sheet(spreadsheet.sheets[0]).parse(header_search: required_headers)
62
70
  end
63
71
 
64
- def detect_header_scheme(line)
72
+ def detect_header_scheme
65
73
  return @header_scheme if @header_scheme
66
74
  @header_scheme = {}
67
- l = line.dup
75
+ l = spreadsheet_data[0].dup
68
76
 
69
77
  self.class.schema.each do |field, column_config|
70
78
  header = column_config.is_a?(Hash) ? column_config[:header] : column_config
@@ -84,7 +92,7 @@ module NtqExcelsior
84
92
  def parse_line(line)
85
93
  parsed_line = {}
86
94
  line.each do |header, value|
87
- header_scheme = detect_header_scheme(line)
95
+ header_scheme = detect_header_scheme
88
96
  if header.to_s == self.class.primary_key.to_s
89
97
  parsed_line[self.class.primary_key] = value
90
98
  next
@@ -109,20 +117,58 @@ module NtqExcelsior
109
117
  # id for default query in model
110
118
  # line in case an override is needed to find correct record
111
119
  def find_or_initialize_record(line)
112
- raise "Primary key must be set for using the default find_or_initialize" unless self.class.primary_key
120
+ return nil unless self.class.primary_key && self.class.model_klass
121
+
122
+ if line[self.class.primary_key.to_sym].present?
123
+ if self.class.primary_key.to_sym == :id
124
+ record = self.class.model_klass.constantize.find_by id: line[self.class.primary_key.to_sym]
125
+ else
126
+ record = self.class.model_klass.constantize.find_or_initialize_by("#{self.class.primary_key}": line[self.class.primary_key.to_sym])
127
+ end
128
+ end
129
+ record = self.class.model_klass.constantize.new unless record
130
+ record
131
+ end
113
132
 
114
- self.class.model_klass.find_or_initialize_by("#{self.class.primary_key}": line[self.class.primary_key.to_sym])
133
+ def record_attributes(record)
134
+ return @record_attributes if @record_attributes
135
+
136
+ @record_attributes = self.class.schema.keys.select{|k| k.to_sym != :id && record.respond_to?(:"#{k}=") }
137
+ end
138
+
139
+ def set_record_fields(record, line)
140
+ attributes_to_set = record_attributes(record)
141
+ attributes_to_set.each do |attribute|
142
+ record.send(:"#{attribute}=", line[attribute])
143
+ end
144
+ record
115
145
  end
116
146
 
117
147
  def import_line(line, save: true)
118
148
  record = find_or_initialize_record(line)
149
+ @success = false
150
+ @action = nil
151
+ @errors = []
152
+
153
+ if (!self.class.autoset.nil? || self.class.autoset)
154
+ record = set_record_fields(record, line)
155
+ end
119
156
 
120
157
  yield(record, line) if block_given?
121
158
 
122
- status = {}
123
- return { status: :success } if record.save
159
+ if (self.class.autosave.nil? || self.class.autosave)
160
+ @action = record.persisted? ? 'update' : 'create'
161
+ if save
162
+ @success = record.save
163
+ else
164
+ @success = record.valid?
165
+ end
166
+ @errors = record.errors.full_messages.concat(@errors) if record.errors.any?
167
+ end
168
+
169
+ return { status: :success, action: @action } if @success
124
170
 
125
- return { status: :error, errors: record.errors.full_messages.join(", ") }
171
+ return { status: :error, errors: @errors.join(", ") }
126
172
  end
127
173
 
128
174
  def import(save: true, status_tracker: nil)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NtqExcelsior
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ntq_excelsior
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-24 00:00:00.000000000 Z
11
+ date: 2023-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: caxlsx