# encoding: utf-8 class Admin::CancerpredictsController < OrbitAdminController require "spreadsheet" require "rubyXL" require "fileutils" require "axlsx" require "csv" #include Admin::CancerpredictsHelper before_action ->(module_app = @app_title) { set_variables module_app } before_action :create_first_field helper Admin::CancerpredictsHelper #before_action :load_access_levels def initialize super @app_title = "cancerpredict" end def yaml_load(v) YAML.load(v) end def index @tags = @module_app.tags @categories = @module_app.categories.enabled @filter_fields = filter_fields(@categories, @tags) @table_fields = [:status, :category, :title, :start_date, :end_date, :last_modified] @head_images_id = @form_to_show.head_images_id @title_images_id = @form_to_show.title_images_id @head_images = [] @title_images = [] @head_images_id.each { |image_id| @head_images.push Headimages.find_by(:id => image_id.to_s) } rescue nil @title_images_id.each { |image_id| @title_images.push Headimages.find_by(:id => image_id.to_s) } rescue nil @head_new_image = Headimages.new(:cancerpredictfields_id => @form_to_show.id) end def edit other_in_use_locales = Site.first.in_use_locales.map { |l| l.to_s } other_in_use_locales.delete(params[:locale]) if !(params["cancerpredictfields"].nil?) if !(params["cancerpredictfields"]["form_show"].nil?) params["cancerpredictfields"]["form_show"].each do |num, property| property.each do |key, value| if key.include?("_file") && (!value[:temp_file].blank? rescue false) if value[:id].nil? mapping_file = CancerPredictMappingFile.create(value) else mapping_file = CancerPredictMappingFile.find(value[:id]) mapping_file.temp_file = value[:temp_file] mapping_file.save end @form_to_show.form_show[num.to_s][key.to_s] = mapping_file.id elsif key.include?("_file") if value[:_destroy] == "1" mapping_file = CancerPredictMappingFile.find(value[:id]) mapping_file.destroy @form_to_show.form_show[num.to_s][key.to_s] = "" end end next if key.include?("_file") if (key != "old_num") if key != params[:locale] @form_to_show.form_show[num.to_s] = {} if @form_to_show.form_show[num.to_s].nil? type = Cancerpredictfields::FIELDINFO[key.to_s] if type && Cancerpredictfields::Field_relations[type] type = Cancerpredictfields::Field_relations[type] end type = type.constantize rescue String if type != Array if type == Fixnum @form_to_show.form_show[num.to_s][key.to_s] = value.to_i rescue 0 elsif type == Float @form_to_show.form_show[num.to_s][key.to_s] = value.to_f rescue 0.0 else @form_to_show.form_show[num.to_s][key.to_s] = value end else if value.length > 2 @form_to_show.form_show[num.to_s][key.to_s] = yaml_load(value) else @form_to_show.form_show[num.to_s][key.to_s] = [] end end else value.each do |sub_property, sub_value| type = Cancerpredictfields::FIELDINFO[sub_property.to_s] if type && Cancerpredictfields::Field_relations[type] type = Cancerpredictfields::Field_relations[type] end type = type.constantize rescue String @form_to_show.form_show[num.to_s][sub_property] = {} if @form_to_show.form_show[num.to_s][sub_property].nil? if type != Array if type == Fixnum @form_to_show.form_show[num.to_s][sub_property][params[:locale].to_s] = sub_value.to_i rescue 0 elsif type == Float @form_to_show.form_show[num.to_s][sub_property][params[:locale].to_s] = sub_value.to_f rescue 0.0 else @form_to_show.form_show[num.to_s][sub_property][params[:locale].to_s] = sub_value end else if sub_value.length > 2 @form_to_show.form_show[num.to_s][sub_property][params[:locale].to_s] = yaml_load(sub_value) else @form_to_show.form_show[num.to_s][sub_property][params[:locale].to_s] = [] end end if (property["old_num"].present? && property["old_num"] != num.to_s) other_in_use_locales.each do |locale| @form_to_show.form_show[num.to_s][sub_property][locale] = @form_to_show.form_show_was[property["old_num"]][sub_property][locale] end end end end end end end org_nums = @form_to_show.form_show_was.keys remain_org_nums = params["cancerpredictfields"]["form_show"].values.map { |property| property["old_num"] }.select { |n| n.present? } delete_nums = org_nums - remain_org_nums if !delete_nums.blank? delete_nums.each do |delete_num| @form_to_show.form_show.delete(delete_num) end end @form_to_show.form_show = @form_to_show.form_show.values.map.with_index { |v, i| [i.to_s, v] }.to_h else @form_to_show.form_show = {} end if !params["cancerpredictfields"]["form_show_in_result"].nil? params["cancerpredictfields"]["form_show_in_result"].each do |num, property| property.each do |key, value| if key.include?("_file") && (!value[:temp_file].blank? rescue false) if value[:id].nil? mapping_file = CancerPredictMappingFile.create(value) else mapping_file = CancerPredictMappingFile.find(value[:id]) mapping_file.temp_file = value[:temp_file] mapping_file.save end @form_to_show.form_show[num.to_s][key.to_s] = mapping_file.id elsif key.include?("_file") if value[:_destroy] == "1" mapping_file = CancerPredictMappingFile.find(value[:id]) mapping_file.destroy @form_to_show.form_show_in_result[num.to_s][key.to_s] = "" end end next if key.include?("_file") if (key != "old_num") if key != params[:locale] @form_to_show.form_show_in_result[num.to_s] = {} if @form_to_show.form_show_in_result[num.to_s].nil? type = Cancerpredictfields::FIELDINFO[key.to_s] if type && Cancerpredictfields::Field_relations[type] type = Cancerpredictfields::Field_relations[type] end type = type.constantize rescue String if type != Array if type == Fixnum @form_to_show.form_show_in_result[num.to_s][key.to_s] = value.to_i rescue 0 elsif type == Float @form_to_show.form_show_in_result[num.to_s][key.to_s] = value.to_f rescue 0.0 else @form_to_show.form_show_in_result[num.to_s][key.to_s] = value end else if value.length > 2 @form_to_show.form_show_in_result[num.to_s][key.to_s] = yaml_load(value) else @form_to_show.form_show_in_result[num.to_s][key.to_s] = [] end end else value.each do |sub_property, sub_value| type = Cancerpredictfields::FIELDINFO[sub_property.to_s] if type && Cancerpredictfields::Field_relations[type] type = Cancerpredictfields::Field_relations[type] end type = type.constantize rescue String @form_to_show.form_show_in_result[num.to_s][sub_property] = {} if @form_to_show.form_show_in_result[num.to_s][sub_property].nil? if type != Array if type == Fixnum @form_to_show.form_show_in_result[num.to_s][sub_property][params[:locale].to_s] = sub_value.to_i rescue 0 elsif type == Float @form_to_show.form_show_in_result[num.to_s][sub_property][params[:locale].to_s] = sub_value.to_f rescue 0.0 else @form_to_show.form_show_in_result[num.to_s][sub_property][params[:locale].to_s] = sub_value end else if sub_value.length > 2 @form_to_show.form_show_in_result[num.to_s][sub_property][params[:locale].to_s] = yaml_load(sub_value) else @form_to_show.form_show_in_result[num.to_s][sub_property][params[:locale].to_s] = [] end end if (property["old_num"].present? && property["old_num"] != num.to_s) other_in_use_locales.each do |locale| @form_to_show.form_show_in_result[num.to_s][sub_property][locale] = @form_to_show.form_show_was[property["old_num"]][sub_property][locale] end end end end end end end org_nums = @form_to_show.form_show_in_result_was.keys remain_org_nums = params["cancerpredictfields"]["form_show_in_result"].values.map { |property| property["old_num"] }.select { |n| n.present? } delete_nums = org_nums - remain_org_nums if !delete_nums.blank? delete_nums.each do |delete_num| @form_to_show.form_show_in_result.delete(delete_num) end end @form_to_show.form_show_in_result = @form_to_show.form_show_in_result.values.map.with_index { |v, i| [i.to_s, v] }.to_h else @form_to_show.form_show_in_result = {} end @create_items = ["title_texts", "form_result_is_right", "text_descibe", "years", "table_above_texts", "text_above_texts", "surgery_only_texts", "extra_texts", "extra_therapy_texts", "danger_texts", "texts_between_Result_and_result_block", "prediction_formula", "hidden_variables", "advance_mode", "years_settings"] params_cancer = params.require("cancerpredictfields").permit! @create_items.each do |item| if (@form_to_show[item].class == BSON::Document) || (@form_to_show.send(item).class == Hash) item_hash = @form_to_show[item] item_hash = item_hash.merge(params_cancer[item]) @form_to_show[item] = item_hash elsif @form_to_show[item].class == Array if params_cancer[item].class != Array @form_to_show[item] = yaml_load(params_cancer[item]) rescue [] else @form_to_show[item] = params_cancer[item] end @form_to_show[item] = [] if @form_to_show[item].class != Array else @form_to_show[item] = params_cancer[item] end end @size = ["small", "medium", "large"] @size.each { |size| @form_to_show[size] = params["cancerpredictfields"][size].to_h } @file_path = Rails.root.to_s + "/app/assets/images/predict_tool" if !Dir.exist? @file_path FileUtils.mkdir_p @file_path end @images = params["cancerpredictfields"]["head_images"] @head_images_id = @form_to_show.head_images_id @delete_index = [] if !@images.nil? @images.each do |num, image| if num.to_i < @head_images_id.length && @head_images_id.length != 0 if image["remove_image"] == "1" @delete_index.push num.to_i else @image_id = @head_images_id[num.to_i] @image = Headimages.find_by(:id => @image_id.to_s) if !image["sort_number"].nil? @image.sort_number = image["sort_number"].to_i @image.save end next if image["temp_file"] == nil @file_name = image["temp_file"].original_filename.gsub("(", "_").gsub(")", "_").gsub(" ", "_") rescue next @image.sort_number = image["sort_number"].to_i @image.temp_file = image["temp_file"] @image.save end else @file_name = image["temp_file"].original_filename.gsub("(", "_").gsub(")", "_").gsub(" ", "_") rescue next @headimages = Headimages.new(:cancerpredictfields_id => @form_to_show.id, :title => @app_title + "head_images") @headimages.temp_file = image["temp_file"] @headimages.sort_number = image["sort_number"].to_i if !image["sort_number"].nil? @headimages.save @form_to_show.head_images_id.push @headimages.id end end end @delete_index.reverse! @delete_index.each do |i| @image_id = @head_images_id[i.to_i] Headimages.find_by(:id => @image_id).destroy rescue next @form_to_show.head_images_id.delete(@image_id) end @images = params["cancerpredictfields"]["title_images"] @title_images_id = @form_to_show.title_images_id @delete_index = [] if !@images.nil? @images.each do |num, image| if num.to_i < @title_images_id.length && @title_images_id.length != 0 if image["remove_image"] == "1" @delete_index.push num.to_i else @image_id = @title_images_id[num.to_i] @image = Headimages.find_by(:id => @image_id.to_s) if !image["sort_number"].nil? @image.sort_number = image["sort_number"].to_i @image.save end next if image["temp_file"] == nil @file_name = image["temp_file"].original_filename.gsub("(", "_").gsub(")", "_").gsub(" ", "_") rescue next @image.sort_number = image["sort_number"].to_i @image.temp_file = image["temp_file"] @image.save end else @file_name = image["temp_file"].original_filename.gsub("(", "_").gsub(")", "_").gsub(" ", "_") rescue next @headimages = Headimages.new(:cancerpredictfields_id => @form_to_show.id, :title => @app_title + "title_images") @headimages.temp_file = image["temp_file"] @headimages.sort_number = image["sort_number"].to_i if !image["sort_number"].nil? @headimages.save @form_to_show.title_images_id.push @headimages.id end end end @delete_index.reverse! @delete_index.each do |i| @image_id = @title_images_id[i.to_i] Headimages.find_by(:id => @image_id).destroy rescue next @form_to_show.title_images_id.delete(@image_id) end file_ids = (@form_to_show.form_show.values + @form_to_show.form_show_in_result.values).map { |property| [property[:variable], property[:cancer_predict_mapping_file]] }.select { |k, f| f.present? }.to_h mapping_data_from_csv = {} if !file_ids.blank? file_ids.each do |k, v| mapping_data_from_csv[k] = read_mapping_file(v) end end @form_to_show.mapping_data_from_csv = mapping_data_from_csv.to_json @form_to_show.save fork do @form_to_show.auto_write_predict_js end end @index = 0 Dir.chdir("public") do while File.exist?("cancerfield_back" + @index.to_s + ".txt") @index += 1 end end Dir.chdir("public") do @site_locales = Site.last.in_use_locales.each do |locale| I18n.with_locale(locale) do @file_tmp = File.new("#{Cancerpredictfields::ToolTablePrefix}#{I18n.locale}.txt", "w") tmp_table_texts = create_table(locale) @file_tmp.write(tmp_table_texts) @file_tmp.close end end end Dir.chdir("public") do @file_back = File.open("cancerfield_back" + @index.to_s + ".txt", "w") @file_back.write(@form_to_show.attributes) @file_back.close @file_org = File.open("cancerfield_org" + @index.to_s + ".txt", "w") @file_org.write(Cancerpredictfields.where("title" => @app_title + "_back").first.attributes) @file_org.close end redirect_to admin_cancerpredicts_path end def create_table(current_locale) create_first_field current_site = Site.last @size = {} @size_name = ["small", "medium", "large"] @size_name.each { |name| @size[name] = @form_to_show[name]["font_size"] } @size_active_size = "" @size.each { |size_key, size_value| (@form_to_show[size_key]["active"].to_i == 1) ? (@size_active_size = size_value) : nil } @table_str = '
' @table_str += '
' + @form_to_show.text_descibe[current_locale] + "
" @table_str += '
' + '" @size.each { |size_key, size_value| @table_str += ('") } @table_str += '
' @table_str_left = '
' @table_str_right = '
' @form_to_show.form_show.each do |num, property| @field_property = {} property.each do |key, value| @value = value @disp_value if @value.class == BSON::Document || @value.class == Hash @disp_value = @value[current_locale] rescue "" else @disp_value = @value end @disp_value = "" if @disp_value.nil? @field_property[key] = @disp_value end if @field_property["right"] == 0 next if @field_property["name"].blank? @table_str_left += "
" @table_str_left += '" if @field_property["comment_text"].present? @table_str_left += '' @table_str_left += '' @table_str_left += '
' end end if @field_property["is_num"] == 1 if @field_property["is_float"] == 1 @table_str_left += '
' else if @field_property["range"] == [] @table_str_left += '
' else @table_str_left += '
' @table_str_left += '' @table_str_left += '' @please_choice = (current_locale.to_s == "zh_tw") ? "請選擇" : "Please choice" @table_str_left += '
" end end else @table_str_left += '
' @field_property["choice_fields"].each do |create_choice| @table_str_left += '" @table_str_left += '' end @table_str_left += "
" end if @field_property["hint"].to_s != "" @table_str_left += '
' + @field_property["hint"] + "
" end @table_str_left += '
' else @table_str_right += "
" break if @field_property["name"] == "" @table_str_right += '" if @field_property["comment_text"].present? @table_str_right += '' @table_str_right += '' @table_str_right += '
' end end if @field_property["is_num"] == 1 if @field_property["is_float"] == 1 @table_str_right += '
' else if @field_property["range"] == [] @table_str_left += '
' else @table_str_right += '
' @table_str_right += '' @table_str_right += '' @please_choice = (current_locale.to_s == "zh_tw") ? "請選擇" : "Please choice" @table_str_right += '
" end end else @table_str_right += '
' @field_property["choice_fields"].each do |create_choice| @table_str_right += '" @table_str_right += '' end @table_str_right += "
" end if @field_property["hint"].to_s != "" @table_str_right += '
' + @field_property["hint"] + "
" end @table_str_right += '
' end end @table_str_left += "
" @table_str_right += "" @table_str += (@table_str_left + @table_str_right) @table_str += '
' @table_result_str = '
' + t("cancerpredict.table.result").to_s + '
' @tab_name = ["table", "text"] @table_result_str += '
' + @form_to_show.texts_between_Result_and_result_block[current_locale] + "
" @table_result_str += '
' @tab_name.each_with_index { |name, index| @table_result_str += ('
') } @table_result_str += '
' @tab_name.each { |name| @table_result_str += '" } @table_result_str += "
" @table_button = '
' @submit_btn_str = '" @reset_btn_str = '" @table_button += (@submit_btn_str + @reset_btn_str + '
') @table_result_choice_fileds = '
' if @form_to_show.form_result_is_right == 1 @table_result_choice_fileds = '
' if @form_to_show.form_result_is_right == 0 @table_result_choice_fileds += '' + t("cancerpredict.table.Therapy_choice").to_s + '
' @table_result_choice_fileds += '
' @form_to_show.form_show_in_result.each do |num, property| @field_property = {} property.each do |key, value| @value = value if @value.class == BSON::Document || @value.class == Hash @disp_value = @value[current_locale.to_s] rescue "" else @disp_value = @value end @disp_value = "" if @disp_value.nil? @field_property[key] = @disp_value end @table_result_choice_fileds += "
" break if @field_property["name"] == "" @table_result_choice_fileds += '" if @field_property["comment_text"].present? @table_result_choice_fileds += '' @table_result_choice_fileds += '' @table_result_choice_fileds += '
' end end if @field_property["is_num"] == 1 if @field_property["is_float"] == 1 @table_result_choice_fileds += '
' else if @field_property["range"] == [] @table_str_left += '
' else @table_result_choice_fileds += '
' @table_result_choice_fileds += '
' @table_str_left += '' @please_choice = (current_locale.to_s == "zh_tw") ? "請選擇" : "Please choice" @table_result_choice_fileds += '
" end end else @table_result_choice_fileds += '
' @field_property["choice_fields"].each do |create_choice| @table_result_choice_fileds += '" @table_result_choice_fileds += '' end @table_result_choice_fileds += "
" end if @field_property["hint"].to_s != "" @table_result_choice_fileds += '
' + @field_property["hint"] + "
" end @table_result_choice_fileds += '
' end @table_result_choice_fileds += "
" @table_str += (@table_button + '
' + @table_result_str + @table_result_choice_fileds + "
" + '
') return @table_str end def showSubmit @page_num = params[:page] || 1 @results = Cancerpredictrecord.where("title" => @app_title).desc(:id).page(@page_num).per(10) @variables = [] @names = [] @form_to_show.form_show.each do |num, property| property.each do |key, value| if key == "variable" @variables.push value elsif key == "name" @names.push value[I18n.locale.to_s] end end end @result_variables = [] @result_names = [] @indexs = [] @choicenames = [] if @results.length != 0 @results[0].result.each { |key, value| @result_variables.push key } rescue nil @result_variables.each do |variable| @index = @variables.index(variable.to_s) @result_names.push @names[@index] if !@index.nil? @indexs.push @index if !@index.nil? end @indexs.each do |index| if @form_to_show.form_show[index.to_s]["is_num"] == 1 || @form_to_show.form_show[index.to_s]["is_float"] == 1 @choicenames.push "" else @choicenames.push @form_to_show.form_show[index.to_s]["choice_fields"][I18n.locale.to_s] end end end @pagination = create_pagination(@page_num.to_i) end def export_cancer_tool_record cancer_records = Cancerpredictrecord.where("title" => @app_title).desc(:id) dir_path = "tmp/cancer_tool/" #FileUtils.rm_r(dir_path, :force => true) if Dir.exist?(dir_path) FileUtils.mkdir dir_path if !Dir.exist?(dir_path) #create dir for storing tmp_file if dir doesn't exist @filename = ("#{Time.now.year}_%02s_%02s_export_cancer_tool_record.xlsx" % [Time.now.month, Time.now.day]).gsub(" ", "0") Dir.chdir(dir_path) do File.open(@filename, "w") do |f| f.write render_to_string(:handlers => [:axlsx], :formats => [:xlsx], :partial => "export_cancer_tool_record.xlsx", :locals => { :results => cancer_records }) end end tmp_filename_data = File.read(dir_path + @filename) send_data(tmp_filename_data, type: "application/xlsx", disposition: "attachment", filename: @filename) end def create_first_field if Cancerpredictfields.where("title" => (@app_title + "_back")).take_while { true }.count == 0 @form_to_show = Cancerpredictfields.new() @form_to_show.title = @app_title + "_back" @form_to_show.save end @form_to_show if Cancerpredictfields.where("title" => @app_title).take_while { true }.count == 0 @form_to_show = Cancerpredictfields.new() @form_to_show.title = @app_title @form_to_show.save @form_to_show = Cancerpredictfields.where("title" => @app_title).first Dir.chdir("public") do @site_locales = Site.last.in_use_locales.each do |locale| I18n.with_locale(locale) do @file_tmp = File.new("#{Cancerpredictfields::ToolTablePrefix}#{I18n.locale}.txt", "w") tmp_table_texts = create_table(locale) @file_tmp.write(tmp_table_texts) @file_tmp.close end end end else @form_to_show = Cancerpredictfields.where("title" => @app_title).first end end def create_pagination(page = 1, fields = Cancerpredictrecord.all, extra_params = "") page = 1 if page == 0 per_page_num = 10.0 all_page_num = (fields.count / per_page_num).ceil all_page_num = 1 if all_page_num == 0 pagination = '
' + ((I18n.locale.to_s == "zh_tw") ? "第 #{page} 頁" : "page #{page}") + "/" + ((I18n.locale.to_s == "zh_tw") ? "共 #{all_page_num} 頁" : "Total #{all_page_num} page(s)") + '
    ' + ((page == 1) ? "
  1. [" + I18n.t("cancerpredict.prev_page") + "]
  2. " : '
  3. [' + I18n.t("cancerpredict.prev_page") + "]
  4. ") if all_page_num > 7 if page <= (all_page_num / 2) if page <= 7 (1..page).to_a.each { |page_num| pagination += ((page_num == page) ? "
  5. [" + page_num.to_s + "]
  6. " : '
  7. ' + page_num.to_s + "
  8. ") } else (1..3).to_a.each { |page_num| pagination += ((page_num == page) ? "
  9. [" + page_num.to_s + "]
  10. " : '
  11. ' + page_num.to_s + "
  12. ") } pagination += "
  13. ...
  14. " (page - 3..page).to_a.each { |page_num| pagination += ((page_num == page) ? "
  15. [" + page_num.to_s + "]
  16. " : '
  17. ' + page_num.to_s + "
  18. ") } end (page + 1..page + 3).to_a.each { |page_num| pagination += ((page_num == page) ? "
  19. [" + page_num.to_s + "]
  20. " : '
  21. ' + page_num.to_s + "
  22. ") } pagination += "
  23. ...
  24. " (all_page_num - 2..all_page_num).to_a.each { |page_num| pagination += ((page_num == page) ? "
  25. [" + page_num.to_s + "]
  26. " : '
  27. ' + page_num.to_s + "
  28. ") } else (1..3).to_a.each { |page_num| pagination += ((page_num == page) ? "
  29. [" + page_num.to_s + "]
  30. " : '
  31. ' + page_num.to_s + "
  32. ") } pagination += "
  33. ...
  34. " (page - 3..page).to_a.each { |page_num| pagination += ((page_num == page) ? "
  35. [" + page_num.to_s + "]
  36. " : '
  37. ' + page_num.to_s + "
  38. ") } if all_page_num - page <= 7 (page + 1..all_page_num).to_a.each { |page_num| pagination += ((page_num == page) ? "
  39. [" + page_num.to_s + "]
  40. " : '
  41. ' + page_num.to_s + "
  42. ") } else (page + 1..page + 3).to_a.each { |page_num| pagination += ((page_num == page) ? "
  43. [" + page_num.to_s + "]
  44. " : '
  45. ' + page_num.to_s + "
  46. ") } pagination += "
  47. ...
  48. " (all_page_num - 2..all_page_num).to_a.each { |page_num| pagination += ((page_num == page) ? "
  49. [" + page_num.to_s + "]
  50. " : '
  51. ' + page_num.to_s + "
  52. ") } end end else (1..all_page_num).to_a.each { |page_num| pagination += ((page_num == page) ? "
  53. [" + page_num.to_s + "]
  54. " : '
  55. ' + page_num.to_s + "
  56. ") } end pagination += (((page == all_page_num) ? "
  57. [" + I18n.t("cancerpredict.next_page") + "]
  58. " : '
  59. [' + I18n.t("cancerpredict.next_page") + "]
  60. ") + "
") end def read_mapping_file(mapping_file_id) mapping_file = CancerPredictMappingFile.find(mapping_file_id) rescue nil if !mapping_file.nil? csv_rows = CSV.read(mapping_file.temp_file.file.path) titles = csv_rows[0] infos = {} titles.each_with_index do |title, i| infos[title] = [] csv_rows[1..-1].each do |row| infos[title] << row[i].to_f end end return infos else return {} end end end