Merge branch 'MDL-77248-401' of https://github.com/andrewnicols/moodle into MOODLE_401_STABLE

This commit is contained in:
Jun Pataleta 2023-02-28 15:46:49 +08:00
commit 21afd4548b
11 changed files with 110 additions and 193 deletions

View File

@ -31,29 +31,20 @@
if (!empty($hide) and confirm_sesskey()) {
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
$class::enable_plugin($hide, false);
admin_get_root(true, false); // settings not required - only pages
if ($class::enable_plugin($hide, false)) {
// Settings not required - only pages.
admin_get_root(true, false);
}
redirect(new moodle_url('/admin/modules.php'));
}
if (!empty($show) and confirm_sesskey()) {
$canenablemodule = true;
$modulename = $show;
// Invoking a callback function that enables plugins to force additional actions (e.g. displaying notifications,
// modals, etc.) and also specify through its returned value (bool) whether the process of enabling the plugin
// should continue after these actions or not.
if (component_callback_exists("mod_{$modulename}", 'pre_enable_plugin_actions')) {
$canenablemodule = component_callback("mod_{$modulename}", 'pre_enable_plugin_actions');
}
if ($canenablemodule) {
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
$class::enable_plugin($show, true);
admin_get_root(true, false); // Settings not required - only pages.
redirect(new moodle_url('/admin/modules.php'));
if (!empty($show) && confirm_sesskey()) {
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
if ($class::enable_plugin($show, true)) {
// Settings not required - only pages.
admin_get_root(true, false);
}
redirect(new moodle_url('/admin/modules.php'));
}
echo $OUTPUT->header();

View File

@ -51,6 +51,18 @@ class mod extends base {
// Only set visibility if it's different from the current value.
if ($module->visible != $enabled) {
if ($enabled && component_callback_exists("mod_{$pluginname}", 'pre_enable_plugin_actions')) {
// This callback may be used to perform actions that must be completed prior to enabling a plugin.
// Example of this may include:
// - making a configuration change
// - adding an alert
// - checking a pre-requisite
//
// If the return value is falsy, then the change will be prevented.
if (!component_callback("mod_{$pluginname}", 'pre_enable_plugin_actions')) {
return false;
}
}
// Set module visibility.
$DB->set_field('modules', 'visible', $enabled, ['id' => $module->id]);
$haschanged = true;

View File

@ -1,11 +0,0 @@
define("mod_bigbluebuttonbn/accept_dpa",["exports","core_form/modalform","core/notification","core/str"],(function(_exports,_modalform,_notification,_str){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}
/**
* Javascript module for confirming the acceptance of the current data processing agreement before enabling
* the BigBlueButton activity module.
*
* @module mod_bigbluebuttonbn/accept_dpa
* @copyright 2022 Mihail Geshoski <mihail@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modalform=_interopRequireDefault(_modalform),_notification=_interopRequireDefault(_notification);_exports.init=()=>{const modalForm=new _modalform.default({modalConfig:{title:(0,_str.get_string)("enablingbigbluebutton","mod_bigbluebuttonbn"),large:!1},formClass:"mod_bigbluebuttonbn\\form\\accept_dpa",saveButtonText:(0,_str.get_string)("enable")});modalForm.addEventListener(modalForm.events.FORM_SUBMITTED,(event=>{event.detail.result?window.location.reload():_notification.default.addNotification({type:"error",message:event.detail.errors.join("<br>")})})),modalForm.show()}}));
//# sourceMappingURL=accept_dpa.min.js.map

View File

@ -1 +0,0 @@
{"version":3,"file":"accept_dpa.min.js","sources":["../src/accept_dpa.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Javascript module for confirming the acceptance of the current data processing agreement before enabling\n * the BigBlueButton activity module.\n *\n * @module mod_bigbluebuttonbn/accept_dpa\n * @copyright 2022 Mihail Geshoski <mihail@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport {get_string as getString} from 'core/str';\n\n/**\n * Initialize module.\n */\nexport const init = () => {\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString('enablingbigbluebutton', 'mod_bigbluebuttonbn'),\n large: false,\n },\n formClass: 'mod_bigbluebuttonbn\\\\form\\\\accept_dpa',\n saveButtonText: getString('enable'),\n });\n\n // Once the form has been submitted and successfully processed, reload the page to enable the activity module.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n type: 'error',\n message: event.detail.errors.join('<br>')\n });\n }\n });\n\n modalForm.show();\n};\n"],"names":["modalForm","ModalForm","modalConfig","title","large","formClass","saveButtonText","addEventListener","events","FORM_SUBMITTED","event","detail","result","window","location","reload","addNotification","type","message","errors","join","show"],"mappings":";;;;;;;;kMA+BoB,WAEVA,UAAY,IAAIC,mBAAU,CAC5BC,YAAa,CACTC,OAAO,mBAAU,wBAAyB,uBAC1CC,OAAO,GAEXC,UAAW,wCACXC,gBAAgB,mBAAU,YAI9BN,UAAUO,iBAAiBP,UAAUQ,OAAOC,gBAAgBC,QACpDA,MAAMC,OAAOC,OACbC,OAAOC,SAASC,+BAEHC,gBAAgB,CACzBC,KAAM,QACNC,QAAUR,MAAMC,OAAOQ,OAAOC,KAAK,aAK/CpB,UAAUqB"}

View File

@ -1,56 +0,0 @@
// 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/>.
/**
* Javascript module for confirming the acceptance of the current data processing agreement before enabling
* the BigBlueButton activity module.
*
* @module mod_bigbluebuttonbn/accept_dpa
* @copyright 2022 Mihail Geshoski <mihail@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import ModalForm from 'core_form/modalform';
import Notification from 'core/notification';
import {get_string as getString} from 'core/str';
/**
* Initialize module.
*/
export const init = () => {
const modalForm = new ModalForm({
modalConfig: {
title: getString('enablingbigbluebutton', 'mod_bigbluebuttonbn'),
large: false,
},
formClass: 'mod_bigbluebuttonbn\\form\\accept_dpa',
saveButtonText: getString('enable'),
});
// Once the form has been submitted and successfully processed, reload the page to enable the activity module.
modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {
if (event.detail.result) {
window.location.reload();
} else {
Notification.addNotification({
type: 'error',
message: event.detail.errors.join('<br>')
});
}
});
modalForm.show();
};

View File

@ -1,104 +0,0 @@
<?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 mod_bigbluebuttonbn\form;
use context;
use moodle_exception;
use moodle_url;
use core_form\dynamic_form;
use mod_bigbluebuttonbn\local\config;
/**
* Accept data processing agreement form presented before enabling the BigBlueButton activity module.
*
* @package mod_bigbluebuttonbn
* @copyright 2022 Mihail Geshoski <mihail@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class accept_dpa extends dynamic_form {
/**
* Form definition
*/
protected function definition() {
$this->_form->addElement('html', \html_writer::tag('p',
get_string('enablingbigbluebuttondpainfo', 'mod_bigbluebuttonbn', config::DEFAULT_DPA_URL)));
$this->_form->addElement('checkbox', 'acceptdefaultdpa', false, get_string('acceptdpa', 'mod_bigbluebuttonbn'),
['class' => 'bold']);
$this->_form->addRule('acceptdefaultdpa', get_string('required'), 'required', null, 'client');
}
/**
* Return form context
*
* @return context
*/
protected function get_context_for_dynamic_submission(): context {
return \context_system::instance();
}
/**
* Check if current user has access to this form, otherwise throw exception.
*
* @return void
* @throws moodle_exception
*/
protected function check_access_for_dynamic_submission(): void {
require_capability('moodle/site:config', $this->get_context_for_dynamic_submission());
}
/**
* Process the form submission, used if form was submitted via AJAX.
*
* @return array
*/
public function process_dynamic_submission(): array {
$result = false;
$errors = [];
if ($this->get_data()->acceptdefaultdpa) {
try {
set_config('bigbluebuttonbn_default_dpa_accepted', true);
$result = true;
} catch (\Exception $e) {
$errors[] = $e->getMessage();
}
}
return [
'result' => $result,
'errors' => $errors,
];
}
/**
* Load in existing data as form defaults (not applicable).
*
* @return void
*/
public function set_data_for_dynamic_submission(): void {
}
/**
* Returns url to set in $PAGE->set_url() when form is being rendered or submitted via AJAX.
*
* @return moodle_url
*/
protected function get_page_url_for_dynamic_submission(): moodle_url {
return new moodle_url('/admin/modules.php', ['show' => 'bigbluebuttonbn', 'sesskey' => sesskey()]);
}
}

View File

@ -136,6 +136,8 @@ class settings {
* @throws \coding_exception
*/
protected function add_general_settings(): admin_settingpage {
global $CFG;
$settingsgeneral = new admin_settingpage(
$this->section,
get_string('config_general', 'bigbluebuttonbn'),
@ -146,7 +148,17 @@ class settings {
// Configuration for BigBlueButton.
$item = new admin_setting_heading('bigbluebuttonbn_config_general',
'',
get_string('config_general_description', 'bigbluebuttonbn'));
get_string('config_general_description', 'bigbluebuttonbn')
);
if (empty($CFG->bigbluebuttonbn_default_dpa_accepted)) {
$settingsgeneral->add(new admin_setting_configcheckbox(
'bigbluebuttonbn_default_dpa_accepted',
get_string('acceptdpa', 'mod_bigbluebuttonbn'),
get_string('enablingbigbluebuttondpainfo', 'mod_bigbluebuttonbn', config::DEFAULT_DPA_URL),
0
));
}
$settingsgeneral->add($item);
$item = new admin_setting_configtext(

View File

@ -49,6 +49,7 @@ $string['bigbluebuttondisablednotification'] = 'The BigBlueButton activity modul
$string['cannotperformaction'] = 'Cannot perform action {$a} on this recording';
$string['enablingbigbluebutton'] = 'Enabling BigBlueButton activity';
$string['enablingbigbluebuttondpainfo'] = 'In order to meet your data protection obligations, prior to enabling this plugin, you may need to ensure that you have read and accepted the <a href="{$a}" target="_blank">Blindside Networks data processing agreement</a>. Please consult with your own privacy professionals for advice.';
$string['dpainfonotsigned'] = 'Before enabling this plugin, you must confirm that you have read and accepted the <a href="{$a}">Blindside Networks data processing agreement</a>.';
$string['indicator:cognitivedepth'] = 'BigBlueButton cognitive';
$string['indicator:cognitivedepth_help'] = 'This indicator is based on the cognitive depth reached by the student in a BigBlueButton activity.';
$string['indicator:socialbreadth'] = 'BigBlueButton social';

View File

@ -730,7 +730,11 @@ function bigbluebuttonbn_pre_enable_plugin_actions(): bool {
// agreement, do not enable the plugin. Instead, display a dynamic form where the administrator can confirm that he
// accepts the DPA prior to enabling the plugin.
if (config::get('server_url') === config::DEFAULT_SERVER_URL && !config::get('default_dpa_accepted')) {
$PAGE->requires->js_call_amd('mod_bigbluebuttonbn/accept_dpa', 'init', []);
$url = new moodle_url('/admin/category.php', ['category' => 'modbigbluebuttonbnfolder']);
\core\notification::add(
get_string('dpainfonotsigned', 'mod_bigbluebuttonbn', $url->out(false)),
\core\notification::ERROR
);
return false;
}
// Otherwise, continue and enable the plugin.

View File

@ -50,6 +50,7 @@ class mod_bigbluebuttonbn_generator extends \testing_module_generator {
*/
public function create_instance($record = null, array $options = null) {
// Prior to creating the instance, make sure that the BigBlueButton module is enabled.
set_config('bigbluebuttonbn_default_dpa_accepted', true);
$modules = \core_plugin_manager::instance()->get_plugins_of_type('mod');
if (!$modules['bigbluebuttonbn']->is_enabled()) {
mod::enable_plugin('bigbluebuttonbn', true);

View File

@ -698,4 +698,72 @@ class lib_test extends \advanced_testcase {
$event->instance = 0;
$this->assertFalse(mod_bigbluebuttonbn_core_calendar_is_event_visible($event));
}
/**
* Check the bigbluebuttonbn_pre_enable_plugin_actions function.
*
* @covers ::bigbluebuttonbn_pre_enable_plugin_actions
* @dataProvider bigbluebuttonbn_pre_enable_plugin_actions_provider
* @param bool $initialstate
* @param bool $expected
* @param int $notificationcount
*/
public function test_bigbluebuttonbn_pre_enable_plugin_actions(
?bool $initialstate,
bool $expected,
int $notificationcount
): void {
$this->resetAfterTest(true);
set_config('bigbluebuttonbn_default_dpa_accepted', $initialstate);
$this->assertEquals($expected, bigbluebuttonbn_pre_enable_plugin_actions());
$this->assertCount($notificationcount, \core\notification::fetch());
}
/**
* Check the bigbluebuttonbn_pre_enable_plugin_actions function.
*
* @covers ::bigbluebuttonbn_pre_enable_plugin_actions
* @dataProvider bigbluebuttonbn_pre_enable_plugin_actions_provider
* @param bool $initialstate
* @param bool $expected
* @param int $notificationcount
*/
public function test_enable_plugin(
?bool $initialstate,
bool $expected,
int $notificationcount
): void {
$this->resetAfterTest(true);
set_config('bigbluebuttonbn_default_dpa_accepted', $initialstate);
$this->assertEquals($expected, \core\plugininfo\mod::enable_plugin('bigbluebuttonbn', 1));
$this->assertCount($notificationcount, \core\notification::fetch());
}
/**
* Data provider for bigbluebuttonbn_pre_enable_plugin_actions tests.
*
* @return array
*/
public function bigbluebuttonbn_pre_enable_plugin_actions_provider(): array {
return [
'Initially unset' => [
null,
false,
1,
],
'Set to false' => [
false,
false,
1,
],
'Initially set' => [
true,
true,
0,
],
];
}
}