class AsiaDatabasesController < ApplicationController include Admin::AsiaDatabasesHelper ExtraFields = { 'discipline_expertise'=> ['discipline_expertise'], 'project'=> ['project_name', 'start_date', 'sponsor'], 'paper'=> ['paper_name', 'issue_year', 'journal_name'], 'patent'=> ['patent_name', 'certification_date', 'patent_country'], 'tec_transfer'=> ['tech_transfer_name', 'start_date', 'receiving_unit'], 'exhibition'=> ['exhibition_name', 'exhibition_date', 'host'] } def render_404 render :file => "#{Rails.root}/app/views/errors/404.html", :layout => false, :status => :not_found, :content_type => 'text/html' end def get_data(params, for_frontend=false) # choice unit choice_unit = [] selected_unit = params[:unit] selected_academy = nil if selected_unit == 'all' choice_unit << {"choice_value"=> 'all', "choice_show"=> 'All', 'choice_select'=> 'selected'} AsiaAcademy.all.each do |academy| choice_unit << {"choice_value"=> academy.uid, "choice_show"=> academy.academy_name, 'choice_select'=>''} end else choice_unit << {"choice_value"=> 'all', "choice_show"=> 'All', 'choice_select'=> ''} AsiaAcademy.all.each do |academy| uid = academy.uid if uid == selected_unit selected_academy = academy choice_select = 'selected' else choice_select = '' end choice_unit << {"choice_value"=> uid, "choice_show"=> academy.academy_name, 'choice_select'=> choice_select} end end # choice field choice_field = [] fields_to_select = ["patent", "project", "paper", "discipline_expertise", "tec_transfer", "exhibition"] fields_to_select.each do |fs| choice_field << {'choice_show'=> t("asia_database.extend_translate.#{fs}"), 'choice_value' => fs, 'choice_select' => ''} end selected_field_int = 0 selected_field = fields_to_select[0] choice_field.each_with_index do |h, i| field_name = h['choice_value'] if field_name == params[:field] h['choice_select'] = 'selected' selected_field = field_name selected_field_int = i break end end fields_to_show = ['academy', 'department', 'teacher'] if selected_field == "discipline_expertise" fields_to_show += ExtraFields[selected_field] table_headers = fields_to_show.map do |fs| { 'head-title' => t("asia_database.#{fs}") } end else table_headers = fields_to_show.map do |fs| { 'head-title' => t("asia_database.#{fs}") } end fields_to_show = fields_to_show.map{|fs| "asia_teacher.#{fs}"} extra_fields = ExtraFields[selected_field] fields_to_show += extra_fields table_headers += extra_fields.map do |fs| { 'head-title' => t("asia_database.asia_#{selected_field}.#{fs}") } end end search_field = nil if selected_field_int == 3 #Discipline Expertise if selected_academy asia_data = selected_academy.asia_teachers else asia_data = AsiaTeacher.all end search_field = 'discipline_expertise' elsif selected_field_int == 1 #Project if selected_academy asia_data = AsiaProject.where(:asia_teacher_id.in=>selected_academy.asia_teacher_ids) else asia_data = AsiaProject.all end search_field = 'project_name' elsif selected_field_int == 2 #Paper if selected_academy asia_data = AsiaPaper.where(:asia_teacher_id.in=>selected_academy.asia_teacher_ids) else asia_data = AsiaPaper.all end search_field = 'paper_name' elsif selected_field_int == 0 #Patent if selected_academy asia_data = AsiaPatent.where(:asia_teacher_id.in=>selected_academy.asia_teacher_ids) else asia_data = AsiaPatent.all end search_field = 'patent_name' elsif selected_field_int == 4 #Technology Transfer if selected_academy asia_data = AsiaTecTransfer.where(:asia_teacher_id.in=>selected_academy.asia_teacher_ids) else asia_data = AsiaTecTransfer.all end search_field = 'tech_transfer_name' elsif selected_field_int == 5 #Exhibition if selected_academy asia_data = AsiaExhibition.where(:asia_teacher_id.in=>selected_academy.asia_teacher_ids) else asia_data = AsiaExhibition.all end search_field = 'exhibition_name' end asia_data = asia_data.sort_order if params[:keywords].present? asia_data = filter_keywords(asia_data,search_field,params[:keywords]) end if for_frontend asia_data = asia_data.page(params[:page_no]).per(OrbitHelper.page_data_count) end asia_data_list = [] if !params['keywords'].nil? if for_frontend asia_data_list = asia_data.collect do |asia_record| {'jps' => fields_to_show.map{|field| {"value"=> get_display_field(asia_record,field)}}} end else all_count = asia_data.count store_record_id = @store_record.id asia_data_list = asia_data.collect.with_index do |asia_record, i| AsiaExportStore.where(:id=>store_record_id).update_all(:finish_percent=> ((i + 1) * 100.0 / all_count).round(1)) fields_to_show.map{|field| get_raw_field(asia_record, field)} end end end return asia_data_list, asia_data, table_headers, choice_unit, choice_field end def index params = OrbitHelper.params # page = OrbitHelper.page rescue Page.where(page_id: params[:page_id]).first asia_data_list, asia_data, table_headers, choice_unit, choice_field = get_data(params, true) download_excel_text = t('asia_database.extend_translate.download_excel') select_field_text = t('asia_database.extend_translate.search_field') select_text = t('asia_database.extend_translate.search_class') search_text = t('asia_database.extend_translate.word_to_search') @_request = OrbitHelper.request csrf_value = form_authenticity_token extras = {} #{"th-academy" => I18n.t("asia_database.academy"), "th-department" => I18n.t("asia_database.department"), "th-teacher" => I18n.t("asia_database.teacher"), "th-discipline_expertise" => I18n.t("asia_database.discipline_expertise"), "th-asia_project.project_name" => I18n.t("asia_database.asia_project.project_name"), "th-asia_project.start_date" => I18n.t("asia_database.asia_project.start_date"), "th-asia_project.sponsor" => I18n.t("asia_database.asia_project.sponsor"), "th-asia_paper.paper_name" => I18n.t("asia_database.asia_paper.paper_name"), "th-asia_paper.issue_year" => I18n.t("asia_database.asia_paper.issue_year"), "th-asia_paper.journal_name" => I18n.t("asia_database.asia_paper.journal_name"), "th-asia_patent.patent_name" => I18n.t("asia_database.asia_patent.patent_name"), "th-asia_patent.certification_date" => I18n.t("asia_database.asia_patent.certification_date"), "th-asia_patent.patent_country" => I18n.t("asia_database.asia_patent.patent_country"), "th-asia_tec_transfer.tech_transfer_name" => I18n.t("asia_database.asia_tec_transfer.tech_transfer_name"), "th-asia_tec_transfer.start_date" => I18n.t("asia_database.asia_tec_transfer.start_date"), "th-asia_tec_transfer.receiving_unit" => I18n.t("asia_database.asia_tec_transfer.receiving_unit"), "th-asia_exhibition.exhibition_name" => I18n.t("asia_database.asia_exhibition.exhibition_name"), "th-asia_exhibition.exhibition_date" => I18n.t("asia_database.asia_exhibition.exhibition_date"), "th-asia_exhibition.host" => I18n.t("asia_database.asia_exhibition.host")} tmp_id = Time.now.to_i.to_s + '-' + csrf_value.gsub(/[\n\/]/, '') extras = extras.merge({ 'url' => '/' + I18n.locale.to_s + params[:url], 'download_url' => "/xhr/asia_database/download_excel?tmp_id=#{tmp_id}", 'export_url' => '/xhr/asia_database/export_excel', 'check_url' => "/xhr/asia_database/get_store_status?tmp_id=#{tmp_id}", 'download_excel_text' => download_excel_text, 'select_field_text' => select_field_text, 'select_text' => select_text, 'search_text' => search_text, 'search_value' => params[:keywords].to_s.gsub(/\"/,''), 'search_trans' => t('asia_database.extend_translate.search'), 'unit_trans' => t('asia_database.extend_translate.unit'), 'csrf_value' => csrf_value, 'tmp_id' => tmp_id }) extras["widget-title"] = I18n.t("module_name.asia_database") { "asia_databases" => asia_data_list, "headers" => table_headers, "extras" => extras, "total_pages" => asia_data.total_pages, 'choice_unit' => choice_unit, 'choice_field' => choice_field } end def export_excel tmp_id = params['tmp_id'] if tmp_id.blank? render(:nothing => true) and return end AsiaExportStore.where(:tmp_id.ne=>tmp_id, :updated_at.lte=> Time.now.to_i - 3600 * 24).destroy filter_str = params.except('action', 'controller', 'tmp_id').to_query @store_record = AsiaExportStore.any_of([{:tmp_id=>tmp_id}, {:filter_str=>filter_str}]).first if @store_record.nil? @store_record = AsiaExportStore.new(:tmp_id=>tmp_id) else if @store_record.filter_str == filter_str render :json => {success: true} and return end @store_record.reinit end @store_record.filter_str = filter_str @store_record.save Thread.new do begin @asia_data_list, asia_data, @table_headers, choice_unit, choice_field = get_data(params) store_record_id = @store_record.id AsiaExportStore.where(:id=>store_record_id).update_all(:status=>1) @excel_title = I18n.t("module_name.asia_database") excel_contents = render_to_string( handlers: [:axlsx], formats: [:xlsx] ,partial: 'export_excel.xlsx',locals: {:@asia_data_list=> @asia_data_list, :@table_headers=> @table_headers, :@excel_title=> @excel_title} ) File.open(@store_record.file_path, 'w') do |f| f.write excel_contents end AsiaExportStore.where(:id=>store_record_id).update_all(:status=>2) rescue => e puts [e.to_s, e.backtrace] end end render :json => {success: true} end def download_excel tmp_id = params['tmp_id'] @store_record = AsiaExportStore.where(:tmp_id=>tmp_id).first if @store_record.nil? || @store_record.status != 2 render_404 else send_file(@store_record.file_path,:filename=>'export_excel.xlsx') end end def get_store_status tmp_id = params['tmp_id'] @store_record = AsiaExportStore.where(:tmp_id=>tmp_id).first if @store_record.nil? render :json => {:finish_percent=> 0, :status=> 0} else render :json => {:finish_percent=> @store_record.finish_percent, :status=> @store_record.status} end end def show params = OrbitHelper.params plugin = AsiaTeacher.where(:is_hidden=>false).find_by(uid: params[:uid].to_s) fields_to_show = ["academy", "department", "teacher", "discipline_expertise", "asia_project.project_name", "asia_project.start_date", "asia_project.sponsor", "asia_paper.paper_name", "asia_paper.issue_year", "asia_paper.journal_name", "asia_patent.patent_name", "asia_patent.certification_date", "asia_patent.patent_country", "asia_tec_transfer.tech_transfer_name", "asia_tec_transfer.start_date", "asia_tec_transfer.receiving_unit", "asia_exhibition.exhibition_name", "asia_exhibition.exhibition_date", "asia_exhibition.host"] {"plugin_datas"=>plugin.get_plugin_data(fields_to_show)} end def get_raw_field(asia_teacher, field) text_only = false value = asia_teacher.send(field) rescue "" if field.include?(".") value = asia_teacher field.split(".").each{|f| value = value.send(f) rescue nil} end if value.class == Array value = value.join("\n") end return value end def get_display_field(model,field) text_only = false value = "" if field.include?(".") field_level = field.split(".") field_level[0...-1].each do |f| model = model.send(f) rescue model end if field_level[-1] == 'teacher' value = teacher_frontend_text(model) else value = model.send(field_level[-1]) end else if field == 'teacher' value = teacher_frontend_text(model) else value = model.send(field) end end if value.class == Array tmp = '' value = tmp end # file_fields = [] # link_fields = [] # member_fields = [] # if file_fields.include?(field) # files = asia_teacher.send(field.pluralize) # value = files.map do |file| # url = file.file.url # title = (file.title.blank? ? File.basename(file.file.path) : file.title) # "
  • #{title}
  • " # end # value = value.join("") # elsif link_fields.include?(field) # links = asia_teacher.send(field.pluralize) # value = links.map do |link| # url = link.url # title = (link.title.blank? ? url : link.title) # "
  • #{title}
  • " # end # value = value.join("") # elsif member_fields.include?(field) # members = asia_teacher.send(field.pluralize) # value = members.map{|m| # path = OrbitHelper.url_to_plugin_show(m.to_param, 'member') rescue '#' # ((text_only rescue false) ? m.name : "#{m.name}") # } # join_text = (text_only rescue false) ? "," : "
    " # value = value.join(join_text) # elsif field == "authors" # value = get_authors_show(asia_teacher) # end # strftime_hash = {} # if strftime_hash.keys.include?(field) # value = value.strftime(strftime_hash[field]) rescue value # end # if field == "teacher" # link = OrbitHelper.url_to_plugin_show(asia_teacher.to_param,'asia_database') # tmp_title = value # url_to_plugin_show_blank = OrbitHelper.instance_variable_get(:@url_to_plugin_show_blank) # value = url_to_plugin_show_blank ? tmp_title : "#{tmp_title}" # end return value end def get_fields_for_index @page = Page.find(params[:page_id]) rescue nil @fields_to_show = ["sid", "academy", "department", "teacher", "url", "discipline_expertise", "asia_project.project_name", "asia_project.start_date", "asia_project.sponsor", "asia_paper.paper_name", "asia_paper.issue_year", "asia_paper.journal_name", "asia_patent.patent_name", "asia_patent.certification_date", "asia_patent.patent_country", "asia_tec_transfer.tech_transfer_name", "asia_tec_transfer.start_date", "asia_tec_transfer.receiving_unit", "asia_exhibition.exhibition_name", "asia_exhibition.exhibition_date", "asia_exhibition.host"] @fields_to_show = @fields_to_show.map { |fs| [t("asia_database.#{fs}"), fs] } if @page.present? && @page.custom_string_field == 'table' @default_fields_to_show = ["academy", "department", "teacher", "discipline_expertise", "asia_project.project_name", "asia_project.start_date", "asia_project.sponsor", "asia_paper.paper_name", "asia_paper.issue_year", "asia_paper.journal_name", "asia_patent.patent_name", "asia_patent.certification_date", "asia_patent.patent_country", "asia_tec_transfer.tech_transfer_name", "asia_tec_transfer.start_date", "asia_tec_transfer.receiving_unit", "asia_exhibition.exhibition_name", "asia_exhibition.exhibition_date", "asia_exhibition.host"] else @default_fields_to_show = ["year", "teacher"] end render layout: false end def save_index_fields page = Page.find(params[:page_id]) rescue nil page.custom_array_field = params[:keys] page.save render json: { 'success' => true }.to_json end def filter_keywords(asia_data,select_field,keywords) member_fields = [] file_fields = [] link_fields = [] if select_field == nil asia_data = asia_data.where(:slug_title=>/#{gsub_invalid_character(keywords)}/) elsif select_field == "member_profile" ms = MemberProfile.all.select{|m| m.name.include?(keywords)} asia_data = asia_data.where(:member_profile_id.in=>ms.map{|m| m.id}) elsif member_fields.include?(select_field) ms = MemberProfile.all.select{|m| m.name.include?(keywords)} m_ids = ms.map{|m| m.id.to_s } tmp_asia_data = asia_data.select{|p| (p.send("#{select_field.singularize}_ids") & m_ids).count != 0} asia_data = asia_data.where(:id.in=>tmp_asia_data.map{|p| p.id}) elsif select_field.split(".").count > 1 relate_name = select_field.split(".").first field_name = select_field.split(".").last.gsub(/^\$+/, '') relate = relate_name.camelize.constantize relate_ids = relate.where(field_name=>/#{gsub_invalid_character(keywords)}/).pluck(:id) asia_data = asia_data.where("#{relate_name.singularize}_id"=>{'$in'=>relate_ids}) elsif (asia_data.klass.fields[select_field].options[:type] == Date rescue false) keywords = keywords.split(/[\/\-]/) if keywords.count > 1 Date.parse(keywords.join("/")) else start_date = Date.parse(keywords[0] + "/1/1") end_date = Date.parse(keywords[0] + "/12/31") asia_data = asia_data.where(select_field=>{'$gte'=>start_date,'$lte'=>end_date}) end elsif (asia_data.klass.fields[select_field].options[:type] == DateTime rescue false) keywords = keywords.split(/[\/\-]/) if keywords.count > 1 DateTime.parse(keywords.join("/")) elsif keywords[0].include?(":") tmp_asia_data = asia_data.select{|p| (p.send(select_field).strftime('%Y/%m/%d %H:%M').include?(keywords[0]) rescue false)} asia_data = asia_data.where(:id.in=>tmp_asia_data.map{|p| p.id}) else start_date = DateTime.parse(keywords[0] + "/1/1 00:00") end_date = DateTime.parse(keywords[0] + "/12/31 23:59") asia_data = asia_data.where(select_field=>{'$gte'=>start_date,'$lte'=>end_date}) end elsif (asia_data.klass.fields[select_field].options[:type] == Integer rescue false) tmp_asia_data = asia_data.select{|p| p.send(select_field).to_s.include?(keywords)} asia_data = asia_data.where(:id.in=>tmp_asia_data.map{|p| p.id}) elsif file_fields.include?(select_field) file_field = select_field.camelize.constantize ids1 = file_field.where(:file=>/#{gsub_invalid_character(keywords)}/).pluck(:id) ids2 = file_field.where(:title=>/#{gsub_invalid_character(keywords)}/).pluck(:id) ids = ids1 + ids2 tmp_asia_data = asia_data.select{|p| (p.send("#{select_field}_ids") & ids).count != 0} asia_data = asia_data.where(:id.in=>tmp_asia_data.map{|p| p.id}) elsif link_fields.include?(select_field) link_field = select_field.camelize.constantize ids1 = link_field.where(:title=>/#{gsub_invalid_character(keywords)}/).pluck(:id) ids2 = link_field.where(:url=>/#{gsub_invalid_character(keywords)}/).pluck(:id) ids = ids1 + ids2 tmp_asia_data = asia_data.select{|p| (p.send("#{select_field}_ids") & ids).count != 0} asia_data = asia_data.where(:id.in=>tmp_asia_data.map{|p| p.id}) else asia_data = asia_data.where(select_field=>/#{gsub_invalid_character(keywords)}/) end return asia_data end def gsub_invalid_character(text) ::Regexp.escape(text.to_s) end def teacher_frontend_text(value) tmp_value = value.teacher "#{tmp_value}" end end