From 088d4309fe54d621ca42dbfa8d1b4fe473664ee2 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Wed, 25 Mar 2020 17:15:51 +0000 Subject: [PATCH] MDL-68252 question bank: for 'missingtype' questions, hide actions --- question/classes/bank/action_column_base.php | 4 +++- question/classes/bank/copy_action_column.php | 7 +++++++ question/classes/bank/edit_action_column.php | 7 +++++++ .../classes/bank/export_xml_action_column.php | 7 +++++++ question/classes/bank/preview_action_column.php | 15 +++++++++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/question/classes/bank/action_column_base.php b/question/classes/bank/action_column_base.php index ab48c8150f4..2c34e41dedb 100644 --- a/question/classes/bank/action_column_base.php +++ b/question/classes/bank/action_column_base.php @@ -53,6 +53,8 @@ abstract class action_column_base extends column_base { public function get_required_fields() { // Createdby is required for permission checks. - return array('q.id', 'q.createdby', 'qc.contextid'); + // Qtype so we can easily avoid applying actions to question types that + // are no longer installed. + return ['q.id', 'q.qtype', 'q.createdby', 'qc.contextid']; } } diff --git a/question/classes/bank/copy_action_column.php b/question/classes/bank/copy_action_column.php index 4c15c1e77fd..ef5e6f00409 100644 --- a/question/classes/bank/copy_action_column.php +++ b/question/classes/bank/copy_action_column.php @@ -46,6 +46,13 @@ class copy_action_column extends menu_action_column_base { } protected function get_url_icon_and_label(\stdClass $question): array { + if (!\question_bank::is_qtype_installed($question->qtype)) { + // It sometimes happens that people end up with junk questions + // in their question bank of a type that is no longer installed. + // We cannot do most actions on them, because that leads to errors. + return [null, null, null]; + } + // To copy a question, you need permission to add a question in the same // category as the existing question, and ability to access the details of // the question being copied. diff --git a/question/classes/bank/edit_action_column.php b/question/classes/bank/edit_action_column.php index a68b2f297cf..b41b487281c 100644 --- a/question/classes/bank/edit_action_column.php +++ b/question/classes/bank/edit_action_column.php @@ -47,6 +47,13 @@ class edit_action_column extends menu_action_column_base { } protected function get_url_icon_and_label(\stdClass $question): array { + if (!\question_bank::is_qtype_installed($question->qtype)) { + // It sometimes happens that people end up with junk questions + // in their question bank of a type that is no longer installed. + // We cannot do most actions on them, because that leads to errors. + return [null, null, null]; + } + if (question_has_capability_on($question, 'edit')) { return [$this->qbank->edit_question_moodle_url($question->id), 't/edit', $this->stredit]; } else if (question_has_capability_on($question, 'view')) { diff --git a/question/classes/bank/export_xml_action_column.php b/question/classes/bank/export_xml_action_column.php index 97118276260..08a9dc55ca9 100644 --- a/question/classes/bank/export_xml_action_column.php +++ b/question/classes/bank/export_xml_action_column.php @@ -46,6 +46,13 @@ class export_xml_action_column extends menu_action_column_base { } protected function get_url_icon_and_label(\stdClass $question): array { + if (!\question_bank::is_qtype_installed($question->qtype)) { + // It sometimes happens that people end up with junk questions + // in their question bank of a type that is no longer installed. + // We cannot do most actions on them, because that leads to errors. + return [null, null, null]; + } + if (!question_has_capability_on($question, 'view')) { return [null, null, null]; } diff --git a/question/classes/bank/preview_action_column.php b/question/classes/bank/preview_action_column.php index 384399e735f..e10e7b02441 100644 --- a/question/classes/bank/preview_action_column.php +++ b/question/classes/bank/preview_action_column.php @@ -49,6 +49,14 @@ class preview_action_column extends action_column_base implements menuable_actio protected function display_content($question, $rowclasses) { global $PAGE; + + if (!\question_bank::is_qtype_installed($question->qtype)) { + // It sometimes happens that people end up with junk questions + // in their question bank of a type that is no longer installed. + // We cannot do most actions on them, because that leads to errors. + return; + } + if (question_has_capability_on($question, 'use')) { echo $PAGE->get_renderer('core_question')->question_preview_link( $question->id, $this->qbank->get_most_specific_context(), false); @@ -56,6 +64,13 @@ class preview_action_column extends action_column_base implements menuable_actio } public function get_action_menu_link(\stdClass $question): ?\action_menu_link { + if (!\question_bank::is_qtype_installed($question->qtype)) { + // It sometimes happens that people end up with junk questions + // in their question bank of a type that is no longer installed. + // We cannot do most actions on them, because that leads to errors. + return null; + } + if (!question_has_capability_on($question, 'use')) { return null; }