sync_personal_data_task_for.../lib/tasks/sync_asia_personal_data_tas...

365 lines
16 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

require 'net/http'
module AsiaSyncPlugin
class SafeHash < Hash
attr_accessor :duplicate_check_off
def []=(key, value)
if !duplicate_check_off && has_key?(key)
super(key,Array(self[key])+[value])
else
super
end
end
end
#ok 期刊論文Journal Papers
#ok 專書Books
#ok 專書論文Book Chapters
#ok 專利Patents
#ok 研討會論文Conference Papers
#ok 研究計畫Research Grant
#ok 獲獎Awards
#ok 展演Exhibitions
#ok 指導論文/ Thesis Advisor
#ok 授課課程Course Information
# 技術轉移Technology Transfers
#ok 創作Creative Design
# 指導大專生計畫College Student Participation in Research Projects
# ["journal", "books", "books1", "patent", "conference",
# "research", "award", ??技術移轉"tec_transfer", "show",創作 "create",
# 授課課程(教學資料)"cos_data", ??個人研究"paper_data", xx指導大專生計畫"college_data"]
# 缺少個人外掛: 創作 create 、 指導大專生計畫 college_data
#未完成: 技術移轉 tec_transfer
#待確認: 指導論文(可用個人研究製作) paper_data
def self.localize_data(data)
in_use_locales = Site.first.in_use_locales rescue [:en,:zh_tw]
return in_use_locales.map{|locale| [locale, data] }.to_h
end
# 期刊論文
def self.sync_journal_papers(query_result, user)
puts "Journal Paper for user: #{user.user_name}"
journal_papers = query_result["journal"].to_a
return if journal_papers.count == 0
#JournalPaper.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
journal_papers.each do |journal_paper|
jp = JournalPaper.where(:rss2_id=> journal_paper["ukey"]).first
jp = JournalPaper.new if jp.nil?
jp.rss2_id = journal_paper["ukey"]
jp.paper_title_translations = localize_data(journal_paper["Thesis_name"])
jp.journal_title_translations = localize_data(journal_paper["Journal_name"])
jp.authors_translations = localize_data(journal_paper["author"])
jp.year = journal_paper["Thesis_year"]
journal_paper_type = JournalPaperType.where(:title=>journal_paper["J_class"]).first
if journal_paper_type.nil?
journal_paper_type = JournalPaperType.create(:title_translations=>localize_data(journal_paper["J_class"]))
end
jp.journal_paper_type = journal_paper_type
jp.member_profile_id = user.member_profile_id
puts "Journal Paper #{jp.id} saved" if jp.save
end
end
# 研討會論文
def self.sync_conference_papers(query_result, user)
puts "Conference Paper for user: #{user.user_name}"
conference_papers = query_result["conference"].to_a
return if conference_papers.count == 0
#WritingConference.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
conference_papers.each do |conference_paper|
wc = WritingConference.where(:rss2_id=> conference_paper["ukey"]).first
wc = WritingConference.new if wc.nil?
wc.rss2_id = conference_paper["ukey"]
titles = conference_paper["name"].split("-")
wc.paper_title_translations = localize_data(titles[0])
wc.conference_title_translations = localize_data(titles[1])
wc.authors_translations = localize_data(conference_paper["author"])
wc.location_translations = localize_data(conference_paper["Sym_location"].strip)
wc.publication_date = DateTime.parse(conference_paper["Sym_YearMonth"].gsub('.','/')) rescue nil
wc.member_profile_id = user.member_profile_id
puts "conference paper #{wc.id} saved" if wc.save
end
end
# 研究計畫 Research Grants
def self.sync_projects(query_result, user)
puts "Projects(Research Grants) for user: #{user.user_name}"
projects = query_result["research"].to_a
return if projects.count == 0
#Project.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
projects.each do |project|
pj = Project.where(:rss2_id=> project["ukey"]).first
pj = Project.new if pj.nil?
pj.rss2_id = project["ukey"]
pj.project_title_translations = localize_data(project["name"]) #計畫名稱
pj.participator_translations = localize_data(project["author"]) #參與人
if project["period"].present? #計畫期間
period = project["period"].split('~').map{|date| DateTime.parse(date.gsub(".","/")) rescue nil }
pj.period_start_date = period[0]
pj.period_end_date = period[1]
end
pj.member_profile_id = user.member_profile_id
puts "Project(Research Grants) #{pj.id} saved" if pj.save
end
end
# 專書 books
def self.sync_books(query_result, user)
puts "books for user: #{user.user_name}"
books = query_result["books"].to_a
books1 = query_result["books1"].to_a
return if (books.count == 0 && books1.count == 0)
#Book.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
books.each do |book|
bk = Book.where(:rss2_id=> book["ukey"]).first
bk = Book.new if bk.nil?
bk.rss2_id = book["ukey"]
bk.book_title_translations = localize_data(book["Books_name"]) #書名
bk.authors_translations = localize_data(book["author"]) #作者
bk.publisher_translations = localize_data(book["Books_publisher"]) #出版社
if !(book["Books_YearMonth"].blank?) #出版日期
if book["Books_YearMonth"].scan(/[\.\/]/).length == 0 # ex: 2021
bk.publish_date = DateTime.parse(book["Books_YearMonth"] + "/1")
else #ex: 2017.03
bk.publish_date = DateTime.parse(book["Books_YearMonth"].gsub('.','/'))
end
end
if bk.publish_date
bk.year = bk.publish_date.year
end
bk.member_profile_id = user.member_profile_id
puts "books #{bk.id} saved" if bk.save
end
books1.each do |book|
bk = Book.where(:rss2_id=> book["ukey"]).first
bk = Book.new if bk.nil?
bk.rss2_id = book["ukey"]
bk.book_title_translations = localize_data(book["Books_name"]) #書名
bk.authors_translations = localize_data(book["author"]) #作者
bk.publisher_translations = localize_data(book["Books_publisher"]) #出版社
bk.year = book["Books_year"]
if !(book["Books_year"].blank?) #出版年度
bk.publish_date = DateTime.parse(book["Books_year"] + "/1")
end
bk.member_profile_id = user.member_profile_id
puts "books #{bk.id} saved" if bk.save
end
end
#專利 Patents
def self.sync_patents(query_result, user)
puts "Patents for user: #{user.user_name}"
patents = query_result["patent"].to_a
return if (patents.count == 0 )
#Patent.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
patents.each do |patent|
pt = Patent.where(:rss2_id=> patent["ukey"]).first
pt = Patent.new if pt.nil?
pt.rss2_id = patent["ukey"]
pt.patent_title_translations = localize_data(patent["Patent_name"]) #專利名稱
pt.patent_no = patent["Patent_id"] #專利編號
if patent["Patent_class"].present? #專利類別
end
if patent["sDate"].present?
period = patent["sDate"].split('~').map{|date| DateTime.parse(date) rescue nil}
pt.publish_date = period[0]
pt.application_date = period[0]
pt.end_date = period[1]
end
pt.member_profile_id = user.member_profile_id
puts "Patent #{pt.id} saved" if pt.save
end
end
#獲獎(榮譽) Award
def self.sync_honors(query_result, user)
puts "Honors(Awards) for user: #{user.user_name}"
honors = query_result["award"].to_a
return if (honors.count == 0 )
#Honor.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
honors.each do |honor|
hn = Honor.where(:rss2_id=> honor["ukey"]).first
hn = Honor.new if hn.nil?
hn.rss2_id = honor["ukey"]
hn.award_name_translations = localize_data(honor["Award_name"]) #獎項名稱
hn.awarding_unit_translations = localize_data(honor["Award_unit"][0].to_s.gsub("授獎單位:","").strip) #頒獎單位
hn.award_date = DateTime.parse(honor["Award_Date"].gsub('.','/')) rescue nil #獲獎日期
hn.member_profile_id = user.member_profile_id
puts "Honor(Award) #{hn.id} saved" if hn.save
end
end
#教師參與展演活動(展演) Show
def self.sync_activities(query_result, user)
puts "Activities(Shows) for user: #{user.user_name}"
activities = query_result["show"].to_a
return if (activities.count == 0 )
#Activity.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
activities.each do |activity|
act = Activity.where(:rss2_id=> activity["ukey"]).first
act = Activity.new if act.nil?
act.rss2_id = activity["ukey"]
act.activity_name_translations = localize_data(activity["show_name"]) #活動名稱
act.activity_area_translations = localize_data(activity["show_author_local"]) #地點
if activity["period"].present? #展演期間
period = activity["period"].split('~').map{|date| DateTime.parse(date) rescue nil}
act.activity_start_date = period[0]
act.activity_end_date = period[1]
end
act.member_profile_id = user.member_profile_id
puts "Activity(Show) #{act.id} saved" if act.save
end
end
#授課課程(教學資料) Course Information
def self.sync_courses(query_result, user)
puts "Courses(Course Information) for user: #{user.user_name}"
courses = query_result["cos_data"].to_a
return if (courses.count == 0 )
#Course.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
courses.each do |course|
cs = Course.where(:rss2_id=> course["ukey"]).first
cs = Course.new if cs.nil?
cs.rss2_id = course["ukey"]
cs.title_translations = localize_data(course["cos_came"]) #課程名稱
cs.objective_translations = localize_data(course["cos_data_nm"]) #課程目標(簡介)
course_class = course["cos_data_nm"].split(/[\(\)]/)[1].strip rescue "" #課程類別
if !course_class.blank?
course_category = CourseCategory.where(:title => course_class).first
if course_category.nil?
course_category = CourseCategory.create(:title_translations=>localize_data(course_class))
end
cs.course_category = course_category
end
course_year_semester = course["cos_data_nm"].split(/[【】]/)[1].strip rescue "" #學年度和學期 ex: 第109學年第2學期A班
if !course_year_semester.blank?
year = course_year_semester.split(/[第學]/)[1].strip rescue nil
cs.year = year
course_semester_title = course_year_semester.split(/[年:]/)[1].strip rescue ""
if !course_semester_title.blank?
course_semester = CourseSemester.where(:title=>course_semester_title).first
if course_semester.nil?
course_semester = CourseSemester.create(:title_translations=>localize_data(course_semester_title))
end
cs.course_semester = course_semester
end
end
cs.course_code = course["cos_data"] #課程代碼 ex: "ES200023A"
cs.member_profile_id = user.member_profile_id
puts "Course(Course Information) #{cs.id} saved" if cs.save
end
end
#指導論文(個人研究) Thesis Advisor
def self.sync_researches(query_result, user)
puts "Researches(Thesis Advisor) for user: #{user.user_name}"
researches = query_result["paper_data"].to_a
return if (researches.count == 0 )
#Research.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
researches.each do |research|
rs = Research.where(:rss2_id=> research["ukey"]).first
rs = Research.new if rs.nil?
rs.rss2_id = research["ukey"]
rs.research_title_translations = localize_data(research["thesis_name"].to_s.gsub("_#{research["chi_name"]}","")) #論文名稱
rs.extracted_chapters_translations = localize_data(research["Paper_unit"]) #系所(摘要)
rs.keywords = research["Paper_unit"] #系所(關鍵字)
rs.authors_translations = localize_data(research["chi_name"]) #作者
rs.year = research["year"] #年度
rs.member_profile_id = user.member_profile_id
puts "Research(Thesis Advisor) #{rs.id} saved" if rs.save
end
end
#創作 Create design
def self.sync_create_designs(query_result, user)
puts "Create Designs for user: #{user.user_name}"
create_designs = query_result["create"].to_a
return if (create_designs.count == 0 )
#CreateDesign.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
create_designs.each do |create_design|
cd = CreateDesign.where(:rss2_id=> create_design["ukey"]).first
cd = CreateDesign.new if cd.nil?
cd.rss2_id = create_design["ukey"]
cd.design_translations = localize_data(create_design["Create_name"].to_s.split("設計:")[1..-1].join("")) #設計
cd.create_location_translations = localize_data(create_design["Create_location"]) #地點
cd.publish_date = Date.parse(create_design["Create_sdate"].gsub(".","/")) rescue nil #系所(關鍵字)
cd.member_profile_id = user.member_profile_id
puts "Create Design #{cd.id} saved" if cd.save
end
end
#技術轉移
def self.sync_tec_transfers(query_result, user)
puts "Technology Transfers for user: #{user.user_name}"
tec_transfers = query_result["tec_transfer"].to_a
return if (tec_transfers.count == 0 )
#TecTransfer.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
tec_transfers.each do |tec_transfer|
tt = TecTransfer.where(:rss2_id=> tec_transfer["ukey"]).first
tt = TecTransfer.new if tt.nil?
tt.rss2_id = tec_transfer["ukey"]
tt.patent_number = tec_transfer["ukey"]
tt.trans_name_translations = localize_data(tec_transfer["Trans_Data_NAME"]) #設計
tt.trans_unit_translations = localize_data(tec_transfer["Trans_Unit"]) #地點
if tec_transfer["period"].present? #展演期間
period = tec_transfer["period"].split('~').map{|date| Date.parse(date) rescue nil}
tt.period_start = period[0]
tt.period_end = period[1]
end
tt.member_profile_id = user.member_profile_id
puts "Technology Transfer #{tt.id} saved" if tt.save
end
end
#指導大專生計畫 College Student Participation in Research Projects
def self.sync_college_projects(query_result, user)
puts "College Projects for user: #{user.user_name}"
college_projects = query_result["college_data"].to_a
return if (college_projects.count == 0 )
#CollegeProject.where(member_profile_id: user.member_profile_id,:rss2_id=>nil).destroy
college_projects.each do |college_project|
cp = CollegeProject.where(:rss2_id=> college_project["ukey"]).first
cp = CollegeProject.new if cp.nil?
cp.rss2_id = college_project["ukey"]
cp.year = college_project["college_year_sch"]
cp.project_name_translations = localize_data(college_project["College_name"]) #計畫名稱
college_tch_std = college_project["College_tch_std"].to_s.split("<br>").map{|v| v.split(":")[1..-1].join("").strip}
cp.advising_professor_translations = localize_data(college_tch_std[0]) #指導教授
cp.student_name_translations = localize_data(college_tch_std[1]) #學生姓名
cp.department_translations = localize_data(college_project["College_unit_nm"].strip)
cp.member_profile_id = user.member_profile_id
puts "College Project #{cp.id} saved" if cp.save
end
end
end
namespace :sync_asia_personal_plugins do
desc 'sync_personal_plugins from Asia'
task :sync => [:environment] do
User.each do |user|
puts "Fetching data for #{user.user_name}..."
query_result = get_sync_data(user.user_name)
#puts ["query_result",query_result]
AsiaSyncPlugin.sync_journal_papers(query_result, user)
AsiaSyncPlugin.sync_books(query_result, user)
AsiaSyncPlugin.sync_conference_papers(query_result, user)
AsiaSyncPlugin.sync_projects(query_result, user)
AsiaSyncPlugin.sync_patents(query_result, user)
AsiaSyncPlugin.sync_honors(query_result, user)
AsiaSyncPlugin.sync_activities(query_result, user)
AsiaSyncPlugin.sync_courses(query_result, user)
AsiaSyncPlugin.sync_researches(query_result, user)
AsiaSyncPlugin.sync_create_designs(query_result, user)
AsiaSyncPlugin.sync_tec_transfers(query_result, user)
AsiaSyncPlugin.sync_college_projects(query_result, user)
end
end
def get_sync_data(user_id)
uri = URI.parse("https://webap.asia.edu.tw/cfd2020/API/Research/Load")
res = Net::HTTP.get_response(uri + "?#{{:id=> user_id}.to_query}")
return JSON.parse(res.body,{object_class: AsiaSyncPlugin::SafeHash})
end
end