diff --git a/fgu_sync.rake b/fgu_sync.rake
new file mode 100644
index 0000000..5ca0f97
--- /dev/null
+++ b/fgu_sync.rake
@@ -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 += "#{course["course_id"]} #{course["course_name"]}
"
+ 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
+