diff --git a/app/controllers/admin/import_controller.rb b/app/controllers/admin/import_controller.rb index 6618157..8a0248e 100644 --- a/app/controllers/admin/import_controller.rb +++ b/app/controllers/admin/import_controller.rb @@ -72,7 +72,6 @@ class Admin::ImportController < OrbitAdminController response = http.request(request) data = response.body data = JSON.parse(data) - case params['module'] when 'archive' import_archive(data) @@ -291,6 +290,292 @@ class Admin::ImportController < OrbitAdminController render :json => settings.to_json end + def rss2_members + uri = URI.parse(params['url']) + # @@thread = Thread.new do + http = Net::HTTP.new(uri.host, uri.port) + request = Net::HTTP::Get.new(uri.request_uri) + response = http.request(request) + data = response.body + data = JSON.parse(data) + @@import_stats["total_members"] = data["users"].count + @@import_stats["current_status"] = 0 + @@import_stats["success"] = true + write_to_file + members = data["users"] + members.each do |member| + @@import_stats["current_member"] = member["user_id"] + @@import_stats["current_member_name"] = member["primary_email"] + write_to_file + + check_member = MemberProfile.find_by(rss2_id: member["rss2_id"]) rescue nil + if check_member.nil? + new_member = MemberProfile.new(email: member["primary_email"], rss2_id: member["rss2_id"], sid: member["sid"], office_tel: member["phone_office"],) + new_member.autobiography_translations = {"en"=>member["bio"]["en"],"zh_tw"=>member["bio"]["zh-tw"]} + new_member.address_translations = {"en"=>member["address_office"]["en"],"zh_tw"=>member["address_office"]["zh-tw"]} + new_member.first_name_translations = {"en"=>member["name"]["en"],"zh_tw"=>member["name"]["zh-tw"]} + if member["gender"] == "M" + new_member.sex = "male" + elsif member["gender"] == "F" + new_member.sex = "female" + elsif member["gender"].nil? + new_member.sex = "unknown" + end + if member["profile_pic"].present? + image_url = member["profile_pic"] + new_member.remote_avatar_url = image_url + end + info = MemberInfo.find_by(key: "basic_info") + + + if member.include?("website") + member_profile_field = info.member_profile_fields.find_by(key: "website") rescue nil + if member_profile_field.nil? + field = info.member_profile_fields.build(key: "website",markup: "text_field",title_translations:{"en"=>"website","zh_tw"=>"網站"}) + field.save + value = field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["website"],"zh_tw"=>member["website"]} + value.save + elsif (member_profile_field.present? && member_profile_field.member_profile_field_values.blank?) + value = member_profile_field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["website"],"zh_tw"=>member["website"]} + value.save + end + end + + if member.include?("address_home") + member_profile_field = info.member_profile_fields.find_by(key: "address_home") rescue nil + if member_profile_field.nil? + field = info.member_profile_fields.build(key: "address_home",markup: "text_area",title_translations:{"en"=>"Home Address","zh_tw"=>"家庭住址"}) + field.save + value = field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["address_home"]["en"],"zh_tw"=>member["address_home"]["zh-tw"]} + value.save + elsif (member_profile_field.present? && member_profile_field.member_profile_field_values.blank?) + value = member_profile_field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["address_home"]["en"],"zh_tw"=>member["address_home"]["zh-tw"]} + value.save + end + end + + if member.include?("fax") + member_profile_field = info.member_profile_fields.find_by(key: "fax") rescue nil + if member_profile_field.nil? + field = info.member_profile_fields.build(key: "fax",markup: "text_field",title_translations:{"en"=>"Fax","zh_tw"=>"傳真"}) + field.save + value = field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["fax"],"zh_tw"=>member["fax"]} + value.save + elsif (member_profile_field.present? && member_profile_field.member_profile_field_values.blank?) + value = member_profile_field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["fax"],"zh_tw"=>member["fax"]} + value.save + end + end + + if member.include?("experience") + member_profile_field = info.member_profile_fields.find_by(key: "experience") rescue nil + if member_profile_field.nil? + field = info.member_profile_fields.build(key: "experience",markup: "text_area",title_translations:{"en"=>"Experience","zh_tw"=>"經驗"}) + field.save + value = field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["experience"]["en"],"zh_tw"=>member["experience"]["zh-tw"]} + value.save + elsif (member_profile_field.present? && member_profile_field.member_profile_field_values.blank?) + value = member_profile_field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["experience"]["en"],"zh_tw"=>member["experience"]["zh-tw"]} + value.save + end + end + + if member.include?("mobile") + member_profile_field = info.member_profile_fields.find_by(key: "mobile") rescue nil + if member_profile_field.nil? + field = info.member_profile_fields.build(key: "mobile",markup: "text_field",title_translations:{"en"=>"Mobile Phone Number","zh_tw"=>"手機號碼"}) + field.save + value = field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["mobile"],"zh_tw"=>member["mobile"]} + value.save + elsif (member_profile_field.present? && member_profile_field.member_profile_field_values.blank?) + value = member_profile_field.member_profile_field_values.build + value.member_profile_id = new_member.id + value.value = {"en"=>member["mobile"],"zh_tw"=>member["mobile"]} + value.save + end + end + + role_attributes = member["attributes"] + role_attributes.each do |ra| + fields = ra["fields"] + role = Role.find_by(key: ra["name"]) rescue nil + if role.present? + fields.each do |f| + type = f["type"] + key = f["name"]["en"].gsub("/"," ").split(' ').join('_').underscore rescue nil + field = AttributeField.find_by(key: key) rescue nil + if (field.nil? && key != "category" && key != "academic_status") + if type == "text" + attribute = role.attribute_fields.build(key: key, title_translations: {"en"=>f["name"]["en"],"zh_tw"=>f["name"]["zh-tw"]}) + attribute["markup"] = "text_field" + attribute.save + if !f["value"].nil? + if (f["value"].is_a?(Hash) && f["value"].has_key?("en")) + field_value = {"en"=>f["value"]["en"],"zh_tw"=>["value"]["zh-tw"]} rescue nil + value = new_member.attribute_values.build(key: attribute.key, attribute_field_id: attribute.id, value: field_value) + value.save + else + value = new_member.attribute_values.build(key: attribute.key, attribute_field_id: attribute.id, value: {"en"=>f["value"],"zh_tw"=>f["value"]}) + value.save + end + end + elsif type == "select" + attribute = role.attribute_fields.build(key: key, title_translations: {"en"=>f["name"]["en"],"zh_tw"=>f["name"]["zh-tw"]}) + attribute["markup"] = type + first_index = 0 + attribute.typeB["option_list"] = {"#{first_index}" => {"en"=>f["value"]["en"],"zh_tw"=>f["value"]["zh-tw"]}} + attribute.save + value = new_member.attribute_values.build(key: key, attribute_field_id: attribute.id, value: first_index) + value.save + end + new_member.roles << role + elsif (field.nil? && (["category","academic_status"].include? key)) + status_key = f["value"]["en"].split(' ').join('_').underscore rescue nil + status = RoleStatus.find_by(key: status_key, role_id: role.id) rescue nil + if status.nil? + role_status = role.role_statuses.build(key: status_key, title_translations: {"en"=>f["value"]["en"],"zh_tw"=>f["value"]["zh-tw"]}) + role_status.member_profiles = [new_member] + role_status.save + else + status.member_profiles = [new_member] + status.save + end + elsif field.present? + if field.markup = "text_field" + if !f["value"].nil? + if (f["value"].is_a?(Hash) && f["value"].has_key?("en")) + field_value = {"en"=>f["value"]["en"],"zh_tw"=>["value"]["zh-tw"]} rescue nil + value = new_member.attribute_values.build(key: field.key, attribute_field_id: field.id, value: field_value) + value.save + else + value = new_member.attribute_values.build(key: field.key, attribute_field_id: field.id, value: {"en"=>f["value"],"zh_tw"=>f["value"]}) + value.save + end + end + elsif field.markup = "select" + field.typeB["option_list"].each_with_index do |v,i| + if v.last["en"] != f["value"]["en"] + option = field.typeB["option_list"] = {"#{i+1}" => {"en"=>f["value"]["en"],"zh_tw"=>f["value"]["zh-tw"]}} + option.save + end + @index = (field.typeB["option_list"].count - 1) + end + value = new_member.attribute_values.build(key: key, attribute_field_id: field.id, value: @index) + value.save + end + new_member.roles << role + end + end + elsif role.nil? + new_role = new_member.roles.build(key: ra["name"], title_translations: {"en"=>ra["name"].titleize,"zh_tw"=>ra["name"].titleize}) + new_role.save + fields.each do |f| + type = f["type"] + key = f["name"]["en"].gsub("/"," ").split(' ').join('_').underscore rescue nil + field = AttributeField.find_by(key: key) rescue nil + if (field.nil? && key != "category" && key != "academic_status") + if type == "text" + attribute = new_role.attribute_fields.build(key: key, title_translations: {"en"=>f["name"]["en"],"zh_tw"=>f["name"]["zh-tw"]}) + attribute["markup"] = "text_field" + attribute.save + if !f["value"].nil? + if (f["value"].is_a?(Hash) && f["value"].has_key?("en")) + field_value = {"en"=>f["value"]["en"],"zh_tw"=>["value"]["zh-tw"]} rescue nil + value = new_member.attribute_values.build(key: attribute.key, attribute_field_id: attribute.id, value: field_value) + value.save + else + value = new_member.attribute_values.build(key: attribute.key, attribute_field_id: attribute.id, value: {"en"=>f["value"],"zh_tw"=>f["value"]}) + value.save + end + end + elsif type == "select" + attribute = new_role.attribute_fields.build(key: key, title_translations: {"en"=>f["name"]["en"],"zh_tw"=>f["name"]["zh-tw"]}) + attribute["markup"] = type + first_index = 0 + attribute.typeB["option_list"] = {"#{first_index}" => {"en"=>f["value"]["en"],"zh_tw"=>f["value"]["zh-tw"]}} + attribute.save + value = new_member.attribute_values.build(key: key, attribute_field_id: attribute.id, value: first_index) + value.save + end + elsif (field.nil? && (["category","academic_status"].include? key)) + status_key = f["value"]["en"].split(' ').join('_').underscore rescue nil + status = RoleStatus.find_by(key: status_key, role_id: new_role.id) rescue nil + if status.nil? + role_status = new_role.role_statuses.build(key: status_key, title_translations: {"en"=>f["value"]["en"],"zh_tw"=>f["value"]["zh-tw"]}) + role_status.member_profiles = [new_member] + role_status.save + else + status.member_profiles = [new_member] + status.save + end + elsif (!field.nil? && key != "category") + if field.markup = "text_field" + if !f["value"].nil? + if (f["value"].is_a?(Hash) && f["value"].has_key?("en")) + field_value = {"en"=>f["value"]["en"],"zh_tw"=>["value"]["zh-tw"]} rescue nil + value = new_member.attribute_values.build(key: field.key, attribute_field_id: field.id, value: field_value) + value.save + else + value = new_member.attribute_values.build(key: field.key, attribute_field_id: field.id, value: {"en"=>f["value"],"zh_tw"=>f["value"]}) + value.save + end + end + elsif field.markup = "select" + field.typeB["option_list"].each_with_index do |v,i| + if v.last["en"] == f["value"]["en"] + + else + option = field.typeB["option_list"] = {"#{i+1}" => {"en"=>f["value"]["en"],"zh_tw"=>f["value"]["zh-tw"]}} + option.save + value = new_member.attribute_values.build(key: key, attribute_field_id: field.id, value: i+1) + value.save + end + end + end + end + end + + end + end + new_member.save + @@import_stats["current_status"] = @@import_stats["current_status"] + 1 + write_to_file + if member["user_id"].present? + user = User.new + user.user_name = member["user_id"] + user.password = "newpassword" + user.password_confirmation = "newpassword" + if member["group_id"] == 40 + w = Workgroup.find_by(key: "admin") rescue nil + user.workgroup = w + end + user.member_profile = new_member + user.save + end + end + end + + render :json => {"success" => true}.to_json + end + def rss2_galleries delete_import_file uri = URI.parse(params['url']) diff --git a/app/models/member_profile.rb b/app/models/member_profile.rb index 4659f77..0d7b8b0 100644 --- a/app/models/member_profile.rb +++ b/app/models/member_profile.rb @@ -19,6 +19,7 @@ class MemberProfile field :autobiography, type: String, localize: true field :email, type: String field :position, type: Integer + field :rss2_id VALID_EMAIL_FORMAT = /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ validates :email, uniqueness: true, format: { with: VALID_EMAIL_FORMAT }, if: :email_present? @@ -157,4 +158,8 @@ class MemberProfile def email_present? self.email.present? end + + def get_role_statuses(role_id) + RoleStatus.where(role_id: role_id).any_of(member_profile_ids: self.id) + end end diff --git a/app/views/admin/import/index.html.erb b/app/views/admin/import/index.html.erb index 54e5908..eac1d1d 100644 --- a/app/views/admin/import/index.html.erb +++ b/app/views/admin/import/index.html.erb @@ -110,7 +110,7 @@