MDL-75187 mod_data: Move delete preset to a modal
Co-author: Ferran Recio <[email protected]>
This commit is contained in:
committed by
Sara Arjona
parent
a7514f231d
commit
ae5dc809ec
+122
@@ -0,0 +1,122 @@
|
||||
<?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_data\external;
|
||||
|
||||
use core\notification;
|
||||
use mod_data\manager;
|
||||
use mod_data\preset;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->libdir . '/externallib.php');
|
||||
|
||||
/**
|
||||
* This is the external method for deleting a saved preset.
|
||||
*
|
||||
* @package mod_data
|
||||
* @since Moodle 4.1
|
||||
* @copyright 2022 Amaia Anabitarte <[email protected]>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class delete_saved_preset extends \external_api {
|
||||
/**
|
||||
* Parameters.
|
||||
*
|
||||
* @return \external_function_parameters
|
||||
*/
|
||||
public static function execute_parameters(): \external_function_parameters {
|
||||
return new \external_function_parameters([
|
||||
'dataid' => new \external_value(PARAM_INT, 'Id of the data activity', VALUE_REQUIRED),
|
||||
'presetnames' => new \external_multiple_structure(
|
||||
new \external_value(PARAM_TEXT, 'The preset name to delete', VALUE_REQUIRED)
|
||||
)
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete saved preset from the file system.
|
||||
*
|
||||
* @param int $dataid Id of the data activity to check context and permissions.
|
||||
* @param array $presetnames List of saved preset names to delete.
|
||||
* @return array True if the content has been deleted; false and the warning, otherwise.
|
||||
*/
|
||||
public static function execute(int $dataid, array $presetnames): array {
|
||||
global $DB;
|
||||
|
||||
$result = false;
|
||||
$warnings = [];
|
||||
|
||||
$params = self::validate_parameters(self::execute_parameters(), ['dataid' => $dataid, 'presetnames' => $presetnames]);
|
||||
|
||||
$instance = $DB->get_record('data', ['id' => $params['dataid']], '*', MUST_EXIST);
|
||||
$manager = manager::create_from_instance($instance);
|
||||
|
||||
foreach ($params['presetnames'] as $presetname) {
|
||||
try {
|
||||
$preset = preset::create_from_instance($manager, $presetname);
|
||||
if ($preset->can_manage()) {
|
||||
if ($preset->delete()) {
|
||||
notification::success(get_string('presetdeleted', 'mod_data'));
|
||||
$result = true;
|
||||
} else {
|
||||
// An error ocurred while deleting the preset.
|
||||
$warnings[] = [
|
||||
'item' => $presetname,
|
||||
'warningcode' => 'failedpresetdelete',
|
||||
'message' => get_string('failedpresetdelete', 'mod_data')
|
||||
];
|
||||
notification::error(get_string('failedpresetdelete', 'mod_data'));
|
||||
}
|
||||
} else {
|
||||
// The user has no permission to delete the preset.
|
||||
$warnings[] = [
|
||||
'item' => $presetname,
|
||||
'warningcode' => 'cannotdeletepreset',
|
||||
'message' => get_string('cannotdeletepreset', 'mod_data')
|
||||
];
|
||||
notification::error(get_string('cannotdeletepreset', 'mod_data'));
|
||||
}
|
||||
} catch (\moodle_exception $e) {
|
||||
// The saved preset has not been deleted.
|
||||
$warnings[] = [
|
||||
'item' => $presetname,
|
||||
'warningcode' => 'exception',
|
||||
'message' => $e->getMessage()
|
||||
];
|
||||
notification::error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'result' => $result,
|
||||
'warnings' => $warnings
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return.
|
||||
*
|
||||
* @return \external_single_structure
|
||||
*/
|
||||
public static function execute_returns(): \external_single_structure {
|
||||
return new \external_single_structure([
|
||||
'result' => new \external_value(PARAM_BOOL, 'The processing result'),
|
||||
'warnings' => new \external_warnings()
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -95,7 +95,7 @@ class save_as_preset extends dynamic_form {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isset($selectedpreset->name) && !data_user_can_delete_preset($context, $selectedpreset)) {
|
||||
if (!$selectedpreset instanceof preset || !$selectedpreset->can_manage()) {
|
||||
$errors['name'] = get_string('cannotoverwritepreset', 'data');
|
||||
}
|
||||
} else if ($formdata['action'] == 'saveaspreset' || $formdata['oldpresetname'] != $formdata['name']) {
|
||||
@@ -105,7 +105,7 @@ class save_as_preset extends dynamic_form {
|
||||
$usercandelete = false;
|
||||
foreach ($sitepresets as $preset) {
|
||||
if ($formdata['name'] == $preset->name) {
|
||||
if (data_user_can_delete_preset($context, $preset)) {
|
||||
if ($preset->can_manage()) {
|
||||
$errors['name'] = get_string('errorpresetexists', 'data');
|
||||
$usercandelete = true;
|
||||
} else {
|
||||
@@ -176,8 +176,8 @@ class save_as_preset extends dynamic_form {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isset($selectedpreset->name) && data_user_can_delete_preset($context, $selectedpreset)) {
|
||||
data_delete_site_preset($formdata->name);
|
||||
if ($selectedpreset instanceof preset && $selectedpreset->can_manage()) {
|
||||
$selectedpreset->delete();
|
||||
}
|
||||
}
|
||||
$presetname = $formdata->name;
|
||||
|
||||
@@ -136,7 +136,7 @@ class presets implements templatable, renderable {
|
||||
$actionmenu->attributes['class'] .= ' presets-actions';
|
||||
|
||||
// Only users with mod/data:manageuserpresets capability have options to edit the preset.
|
||||
if (data_user_can_delete_preset($PAGE->context, $preset)) {
|
||||
if ($preset->can_manage()) {
|
||||
$params = [
|
||||
'd' => $this->id,
|
||||
'action' => 'edit',
|
||||
@@ -158,14 +158,19 @@ class presets implements templatable, renderable {
|
||||
// Delete.
|
||||
$params = [
|
||||
'd' => $this->id,
|
||||
'fullname' => "{$userid}/{$preset->shortname}",
|
||||
'action' => 'confirmdelete',
|
||||
'action' => 'delete',
|
||||
];
|
||||
$deleteactionurl = new moodle_url('/mod/data/preset.php', $params);
|
||||
$attributes = [
|
||||
'data-action' => 'deletepreset',
|
||||
'data-dataid' => $this->id,
|
||||
"data-presetname" => $preset->name,
|
||||
];
|
||||
$actionmenu->add(new action_menu_link_secondary(
|
||||
$deleteactionurl,
|
||||
null,
|
||||
get_string('delete'),
|
||||
$attributes,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -535,4 +535,67 @@ class preset {
|
||||
|
||||
return $preset->asXML();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks to see if the user has permission to manage the preset.
|
||||
*
|
||||
* @return bool Returns true if the user can manage this preset, false otherwise.
|
||||
*/
|
||||
public function can_manage(): bool {
|
||||
global $USER;
|
||||
|
||||
if ($this->isplugin) {
|
||||
// Plugin presets can't be removed or edited.
|
||||
return false;
|
||||
}
|
||||
|
||||
$context = $this->manager->get_context();
|
||||
if (has_capability('mod/data:manageuserpresets', $context)) {
|
||||
return true;
|
||||
} else {
|
||||
if ($this->get_userid() == $USER->id) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes all files related to a saved preset.
|
||||
*
|
||||
* @return bool True if the preset is a saved preset and the file exists in the file system; false otherwise.
|
||||
*/
|
||||
public function delete(): bool {
|
||||
if ($this->isplugin) {
|
||||
// Plugin presets can't be removed.
|
||||
return false;
|
||||
}
|
||||
|
||||
$exists = false;
|
||||
$filepath = $this->get_path();
|
||||
|
||||
$dir = self::get_file($filepath, '.');
|
||||
if (!empty($dir)) {
|
||||
$exists = true;
|
||||
|
||||
$fs = get_file_storage();
|
||||
$files = $fs->get_directory_files(
|
||||
$dir->get_contextid(),
|
||||
$dir->get_component(),
|
||||
$dir->get_filearea(),
|
||||
$dir->get_itemid(),
|
||||
$filepath
|
||||
);
|
||||
if (!empty($files)) {
|
||||
foreach ($files as $file) {
|
||||
$file->delete();
|
||||
}
|
||||
}
|
||||
$dir->delete();
|
||||
// Reseting storedfile property because the file has been removed.
|
||||
$this->storedfile = null;
|
||||
}
|
||||
|
||||
return $exists;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user