From 13e862de9a20ac8a07d66f7e229c4ff731b0a9c2 Mon Sep 17 00:00:00 2001 From: PMKuipers Date: Tue, 27 Jun 2023 07:33:27 +0200 Subject: [PATCH] Studyplan marking for csync cascade --- classes/associationservice.php | 8 +++++--- classes/studyitem.php | 7 ++++++- classes/studyplan.php | 22 ++++++++++++++++++++++ classes/task/autocohortsync.php | 14 ++++++++++++-- db/install.xml | 3 ++- db/tasks.php | 2 +- db/upgrade.php | 13 +++++++++++++ lang/en/local_treestudyplan.php | 2 ++ lang/nl/local_treestudyplan.php | 1 + settings.php | 4 +++- version.php | 2 +- 11 files changed, 68 insertions(+), 10 deletions(-) diff --git a/classes/associationservice.php b/classes/associationservice.php index ee36ad7..809601f 100644 --- a/classes/associationservice.php +++ b/classes/associationservice.php @@ -201,6 +201,7 @@ class associationservice extends \external_api 'cohort_id' => $cohort_id, ]); + $studyplan->mark_csync_changed(); return ['success' => true, 'msg'=>'Cohort connected']; } else { @@ -239,7 +240,9 @@ class associationservice extends \external_api 'studyplan_id' => $studyplan_id, 'cohort_id' => $cohort_id, ]); - + + $studyplan->mark_csync_changed(); + return ['success' => true, 'msg'=>'Cohort Disconnected']; } else { return ['success' => true, 'msg'=>'Connection does not exist']; @@ -314,8 +317,7 @@ class associationservice extends \external_api 'studyplan_id' => $studyplan_id, 'user_id' => $user_id, ]); - - return ['success' => true, 'msg'=>'USer Disconnected']; + return ['success' => true, 'msg'=>'User Disconnected']; } else { return ['success' => true, 'msg'=>'Connection does not exist']; } diff --git a/classes/studyitem.php b/classes/studyitem.php index b2e8803..32e8c0b 100644 --- a/classes/studyitem.php +++ b/classes/studyitem.php @@ -198,7 +198,12 @@ class studyitem { } } $id = $DB->insert_record(self::TABLE, $info); - return self::findById($id); + $item = self::findById($id); + if($item->type() == self::COURSE){ + // Signal the studyplan that a course has been added so it can be marked for csync cascading + $item->getStudyline()->getStudyplan()->mark_csync_changed(); + } + return $item; } public function edit($fields) diff --git a/classes/studyplan.php b/classes/studyplan.php index c0f9d52..92c9616 100644 --- a/classes/studyplan.php +++ b/classes/studyplan.php @@ -729,6 +729,28 @@ class studyplan { return true; } + /** + * Mark the studyplan as changed regarding courses and associated cohorts + */ + public function mark_csync_changed(){ + global $DB; + $DB->update_record(self::TABLE, ['id' => $this->id,"csync_flag" => 1]); + $this->r->csync_flag = 1; //manually set it in the cache, if something unexpected happened, an exception has already been thrown anyway + } + + /** + * Clear the csync mark + */ + public function clear_csync_changed(){ + global $DB; + $DB->update_record(self::TABLE, ['id' => $this->id,"csync_flag" => 0]); + $this->r->csync_flag = 0; //manually set it in the cache, if something unexpected happened, an exception has already been thrown anyway + } + + public function has_csync_changed(){ + return ($this->r->csync_flag > 0)?true:false; + } + /** * See if the specified course id is linked in this studyplan */ diff --git a/classes/task/autocohortsync.php b/classes/task/autocohortsync.php index 8ecafa7..0b63d9e 100644 --- a/classes/task/autocohortsync.php +++ b/classes/task/autocohortsync.php @@ -20,12 +20,22 @@ class autocohortsync extends \core\task\scheduled_task { */ public function execute() { if(get_config("local_treestudyplan","csync_enable")){ + \mtrace("Automatic csync cascading enabled"); $studyplans = studyplan::find_all(); foreach($studyplans as $studyplan) { - $enroller = new cascadecohortsync($studyplan); - $enroller->sync(); + // Only process studyplans that have been marked for change because + // a cohort change has occurred or a course has been added.... + if($studyplan->has_csync_changed()){ + \mtrace("Studyplan {$studyplan->shortname()} needs processing"); + $enroller = new cascadecohortsync($studyplan); + $enroller->sync(); + $studyplan->clear_csync_changed(); + } } + \mtrace("Task done"); + } else { + \mtrace("Automatic csync cascading disabled"); } } } \ No newline at end of file diff --git a/db/install.xml b/db/install.xml index 8b7bd10..ab9a9d9 100644 --- a/db/install.xml +++ b/db/install.xml @@ -1,5 +1,5 @@ - @@ -33,6 +33,7 @@ + diff --git a/db/tasks.php b/db/tasks.php index e921373..4c98609 100644 --- a/db/tasks.php +++ b/db/tasks.php @@ -3,7 +3,7 @@ $tasks = [ [ 'classname' => 'local_treestudyplan\task\autocohortsync', 'blocking' => 0, - 'minute' => '*/10', + 'minute' => '*', 'hour' => '*', 'day' => '*', 'month' => '*', diff --git a/db/upgrade.php b/db/upgrade.php index 70accab..ed7d1b2 100644 --- a/db/upgrade.php +++ b/db/upgrade.php @@ -183,7 +183,20 @@ function xmldb_local_treestudyplan_upgrade($oldversion) { upgrade_plugin_savepoint(true, 2023051700, 'local', 'treestudyplan'); } + if ($oldversion < 2023062603) { + // Define field csync_flag to be added to local_treestudyplan. + $table = new xmldb_table('local_treestudyplan'); + $field = new xmldb_field('csync_flag', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1', 'context_id'); + + // Conditionally launch add field csync_flag. + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Treestudyplan savepoint reached. + upgrade_plugin_savepoint(true, 2023062603, 'local', 'treestudyplan'); + } return true; } \ No newline at end of file diff --git a/lang/en/local_treestudyplan.php b/lang/en/local_treestudyplan.php index 5d256c3..6c102be 100644 --- a/lang/en/local_treestudyplan.php +++ b/lang/en/local_treestudyplan.php @@ -69,6 +69,8 @@ $string['setting_csync_role_field'] = 'Role'; $string['settingdesc_csync_role_field'] = 'The role to use for automatic cohort sync enrolment created in courses'; $string['setting_csync_remember_manual_csync_field'] = 'Remember existing cohort-syncs'; $string['settingdesc_csync_remember_manual_csync_field'] = 'Mark cohort syncs that were manually created earlier, so they won\'t be removed during autosync if cohorts are removed from the studyplan'; +$string['autocohortsync_name'] = 'Studyplan automatic cohort sync cascading'; + $string['studyplan_add'] = 'Add study plan'; $string['studyplan_edit'] = 'Edit study plan'; diff --git a/lang/nl/local_treestudyplan.php b/lang/nl/local_treestudyplan.php index 077115f..a0b4b8b 100644 --- a/lang/nl/local_treestudyplan.php +++ b/lang/nl/local_treestudyplan.php @@ -71,6 +71,7 @@ $string['setting_csync_role_field'] = 'Synchronisatierol'; $string['settingdesc_csync_role_field'] = 'Welke rol te gebruiken voor automatische site-groep sync koppelingen'; $string['setting_csync_remember_manual_csync_field'] = 'Bewaar bestaande site-group syncs'; $string['settingdesc_csync_remember_manual_csync_field'] = 'Markeer site-group synchronisaties die eerder handmatig zijn aangemaakt, zodat deze niet worden verwijderd als ze uit het studieplan worden gehaald.'; +$string['autocohortsync_name'] = 'Studyplan automatisch site-group synchronisatie doorzetten'; $string['studyplan_add'] = 'Nieuw studieplan'; $string['studyplan_edit'] = 'Studieplan bewerken'; diff --git a/settings.php b/settings.php index fd5183d..792cefa 100644 --- a/settings.php +++ b/settings.php @@ -198,7 +198,9 @@ if ($hassiteconfig) { $student = get_archetype_roles('student'); $student = reset($student); $page_csync->add(new admin_setting_configselect('local_treestudyplan/csync_roleid', - get_string('defaultrole', 'role'), '', $student->id ?? null, $options)); + get_string('setting_csync_role_field', 'local_treestudyplan'), + get_string('settingdesc_csync_role_field', 'local_treestudyplan'), + $student->id ?? null, $options)); } // Add settings page2 to the admin settings category. diff --git a/version.php b/version.php index fffac53..9218d8b 100644 --- a/version.php +++ b/version.php @@ -1,6 +1,6 @@ component = 'local_treestudyplan'; // Recommended since 2.0.2 (MDL-26035). Required since 3.0 (MDL-48494) -$plugin->version = 2023062602; // YYYYMMDDHH (year, month, day, iteration) +$plugin->version = 2023062604; // YYYYMMDDHH (year, month, day, iteration) $plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11) $plugin->dependencies = [