survey/app/controllers/surveys_controller.rb

204 lines
7.0 KiB
Ruby

class SurveysController < ApplicationController
helper MemberHelper
def index
questionnairesurveys = QuestionnaireSurvey.any_of( {:postdate.lte => Time.now} ).desc(:postdate).page(OrbitHelper.params[:page_no]).per(OrbitHelper.page_data_count)
current_user = OrbitHelper.current_user
surveys = questionnairesurveys.collect do |a|
answer_present = (current_user.nil? ? false : (a.survey_answers.where(:user => current_user.id).count > 0 ? true : false))
if !OrbitHelper.params[:page_no].blank?
title = ('<a href="'+ OrbitHelper.url_to_show(a.to_param) + "?method=show_data&page_no=#{OrbitHelper.params[:page_no]}" + '">' + a.title + '</a>').html_safe
else
title = ('<a href="'+ OrbitHelper.url_to_show(a.to_param) + '?method=show_data">' + a.title + '</a>').html_safe
end
{
"title" => title,
"time_range" => QuestionnaireSurvey.time_range(a),
"write" => QuestionnaireSurvey.write(a),
"result" => QuestionnaireSurvey.result(a),
"answer_present" => answer_present
}
end
{
"surveys" => surveys,
"extras" => {
"widget-title"=>t('survey.survey'),
"th_time_range" => t('survey.time_range'),
"th_title" => t("survey.title"),
"th_write" => t('survey.write'),
"th_result" => t('survey.result')
},
"total_pages" => questionnairesurveys.total_pages
}
end
def show_data
params = OrbitHelper.params
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
current_user = OrbitHelper.current_user
answer_present = (current_user.nil? ? false : (survey.survey_answers.where(:user => current_user.id).count > 0 ? true : false))
answer_present = (!survey.needs_login ? false : answer_present)
link_to_answer_set = (answer_present ? "/admin/surveys/#{survey.survey_answers.where(:user => current_user.id).first.id.to_s}/answer_set" : "")
{
'survey' => survey,
'answer_present' => answer_present,
'link_to_answer_set' => link_to_answer_set,
'time_range' => QuestionnaireSurvey.time_range(survey)
}
end
def show
params = OrbitHelper.params
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
if survey.redirect_mode
redirect_url = survey.redirect_url
{
'redirect_url' => redirect_url
}
else
questions = survey.survey_questions.all.entries
current_user = OrbitHelper.current_user
answer_present = (current_user.nil? ? false : (survey.survey_answers.where(:user => current_user.id).count > 0 ? true : false))
answer_present = (!survey.needs_login ? false : answer_present)
link_to_answer_set = (answer_present ? "/admin/surveys/#{survey.survey_answers.where(:user => current_user.id).first.id.to_s}/answer_set" : "")
if survey.jump_mode
answers = Hash[questions.collect{ |o| [o.id.to_s, o.id.to_s] }]
jumpable_questions = questions.select{ |q| q.jumpable? && q.can_set_jump? }
jump_tos_map = jumpable_questions.map(&:get_jump_tos).inject(:merge)
end
{
'survey' => survey,
'redirect_url' => '',
'link_to_answer_set' => link_to_answer_set,
'questions' => questions,
'answers' => answers,
'answer_present' => answer_present,
'jump_tos_map' => jump_tos_map
}
end
end
def update
uid = params[:id].split('-').last
@survey = QuestionnaireSurvey.find_by(:uid=>uid)
total = 0
answer = params[:answer]
@answer_model = @survey.survey_answers.new
@answer_model.user = current_user.id if !current_user.nil?
@survey.survey_questions.each do |question|
qid = question.id.to_s
if question.is_required && answer[qid].blank? && !@survey.jump_mode #&& (! @survey.jump_mode || ( @survey.jump_mode && question.jumpable? ) )
@answer_model.errors.add question.title, t('survey_question.required_error')
else
case question.type
when SurveyQuestion::Radio, SurveyQuestion::Select
if question.custom_option && answer[qid] == 'custom_option'
@answer_model[qid] = answer[qid + '_custom_option']
else
if answer[qid]
opt = question.survey_question_options.find(answer[qid])
@answer_model[qid] = opt.name
p = (opt.points == nil ? 0 : opt.points) rescue 0
total = total + p
end
end
when SurveyQuestion::Check
@answer_model[qid] = []
if answer[qid]
answer[qid].each do |oid, value|
if value.to_i != 0
if question.custom_option && oid == 'custom_option'
@answer_model[qid].push answer[qid + '_custom_option']
else
opt = question.survey_question_options.find(oid)
@answer_model[qid].push opt.name
p = (opt.points == nil ? 0 : opt.points) rescue 0
total = total + p
end
end
end
end
when SurveyQuestion::Radiogroup
@answer_model[qid] = {}
options = Hash[question.survey_question_options.collect{|o| [ o.id.to_s, (o.points.nil? ? 0 : o.points) ] }]
radiogroups = Hash[question.survey_question_radiogroups.collect{|rg| [ rg.id.to_s, rg.name] }]
if answer[qid]
answer[qid].each do |oid, value|
unless value.blank?
@answer_model[qid][oid] = radiogroups[value]
total = total + options[oid]
else
if question.is_required
@answer_model.errors.add question.title, t('survey_question.required_error')
end
end
end
end
when SurveyQuestion::Oneline, SurveyQuestion::Multiline
@answer_model[qid] = answer[qid]
end
end
end
if @answer_model.errors.empty?
@answer_model.scored_points = total
@answer_model.save!
redirect_to OrbitHelper.url_to_show(@survey.to_param) + "?method=answer_success&ans=#{@answer_model.id.to_s}"
else
@survey_answer_error = @answer_model.errors.full_messages.join(',')
render :answer_error
end
end
def answer_success
params = OrbitHelper.params
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
answer = SurveyAnswer.find(params[:ans])
page = Page.where(:page_id => params[:page_id]).first
{
'survey' => survey,
'answer' => answer,
'url' => "/#{I18n.locale.to_s}" + page.url
}
end
def result
params = OrbitHelper.params
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
# survey.result_type = QuestionnaireSurvey::ResultChart if params[:force_chart]
case survey.result_type
when QuestionnaireSurvey::ResultChart
chart_data, survey_questions, survey_answers = survey.generate_chart_data
end
{
'survey' => survey,
'chart_data' => chart_data,
'survey_questions' => survey_questions,
'survey_answers' => survey_answers
}
end
end