| rev | 
   line source | 
| 
bsw@1735
 | 
     1 local id = param.get("question_id", atom.integer)
 | 
| 
bsw@1735
 | 
     2 
 | 
| 
bsw@1735
 | 
     3 local question = SurveyQuestion:by_id(id)
 | 
| 
bsw@1735
 | 
     4 
 | 
| 
bsw@1735
 | 
     5 local survey = Survey:get_open()
 | 
| 
bsw@1735
 | 
     6 
 | 
| 
bsw@1735
 | 
     7 if question.survey_id ~= survey.id then
 | 
| 
bsw@1735
 | 
     8   slot.put_into("error", _"Internal error 2")
 | 
| 
bsw@1735
 | 
     9   return false
 | 
| 
bsw@1735
 | 
    10 end
 | 
| 
bsw@1735
 | 
    11 
 | 
| 
bsw@1735
 | 
    12 if not question or not question.survey.open then
 | 
| 
bsw@1735
 | 
    13   slot.put_into("error", _"Internal error 3")
 | 
| 
bsw@1735
 | 
    14   return false
 | 
| 
bsw@1735
 | 
    15 end
 | 
| 
bsw@1735
 | 
    16 
 | 
| 
bsw@1735
 | 
    17 local survey_member = SurveyMember:by_pk(question.survey.id, app.session.member_id)
 | 
| 
bsw@1735
 | 
    18 if not survey_member then
 | 
| 
bsw@1735
 | 
    19   return execute.view { module = "index", view = "404" }
 | 
| 
bsw@1735
 | 
    20 end
 | 
| 
bsw@1735
 | 
    21 
 | 
| 
bsw@1735
 | 
    22 local answer_set = survey_member.answer_set
 | 
| 
bsw@1735
 | 
    23 if not answer_set then
 | 
| 
bsw@1735
 | 
    24   return execute.view { module = "index", view = "404" }
 | 
| 
bsw@1735
 | 
    25 end
 | 
| 
bsw@1735
 | 
    26 
 | 
| 
bsw@1735
 | 
    27 local answer = SurveyAnswer:by_pk(answer_set.ident, question.id)
 | 
| 
bsw@1735
 | 
    28 if not answer then
 | 
| 
bsw@1735
 | 
    29   answer = SurveyAnswer:new()
 | 
| 
bsw@1735
 | 
    30   answer.survey_answer_set_ident = answer_set.ident
 | 
| 
bsw@1735
 | 
    31   answer.survey_question_id = question.id
 | 
| 
bsw@1735
 | 
    32 end
 | 
| 
bsw@1735
 | 
    33 
 | 
| 
bsw@1735
 | 
    34 if question.answer_type == "radio" then
 | 
| 
bsw@1743
 | 
    35   local given_answer = param.get("answer")
 | 
| 
bsw@1735
 | 
    36   if not given_answer then
 | 
| 
bsw@1735
 | 
    37     slot.put_into("error", _"Please choose an option!")
 | 
| 
bsw@1735
 | 
    38     return false
 | 
| 
bsw@1735
 | 
    39   end
 | 
| 
bsw@1735
 | 
    40   local answer_valid = false
 | 
| 
bsw@1735
 | 
    41   for i, answer_option in ipairs(question.answer_options) do
 | 
| 
bsw@1735
 | 
    42     if given_answer == answer_option then
 | 
| 
bsw@1735
 | 
    43       answer_valid = true
 | 
| 
bsw@1735
 | 
    44     end
 | 
| 
bsw@1735
 | 
    45   end
 | 
| 
bsw@1735
 | 
    46   if not answer_valid then
 | 
| 
bsw@1735
 | 
    47     slot.put_into("error", _"Internal error 1")
 | 
| 
bsw@1735
 | 
    48     return false
 | 
| 
bsw@1735
 | 
    49   end
 | 
| 
bsw@1743
 | 
    50   answer.answer = given_answer
 | 
| 
bsw@1743
 | 
    51 
 | 
| 
bsw@1744
 | 
    52 elseif question.answer_type == "checkbox" then
 | 
| 
bsw@1743
 | 
    53   local answers = json.array()
 | 
| 
bsw@1743
 | 
    54   for i, answer_option in ipairs(question.answer_options) do
 | 
| 
bsw@1743
 | 
    55     local answer = param.get("answer_" .. answer_option)
 | 
| 
bsw@1743
 | 
    56     if answer then
 | 
| 
bsw@1748
 | 
    57       table.insert(answers, answer_option)
 | 
| 
bsw@1743
 | 
    58     end
 | 
| 
bsw@1743
 | 
    59   end
 | 
| 
bsw@1743
 | 
    60   answer.answer = answers
 | 
| 
bsw@1735
 | 
    61 end
 | 
| 
bsw@1735
 | 
    62 
 | 
| 
bsw@1735
 | 
    63 answer:save()
 | 
| 
bsw@1735
 | 
    64 
 | 
| 
bsw@1735
 | 
    65 local question
 | 
| 
bsw@1735
 | 
    66 local answers_by_question_id = {}
 | 
| 
bsw@1735
 | 
    67 for i, answer in ipairs(answer_set.answers) do
 | 
| 
bsw@1735
 | 
    68   answers_by_question_id[answer.survey_question_id] = answer
 | 
| 
bsw@1735
 | 
    69 end
 | 
| 
bsw@1735
 | 
    70 for i, q in ipairs(survey.questions) do
 | 
| 
bsw@1735
 | 
    71   if not question and not answers_by_question_id[q.id] then
 | 
| 
bsw@1735
 | 
    72     question = q
 | 
| 
bsw@1735
 | 
    73   end
 | 
| 
bsw@1735
 | 
    74 end
 | 
| 
bsw@1735
 | 
    75 
 | 
| 
bsw@1735
 | 
    76 if not question then
 | 
| 
bsw@1735
 | 
    77   survey_member.survey_answer_set_ident = nil
 | 
| 
bsw@1735
 | 
    78   survey_member.finished = 'now'
 | 
| 
bsw@1735
 | 
    79   survey_member:save()
 | 
| 
bsw@1735
 | 
    80 end
 | 
| 
bsw@1735
 | 
    81 
 | 
| 
bsw@1735
 | 
    82 return true
 |