class Admin::SurveysController < OrbitAdminController include Admin::SurveysHelper before_action ->(module_app = @app_title) { set_variables module_app } before_action :set_survey, only: [:edit, :destroy, :export, :set_answers, :jump, :duplicate_it, :answer_sets] def initialize super @app_title = 'survey' end def index @categories = current_user.approved_categories.select{|c| c.module_app_id == @module_app.id} rescue [] @filter_fields = filter_fields(@categories,[]) @table_fields = [:title, 'survey.postdate', 'survey.deadline', 'survey.results_count', 'survey.update_user'] !params[:sort].blank? ? sort = {params[:sort].to_sym=>params[:order]} : sort = {:postdate=>"desc"} @surveys = QuestionnaireSurvey.all.order_by(sort).with_categories(filters("category")) @surveys = search_data(@surveys,[:title]).page(params[:page]).per(10) if request.xhr? render :partial => "index" end end def answer_sets if can_edit_or_delete?(@survey) @table_fields = ['survey.taken_by', 'survey.taken_date',"survey.records"] @survey_answer_groups = @survey.survey_answer_groups.desc(:last_modified).page(params[:page]).per(15) if params[:search] match_user_ids = User.where(:id.in=>@survey.survey_answer_groups.pluck(:user),:member_name=>/#{params[:search]}/).pluck(:id) rescue []; @survey_answer_groups = @survey_answer_groups.where(:user.in=>match_user_ids) end @answer_repeat = @survey.get_answer_repeat else render_401 end end def answer_set @survey_answer = SurveyAnswer.find(params["id"]) rescue nil @survey = @survey_answer.questionnaire_survey if !@survey_answer.nil? @user = @survey_answer.user.nil? ? nil : (User.find(@survey_answer.user) rescue nil) #render :html => @survey_answer and return end def answer_list @table_fields = ['survey.taken_by', 'survey.taken_date',"survey.records"] @survey_answer_group = SurveyAnswerGroup.find(params["id"]) rescue nil @survey = @survey_answer_group.questionnaire_survey @survey_answers = @survey_answer_group.survey_answers.desc(:updated_at).page(params[:page]).per(15) @user = @survey_answer_group.user.nil? ? nil : (User.find(@survey_answer_group.user) rescue nil) @is_answer_list = true render "answer_sets" end def export_answers @survey_answer_group = SurveyAnswerGroup.find(params["id"]) rescue nil @survey = @survey_answer_group.questionnaire_survey @user = @survey_answer_group.user.nil? ? nil : (User.find(@survey_answer_group.user) rescue nil) @survey_answers = @survey_answer_group.survey_answers extra_filename = "_#{@user.member_name rescue nil}" title = @survey.title.gsub(/[ "'*@#$%^&()+=;:.,?>|\\\/<~_!:,、。!?;「」〈〉【】/]/,'') f = "public/uploads/survey_export/#{@survey.id}/#{title}#{extra_filename}.xlsx" File.delete(f) if File.exists?(f) locale = I18n.locale Thread.new do begin SurveysHelper.generate_xlsx(@survey.id,locale,{:id=>params["id"]},extra_filename) rescue => e puts [e,e.backtrace] end end render :json => {"success" => true, "title" => title}.to_json end def new @survey = QuestionnaireSurvey.new @primary_locale = I18n.locale.to_s @secondary_locale = (I18n.locale == :zh_tw) ? "en" : "zh_tw" end def create @survey = QuestionnaireSurvey.new(survey_params) total = 0 @survey.survey_questions.each do |ques| ques.survey_question_options.each do |opt| p = (opt.points == nil ? 0 : opt.points) rescue 0 total = total + p end end @survey.total_points = total @survey.create_user_id = current_user.id @survey.update_user_id = current_user.id respond_to do |format| if @survey.save format.html { redirect_to(admin_surveys_path) } format.xml { render :xml => @survey, :status => :created, :location => @survey } else format.html { render :action => "new" } format.xml { render :xml => @survey.errors, :status => :unprocessable_entity } end end end def edit @primary_locale = I18n.locale.to_s @secondary_locale = (I18n.locale == :zh_tw) ? "en" : "zh_tw" @sqs = @survey.survey_questions.as_json end def update uid = params[:id].split('-').last @survey = QuestionnaireSurvey.find_by(:uid=>uid) @survey.update_user_id = current_user.id total = 0 @survey.survey_questions.each do |ques| ques.survey_question_options.each do |opt| p = (opt.points == nil ? 0 : opt.points) rescue 0 total = total + p end end @survey.total_points = total respond_to do |format| if @survey.update_attributes(survey_params) if params[:et] == "result" format.html { redirect_to(set_answers_admin_survey_path(@survey.id)) } else format.html { redirect_to(admin_surveys_url(:page => params[:page])) } end format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @survey.errors, :status => :unprocessable_entity } end end end def destroy @survey.destroy redirect_to "/admin/surveys" # @survey = QuestionnaireSurvey.find(params[:id]) # @survey.destroy # respond_to do |format| # format.html { redirect_to(panel_survey_back_end_surveys_url) } # format.js # end end def delete if params[:ids] surveys = QuestionnaireSurvey.any_in(:_id => params[:ids]).destroy_all end redirect_to "/admin/surveys" # redirect_to panel_survey_back_end_surveys_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options]) end def checkforthread running = !File.exists?("public/uploads/survey_export/#{params[:survey_id]}/#{params[:survey_title]}.xlsx") render :json => {"status" => running}.to_json end def export title = @survey.title.gsub(/[ "'*@#$%^&()+=;:.,?>|\\\/<~_!:,、。!?;「」〈〉【】/]/,'') f = "public/uploads/survey_export/#{@survey.id}/#{title}.xlsx" File.delete(f) if File.exists?(f) locale = I18n.locale Thread.new do begin SurveysHelper.generate_xlsx(@survey.id,locale) rescue => e puts [e,e.backtrace] end #system "rake survey_tasks:prepare_download[#{@survey.id}] >> #{Rails.root}/log/rake.log &" end render :json => {"success" => true, "title" => title}.to_json # @chart_data, @survey_questions, @survey_answers = @survey.generate_chart_data # respond_to do |format| # format.xlsx { # response.headers['Content-Disposition'] = 'attachment; filename="export.xlsx"' # } # end end def set_answers end def set_sections @sections = QuestionnaireSurvey.find(params[:id]).survey_sections end def add_section @section = SurveySection.new @survey = QuestionnaireSurvey.find(params[:id]) end def pagination_setting @survey = QuestionnaireSurvey.find(params[:id]) @min_section = 1 @survey_sections_len = @survey.survey_sections.count @max_section = @survey_sections_len if @max_section<@min_section @max_section = @min_section end @pagination_settings = @survey.survey_paginations end def save_pagination_setting @survey = QuestionnaireSurvey.find(params[:id]) survey_params = params.require(:survey).permit! @survey.update_attributes(survey_params) redirect_to set_sections_admin_survey_path(params[:id]) end def edit_section @section = SurveySection.find(params[:id]) @survey = @section.questionnaire_survey end def delete_section end def create_section section = SurveySection.create(survey_section_params) redirect_to set_sections_admin_survey_path(section.questionnaire_survey.id) end def update_section section = SurveySection.find(params[:id]) section.update_attributes(survey_section_params) redirect_to set_sections_admin_survey_path(section.questionnaire_survey.id) end def jump @questions = @survey.survey_questions.all @jump_to_options = [[ t('survey.not_jump'), 0 ], [t('survey.jump_to_end'), 1]] @jump_to_options += @questions.collect {|q| [ q.title, q.id.to_s ] } end def duplicate_it @new_survey = QuestionnaireSurvey.new(:copy_id=>@survey.id,:except_clone_relations=>["survey_answers"]) @new_survey.create_user_id = current_user.id @new_survey.update_user_id = current_user.id @new_survey.save! respond_to do |format| format.html { redirect_to(admin_surveys_url) } format.xml { render :xml => @survey, :status => :created, :location => @new_survey } end end private def set_survey @survey = QuestionnaireSurvey.find(params[:id]) end def survey_params p = params.require(:questionnaire_survey).permit! if !p[:result_criteria].blank? x = p[:result_criteria].collect{|y| y.last} p[:result_criteria] = x end p end def survey_section_params params.require(:survey_section).permit! end end