# 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 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?) 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 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 value != "0" && value != "1" 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].constantize rescue String if @form_to_show.form_show[num.to_s][key.to_s].class != Array && type != Array @form_to_show.form_show[num.to_s][key.to_s] = value 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].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 @form_to_show.form_show[ num.to_s ][ sub_property ][params[:locale].to_s].class != Array && type != Array @form_to_show.form_show[ num.to_s ][ sub_property ][params[:locale].to_s] = sub_value 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 else @form_to_show.form_show[num.to_s][key.to_s] = value.to_i end end end end largest_num = org_nums.map{|n| n.to_i}.sort.last if (params["cancerpredictfields"]["form_show"].keys.last.to_i + 1 ) <= largest_num ( (params["cancerpredictfields"]["form_show"].keys.last.to_i + 1 ) .. (largest_num)).each do |i| @form_to_show.form_show.delete i.to_s end end if !params["cancerpredictfields"]["form_show_in_result"].nil? 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 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[num.to_s][key.to_s] = "" end end next if key.include?("_file") if (key != "old_num") if value != "0" && value != "1" if key != params[:locale] if @form_to_show.form_show_in_result[num.to_s][key.to_s].class != Array @form_to_show.form_show_in_result[num.to_s][key.to_s] = value 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| if @form_to_show.form_show_in_result[ num.to_s ][ sub_property ][params[:locale].to_s].class != Array @form_to_show.form_show_in_result[ num.to_s ][ sub_property ][params[:locale].to_s] = sub_value 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"] != nil && 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_in_result_was[ property["old_num"] ][ sub_property ][locale] end end end end else @form_to_show.form_show_in_result[num.to_s][key.to_s] = value.to_i end end end end largest_num = org_nums.map{|n| n.to_i}.sort.last if (params["cancerpredictfields"]["form_show_in_result"].keys.last.to_i + 1 ) <= largest_num ( (params["cancerpredictfields"]["form_show_in_result"].keys.last.to_i + 1 ) .. (largest_num)).each do |i| @form_to_show.form_show_in_result.delete i.to_s end end 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'] 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 @form_to_show[item] = YAML.load(params_cancer[item]) @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]} @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.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('cancer_tool_table_tmp_'+locale.to_s+'.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 = '