Merge branch 'MDL-83861_main' of https://github.com/marxjohnson/moodle
This commit is contained in:
@@ -39,6 +39,7 @@ class plugin_feature extends plugin_features_base {
|
||||
public function get_question_filters(?view $qbank = null): array {
|
||||
return [
|
||||
new question_name_condition($qbank),
|
||||
new question_idnumber_condition($qbank),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace qbank_viewquestionname;
|
||||
|
||||
use core\output\datafilter;
|
||||
use core_question\local\bank\condition;
|
||||
|
||||
/**
|
||||
* Filter condition for filtering on the question idnumber
|
||||
*
|
||||
* @package qbank_viewquestionname
|
||||
* @copyright 2024 onwards Catalyst IT EU {@link https://catalyst-eu.net}
|
||||
* @author Mark Johnson <[email protected]>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class question_idnumber_condition extends condition {
|
||||
#[\Override]
|
||||
public function get_title() {
|
||||
return get_string('questionidnumbercondition', 'qbank_viewquestionname');
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
public static function get_condition_key() {
|
||||
return 'questionidnumber';
|
||||
}
|
||||
|
||||
#[\Override]
|
||||
public function get_filter_class() {
|
||||
return 'core/datafilter/filtertypes/keyword';
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an SQL condition and parameters for filtering on q.idnumber.
|
||||
*
|
||||
* This will search for the terms provided anywhere in the name.
|
||||
*
|
||||
* @param array $filter
|
||||
* @return array
|
||||
*/
|
||||
public static function build_query_from_filter(array $filter): array {
|
||||
global $DB;
|
||||
|
||||
$conditions = [];
|
||||
$params = [];
|
||||
$notlike = $filter['jointype'] === datafilter::JOINTYPE_NONE;
|
||||
foreach ($filter['values'] as $key => $value) {
|
||||
$params["idnumber{$key}"] = "%{$value}%";
|
||||
$conditions[] = $DB->sql_like('qbe.idnumber', ":idnumber{$key}", casesensitive: false, notlike: $notlike);
|
||||
}
|
||||
$delimiter = $filter['jointype'] === datafilter::JOINTYPE_ANY ? ' OR ' : ' AND ';
|
||||
return [
|
||||
implode($delimiter, $conditions),
|
||||
$params,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
$string['pluginname'] = 'View question name';
|
||||
$string['privacy:metadata'] = 'The View question name question bank plugin does not store any personal data.';
|
||||
$string['questionidnumbercondition'] = 'Question ID number';
|
||||
$string['questionnamecondition'] = 'Question name';
|
||||
// In place editing.
|
||||
$string['edit_question_name_hint'] = 'Edit question name';
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
@qbank @qbank_viewquestionnname @javascript
|
||||
Feature: Filter questions by idnumber
|
||||
As a teacher
|
||||
In order to organise my questions
|
||||
I want to filter the list of questions by idnumber
|
||||
|
||||
Background:
|
||||
Given the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
And the following "activities" exist:
|
||||
| activity | name | intro | course | idnumber |
|
||||
| qbank | Qbank 1 | Question bank 1 | C1 | qbank1 |
|
||||
And the following "question categories" exist:
|
||||
| contextlevel | reference | name |
|
||||
| Activity module | qbank1 | Test questions |
|
||||
And the following "questions" exist:
|
||||
| questioncategory | qtype | name | questiontext | idnumber |
|
||||
| Test questions | truefalse | a | Answer the first question | q_01_ab |
|
||||
| Test questions | numerical | b | Answer the second question | q_02_bc |
|
||||
| Test questions | essay | c | Answer the third question | Q_21_ca |
|
||||
And I am on the "Qbank 1" "core_question > question bank" page logged in as "admin"
|
||||
And I should see "q_01_ab"
|
||||
And I should see "q_02_bc"
|
||||
And I should see "Q_21_ca"
|
||||
|
||||
Scenario: Filter by a single term
|
||||
When I apply question bank filter "Question ID number" with value "ab"
|
||||
Then I should see "q_01_ab"
|
||||
And I should not see "q_02_bc"
|
||||
And I should not see "Q_21_ca"
|
||||
|
||||
Scenario: Filter by any term
|
||||
When I apply question bank filter "Question ID number" with value "ab, ca"
|
||||
Then I should see "q_01_ab"
|
||||
And I should not see "q_02_bc"
|
||||
And I should see "Q_21_ca"
|
||||
|
||||
Scenario: Filter by all terms
|
||||
When I add question bank filter "Question ID number"
|
||||
And I set the field "Question ID number" to "q, c"
|
||||
And I set the field "Match" in the "Filter 3" "fieldset" to "All"
|
||||
And I press "Apply filters"
|
||||
Then I should not see "q_01_ab"
|
||||
And I should see "q_02_bc"
|
||||
# Filter should be case-insensitive.
|
||||
And I should see "Q_21_ca"
|
||||
|
||||
Scenario: Exclude idnumbers by filter
|
||||
When I add question bank filter "Question ID number"
|
||||
And I set the field "Question ID number" to "ab, ca"
|
||||
And I set the field "Match" in the "Filter 3" "fieldset" to "None"
|
||||
And I press "Apply filters"
|
||||
Then I should not see "q_01_ab"
|
||||
And I should see "q_02_bc"
|
||||
And I should not see "Q_21_ca"
|
||||
Reference in New Issue
Block a user