From acf5e44fde1b828f425348f5f748b31b9a4e6bd8 Mon Sep 17 00:00:00 2001 From: James C <5689414+james-cnz@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:20:56 +1200 Subject: [PATCH 1/6] MDL-78080 course: Duplicate section: Fix course_update_section params --- course/format/classes/base.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/course/format/classes/base.php b/course/format/classes/base.php index 86f4b5a2e27..45d19685a60 100644 --- a/course/format/classes/base.php +++ b/course/format/classes/base.php @@ -2051,19 +2051,19 @@ abstract class base { } $course = $this->get_course(); - $oldsectioninfo = get_fast_modinfo($course)->get_section_info($originalsection->section); - $newsection = course_create_section($course, $oldsectioninfo->section + 1); // Place new section after existing one. + $newsection = course_create_section($course, $originalsection->section + 1); // Place new section after existing one. + $newsectiondata = new stdClass(); if (!empty($originalsection->name)) { - $newsection->name = get_string('duplicatedsection', 'moodle', $originalsection->name); + $newsectiondata->name = get_string('duplicatedsection', 'moodle', $originalsection->name); } else { - $newsection->name = $originalsection->name; + $newsectiondata->name = $originalsection->name; } - $newsection->summary = $originalsection->summary; - $newsection->summaryformat = $originalsection->summaryformat; - $newsection->visible = $originalsection->visible; - $newsection->availability = $originalsection->availability; - course_update_section($course, $newsection, $newsection); + $newsectiondata->summary = $originalsection->summary; + $newsectiondata->summaryformat = $originalsection->summaryformat; + $newsectiondata->visible = $originalsection->visible; + $newsectiondata->availability = $originalsection->availability; + course_update_section($course, $newsection, $newsectiondata); $modinfo = $this->get_modinfo(); From 23567ce725a392d68d3712f7c17e731f84d4b7a9 Mon Sep 17 00:00:00 2001 From: James C <5689414+james-cnz@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:22:16 +1200 Subject: [PATCH 2/6] MDL-78080 course: Duplicate section: Copy custom section options --- course/format/classes/base.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/course/format/classes/base.php b/course/format/classes/base.php index 45d19685a60..0228eda4a57 100644 --- a/course/format/classes/base.php +++ b/course/format/classes/base.php @@ -2063,6 +2063,9 @@ abstract class base { $newsectiondata->summaryformat = $originalsection->summaryformat; $newsectiondata->visible = $originalsection->visible; $newsectiondata->availability = $originalsection->availability; + foreach ($this->section_format_options() as $key => $value) { + $newsectiondata->$key = $originalsection->$key; + } course_update_section($course, $newsection, $newsectiondata); $modinfo = $this->get_modinfo(); From ef0290801336e1364f9347b11a3c163e196b9718 Mon Sep 17 00:00:00 2001 From: James C <5689414+james-cnz@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:24:09 +1200 Subject: [PATCH 3/6] MDL-78080 course: Duplicate section: Copy section summary files --- course/format/classes/base.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/course/format/classes/base.php b/course/format/classes/base.php index 0228eda4a57..cfcaa1b6169 100644 --- a/course/format/classes/base.php +++ b/course/format/classes/base.php @@ -2051,6 +2051,7 @@ abstract class base { } $course = $this->get_course(); + $context = context_course::instance($course->id); $newsection = course_create_section($course, $originalsection->section + 1); // Place new section after existing one. $newsectiondata = new stdClass(); @@ -2068,6 +2069,25 @@ abstract class base { } course_update_section($course, $newsection, $newsectiondata); + try { + $fs = get_file_storage(); + $files = $fs->get_area_files($context->id, 'course', 'section', $originalsection->id); + + foreach ($files as $f) { + + $fileinfo = [ + 'contextid' => $context->id, + 'component' => 'course', + 'filearea' => 'section', + 'itemid' => $newsection->id, + ]; + + $fs->create_file_from_storedfile($fileinfo, $f); + } + } catch (\Exception $e) { + debugging('Error copying section files.' . $e->getMessage(), DEBUG_DEVELOPER); + } + $modinfo = $this->get_modinfo(); // Duplicate the section modules, should they exist. From f00a6caaafb3a7f8eb5d7bf2c9b6d51add3ac7a0 Mon Sep 17 00:00:00 2001 From: James C <5689414+james-cnz@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:25:11 +1200 Subject: [PATCH 4/6] MDL-78080 course: Duplicate section: Don't copy deleted activities --- course/format/classes/base.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/course/format/classes/base.php b/course/format/classes/base.php index cfcaa1b6169..b0f8bc35ce9 100644 --- a/course/format/classes/base.php +++ b/course/format/classes/base.php @@ -2094,7 +2094,9 @@ abstract class base { if (array_key_exists($originalsection->section, $modinfo->sections)) { foreach ($modinfo->sections[$originalsection->section] as $modnumber) { $originalcm = $modinfo->cms[$modnumber]; - duplicate_module($course, $originalcm, $newsection->id, false); + if (!$originalcm->deletioninprogress) { + duplicate_module($course, $originalcm, $newsection->id, false); + } } } From 7cde0e99848951ab48487b290b8791bb524c9490 Mon Sep 17 00:00:00 2001 From: James C <5689414+james-cnz@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:27:01 +1200 Subject: [PATCH 5/6] MDL-78080 course: Duplicate section: No duplicate option for section 0 --- .../local/content/section/controlmenu.php | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/course/format/classes/output/local/content/section/controlmenu.php b/course/format/classes/output/local/content/section/controlmenu.php index 8b0d98fc711..9cab6c5c37a 100644 --- a/course/format/classes/output/local/content/section/controlmenu.php +++ b/course/format/classes/output/local/content/section/controlmenu.php @@ -193,19 +193,21 @@ class controlmenu implements named_templatable, renderable { 'attr' => ['class' => 'icon edit'], ]; - $duplicatesectionurl = clone($baseurl); - $duplicatesectionurl->param('section', $section->section); - $duplicatesectionurl->param('duplicatesection', $section->section); - if (!is_null($sectionreturn)) { - $duplicatesectionurl->param('sr', $sectionreturn); + if ($section->section) { + $duplicatesectionurl = clone($baseurl); + $duplicatesectionurl->param('section', $section->section); + $duplicatesectionurl->param('duplicatesection', $section->section); + if (!is_null($sectionreturn)) { + $duplicatesectionurl->param('sr', $sectionreturn); + } + $controls['duplicate'] = [ + 'url' => $duplicatesectionurl, + 'icon' => 't/copy', + 'name' => get_string('duplicate'), + 'pixattr' => ['class' => ''], + 'attr' => ['class' => 'icon duplicate'], + ]; } - $controls['duplicate'] = [ - 'url' => $duplicatesectionurl, - 'icon' => 't/copy', - 'name' => get_string('duplicate'), - 'pixattr' => ['class' => ''], - 'attr' => ['class' => 'icon duplicate'], - ]; } if ($section->section) { From 7dca6d0e3b9fa852992cf48280ab448b30194592 Mon Sep 17 00:00:00 2001 From: James C <5689414+james-cnz@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:28:07 +1200 Subject: [PATCH 6/6] MDL-78080 course: Duplicate section: Duplicate by section id, not num --- .../classes/output/local/content/section/controlmenu.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/course/format/classes/output/local/content/section/controlmenu.php b/course/format/classes/output/local/content/section/controlmenu.php index 9cab6c5c37a..e7fdb208e38 100644 --- a/course/format/classes/output/local/content/section/controlmenu.php +++ b/course/format/classes/output/local/content/section/controlmenu.php @@ -195,8 +195,8 @@ class controlmenu implements named_templatable, renderable { if ($section->section) { $duplicatesectionurl = clone($baseurl); - $duplicatesectionurl->param('section', $section->section); - $duplicatesectionurl->param('duplicatesection', $section->section); + $duplicatesectionurl->param('sectionid', $section->id); + $duplicatesectionurl->param('duplicatesection', 1); if (!is_null($sectionreturn)) { $duplicatesectionurl->param('sr', $sectionreturn); }