member import and some fixes in member backend

This commit is contained in:
Saurabh Bhatia 2014-07-09 11:22:21 +08:00
parent 1492e6e9e8
commit c6dd73a98e
7 changed files with 349 additions and 6 deletions

View File

@ -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'])

View File

@ -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

View File

@ -110,7 +110,7 @@
</div>
<div id="import-modules" class="hide">
<div id="member-module" class="module" onclick="importModule('member')">
<div id="members-module" class="module" onclick="importModule('members')">
<div class="lead muted">
<i class="icons-users"></i><br/>
<%= t("member_") %>
@ -197,6 +197,9 @@
case "links":
importLinks();
break;
case "members":
importMembers();
break;
default:
getModuleCategories();
}
@ -260,6 +263,55 @@
setTimeout("startCheckingGalleryImportStatus()",700);
}
var importMembers = function(){
$("#import-progress .bar").css('width', '0%');
$("#import-progress-text").html("Importing Member..<br/>");
$.ajax({
type: "post",
url: '<%= admin_import_rss2_members_path %>',
data : {"url" : url+'?module='+module}
}).done(function(){
}).fail(function(){
$("#import-progress-text").html("Importing failed, click on start to try again.");
$("#alert-msg").text("There was an unknown error");
$(".alert-danger").removeClass("hide").show();
})
setTimeout("startCheckingMemberImportStatus()",700);
}
var startCheckingMemberImportStatus = function(){
$.ajax({
type : "get",
dataType : "json",
data : {"module" : module},
url : "<%= admin_import_get_import_status_path %>"
}).done(function(status){
if(status.success == true){
if(status.total_members != null){
var percent = (status.current_status * 100) / status.total_members;
$("#import-progress .bar").css('width',percent + "%");
$("#import-progress-text").html("Importing Member" + status.current_member_name + " .. " + status.current_status + "/" + status.total_members + "<br/>");
}
if(status.total_members != status.current_status){
setTimeout("startCheckingMemberImportStatus()",700);
}else{
if(status.total_members == null){
setTimeout("startCheckingMemberImportStatus()",700);
}
$("#import-progress-text").html("Finished importing Members.<br/>");
}
}else if(status.success == false){
$("#import-progress-text").html("Importing failed, click on start to try again.");
$("#alert-msg").text("Error importing page " + status.current_member_name + " Email : " + status.current_member)
$(".alert-danger").removeClass("hide").show();
}
}).fail(function(){
$("#import-progress-text").html("Importing failed, click on start to try again.");
$("#alert-msg").text("There was an unknown error");
$(".alert-danger").removeClass("hide").show();
})
}
var startCheckinglinksImportStatus = function(){
$.ajax({
type : "get",

View File

@ -18,7 +18,7 @@
<% end %>
</td>
<td>
<%= link_to (member_for_listing.name && member_for_listing.name != (member_for_listing.email if member_for_listing.user.present?) ? member_for_listing.name : member_for_listing.user.id),admin_member_path(member_for_listing) %>
<%= link_to (member_for_listing.name != (member_for_listing.email) ? member_for_listing.name : member_for_listing.id),admin_member_path(member_for_listing) %>
<div class="quick-edit">
<ul class="nav nav-pills">
<%= content_tag(:li, link_to(t(:edit),edit_admin_member_path(member_for_listing))) if current_user.is_admin? %>

View File

@ -18,7 +18,7 @@
<%= image_tag(member_for_summary.avatar) %>
</div>
<div class="member-info">
<h4 class="member-name"><%= link_to (member_for_summary.name && member_for_summary.name != member_for_summary.email ? member_for_summary.name : member_for_summary.user_id),admin_members_path(member_for_summary)%></h4>
<h4 class="member-name"><%= link_to (member_for_summary.name != (member_for_summary.email) ? member_for_summary.name : member_for_summary.id),admin_member_path(member_for_summary) %></h4>
<div class="member-mail muted"><%= member_for_summary.email%></div>
<hr>
<ul class="member-roles">
@ -27,7 +27,7 @@
<span class="label label-info"><%= rf.title %></span>
<span class="member-staturs muted"><i class="icon-angle-right"></i>
<%= User.get_member_list_attribute_value(member_for_summary.id, rf.key, "job_title").get_value_by_locale(I18n.locale) rescue '' %>
<%= member_for_summary.role_statuses.map{|t|t.title.to_s}.join(',') rescue '' %>
<%= member_for_summary.get_role_statuses(rf.id).map{|t|t.title.to_s}.join(',') rescue ''%>
</span>
</li>
<% end %>

View File

@ -17,5 +17,5 @@
</div>
<%= image_tag(member_for_thumbnail.avatar) %>
</div>
<h4 class="member-name text-center"><%= link_to (member_for_thumbnail.name && member_for_thumbnail.name != member_for_thumbnail.email ? member_for_thumbnail.name : member_for_thumbnail.user_id),admin_members_path(member_for_thumbnail)%></h4>
<h4 class="member-name text-center"><%= link_to (member_for_thumbnail.name != (member_for_thumbnail.email) ? member_for_thumbnail.name : member_for_thumbnail.id),admin_member_path(member_for_thumbnail) %></h4>
</li>

View File

@ -221,6 +221,7 @@ Orbit::Application.routes.draw do
get "import/get_import_status" => "import#get_import_status"
post "import/rss2_galleries" => "import#rss2_galleries"
post "import/rss2_links" => "import#rss2_links"
post "import/rss2_members" => "import#rss2_members"
end
get 'mobile', to: 'pages#home'