* Internal function, do not call directly. Create a variant object, do not write to DB. * @protected * * @param {Object} question - The question for the variant. * @param {Object} course - The course for the variant. * @param {Object} options - Options controlling the creati
(question, course, options, callback)
| 87 | * @param {function} callback - A callback(err, courseIssues, variant) function. |
| 88 | */ |
| 89 | _makeVariant(question, course, options, callback) { |
| 90 | debug('_makeVariant()'); |
| 91 | var variant_seed; |
| 92 | if (_(options).has('variant_seed') && options.variant_seed != null) { |
| 93 | variant_seed = options.variant_seed; |
| 94 | } else { |
| 95 | variant_seed = Math.floor(Math.random() * Math.pow(2, 32)).toString(36); |
| 96 | } |
| 97 | debug(`_makeVariant(): question_id = ${question.id}`); |
| 98 | questionServers.getModule(question.type, (err, questionModule) => { |
| 99 | if (ERR(err, callback)) return; |
| 100 | questionModule.generate(question, course, variant_seed, (err, courseIssues, data) => { |
| 101 | if (ERR(err, callback)) return; |
| 102 | const hasFatalIssue = _.some(_.map(courseIssues, 'fatal')); |
| 103 | var variant = { |
| 104 | variant_seed: variant_seed, |
| 105 | params: data.params || {}, |
| 106 | true_answer: data.true_answer || {}, |
| 107 | options: data.options || {}, |
| 108 | broken: hasFatalIssue, |
| 109 | }; |
| 110 | if (variant.broken) { |
| 111 | return callback(null, courseIssues, variant); |
| 112 | } |
| 113 | questionModule.prepare(question, course, variant, (err, extraCourseIssues, data) => { |
| 114 | if (ERR(err, callback)) return; |
| 115 | courseIssues.push(...extraCourseIssues); |
| 116 | const hasFatalIssue = _.some(_.map(courseIssues, 'fatal')); |
| 117 | var variant = { |
| 118 | variant_seed: variant_seed, |
| 119 | params: data.params || {}, |
| 120 | true_answer: data.true_answer || {}, |
| 121 | options: data.options || {}, |
| 122 | broken: hasFatalIssue, |
| 123 | }; |
| 124 | callback(null, courseIssues, variant); |
| 125 | }); |
| 126 | }); |
| 127 | }); |
| 128 | }, |
| 129 | |
| 130 | /** |
| 131 | * Get a file that is generated by code. |