Class: UserImportFile

Inherits:
ApplicationRecord
  • Object
show all
Includes:
ImportFile, Statesman::Adapters::ActiveRecordQueries
Defined in:
app/models/user_import_file.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ImportFile

#convert_encoding, expire, #import_start, #send_message

Instance Attribute Details

#modeObject

Returns the value of attribute mode.



36
37
38
# File 'app/models/user_import_file.rb', line 36

def mode
  @mode
end

Instance Method Details

#importObject

利用者情報をTSVファイルを用いて作成します。



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'app/models/user_import_file.rb', line 46

def import
  transition_to!(:started)
  num = { user_imported: 0, user_found: 0, failed: 0, error: 0 }
  rows = open_import_file(create_import_temp_file(user_import))
  row_num = 1

  field = rows.first
  if [field['username']].reject{ |f| f.to_s.strip == "" }.empty?
    raise "username column is not found"
  end

  rows.each do |row|
    row_num += 1
    import_result = UserImportResult.create!(
      user_import_file_id: id, body: row.fields.join("\t")
    )
    next if row['dummy'].to_s.strip.present?

    username = row['username']
    new_user = User.find_by(username: username)
    if new_user
      import_result.user = new_user
      import_result.save
      num[:user_found] += 1
    else
      new_user = User.new
      new_user.role = Role.find_by(name: row['role'])
      if new_user.role
        unless user.has_role?(new_user.role.name)
          num[:failed] += 1
          next
        end
      else
        new_user.role = Role.find(2) # User
      end
      new_user.username = username
      new_user.assign_attributes(set_user_params(row))
      profile = Profile.new
      profile.assign_attributes(set_profile_params(row))

      Profile.transaction do
        if new_user.valid? and profile.valid?
          new_user.profile = profile
          import_result.user = new_user
          import_result.save!
          num[:user_imported] += 1
        else
          error_message = "line #{row_num}: "
          error_message += new_user.errors.full_messages.join(" ")
          error_message += profile.errors.full_messages.join(" ")
          import_result.error_message = error_message
          import_result.save
          num[:error] += 1
        end
      end
    end
  end

  Sunspot.commit
  rows.close
  error_messages = user_import_results.order(:id).pluck(:error_message).compact
  unless error_messages.empty?
    self.error_message = '' if error_message.nil?
    self.error_message += "\n"
    self.error_message += error_messages.join("\n")
  end
  save
  if num[:error] >= 1
    transition_to!(:failed)
  else
    transition_to!(:completed)
  end
  mailer = UserImportMailer.completed(self)
  send_message(mailer)
  num
rescue => e
  transition_to!(:failed)
  mailer = UserImportMailer.failed(self)
  send_message(mailer)
  raise e
end

#modifyObject

利用者情報をTSVファイルを用いて更新します。



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'app/models/user_import_file.rb', line 129

def modify
  transition_to!(:started)
  num = { user_updated: 0, user_not_found: 0, failed: 0 }
  rows = open_import_file(create_import_temp_file(user_import))
  row_num = 1

  field = rows.first
  if [field['username']].reject{|f| f.to_s.strip == ""}.empty?
    raise "username column is not found"
  end

  rows.each do |row|
    row_num += 1
    next if row['dummy'].to_s.strip.present?
    import_result = UserImportResult.create!(
      user_import_file_id: id, body: row.fields.join("\t")
    )

    username = row['username']
    new_user = User.find_by(username: username)
    if new_user.try(:profile)
      new_user.assign_attributes(set_user_params(row))
      new_user.profile.assign_attributes(set_profile_params(row))
      Profile.transaction do
        if new_user.save and new_user.profile.save
          num[:user_updated] += 1
          import_result.user = new_user
          import_result.save!
        else
          num[:failed] += 1
        end
      end
    else
      num[:user_not_found] += 1
    end
  end

  rows.close
  Sunspot.commit
  transition_to!(:completed)
  mailer = UserImportMailer.completed(self)
  send_message(mailer)
  num
rescue => e
  self.error_message = "line #{row_num}: #{e.message}"
  save
  transition_to!(:failed)
  mailer = UserImportMailer.failed(self)
  send_message(mailer)
  raise e
end

#removeObject

利用者情報をTSVファイルを用いて削除します。



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'app/models/user_import_file.rb', line 182

def remove
  transition_to!(:started)
  row_num = 1
  rows = open_import_file(create_import_temp_file(user_import))

  field = rows.first
  if [field['username']].reject{ |f| f.to_s.strip == "" }.empty?
    raise "username column is not found"
  end

  rows.each do |row|
    row_num += 1
    username = row['username'].to_s.strip
    remove_user = User.find_by(username: username)
    if remove_user.try(:deletable_by?, user)
      UserImportFile.transaction do
        remove_user.destroy
        remove_user.profile.destroy
      end
    end
  end
  transition_to!(:completed)
  mailer = UserImportMailer.completed(self)
  send_message(mailer)
rescue => e
  self.error_message = "line #{row_num}: #{e.message}"
  save
  transition_to!(:failed)
  mailer = UserImportMailer.failed(self)
  send_message(mailer)
  raise e
end

#state_machineObject



38
39
40
# File 'app/models/user_import_file.rb', line 38

def state_machine
  UserImportFileStateMachine.new(self, transition_class: UserImportFileTransition)
end