Update member frontend and fix member import missing fields

This commit is contained in:
manson 2014-07-24 20:12:35 +08:00
parent 8676e06c87
commit d6287177a2
5 changed files with 162 additions and 145 deletions

View File

@ -418,148 +418,66 @@ class Admin::ImportController < OrbitAdminController
end end
end end
role_attributes = member["attributes"] rss2_roles = member["attributes"]
role_attributes.each do |ra| rss2_roles.each do |rss2_role|
fields = ra["fields"] role = Role.find_by(key: rss2_role["name"]["en"]) rescue nil
role = Role.find_by(key: ra["name"]) rescue nil if role.nil?
if role.present? role = Role.new(key: rss2_role["name"]["en"], title_translations: {"en"=>rss2_role["name"]["en"],"zh_tw"=>rss2_role["name"]["zh-tw"]})
fields.each do |f| role.save
type = f["type"] end
key = f["name"]["en"].gsub("/"," ").split(' ').join('_').underscore rescue nil role.member_profiles << new_member
field = AttributeField.find_by(key: key) rescue nil new_member.position = rss2_role["order"] if !rss2_role["order"].blank?
if (field.nil? && key != "category" && key != "academic_status")
if type == "text" rss2_role["fields"].each do |rss2_field|
attribute = role.attribute_fields.build(key: key, title_translations: {"en"=>f["name"]["en"],"zh_tw"=>f["name"]["zh-tw"]}) key = rss2_field["name"]["en"].gsub("/"," ").split(' ').join('_').underscore rescue nil
attribute["markup"] = "text_field" rss2_field["type"] = rss2_field["type"].eql?("text") ? "text_field" : rss2_field["type"]
attribute.save if key != "category"
if !f["value"].nil? # Role attribute
if (f["value"].is_a?(Hash) && f["value"].has_key?("en")) field = AttributeField.find_by(key: key, :role=>role) rescue nil
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) if field.nil?
field = AttributeField.new(key: key, title_translations: {"en"=>rss2_field["name"]["en"],"zh_tw"=>rss2_field["name"]["zh-tw"]})
field["markup"] = rss2_field["type"]
role.attribute_fields << field
field.save
end
case rss2_field["type"]
when "text_field"
field_value = rss2_field["value"].is_a?(Hash) ? {"en"=>rss2_field["value"]["en"],"zh_tw"=>rss2_field["value"]["zh-tw"]} : {"en"=>rss2_field["value"],"zh_tw"=>rss2_field["value"]} rescue nil
value = new_member.attribute_values.build(key: field.key, attribute_field_id: field.id, value: field_value)
value.save value.save
when "select"
if !rss2_field["value"]["en"].nil?
option = {"en"=>rss2_field["value"]["en"],"zh_tw"=>rss2_field["value"]["zh-tw"]}
index = 0
if field.typeB["option_list"].nil? or !field.typeB["option_list"].has_value? option
field.typeB["option_list"] = {} if field.typeB["option_list"].nil?
index = field.typeB["option_list"].count
field.typeB["option_list"]["#{index}"] = option
field.save
else else
value = new_member.attribute_values.build(key: attribute.key, attribute_field_id: attribute.id, value: {"en"=>f["value"],"zh_tw"=>f["value"]}) index = field.typeB["option_list"].key(option)
end
value = new_member.attribute_values.build(key: key, attribute_field_id: field.id, value: index)
value.save value.save
end end
end end
elsif type == "select" else
attribute = role.attribute_fields.build(key: key, title_translations: {"en"=>f["name"]["en"],"zh_tw"=>f["name"]["zh-tw"]}) # Role status
attribute["markup"] = type status_key = rss2_field["value"]["en"].split(' ').join('_').underscore rescue nil
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 status = RoleStatus.find_by(key: status_key, role_id: role.id) rescue nil
if status.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"]}) status = role.role_statuses.build(key: status_key, title_translations: {"en"=>rss2_field["value"]["en"],"zh_tw"=>rss2_field["value"]["zh-tw"]})
role_status.member_profiles = [new_member] end
role_status.save
else
status.member_profiles << new_member status.member_profiles << new_member
status.save status.save
end 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, role_id: new_role.id) 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
end
end
new_member.save new_member.save
@@import_stats["current_status"] = @@import_stats["current_status"] + 1 @@import_stats["current_status"] = @@import_stats["current_status"] + 1
write_to_file write_to_file

View File

@ -28,7 +28,7 @@ class MembersController < ApplicationController
status_list = [] status_list = []
if !role['status'].blank? if !role['status'].blank?
role['status'].each do |status| role['status'].each do |status|
member_profiles = get_members_by_status(status) member_profiles = get_members_by_status(status, role['id'])
status_list << { status_list << {
"status-title" => status.title, "status-title" => status.title,
"members" => member_profiles "members" => member_profiles
@ -36,8 +36,8 @@ class MembersController < ApplicationController
end end
else else
# Members with status # Members with status
RoleStatus.where(:role_id=>role['id']).each do |status| RoleStatus.order_by(:title=>"desc").where(:role_id=>role['id']).each do |status|
member_profiles = get_members_by_status(status) member_profiles = get_members_by_status(status, role['id'])
status_list << { status_list << {
"status-title" => status.title, "status-title" => status.title,
"members" => member_profiles "members" => member_profiles
@ -46,7 +46,7 @@ class MembersController < ApplicationController
# Members without status # Members without status
member_profiles = [] member_profiles = []
MemberProfile.where(:role_ids.in=>[role['id']], :role_status_ids.in=>[nil,[]]).collect do |profile| MemberProfile.where(:role_ids.in=>[role['id']], :role_status_ids.in=>[nil,[]]).collect do |profile|
member_profiles << get_member_data(profile) member_profiles << get_member_data(profile, role['id'])
end end
status_list << { status_list << {
"status-title" => "", "status-title" => "",
@ -66,15 +66,22 @@ class MembersController < ApplicationController
} }
end end
def get_members_by_status(status) def get_members_by_status(status, role_id)
member_profiles = [] member_profiles = []
status.member_profiles.each do |profile| status.member_profiles.sort{|a,b|a.position<=>b.position}.each do |profile|
member_profiles<<get_member_data(profile) member_profiles<<get_member_data(profile, role_id)
end end
return member_profiles return member_profiles
end end
def get_member_data(profile) def get_member_data(profile, role_id)
params = OrbitHelper.params
case params['layout_type']
when "index_teacher"
get_teacher_data(profile, role_id)
when "index_staff"
get_staff_data(profile, role_id)
else
{ {
"name"=>profile.name, "name"=>profile.name,
"email" => profile.email, "email" => profile.email,
@ -82,6 +89,36 @@ class MembersController < ApplicationController
"link_to_show" => OrbitHelper.url_to_show(profile.to_param) "link_to_show" => OrbitHelper.url_to_show(profile.to_param)
} }
end end
end
def get_teacher_data(profile, role_id)
job_title_value = profile.attribute_values.where(:key=>'job_title', :attribute_field_id.in=>Role.find(role_id).attribute_field_ids).first
job_title = job_title_value.attribute_field.option_list[job_title_value.value.to_s][I18n.locale.to_s] rescue ""
discipline = profile.attribute_values.where(:key=>'discipline', :attribute_field_id.in=>Role.find(role_id).attribute_field_ids).first.value[I18n.locale]
phone_office = profile.attributes.select{|k,v| v if (k.eql?("office_tel") && v.present?)}
{
"name"=>profile.name,
"email" => profile.email,
"job-title" => job_title,
"discipline" => discipline,
"phone-office" => phone_office['office_tel'],
"image" => profile.avatar.present? ? profile.avatar.thumb.url : "http://placehold.it/100x100",
"link_to_show" => OrbitHelper.url_to_show(profile.to_param)
}
end
def get_staff_data(profile, role_id)
job_title_value = profile.attribute_values.where(:key=>'job_title', :attribute_field_id.in=>Role.find(role_id).attribute_field_ids).first
job_title = job_title_value.attribute_field.option_list[job_title_value.value.to_s][I18n.locale.to_s] rescue ""
{
"name"=>profile.name,
"email" => profile.email,
"job-title" => job_title,
"image" => profile.avatar.present? ? profile.avatar.thumb.url : "http://placehold.it/100x100",
"link_to_show" => OrbitHelper.url_to_show(profile.to_param)
}
end
def show def show
params = OrbitHelper.params params = OrbitHelper.params

View File

@ -0,0 +1,30 @@
<div class="index-member index1">
<div class="index-member-group" data-list="roles" data-level="0">
<div class="index-member-group-item">
<h3 class="index-title">
<span>{{role-title}}</span>
</h3>
<div class="index-member-status" data-level="1" data-list="status-list">
<div class="index-member-list row" data-level="2" data-list="members">
<div class="index-member-item clearfix col-sm-6">
<div class="index-member-avatar pull-left">
<img src="{{image}}" alt="{{name}}" height="80">
</div>
<div class="index-member-info">
<h5 class="index-member-name">
<a href="{{link_to_show}}">{{name}}</a>
</h5>
<p data-level="3" data-list="roles">
<span class="index-member-job-title">{{job-title}}</span>
</p>
<p class="index-member-mail">{{email}}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{{pagination_goes_here}}

View File

@ -0,0 +1,32 @@
<div class="index-member index1">
<div class="index-member-group" data-list="roles" data-level="0">
<div class="index-member-group-item">
<div class="index-member-status" data-level="1" data-list="status-list">
<h3 class="index-title">
<span>{{status-title}}</span>
</h3>
<div class="index-member-list row" data-level="2" data-list="members">
<div class="index-member-item clearfix col-sm-6">
<table class="table-condensed">
<tr>
<td rowspan="5" height="120">
<img src="{{image}}" alt="{{name}}" height="120">
</td>
<td><a href="{{link_to_show}}">{{name}}</a></td>
</tr>
<tr><td>{{job-title}}</td></tr>
<tr><td>{{discipline}}</td></tr>
<tr><td>{{phone-office}}</td></tr>
<tr><td><a href="mailto:{{email}}">{{email}}</a></td></tr>
</table>
<br/><br/>
</div>
</div>
</div>
</div>
</div>
</div>
{{pagination_goes_here}}

View File

@ -309,7 +309,7 @@
$("#import-progress-text").html("Finished importing Members.<br/>"); $("#import-progress-text").html("Finished importing Members.<br/>");
$("#import-progress .bar").css('width', '100%'); $("#import-progress .bar").css('width', '100%');
new_members_data = data.members; new_members_data = data.members;
importPlugins(0); // importPlugins(0);
} }
}).fail(function(){ }).fail(function(){
$("#import-progress-text").html("Importing failed, click on start to try again."); $("#import-progress-text").html("Importing failed, click on start to try again.");