Upload fgu_sync.rake
This commit is contained in:
parent
bf91c11bd7
commit
9370739e35
|
@ -0,0 +1,382 @@
|
|||
require "uri"
|
||||
require "net/http"
|
||||
namespace :fgu_sync do
|
||||
task :sync_plugins => :environment do
|
||||
MemberProfile.each do |mp|
|
||||
staff_id = mp.sid rescue nil
|
||||
if !staff_id.nil? && staff_id != ""
|
||||
sync_fgu_journals(staff_id, mp)
|
||||
sync_fgu_conference(staff_id, mp)
|
||||
sync_fgu_books(staff_id, mp)
|
||||
sync_fgu_diploma(staff_id, mp)
|
||||
sync_fgu_experience(staff_id, mp)
|
||||
sync_fgu_profile(staff_id, mp)
|
||||
end
|
||||
end
|
||||
end
|
||||
def camelize(str)
|
||||
str.split('_').map{|v| v.capitalize}.join(' ')
|
||||
end
|
||||
def fetch_key(data,key,role=nil,value_flag=false)
|
||||
begin
|
||||
attr_fields = (value_flag ? role.attribute_fields : data)
|
||||
case key
|
||||
when 'f_profession_list'
|
||||
tmp_key = 'Research Expertise'
|
||||
else
|
||||
tmp_key = camelize(key)
|
||||
end
|
||||
tmp = attr_fields.select{|v| v[:title][:en].upcase.include?(tmp_key.upcase)}.first
|
||||
value_flag ? data.where(:attribute_field_id => tmp.id).first : tmp
|
||||
rescue => e
|
||||
nil
|
||||
end
|
||||
end
|
||||
def sync_fgu_journals(staff_id, mp)
|
||||
puts "*********************************************"
|
||||
puts "Syncing journals for #{staff_id}"
|
||||
params_to_send = {"plugin" => "journal", "id" => staff_id}
|
||||
data = get_fgu_data(params_to_send)
|
||||
I18n.locale = :zh_tw
|
||||
if !data.nil? && data["success"] == true && data["data"].count > 0
|
||||
puts "Data found."
|
||||
JournalPaper.where(:member_profile_id => mp.id).destroy_all
|
||||
data["data"].each_with_index do |dt, idx|
|
||||
rss2id = dt["journal_id"]
|
||||
|
||||
pd = Date.parse(dt["publication_date"]) rescue Date.today
|
||||
paper_title = {"en" => dt["paper_title"],"zh_tw" => dt["paper_title"]}
|
||||
journal_title = {"en" => dt["journal_title"],"zh_tw" => dt["journal_title"]}
|
||||
from_to = dt["from_to"].split("-")
|
||||
from_to[1] = "" if !from_to[1].present?
|
||||
authors = [dt["author1"],dt["author2"],dt["author3"],dt["author4"]]
|
||||
authors.delete("")
|
||||
authors = {"en" => authors.join(", "), "zh_tw" => authors.join(", ")}
|
||||
note = dt["department"] + " " + dt["country"] + " " + dt["note"]
|
||||
|
||||
if !dt["paper_level"].empty?
|
||||
level = JournalLevel.where(:title => dt["paper_level"]).first rescue nil
|
||||
if level.nil?
|
||||
level = JournalLevel.create(:key => "key_#{idx}", :title_translations => {"en" => dt["paper_level"], "zh_tw" => dt["paper_level"]})
|
||||
end
|
||||
end
|
||||
|
||||
if !dt["paper_type"].empty?
|
||||
type = JournalPaperType.where(:title => dt["paper_type"]).first rescue nil
|
||||
if type.nil?
|
||||
type = JournalPaperType.create(:key => "key_#{idx}", :title_translations => {"en" => dt["paper_type"], "zh_tw" => dt["paper_type"]})
|
||||
end
|
||||
end
|
||||
|
||||
jp = JournalPaper.where(:rss2_id => rss2id).first rescue nil
|
||||
if jp.nil?
|
||||
jp = JournalPaper.new(:publication_date => pd, :rss2_id => rss2id, :year => pd.strftime("%Y"), :authors_translations => authors, :paper_title_translations => paper_title, :journal_title_translations => journal_title, :vol_no => dt["vol_no"], :issue_no => dt["issue_no"], :note => note, :form_to_start => from_to[0], :form_to_end => from_to[1], :member_profile => mp)
|
||||
jp.journal_levels << level if !level.nil?
|
||||
jp.journal_paper_type = type if !type.nil?
|
||||
jp.save
|
||||
puts "Saving new journal."
|
||||
else
|
||||
jp.update_attributes(:publication_date => pd, :rss2_id => rss2id, :year => pd.strftime("%Y"), :authors_translations => authors, :paper_title_translations => paper_title, :journal_title_translations => journal_title, :vol_no => dt["vol_no"], :issue_no => dt["issue_no"], :note => note, :form_to_start => from_to[0], :form_to_end => from_to[1])
|
||||
jp.journal_levels << level if !level.nil?
|
||||
jp.journal_paper_type = type if !type.nil?
|
||||
jp.save
|
||||
puts "Updating journal #{jp.id}."
|
||||
end
|
||||
end
|
||||
else
|
||||
puts "No data found."
|
||||
end
|
||||
puts "Sync complete for #{staff_id}"
|
||||
puts "*********************************************"
|
||||
end
|
||||
|
||||
def sync_fgu_conference(staff_id, mp)
|
||||
puts "*********************************************"
|
||||
puts "Syncing conference for #{staff_id}"
|
||||
params_to_send = {"plugin" => "conference", "id" => staff_id}
|
||||
data = get_fgu_data(params_to_send)
|
||||
I18n.locale = :zh_tw
|
||||
if !data.nil? && data["success"] == true && data["data"].count > 0
|
||||
puts "Data found."
|
||||
WritingConference.where(:member_profile_id => mp.id).destroy_all
|
||||
data["data"].each_with_index do |dt, idx|
|
||||
rss2id = dt["conf_id"]
|
||||
|
||||
start_date = Date.parse(dt["start_date"]) rescue Date.today
|
||||
end_date = Date.parse(dt["end_date"]) rescue Date.today
|
||||
paper_title = {"en" => dt["paper_title"],"zh_tw" => dt["paper_title"]}
|
||||
conference_title = {"en" => dt["conference_name"],"zh_tw" => dt["conference_name"]}
|
||||
authors = [dt["author1"],dt["author2"],dt["author3"],dt["author4"]]
|
||||
authors.delete("")
|
||||
authors = {"en" => authors.join(", "), "zh_tw" => authors.join(", ")}
|
||||
note = dt["department"] + " " + dt["note"]
|
||||
|
||||
cp = WritingConference.where(:rss2_id => rss2id).first rescue nil
|
||||
if cp.nil?
|
||||
cp = WritingConference.new(:period_start_date => start_date, :period_end_date => end_date, :rss2_id => rss2id, :year => end_date.strftime("%Y"), :authors_translations => authors, :paper_title_translations => paper_title, :conference_title_translations => conference_title, :note => note, :member_profile => mp, :location_translations => {"en" => dt["location"], "zh_tw" => dt["location"]})
|
||||
cp.save
|
||||
puts "Saving new conference."
|
||||
else
|
||||
cp.update_attributes(:period_start_date => start_date, :period_end_date => end_date, :rss2_id => rss2id, :year => end_date.strftime("%Y"), :authors_translations => authors, :paper_title_translations => paper_title, :conference_title_translations => conference_title, :note => note, :location_translations => {"en" => dt["location"], "zh_tw" => dt["location"]})
|
||||
puts "Updating conference #{cp.id}."
|
||||
end
|
||||
end
|
||||
else
|
||||
puts "No data found."
|
||||
end
|
||||
puts "Sync complete for #{staff_id}"
|
||||
puts "*********************************************"
|
||||
end
|
||||
|
||||
def sync_fgu_books(staff_id, mp)
|
||||
puts "*********************************************"
|
||||
puts "Syncing book for #{staff_id}"
|
||||
params_to_send = {"plugin" => "book", "id" => staff_id}
|
||||
data = get_fgu_data(params_to_send)
|
||||
I18n.locale = :zh_tw
|
||||
if !data.nil? && data["success"] == true && data["data"].count > 0
|
||||
puts "Data found."
|
||||
Book.where(:member_profile_id => mp.id).destroy_all
|
||||
data["data"].each_with_index do |dt, idx|
|
||||
rss2id = dt["book_id"]
|
||||
|
||||
pd = Date.parse(dt["date_of_publication"]) rescue Date.today
|
||||
book_title = {"en" => dt["book_title"],"zh_tw" => dt["book_title"]}
|
||||
publisher = {"en" => dt["publisher"],"zh_tw" => dt["publisher"]}
|
||||
authors = [dt["author1"],dt["author2"],dt["author3"],dt["author4"]]
|
||||
authors.delete("")
|
||||
authors = {"en" => authors.join(", "), "zh_tw" => authors.join(", ")}
|
||||
note = dt["department"] + " " + dt["location"] + " " + dt["note"]
|
||||
|
||||
if !dt["author_type"].empty?
|
||||
authortype = BookAuthorType.where(:title => dt["author_type"]).first rescue nil
|
||||
if authortype.nil?
|
||||
authortype = BookAuthorType.create(:title_translations => {"en" => dt["author_type"], "zh_tw" => dt["author_type"]})
|
||||
end
|
||||
end
|
||||
|
||||
if !dt["book_type"].empty?
|
||||
type = BookType.where(:title => dt["book_type"]).first rescue nil
|
||||
if type.nil?
|
||||
type = BookType.create(:title_translations => {"en" => dt["book_type"], "zh_tw" => dt["book_type"]})
|
||||
end
|
||||
end
|
||||
|
||||
book = Book.where(:rss2_id => rss2id).first rescue nil
|
||||
if book.nil?
|
||||
book = Book.new(:publish_date => pd, :rss2_id => rss2id, :year => pd.strftime("%Y"), :authors_translations => authors, :publisher_translations => publisher, :book_title_translations => book_title, :isbn => dt["isbn"], :note => note, :language => dt["language"], :member_profile => mp)
|
||||
book.book_author_types << authortype if !authortype.nil?
|
||||
book.book_type = type if !type.nil?
|
||||
book.save
|
||||
puts "Saving new book."
|
||||
else
|
||||
book.update_attributes(:publish_date => pd, :rss2_id => rss2id, :year => pd.strftime("%Y"), :authors_translations => authors, :publisher_translations => publisher, :book_title_translations => book_title, :isbn => dt["isbn"], :note => note, :language => dt["language"], :member_profile => mp)
|
||||
book.book_author_types << authortype if !authortype.nil?
|
||||
book.book_type = type if !type.nil?
|
||||
book.save
|
||||
puts "Updating book #{book.id}."
|
||||
end
|
||||
end
|
||||
else
|
||||
puts "No data found."
|
||||
end
|
||||
puts "Sync complete for #{staff_id}"
|
||||
puts "*********************************************"
|
||||
end
|
||||
|
||||
def sync_fgu_diploma(staff_id, mp)
|
||||
puts "*********************************************"
|
||||
puts "Syncing diplomas for #{staff_id}"
|
||||
params_to_send = {"plugin" => "diploma", "id" => staff_id}
|
||||
data = get_fgu_data(params_to_send)
|
||||
I18n.locale = :zh_tw
|
||||
if !data.nil? && data["success"] == true && data["data"].count > 0
|
||||
puts "Data found."
|
||||
puts "Deleting old data"
|
||||
Diploma.where(:member_profile_id => mp.id).destroy_all
|
||||
data["data"].each_with_index do |dt, idx|
|
||||
start_date = Date.parse(dt["start_date"]) rescue Date.today
|
||||
end_date = Date.parse(dt["end_date"]) rescue Date.today
|
||||
school_name = {"en" => dt["school_name"], "zh_tw" => dt["school_name"]}
|
||||
department = {"en" => dt["department"], "zh_tw" => dt["department"]}
|
||||
degree = {"en" => dt["degree"], "zh_tw" => dt["degree"]}
|
||||
Diploma.create(:start_date => start_date, :end_date => end_date, :school_name_translations => school_name, :department_translations => department, :degree_translations => degree, :member_profile => mp)
|
||||
puts "Diploma created."
|
||||
end
|
||||
end
|
||||
puts "Syncing diplomas for #{staff_id} complete."
|
||||
puts "*********************************************"
|
||||
end
|
||||
|
||||
def sync_fgu_experience(staff_id, mp)
|
||||
puts "*********************************************"
|
||||
puts "Syncing experiences for #{staff_id}"
|
||||
params_to_send = {"plugin" => "experience", "id" => staff_id}
|
||||
data = get_fgu_data(params_to_send)
|
||||
I18n.locale = :zh_tw
|
||||
if !data.nil? && data["success"] == true && data["data"].count > 0
|
||||
puts "Data found."
|
||||
puts "Deleting old data"
|
||||
Experience.where(:member_profile_id => mp.id).destroy_all
|
||||
data["data"].each_with_index do |dt, idx|
|
||||
start_date = Date.parse(dt["start_date"]) rescue Date.today
|
||||
end_date = Date.parse(dt["end_date"]) rescue Date.today
|
||||
organization_title = {"en" => dt["organization_title"], "zh_tw" => dt["organization_title"]}
|
||||
job_title = {"en" => dt["job_title"], "zh_tw" => dt["job_title"]}
|
||||
if !dt["emp_type"].blank?
|
||||
type = ExperienceType.where(:title => dt["emp_type"]).first rescue nil
|
||||
if type.nil?
|
||||
type = ExperienceType.create(:title_translations => {"en" => dt["emp_type"], "zh_tw" => dt["emp_type"]})
|
||||
end
|
||||
end
|
||||
exp = Experience.new(:start_date => start_date, :end_date => end_date, :organizationt_title_translations => organization_title, :job_title_translations => job_title, :member_profile => mp)
|
||||
exp.experience_type = type if !type.nil?
|
||||
exp.save
|
||||
puts "Exp created."
|
||||
end
|
||||
end
|
||||
puts "Syncing experiences for #{staff_id} complete."
|
||||
puts "*********************************************"
|
||||
end
|
||||
|
||||
def sync_fgu_profile(staff_id, mp)
|
||||
puts "*********************************************"
|
||||
puts "Syncing profile for #{staff_id}"
|
||||
params_to_send = {"plugin" => "profile", "id" => staff_id}
|
||||
data = get_fgu_data(params_to_send)
|
||||
I18n.locale = :zh_tw
|
||||
if !data.nil? && data["success"] == true && data["data"].count > 0
|
||||
all_role_ids = mp.role_ids
|
||||
all_role_status_ids = mp.role_status_ids
|
||||
data["data"].each do |dt|
|
||||
case dt["role"]
|
||||
when "職員"
|
||||
role = Role.where(:key => "staff").first
|
||||
when "教師"
|
||||
role = Role.where(:key => "teacher").first
|
||||
when nil
|
||||
role = Role.where(:key => "teacher").first
|
||||
end
|
||||
if !role.nil?
|
||||
puts "Assigning role #{role.key}"
|
||||
case dt["job_status"]
|
||||
when "專任"
|
||||
role_status = role.role_statuses.select{|v| v[:title][:en].upcase == "Full-Time".upcase}.first
|
||||
when "兼任"
|
||||
role_status = role.role_statuses.select{|v| v[:title][:en].upcase == "Part-Time".upcase}.first
|
||||
else
|
||||
role_status = nil
|
||||
end
|
||||
if role.key == "teacher"
|
||||
puts dt
|
||||
af = fetch_key(role.attribute_fields,"job_title")
|
||||
if !af.nil?
|
||||
options = af.option_list.values
|
||||
job_title = options.index(options.find{|x| x["zh_tw"] == dt["job_title"]})
|
||||
puts job_title.to_s
|
||||
if job_title.blank?
|
||||
job_title = af.option_list.keys.last.to_i + 1
|
||||
af.option_list[job_title] = {"en" => dt["job_title"], "zh_tw" => dt["job_title"]}
|
||||
puts af.option_list.to_s
|
||||
af.save
|
||||
else
|
||||
job_title = af.option_list.keys[job_title].to_i
|
||||
end
|
||||
end
|
||||
#saving job title
|
||||
av = fetch_key(mp.attribute_values,"job_title",role,true)
|
||||
if av.nil?
|
||||
field = fetch_key(role.attribute_fields,"job_title")
|
||||
if !field.nil?
|
||||
av = AttributeValue.new(:attribute_field_id => field.id, :member_profile_id => mp.id, :key => "job_title")
|
||||
end
|
||||
end
|
||||
if !av.nil?
|
||||
av.value= job_title
|
||||
av.save
|
||||
end
|
||||
#saving profession list
|
||||
av = fetch_key(mp.attribute_values,"f_profession_list",role,true)
|
||||
if av.nil?
|
||||
field = fetch_key(role.attribute_fields,"f_profession_list")
|
||||
if !field.nil?
|
||||
av = AttributeValue.new(:attribute_field_id => field.id, :member_profile_id => mp.id, :key => "f_profession_list")
|
||||
end
|
||||
end
|
||||
if !av.nil?
|
||||
av.value= {:en => dt["profession_list"], :zh_tw => dt["profession_list"]}
|
||||
av.save
|
||||
end
|
||||
#saving courses
|
||||
av = fetch_key(mp.attribute_values,"current_course",role,true)
|
||||
if av.nil?
|
||||
field = fetch_key(role.attribute_fields,"current_course")
|
||||
if !field.nil?
|
||||
av = AttributeValue.new(:attribute_field_id => field.id, :member_profile_id => mp.id)
|
||||
end
|
||||
end
|
||||
if !av.nil?
|
||||
course_html = ""
|
||||
if dt["courses"].blank?
|
||||
av.value= {:en => course_html, :zh_tw => course_html}
|
||||
av.save
|
||||
end
|
||||
dt["courses"].each do |course|
|
||||
course_html += "<a data-year='#{course["year"].to_i + 1911}' data-sem='#{course["sem"]}' href='#{course["course_url"]}' target='_blank'>#{course["course_id"]} #{course["course_name"]}</a><br />"
|
||||
av.value= {:en => course_html, :zh_tw => course_html}
|
||||
av.save
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
mp.email = dt["email"]
|
||||
mp.office_tel = dt["office_tel"]
|
||||
mp.address_translations = {"en" => dt["address"], "zh_tw" => dt["address"]}
|
||||
mp.first_name_translations = {"en" => dt["name"], "zh_tw" => dt["name"]}
|
||||
if (!role.nil? && !all_role_ids.include?(role.id))
|
||||
all_role_ids << role.id
|
||||
end
|
||||
if (!role_status.nil? && !all_role_status_ids.include?(role_status.id))
|
||||
all_role_status_ids << role_status.id
|
||||
end
|
||||
end
|
||||
puts [staff_id,all_role_ids.inspect]
|
||||
if !all_role_ids.blank?
|
||||
mp.role_ids = all_role_ids
|
||||
all_role_ids.each do |r_id|
|
||||
rr = Role.find(r_id)
|
||||
if !rr.member_profile_ids.include?(mp.id)
|
||||
rr.member_profile_ids << mp.id
|
||||
rr.save
|
||||
end
|
||||
end
|
||||
puts 'modify roles'
|
||||
end
|
||||
if !all_role_status_ids.blank?
|
||||
mp.role_status_ids = all_role_status_ids
|
||||
all_role_status_ids.each do |r_id|
|
||||
rr = RoleStatus.find(r_id)
|
||||
if !rr.member_profile_ids.include?(mp.id)
|
||||
rr.member_profile_ids << mp.id
|
||||
rr.save
|
||||
end
|
||||
end
|
||||
puts 'modify role_statuses'
|
||||
end
|
||||
mp.save
|
||||
end
|
||||
puts "Syncing profile for #{staff_id} complete."
|
||||
puts "*********************************************"
|
||||
end
|
||||
|
||||
def get_fgu_data(params_to_send)
|
||||
uri = URI.parse("http://120.101.66.83/fgu/?plugin=#{params_to_send["plugin"]}&id=#{params_to_send["id"]}")
|
||||
# uri = URI.parse("http://127.0.0.1/fgu/?plugin=#{params_to_send["plugin"]}&id=#{params_to_send["id"]}")
|
||||
http = Net::HTTP.new(uri.host, uri.port)
|
||||
request = Net::HTTP::Get.new(uri.request_uri)
|
||||
response = http.request(request)
|
||||
data = JSON.parse(response.body) rescue nil
|
||||
return data
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue