mirror of
https://github.com/moodle/moodle.git
synced 2025-03-22 00:20:37 +01:00
Merge branch 'MDL-76066-401' of https://github.com/aanabit/moodle into MOODLE_401_STABLE
This commit is contained in:
commit
df96d98c39
@ -240,7 +240,7 @@ abstract class preset_importer {
|
||||
* @return bool Wether the importing has been successful.
|
||||
*/
|
||||
public function import(bool $overwritesettings): bool {
|
||||
global $DB, $OUTPUT;
|
||||
global $DB, $OUTPUT, $CFG;
|
||||
|
||||
$settings = $this->settings->settings;
|
||||
$currentfields = $this->settings->currentfields;
|
||||
@ -250,8 +250,9 @@ abstract class preset_importer {
|
||||
foreach ($this->fieldstoupdate as $currentid => $updatable) {
|
||||
if ($currentid != -1 && isset($currentfields[$currentid])) {
|
||||
$fieldobject = data_get_field_from_id($currentfields[$currentid]->id, $module);
|
||||
$toupdate = false;
|
||||
foreach ($updatable as $param => $value) {
|
||||
if ($param != "id") {
|
||||
if ($param != "id" && $fieldobject->field->$param !== $value) {
|
||||
$fieldobject->field->$param = $value;
|
||||
}
|
||||
}
|
||||
@ -263,7 +264,7 @@ abstract class preset_importer {
|
||||
|
||||
foreach ($this->fieldstocreate as $newfield) {
|
||||
/* Make a new field */
|
||||
$filepath = "field/$newfield->type/field.class.php";
|
||||
$filepath = $CFG->dirroot."/mod/data/field/$newfield->type/field.class.php";
|
||||
if (!file_exists($filepath)) {
|
||||
$missingfieldtypes[] = $newfield->name;
|
||||
continue;
|
||||
@ -285,10 +286,10 @@ abstract class preset_importer {
|
||||
// Get rid of all old unused data.
|
||||
foreach ($currentfields as $cid => $currentfield) {
|
||||
if (!array_key_exists($cid, $this->fieldstoupdate)) {
|
||||
$id = $currentfield->id;
|
||||
// Why delete existing data records and related comments/ratings??
|
||||
$DB->delete_records('data_content', ['fieldid' => $id]);
|
||||
$DB->delete_records('data_fields', ['id' => $id]);
|
||||
|
||||
// Delete all information related to fields.
|
||||
$todelete = data_get_field_from_id($currentfield->id, $module);
|
||||
$todelete->delete_field();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1205,22 +1205,12 @@ function data_delete_instance($id) { // takes the dataid
|
||||
$cm = get_coursemodule_from_instance('data', $data->id);
|
||||
$context = context_module::instance($cm->id);
|
||||
|
||||
/// Delete all the associated information
|
||||
|
||||
// files
|
||||
$fs = get_file_storage();
|
||||
$fs->delete_area_files($context->id, 'mod_data');
|
||||
|
||||
// get all the records in this data
|
||||
$sql = "SELECT r.id
|
||||
FROM {data_records} r
|
||||
WHERE r.dataid = ?";
|
||||
|
||||
$DB->delete_records_select('data_content', "recordid IN ($sql)", array($id));
|
||||
|
||||
// delete all the records and fields
|
||||
$DB->delete_records('data_records', array('dataid'=>$id));
|
||||
$DB->delete_records('data_fields', array('dataid'=>$id));
|
||||
// Delete all information related to fields.
|
||||
$fields = $DB->get_records('data_fields', ['dataid' => $id]);
|
||||
foreach ($fields as $field) {
|
||||
$todelete = data_get_field($field, $data, $cm);
|
||||
$todelete->delete_field();
|
||||
}
|
||||
|
||||
// Remove old calendar events.
|
||||
$events = $DB->get_records('event', array('modulename' => 'data', 'instance' => $id));
|
||||
@ -2562,10 +2552,9 @@ abstract class data_preset_importer {
|
||||
/* Data not used anymore so wipe! */
|
||||
echo "Deleting field $currentfield->name<br />";
|
||||
|
||||
$id = $currentfield->id;
|
||||
// Why delete existing data records and related comments/ratings??
|
||||
$DB->delete_records('data_content', ['fieldid' => $id]);
|
||||
$DB->delete_records('data_fields', ['id' => $id]);
|
||||
// Delete all information related to fields.
|
||||
$todelete = data_get_field_from_id($currentfield->id, $this->module);
|
||||
$todelete->delete_field();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,6 +25,10 @@
|
||||
|
||||
namespace mod_data\event;
|
||||
|
||||
use mod_data\local\importer\preset_existing_importer;
|
||||
use mod_data\manager;
|
||||
use mod_data\preset;
|
||||
|
||||
class events_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
@ -360,4 +364,127 @@ class events_test extends \advanced_testcase {
|
||||
$url = new \moodle_url('/mod/data/templates.php', array('d' => $data->id));
|
||||
$this->assertEquals($url, $event->get_url());
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for build providers for test_needs_mapping and test_set_affected_fields.
|
||||
*
|
||||
* @return array[]
|
||||
*/
|
||||
public function preset_importer_provider(): array {
|
||||
// Image gallery preset is: ['title' => 'text', 'description' => 'textarea', 'image' => 'picture'];
|
||||
|
||||
$titlefield = new \stdClass();
|
||||
$titlefield->name = 'title';
|
||||
$titlefield->type = 'text';
|
||||
|
||||
$descfield = new \stdClass();
|
||||
$descfield->name = 'description';
|
||||
$descfield->type = 'textarea';
|
||||
|
||||
$imagefield = new \stdClass();
|
||||
$imagefield->name = 'image';
|
||||
$imagefield->type = 'picture';
|
||||
|
||||
$difffield = new \stdClass();
|
||||
$difffield->name = 'title';
|
||||
$difffield->type = 'textarea';
|
||||
|
||||
$newfield = new \stdClass();
|
||||
$newfield->name = 'number';
|
||||
$newfield->type = 'number';
|
||||
|
||||
return [
|
||||
'Empty database / Importer with fields' => [
|
||||
'currentfields' => [],
|
||||
'newfields' => [$titlefield, $descfield, $imagefield],
|
||||
'expected' => ['field_created' => 3],
|
||||
],
|
||||
'Database with fields / Empty importer' => [
|
||||
'currentfields' => [$titlefield, $descfield, $imagefield],
|
||||
'newfields' => [],
|
||||
'expected' => ['field_deleted' => 3],
|
||||
],
|
||||
'Fields to create' => [
|
||||
'currentfields' => [$titlefield, $descfield],
|
||||
'newfields' => [$titlefield, $descfield, $imagefield],
|
||||
'expected' => ['field_updated' => 2, 'field_created' => 1],
|
||||
],
|
||||
'Fields to remove' => [
|
||||
'currentfields' => [$titlefield, $descfield, $imagefield, $difffield],
|
||||
'newfields' => [$titlefield, $descfield, $imagefield],
|
||||
'expected' => ['field_updated' => 2, 'field_deleted' => 1],
|
||||
],
|
||||
'Fields to update' => [
|
||||
'currentfields' => [$difffield, $descfield, $imagefield],
|
||||
'newfields' => [$titlefield, $descfield, $imagefield],
|
||||
'expected' => ['field_updated' => 1, 'field_created' => 1, 'field_deleted' => 1],
|
||||
],
|
||||
'Fields to create, remove and update' => [
|
||||
'currentfields' => [$titlefield, $descfield, $imagefield, $difffield],
|
||||
'newfields' => [$titlefield, $descfield, $newfield],
|
||||
'expected' => ['field_updated' => 2, 'field_created' => 1, 'field_deleted' => 2],
|
||||
],
|
||||
];
|
||||
}
|
||||
/**
|
||||
* Test for needs_mapping method.
|
||||
*
|
||||
* @dataProvider preset_importer_provider
|
||||
*
|
||||
* @param array $currentfields Fields of the current activity.
|
||||
* @param array $newfields Fields to be imported.
|
||||
* @param array $expected Expected events.
|
||||
*/
|
||||
public function test_importing_events(
|
||||
array $currentfields,
|
||||
array $newfields,
|
||||
array $expected
|
||||
) {
|
||||
|
||||
global $USER;
|
||||
|
||||
$this->resetAfterTest();
|
||||
$this->setAdminUser();
|
||||
$plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data');
|
||||
|
||||
// Create a course and a database activity.
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]);
|
||||
// Add current fields to the activity.
|
||||
foreach ($currentfields as $field) {
|
||||
$plugingenerator->create_field($field, $activity);
|
||||
}
|
||||
$manager = manager::create_from_instance($activity);
|
||||
|
||||
$presetactivity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]);
|
||||
// Add current fields to the activity.
|
||||
foreach ($newfields as $field) {
|
||||
$plugingenerator->create_field($field, $presetactivity);
|
||||
}
|
||||
|
||||
$record = (object) [
|
||||
'name' => 'Testing preset name',
|
||||
'description' => 'Testing preset description',
|
||||
];
|
||||
$saved = $plugingenerator->create_preset($presetactivity, $record);
|
||||
$savedimporter = new preset_existing_importer($manager, $USER->id . '/Testing preset name');
|
||||
|
||||
// Trigger and capture the event for deleting the field.
|
||||
$sink = $this->redirectEvents();
|
||||
$savedimporter->import(false);
|
||||
$events = $sink->get_events();
|
||||
|
||||
foreach ($expected as $triggeredevent => $count) {
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
$event = array_shift($events);
|
||||
|
||||
// Check that the event data is valid.
|
||||
$this->assertInstanceOf('\mod_data\event\\'.$triggeredevent, $event);
|
||||
$this->assertEquals(\context_module::instance($activity->cmid), $event->get_context());
|
||||
$this->assertEventContextNotUsed($event);
|
||||
$url = new \moodle_url('/mod/data/field.php', ['d' => $activity->id]);
|
||||
$this->assertEquals($url, $event->get_url());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user