summaryrefslogtreecommitdiffstats
path: root/app/models/user_import.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/user_import.rb')
-rw-r--r--app/models/user_import.rb118
1 files changed, 118 insertions, 0 deletions
diff --git a/app/models/user_import.rb b/app/models/user_import.rb
new file mode 100644
index 000000000..21c3e530e
--- /dev/null
+++ b/app/models/user_import.rb
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+# Redmine - project management software
+# Copyright (C) 2006-2020 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+class UserImport < Import
+ AUTO_MAPPABLE_FIELDS = {
+ 'login' => 'field_login',
+ 'firstname' => 'field_firstname',
+ 'lastname' => 'field_lastname',
+ 'mail' => 'field_mail',
+ 'language' => 'field_language',
+ 'admin' => 'field_admin',
+ 'auth_source' => 'field_auth_source',
+ 'password' => 'field_password',
+ 'must_change_passwd' => 'field_must_change_passwd',
+ 'status' => 'field_status'
+ }
+
+ def self.menu_item
+ :users
+ end
+
+ def self.layout
+ 'admin'
+ end
+
+ def self.authorized?(user)
+ user.admin?
+ end
+
+ # Returns the objects that were imported
+ def saved_objects
+ User.where(:id => saved_items.pluck(:obj_id)).order(:id)
+ end
+
+ def mappable_custom_fields
+ UserCustomField.all
+ end
+
+ private
+
+ def build_object(row, item)
+ object = User.new
+
+ attributes = {
+ :login => row_value(row, 'login'),
+ :firstname => row_value(row, 'firstname'),
+ :lastname => row_value(row, 'lastname'),
+ :mail => row_value(row, 'mail')
+ }
+
+ lang = nil
+ if language = row_value(row, 'language')
+ lang = find_language(language)
+ end
+ attributes[:language] = lang || Setting.default_language
+
+ if admin = row_value(row, 'admin')
+ if yes?(admin)
+ attributes['admin'] = '1'
+ end
+ end
+
+ if auth_source_name = row_value(row, 'auth_source')
+ if auth_source = AuthSource.find_by(:name => auth_source_name)
+ attributes[:auth_source_id] = auth_source.id
+ end
+ end
+
+ if password = row_value(row, 'password')
+ object.password = password
+ object.password_confirmation = password
+ end
+
+ if must_change_passwd = row_value(row, 'must_change_passwd')
+ if yes?(must_change_passwd)
+ attributes[:must_change_passwd] = '1'
+ end
+ end
+
+ if status_name = row_value(row, 'status')
+ if status = User::LABEL_BY_STATUS.key(status_name)
+ attributes[:status] = status
+ end
+ end
+
+ attributes['custom_field_values'] = object.custom_field_values.each_with_object({}) do |v, h|
+ value =
+ case v.custom_field.field_format
+ when 'date'
+ row_date(row, "cf_#{v.custom_field.id}")
+ else
+ row_value(row, "cf_#{v.custom_field.id}")
+ end
+ if value
+ h[v.custom_field.id.to_s] = v.custom_field.value_from_keyword(value, object)
+ end
+ end
+
+ object.send(:safe_attributes=, attributes, user)
+ object
+ end
+end