From d195956f3a361e2b74dd442aa14a2e26eeeaac84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 10 Dec 2021 12:40:38 +0100 Subject: [PATCH] MDL-67853 message: Translate user message preference from restore and WS --- backup/util/dbops/restore_dbops.class.php | 38 +++++++++++++++++++++-- user/externallib.php | 12 +++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/backup/util/dbops/restore_dbops.class.php b/backup/util/dbops/restore_dbops.class.php index fc0067ee771..435c101b9fc 100644 --- a/backup/util/dbops/restore_dbops.class.php +++ b/backup/util/dbops/restore_dbops.class.php @@ -1301,7 +1301,41 @@ abstract class restore_dbops { $preference = (object)$preference; // Prepare the record and insert it $preference->userid = $newuserid; - $status = $DB->insert_record('user_preferences', $preference); + + // Translate _loggedin / _loggedoff message user preferences to _enabled. (MDL-67853) + // This code cannot be removed. + if (preg_match('/message_provider_.*/', $preference->name)) { + $nameparts = explode('_', $preference->name); + $name = array_pop($nameparts); + + if ($name == 'loggedin' || $name == 'loggedoff') { + $preference->name = implode('_', $nameparts).'_enabled'; + + $existingpreference = $DB->get_record('user_preferences', + ['name' => $preference->name , 'userid' => $newuserid]); + // Merge both values. + if ($existingpreference) { + $values = []; + + if (!empty($existingpreference->value) && $existingpreference->value != 'none') { + $values = explode(',', $existingpreference->value); + } + + if (!empty($preference->value) && $preference->value != 'none') { + $values = array_merge(explode(',', $preference->value), $values); + $values = array_unique($values); + } + + $existingpreference->value = empty($values) ? 'none' : implode(',', $values); + + $DB->update_record('user_preferences', $existingpreference); + continue; + } + } + } + // End translating loggedin / loggedoff message user preferences. + + $DB->insert_record('user_preferences', $preference); } } // Special handling for htmleditor which was converted to a preference. @@ -1311,7 +1345,7 @@ abstract class restore_dbops { $preference->userid = $newuserid; $preference->name = 'htmleditor'; $preference->value = 'textarea'; - $status = $DB->insert_record('user_preferences', $preference); + $DB->insert_record('user_preferences', $preference); } } diff --git a/user/externallib.php b/user/externallib.php index 0f402dfa9a0..87f8fbed253 100644 --- a/user/externallib.php +++ b/user/externallib.php @@ -415,6 +415,18 @@ class core_user_external extends external_api { if (!empty($preferences)) { $userpref = ['id' => $userid]; foreach ($preferences as $preference) { + + /* + * Rename user message provider preferences to avoid orphan settings on old app versions. + * @todo Remove this "translation" block on MDL-73284. + */ + if (preg_match('/message_provider_.*_loggedin/', $preference['type']) || + preg_match('/message_provider_.*_loggedoff/', $preference['type'])) { + $nameparts = explode('_', $preference['type']); + array_pop($nameparts); + $preference['type'] = implode('_', $nameparts).'_enabled'; + } + $userpref['preference_' . $preference['type']] = $preference['value']; } useredit_update_user_preference($userpref);