survey/app/controllers/admin/surveys_controller.rb

296 lines
9.5 KiB
Ruby

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].present?
if params[:search] == "NA"
@survey_answer_groups = @survey_answer_groups.where(:user=>nil)
else
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
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) * ques.weight 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
@survey.update_total_weight
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) * ques.weight rescue 0
total = total + p
end
end
@survey.total_points = total
respond_to do |format|
if @survey.update_attributes(survey_params)
Thread.new do
@survey.update_answer_score
@survey.update_total_weight
if @survey.need_assign_color && @survey.need_update_color
@survey.update_answers_color
end
end
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
@section = SurveySection.find(params[:id])
@section.destroy
redirect_to :back
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