285 lines
9.1 KiB
Ruby
285 lines
9.1 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]
|
|
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
|
|
@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) rescue 0
|
|
total = total + p
|
|
end
|
|
end
|
|
@survey.total_points = total
|
|
respond_to do |format|
|
|
if @survey.update_attributes(survey_params)
|
|
@survey.update_answer_score
|
|
@survey.update_total_weight
|
|
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 |