generated from your-land/yl_template
Implements create_question
This commit is contained in:
parent
d4cf7d98a6
commit
ed01ad4ec2
@ -101,7 +101,7 @@ yl_survey.evaluate(s_id)
|
|||||||
??? How do we evaluate that stuff ???
|
??? How do we evaluate that stuff ???
|
||||||
|
|
||||||
```
|
```
|
||||||
yl_survey.create_question(s_id, question, category, sort, {type}, {answers})
|
yl_survey.create_question(s_id, question, category, sort, {allowed_types}, {answers}, enabled)
|
||||||
```
|
```
|
||||||
|
|
||||||
Returns `true, q_id` if successful, `false, "errormessage` if not.
|
Returns `true, q_id` if successful, `false, "errormessage` if not.
|
||||||
@ -112,11 +112,12 @@ Adds a question to the survey identified by `s_id`.
|
|||||||
* question: string, required. This is the question text the survey asks its respondents.
|
* question: string, required. This is the question text the survey asks its respondents.
|
||||||
* category: string, optional, default empty. Use it for additonal explanation, category, help. Is displayed near the question. May be nil or empty.
|
* category: string, optional, default empty. Use it for additonal explanation, category, help. Is displayed near the question. May be nil or empty.
|
||||||
* sort: integer, optional, defaults to the next free number. Use this to order your questions.
|
* sort: integer, optional, defaults to the next free number. Use this to order your questions.
|
||||||
* {type}: table of enum("singlechoice","multiplechoice","freetext"), required. `singlechoice` and `multiplechoice` are mutually exclusive, while freetxt can be combined with either.
|
* {allowed_types}: table of enum("singlechoice","multiplechoice","freetext"), required. `singlechoice` and `multiplechoice` are mutually exclusive, while freetxt can be combined with either.
|
||||||
* {answers}: table of strings, optional. Holds the answers to a singlechoice or multiplechoice question.
|
* {answers}: table of strings, optional. Holds the answers to a singlechoice or multiplechoice question.
|
||||||
|
* enabled: boolean, optional, defaults to true. If true, the question is delivered to a participant. If false, the question is hidden.
|
||||||
|
|
||||||
```
|
```
|
||||||
yl_survey.edit_question(s_id, q_id, question, sort, category, {type}, {answers}, delete_responses)
|
yl_survey.edit_question(s_id, q_id, question, sort, category, {allowed_types}, {answers}, enabled, delete_responses)
|
||||||
```
|
```
|
||||||
|
|
||||||
Returns `true, q_id` if successful, `false, "errormessage` if not.
|
Returns `true, q_id` if successful, `false, "errormessage` if not.
|
||||||
|
146
api.lua
146
api.lua
@ -1,3 +1,6 @@
|
|||||||
|
--
|
||||||
|
-- Surveys
|
||||||
|
--
|
||||||
-- yl_survey.get_data
|
-- yl_survey.get_data
|
||||||
--
|
--
|
||||||
local function get_data()
|
local function get_data()
|
||||||
@ -32,11 +35,45 @@ end
|
|||||||
|
|
||||||
local function validate(value, expect_type, allow_nil)
|
local function validate(value, expect_type, allow_nil)
|
||||||
if ((allow_nil == true) and (value == nil)) then return true end
|
if ((allow_nil == true) and (value == nil)) then return true end
|
||||||
if ((allow_nil == false) and (value == nil)) then return true end
|
if ((allow_nil == false) and (value == nil)) then return false end
|
||||||
if (type(value) == expect_type) then return true end
|
if (type(value) == expect_type) then return true end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function validate_questiontype(allowed_types)
|
||||||
|
local valid_types = {
|
||||||
|
singlechoice = true,
|
||||||
|
multiplechoice = true,
|
||||||
|
freetext = true
|
||||||
|
}
|
||||||
|
|
||||||
|
local sm_count = 0
|
||||||
|
local ft_count = 0
|
||||||
|
|
||||||
|
for _, t in ipairs(allowed_types) do
|
||||||
|
|
||||||
|
-- Invalid question type
|
||||||
|
if (valid_types[t] == nil) then return false end
|
||||||
|
|
||||||
|
-- Either singlechoice OR multiplechoice
|
||||||
|
if ((t == "singlechoice") or (t == "multiplechoice")) then
|
||||||
|
sm_count = sm_count + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if sm_count > 1 then return false end
|
||||||
|
|
||||||
|
-- Only one freetext allowed
|
||||||
|
if (t == "freetext") then ft_count = ft_count + 1 end
|
||||||
|
|
||||||
|
if ft_count > 1 then return false end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if ((ft_count + sm_count) == 0) then return false end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
local function create_survey(owner, allow_names, allow_anonymous, allow_changes,
|
local function create_survey(owner, allow_names, allow_anonymous, allow_changes,
|
||||||
timestamp_start, timestamp_end)
|
timestamp_start, timestamp_end)
|
||||||
-- Defense
|
-- Defense
|
||||||
@ -77,7 +114,8 @@ local function create_survey(owner, allow_names, allow_anonymous, allow_changes,
|
|||||||
if ((allow_names == false) and (allow_anonymous == false) and
|
if ((allow_names == false) and (allow_anonymous == false) and
|
||||||
(allow_changes == false)) then
|
(allow_changes == false)) then
|
||||||
return false, yl_survey.t("Noone can take part in that survey. " ..
|
return false, yl_survey.t("Noone can take part in that survey. " ..
|
||||||
"Neither named nor anonymous participants are allowed and you can't change it later")
|
"Neither named nor anonymous participants are allowed. " ..
|
||||||
|
" You can't change it later")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Specialcase: We don't accept surveys where the enddate is smaller than the startdate
|
-- Specialcase: We don't accept surveys where the enddate is smaller than the startdate
|
||||||
@ -164,6 +202,9 @@ local function edit_survey(id, owner, allow_names, allow_anonymous,
|
|||||||
|
|
||||||
local record = yl_survey.get_record(id)
|
local record = yl_survey.get_record(id)
|
||||||
|
|
||||||
|
if (record == nil) then
|
||||||
|
return false, yl_survey.t("record does not exist")
|
||||||
|
end
|
||||||
if (record["metadata"].allow_changes == false) then
|
if (record["metadata"].allow_changes == false) then
|
||||||
return false, yl_survey.t("no changes allowed")
|
return false, yl_survey.t("no changes allowed")
|
||||||
end
|
end
|
||||||
@ -182,6 +223,12 @@ local function edit_survey(id, owner, allow_names, allow_anonymous,
|
|||||||
|
|
||||||
record["metadata"] = metadata
|
record["metadata"] = metadata
|
||||||
|
|
||||||
|
-- Delete responses
|
||||||
|
local no
|
||||||
|
if (delete_responses == true) then
|
||||||
|
record, no = yl_survey.delete_responses(record)
|
||||||
|
end
|
||||||
|
|
||||||
-- Store
|
-- Store
|
||||||
local success = yl_survey.save(id, record)
|
local success = yl_survey.save(id, record)
|
||||||
if (success == true) then
|
if (success == true) then
|
||||||
@ -205,9 +252,7 @@ end
|
|||||||
|
|
||||||
local function remove_record(id)
|
local function remove_record(id)
|
||||||
local data_success, data = yl_survey.get_data()
|
local data_success, data = yl_survey.get_data()
|
||||||
if (data_success ~= true) then
|
if (data_success ~= true) then return false, "Cannot get data" end
|
||||||
return false, "Cannot get data"
|
|
||||||
end
|
|
||||||
|
|
||||||
local remove_success = yl_survey.remove_file(id)
|
local remove_success = yl_survey.remove_file(id)
|
||||||
if (remove_success ~= true) then
|
if (remove_success ~= true) then
|
||||||
@ -223,6 +268,93 @@ local function remove_record(id)
|
|||||||
return true, record
|
return true, record
|
||||||
end
|
end
|
||||||
|
|
||||||
function yl_survey.remove_record(id)
|
function yl_survey.remove_record(id) return remove_record(id) end
|
||||||
return remove_record(id)
|
|
||||||
|
--
|
||||||
|
-- Questions
|
||||||
|
--
|
||||||
|
|
||||||
|
local function create_question(id, question, category, sort, allowed_types,
|
||||||
|
answers, enabled)
|
||||||
|
-- Defense
|
||||||
|
if (validate(id, "string", false) == false) then
|
||||||
|
return false, yl_survey.t("id must be string")
|
||||||
|
end
|
||||||
|
if (validate(question, "string", false) == false) then
|
||||||
|
return false, yl_survey.t("question must be string")
|
||||||
|
end
|
||||||
|
if (category == nil) then category = "" end
|
||||||
|
if (validate(category, "string", false) == false) then
|
||||||
|
return false, yl_survey.t("category must be string")
|
||||||
|
end
|
||||||
|
if (validate_nil_or_positive(sort) == false) then
|
||||||
|
return false, yl_survey.t("sort must be positive number")
|
||||||
|
end
|
||||||
|
if (validate(allowed_types, "table", false) == false) then
|
||||||
|
return false, yl_survey.t("allowed_types must be table")
|
||||||
|
end
|
||||||
|
if (validate(answers, "table", true) == false) then
|
||||||
|
return false, yl_survey.t("answers must be table")
|
||||||
|
end
|
||||||
|
if (enabled == nil) then enabled = true end
|
||||||
|
if (validate(enabled, "boolean", false) == false) then
|
||||||
|
return false, yl_survey.t("enabled must be boolean")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Specialcase : allowed_types must be a combination of
|
||||||
|
-- "singlechoice" or "multiplechoice" or "freetext"
|
||||||
|
if (validate_questiontype(allowed_types) == false) then
|
||||||
|
return false, yl_survey.t("wrong allowed_types")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Specialcase : answers cannot be nil or empty if allowedtypes has either multiplechoice or singlechoice
|
||||||
|
if (((answers == nil) or (next(answers) == nil)) and
|
||||||
|
((allowed_types["multiplechoice"] ~= nil) or
|
||||||
|
(allowed_types["singlechoice"] ~= nil))) then
|
||||||
|
return false, yl_survey.t(
|
||||||
|
"answers cannot be nil or empty if allowedtypes has either multiplechoice or singlechoice")
|
||||||
|
end
|
||||||
|
|
||||||
|
local record = yl_survey.get_record(id)
|
||||||
|
|
||||||
|
if (record == nil) then
|
||||||
|
return false, yl_survey.t("record does not exist")
|
||||||
|
end
|
||||||
|
if (record["metadata"].allow_changes == false) then
|
||||||
|
return false, yl_survey.t("no changes allowed")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Payload
|
||||||
|
|
||||||
|
-- if sort is nil, then find next sort
|
||||||
|
local next_sort = sort or yl_survey.find_next_free_number(record, "sort")
|
||||||
|
-- Find next free q_id
|
||||||
|
local next_q_id = yl_survey.find_next_free_number(record, "id")
|
||||||
|
|
||||||
|
local t_question = {
|
||||||
|
id = next_q_id,
|
||||||
|
category = category,
|
||||||
|
sort = next_sort,
|
||||||
|
question = question,
|
||||||
|
enabled = true,
|
||||||
|
allowed_types = allowed_types,
|
||||||
|
answers = answers,
|
||||||
|
responses = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
record[tostring(next_q_id)] = t_question
|
||||||
|
|
||||||
|
-- Store
|
||||||
|
local success = yl_survey.save(id, record)
|
||||||
|
if (success == true) then
|
||||||
|
yl_survey.data[id] = record
|
||||||
|
return true, next_q_id
|
||||||
|
else
|
||||||
|
return false, yl_survey.t("Could not store")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function yl_survey.create_question(id, question, category, sort, allowed_types,
|
||||||
|
answers)
|
||||||
|
return create_question(id, question, category, sort, allowed_types, answers)
|
||||||
end
|
end
|
||||||
|
@ -20,8 +20,8 @@ remove_survey(s_id)
|
|||||||
list_surveys()
|
list_surveys()
|
||||||
evaluate(s_id)
|
evaluate(s_id)
|
||||||
|
|
||||||
create_question(s_id, question, category, sort, {type}, {answers}) return q_id
|
create_question(s_id, question, category, sort, {allowed_types}, {answers}) return q_id
|
||||||
edit_question(s_id, q_id, question, sort, category, {type}, {answers}, delete_responses)
|
edit_question(s_id, q_id, question, sort, category, {allowed_types}, {answers}, delete_responses)
|
||||||
remove_question(q_id)
|
remove_question(q_id)
|
||||||
list_questions()
|
list_questions()
|
||||||
|
|
||||||
@ -49,12 +49,12 @@ This is the planned data structure:
|
|||||||
"sort": 99,
|
"sort": 99,
|
||||||
"question": "How did you find out about Minetest in general?",
|
"question": "How did you find out about Minetest in general?",
|
||||||
"enabled" : true,
|
"enabled" : true,
|
||||||
"type": [
|
"allowed_types": [
|
||||||
"singlechoice",
|
"singlechoice",
|
||||||
"multiplechoice",
|
"multiplechoice",
|
||||||
"freetext"
|
"freetext"
|
||||||
],
|
],
|
||||||
"answer": {
|
"answers": {
|
||||||
"1": "Friend dragged me over",
|
"1": "Friend dragged me over",
|
||||||
"2": "I came here of my own free will"
|
"2": "I came here of my own free will"
|
||||||
},
|
},
|
||||||
@ -76,12 +76,12 @@ This is the planned data structure:
|
|||||||
"sort": 2,
|
"sort": 2,
|
||||||
"question": "What do you think about the current state of the server?",
|
"question": "What do you think about the current state of the server?",
|
||||||
"enabled" : true,
|
"enabled" : true,
|
||||||
"type": [
|
"allowed_types": [
|
||||||
"singlechoice",
|
"singlechoice",
|
||||||
"multiplechoice",
|
"multiplechoice",
|
||||||
"freetext"
|
"freetext"
|
||||||
],
|
],
|
||||||
"answer": {
|
"answers": {
|
||||||
"0": "Write your answer here",
|
"0": "Write your answer here",
|
||||||
"1": "Terrible",
|
"1": "Terrible",
|
||||||
"2": "Not soo bad"
|
"2": "Not soo bad"
|
||||||
|
37
internal.lua
37
internal.lua
@ -82,6 +82,43 @@ end
|
|||||||
|
|
||||||
function yl_survey.create_uuid() return create_uuid() end
|
function yl_survey.create_uuid() return create_uuid() end
|
||||||
|
|
||||||
|
-- delete responses
|
||||||
|
|
||||||
|
local function delete_responses(record)
|
||||||
|
local no = 0
|
||||||
|
for key, question in pairs(record) do
|
||||||
|
if (tonumber(key) ~= nil) then
|
||||||
|
if question.responses ~= nil then
|
||||||
|
question.responses = nil
|
||||||
|
no = no + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return record, no
|
||||||
|
end
|
||||||
|
|
||||||
|
function yl_survey.delete_responses(record)
|
||||||
|
return delete_responses(record)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- yl_survey.find_next_free_sort_number(record)
|
||||||
|
|
||||||
|
local function find_next_free_number(record, target)
|
||||||
|
local highest_no = 1
|
||||||
|
for key, question in pairs(record) do
|
||||||
|
if (tonumber(key) ~= nil) then
|
||||||
|
if (question[target] > highest_no) then
|
||||||
|
highest_no = question[target] + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return highest_no
|
||||||
|
end
|
||||||
|
|
||||||
|
function yl_survey.find_next_free_number(record, target)
|
||||||
|
return find_next_free_number(record, target)
|
||||||
|
end
|
||||||
|
|
||||||
-- Load and save
|
-- Load and save
|
||||||
|
|
||||||
local function get_savepath()
|
local function get_savepath()
|
||||||
|
Loading…
Reference in New Issue
Block a user