diff --git a/lib/classes/plugin_manager.php b/lib/classes/plugin_manager.php index f4c0391d761..b8da2e822d1 100644 --- a/lib/classes/plugin_manager.php +++ b/lib/classes/plugin_manager.php @@ -1943,6 +1943,7 @@ class core_plugin_manager { 'editquestion', 'exportquestions', 'importquestions', + 'viewcreator', 'viewquestionname', 'viewquestiontext', 'viewquestiontype', diff --git a/question/bank/viewcreator/classes/creator_name_column.php b/question/bank/viewcreator/classes/creator_name_column.php new file mode 100644 index 00000000000..bf655de8a65 --- /dev/null +++ b/question/bank/viewcreator/classes/creator_name_column.php @@ -0,0 +1,74 @@ +. + +namespace qbank_viewcreator; + +use core_question\local\bank\column_base; + +/** + * A column type for the name of the question creator. + * + * @package qbank_viewcreator + * @copyright 2009 Tim Hunt + * @author 2021 Ghaly Marc-Alexandre + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class creator_name_column extends column_base { + + public function get_name(): string { + return 'creatorname'; + } + + protected function get_title(): string { + return get_string('createdby', 'question'); + } + + protected function display_content($question, $rowclasses): void { + global $PAGE; + $displaydata = []; + + if (!empty($question->creatorfirstname) && !empty($question->creatorlastname)) { + $u = new \stdClass(); + $u = username_load_fields_from_object($u, $question, 'creator'); + $displaydata['date'] = userdate($question->timecreated, get_string('strftimedatetime', 'langconfig')); + $displaydata['creator'] = fullname($u); + echo $PAGE->get_renderer('qbank_viewcreator')->render_creator_name($displaydata); + } + } + + public function get_extra_joins(): array { + return ['uc' => 'LEFT JOIN {user} uc ON uc.id = q.createdby']; + } + + public function get_required_fields(): array { + $allnames = \core_user\fields::get_name_fields(); + $requiredfields = []; + foreach ($allnames as $allname) { + $requiredfields[] = 'uc.' . $allname . ' AS creator' . $allname; + } + $requiredfields[] = 'q.timecreated'; + return $requiredfields; + } + + public function is_sortable(): array { + return [ + 'firstname' => ['field' => 'uc.firstname', 'title' => get_string('firstname')], + 'lastname' => ['field' => 'uc.lastname', 'title' => get_string('lastname')], + 'timecreated' => ['field' => 'q.timecreated', 'title' => get_string('date')] + ]; + } + +} diff --git a/question/bank/viewcreator/classes/modifier_name_column.php b/question/bank/viewcreator/classes/modifier_name_column.php new file mode 100644 index 00000000000..19e6737181b --- /dev/null +++ b/question/bank/viewcreator/classes/modifier_name_column.php @@ -0,0 +1,74 @@ +. + +namespace qbank_viewcreator; + +use core_question\local\bank\column_base; + +/** + * A column type for the name of the question last modifier. + * + * @package qbank_viewcreator + * @copyright 2009 Tim Hunt + * @author 2021 Ghaly Marc-Alexandre + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class modifier_name_column extends column_base { + + public function get_name(): string { + return 'modifiername'; + } + + protected function get_title(): string { + return get_string('lastmodifiedby', 'question'); + } + + protected function display_content($question, $rowclasses): void { + global $PAGE; + $displaydata = []; + + if (!empty($question->modifierfirstname) && !empty($question->modifierlastname)) { + $u = new \stdClass(); + $u = username_load_fields_from_object($u, $question, 'modifier'); + $displaydata['date'] = userdate($question->timemodified, get_string('strftimedatetime', 'langconfig')); + $displaydata['modifier'] = fullname($u); + echo $PAGE->get_renderer('qbank_viewcreator')->render_modifier_name($displaydata); + } + } + + public function get_extra_joins(): array { + return ['um' => 'LEFT JOIN {user} um ON um.id = q.modifiedby']; + } + + public function get_required_fields(): array { + $allnames = \core_user\fields::get_name_fields(); + $requiredfields = []; + foreach ($allnames as $allname) { + $requiredfields[] = 'um.' . $allname . ' AS modifier' . $allname; + } + $requiredfields[] = 'q.timemodified'; + return $requiredfields; + } + + public function is_sortable(): array { + return [ + 'firstname' => ['field' => 'um.firstname', 'title' => get_string('firstname')], + 'lastname' => ['field' => 'um.lastname', 'title' => get_string('lastname')], + 'timemodified' => ['field' => 'q.timemodified', 'title' => get_string('date')] + ]; + } + +} diff --git a/question/bank/viewcreator/classes/output/renderer.php b/question/bank/viewcreator/classes/output/renderer.php new file mode 100644 index 00000000000..faa072a280f --- /dev/null +++ b/question/bank/viewcreator/classes/output/renderer.php @@ -0,0 +1,48 @@ +. + +namespace qbank_viewcreator\output; + +/** + * Class renderer. + * @package qbank_viewcreator + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Ghaly Marc-Alexandre + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class renderer extends \plugin_renderer_base { + + /** + * Render question creator. + * + * @param array $displaydata + * @return string + */ + public function render_creator_name($displaydata) { + return $this->render_from_template('qbank_viewcreator/creator_display', $displaydata); + } + + /** + * Render question modifier. + * + * @param array $displaydata + * @return string + */ + public function render_modifier_name($displaydata) { + return $this->render_from_template('qbank_viewcreator/modifier_display', $displaydata); + } + +} diff --git a/question/bank/viewcreator/classes/plugin_feature.php b/question/bank/viewcreator/classes/plugin_feature.php new file mode 100644 index 00000000000..0af1f7e9e09 --- /dev/null +++ b/question/bank/viewcreator/classes/plugin_feature.php @@ -0,0 +1,37 @@ +. + +namespace qbank_viewcreator; + +use core_question\local\bank\plugin_features_base; + +/** + * Class plugin_feature is the entrypoint for the columns. + * + * @package qbank_viewcreator + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Ghaly Marc-Alexandre + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class plugin_feature extends plugin_features_base { + + public function get_question_columns($qbank): array { + return [ + new creator_name_column($qbank), + new modifier_name_column($qbank) + ]; + } +} diff --git a/question/bank/viewcreator/classes/privacy/provider.php b/question/bank/viewcreator/classes/privacy/provider.php new file mode 100644 index 00000000000..3665c1820b0 --- /dev/null +++ b/question/bank/viewcreator/classes/privacy/provider.php @@ -0,0 +1,32 @@ +. + +namespace qbank_viewcreator\privacy; + +/** + * Privacy Subsystem for qbank_viewcreator implementing null_provider. + * + * @package qbank_viewcreator + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Ghaly Marc-Alexandre + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class provider implements \core_privacy\local\metadata\null_provider { + + public static function get_reason(): string { + return 'privacy:metadata'; + } +} diff --git a/question/bank/viewcreator/lang/en/qbank_viewcreator.php b/question/bank/viewcreator/lang/en/qbank_viewcreator.php new file mode 100644 index 00000000000..5d93a01588f --- /dev/null +++ b/question/bank/viewcreator/lang/en/qbank_viewcreator.php @@ -0,0 +1,27 @@ +. + +/** + * Strings for component qbank_viewcreator, language 'en' + * + * @package qbank_viewcreator + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Ghaly Marc-Alexandre + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['pluginname'] = 'View creator'; +$string['privacy:metadata'] = 'View creator question bank plugin does not store any user data.'; diff --git a/question/bank/viewcreator/templates/creator_display.mustache b/question/bank/viewcreator/templates/creator_display.mustache new file mode 100644 index 00000000000..ed32f626c12 --- /dev/null +++ b/question/bank/viewcreator/templates/creator_display.mustache @@ -0,0 +1,33 @@ +{{! + This file is part of Moodle - http://moodle.org/ + Moodle is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + Moodle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with Moodle. If not, see . +}} +{{! + @template qbank_viewcreator/creator_display + Example context (json): + { + "displaydata": [ + { + "creator": "Marc Ghaly", + "date": "2 June 2021, 5:32 PM", + } + ] + } +}} + + + {{creator}} + +
+ + {{date}} + diff --git a/question/bank/viewcreator/templates/modifier_display.mustache b/question/bank/viewcreator/templates/modifier_display.mustache new file mode 100644 index 00000000000..9f950643576 --- /dev/null +++ b/question/bank/viewcreator/templates/modifier_display.mustache @@ -0,0 +1,33 @@ +{{! + This file is part of Moodle - http://moodle.org/ + Moodle is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + Moodle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with Moodle. If not, see . +}} +{{! + @template qbank_viewcreator/modifier_display + Example context (json): + { + "displaydata": [ + { + "modifier": "Marc Ghaly", + "date": "2 June 2021, 5:32 PM", + } + ] + } +}} + + + {{modifier}} + +
+ + {{date}} + diff --git a/question/bank/viewcreator/tests/behat/view_view_creator_column.feature b/question/bank/viewcreator/tests/behat/view_view_creator_column.feature new file mode 100644 index 00000000000..7172b8c688d --- /dev/null +++ b/question/bank/viewcreator/tests/behat/view_view_creator_column.feature @@ -0,0 +1,33 @@ +@qbank @qbank_viewcreator +Feature: Use the qbank plugin manager page for viewcreator plugin + In order to check the plugin behaviour with enable and disable + + Background: + Given the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + And the following "activities" exist: + | activity | name | course | idnumber | + | quiz | Test quiz | C1 | quiz1 | + And the following "question categories" exist: + | contextlevel | reference | name | + | Course | C1 | Test questions | + And the following "questions" exist: + | questioncategory | qtype | name | questiontext | + | Test questions | truefalse | First question | Answer the first question | + + Scenario: Enable/disable viewcreator column from the base view + Given I log in as "admin" + And I navigate to "Plugins > Question bank plugins > Manage question bank plugins" in site administration + And I should see "View creator" + When I click on "Disable" "link" in the "View creator" "table_row" + And I am on the "Test quiz" "quiz activity" page + And I navigate to "Question bank > Questions" in current page administration + Then I should not see "Created by" + And I should not see "Last modified by" + And I navigate to "Plugins > Question bank plugins > Manage question bank plugins" in site administration + And I click on "Enable" "link" in the "View creator" "table_row" + And I am on the "Test quiz" "quiz activity" page + And I navigate to "Question bank > Questions" in current page administration + Then I should see "Created by" + And I should see "Last modified by" diff --git a/question/bank/viewcreator/version.php b/question/bank/viewcreator/version.php new file mode 100644 index 00000000000..98094f35d4f --- /dev/null +++ b/question/bank/viewcreator/version.php @@ -0,0 +1,31 @@ +. + +/** + * Version information for qbank_viewcreator. + * + * @package qbank_viewcreator + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Ghaly Marc-Alexandre + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$plugin->component = 'qbank_viewcreator'; +$plugin->version = 2021070700; +$plugin->requires = 2021052500; +$plugin->maturity = MATURITY_STABLE; diff --git a/question/classes/bank/creator_name_column.php b/question/classes/bank/creator_name_column.php index 4db687f6936..f190e15cc4b 100644 --- a/question/classes/bank/creator_name_column.php +++ b/question/classes/bank/creator_name_column.php @@ -17,9 +17,9 @@ /** * A column type for the name of the question creator. * - * @package core_question - * @copyright 2009 Tim Hunt - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @package core_question + * @copyright 2009 Tim Hunt + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace core_question\bank; diff --git a/question/editlib.php b/question/editlib.php index aeaeb4a06dd..0d5fabab652 100644 --- a/question/editlib.php +++ b/question/editlib.php @@ -189,7 +189,7 @@ class_alias('qbank_viewquestionname\viewquestionname_column_helper', 'question_b * @deprecated since Moodle 2.7 MDL-40457 * @todo MDl-72004 delete the class alias, not done in MDL-71516 for any potential error from other plugins. */ -class_alias('core_question\bank\creator_name_column', 'question_bank_creator_name_column', true); +class_alias('qbank_viewcreator\creator_name_column', 'question_bank_creator_name_column', true); /** @@ -200,7 +200,7 @@ class_alias('core_question\bank\creator_name_column', 'question_bank_creator_nam * @deprecated since Moodle 2.7 MDL-40457 * @todo MDl-72004 delete the class alias, not done in MDL-71516 for any potential error from other plugins. */ -class_alias('core_question\bank\modifier_name_column', 'question_bank_modifier_name_column', true); +class_alias('qbank_viewcreator\modifier_name_column', 'question_bank_modifier_name_column', true); /**