MDL-63809 question: handling bad questions in question_has_capability_on

This commit is contained in:
Shamim Rezaie 2018-12-18 15:05:37 +11:00
parent b195523758
commit 8e93e515ed
3 changed files with 59 additions and 11 deletions

View file

@ -921,8 +921,6 @@ function question_load_questions($questionids, $extrafields = '', $join = '') {
* @param stdClass[]|null $filtercourses The courses to filter the course tags by.
*/
function _tidy_question($question, $category, array $tagobjects = null, array $filtercourses = null) {
global $CFG;
// Load question-type specific fields.
if (!question_bank::is_qtype_installed($question->qtype)) {
$question->questiontext = html_writer::tag('p', get_string('warningmissingtype',
@ -1651,25 +1649,44 @@ class context_to_string_translator{
/**
* Check capability on category
*
* @param mixed $questionorid object or id. If an object is passed, it should include ->contextid and ->createdby.
* @param int|stdClass $questionorid object or id. If an object is passed, it should include ->contextid and ->createdby.
* @param string $cap 'add', 'edit', 'view', 'use', 'move' or 'tag'.
* @param integer $notused no longer used.
* @return boolean this user has the capability $cap for this question $question?
* @param int $notused no longer used.
* @return bool this user has the capability $cap for this question $question?
* @throws coding_exception
*/
function question_has_capability_on($questionorid, $cap, $notused = -1) {
global $USER;
global $USER, $DB;
if (is_numeric($questionorid)) {
$question = question_bank::load_question_data((int)$questionorid);
$questionid = (int)$questionorid;
} else if (is_object($questionorid)) {
// All we really need in this function is the contextid and author of the question.
// We won't bother fetching other details of the question if these 2 fields are provided.
if (isset($questionorid->contextid) && isset($questionorid->createdby)) {
$question = $questionorid;
} else if (!empty($questionorid->id)) {
$questionid = $questionorid->id;
}
}
if (!isset($question) && isset($questionorid->id) && $questionorid->id != 0) {
$question = question_bank::load_question_data($questionorid->id);
// At this point, either $question or $questionid is expected to be set.
if (isset($questionid)) {
try {
$question = question_bank::load_question_data($questionid);
} catch (Exception $e) {
// Let's log the exception for future debugging.
debugging($e->getMessage(), DEBUG_NORMAL, $e->getTrace());
// Well, at least we tried. Seems that we really have to read from DB.
$question = $DB->get_record_sql('SELECT q.id, q.createdby, qc.contextid
FROM {question} q
JOIN {question_categories} qc ON q.category = qc.id
WHERE q.id = :id', ['id' => $questionid]);
}
} else {
}
if (!isset($question)) {
throw new coding_exception('$questionorid parameter needs to be an integer or an object.');
}