add Cleaner for preferences (workspaces)

master
Jean-Christian Paul Denis 2023-04-23 17:58:35 +02:00
parent a01d41d535
commit 36c99b2a34
Signed by: JcDenis
GPG Key ID: 1B5B8C5B90B6C951
3 changed files with 283 additions and 24 deletions

View File

@ -1,15 +1,15 @@
# Language: Français
# Module: Uninstaller - 0.2
# Date: 2023-04-16 09:40:12
# Module: Uninstaller - 0.4
# Date: 2023-04-23 15:51:03
# Author: , contact@jcdenis.fr
# Translated with translater 2023.03.19
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: Uninstaller 0.2\n"
"Project-Id-Version: Uninstaller 0.4\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2023-04-16T09:40:12+00:00\n"
"PO-Revision-Date: 2023-04-23T15:51:03+00:00\n"
"Last-Translator: Jean-Christian Denis\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@ -100,6 +100,74 @@ msgstr "fichiers et répertoires du plugin \"%s\" effacés"
msgid "Failed to delete \"%s\" plugin files and directories"
msgstr "Impossible d'effacer les fichiers et répertoires du plugin \"%s\""
#: src/Cleaner/Preferences.php:40
msgid "Preferences"
msgstr "Préférences"
#: src/Cleaner/Preferences.php:41
msgid "Users preferences workspaces"
msgstr "Préférences utilisateurs (workspaces)"
#: src/Cleaner/Preferences.php:50
msgid "delete selected global preferences workspaces"
msgstr "effacer les préférences globales"
#: src/Cleaner/Preferences.php:51
msgid "delete \"%s\" global preferences workspace"
msgstr "effacer les préférences globales \"%s\""
#: src/Cleaner/Preferences.php:52
msgid "\"%s\" global preferences workspace deleted"
msgstr "préférences globales \"%s\" effacées"
#: src/Cleaner/Preferences.php:53
msgid "Failed to delete \"%s\" global preferences workspace"
msgstr "Impossible d'effacer les préférences globales \"%s\""
#: src/Cleaner/Preferences.php:57
msgid "delete selected users preferences workspaces"
msgstr "effacer les préférences utilisateurs sélectionnées"
#: src/Cleaner/Preferences.php:58
msgid "delete \"%s\" users preferences workspace"
msgstr "effacer les préférences utilisateurs \"%s\""
#: src/Cleaner/Preferences.php:59
msgid "\"%s\" users preferences workspace deleted"
msgstr "préférences utilistateurs \"%s\" effacées"
#: src/Cleaner/Preferences.php:60
msgid "Failed to delete \"%s\" users preferences workspace"
msgstr "Impossible d'effacer les préférences utilisateurs \"%s\""
#: src/Cleaner/Preferences.php:64
msgid "delete selected preferences workspaces"
msgstr "effacer les préférences selectionnées"
#: src/Cleaner/Preferences.php:65
msgid "delete \"%s\" preferences workspace"
msgstr "effacer les préférences \"%s\""
#: src/Cleaner/Preferences.php:66
msgid "\"%s\" preferences workspace deleted"
msgstr "préférences \"%s\" effacées"
#: src/Cleaner/Preferences.php:67
msgid "Failed to delete \"%s\" preferences workspace"
msgstr "Impossible d'effacer les préférences \"%s\""
#: src/Cleaner/Preferences.php:72
msgid "delete related preferences"
msgstr "effacer les préférences associées"
#: src/Cleaner/Preferences.php:73
msgid "related preferences deleted"
msgstr "préférences associées effacées"
#: src/Cleaner/Preferences.php:74
msgid "Failed to delete related preferences"
msgstr "Impossible d'effacer les préférences associées"
#: src/Cleaner/Settings.php:41
msgid "Namespaces registered in dcSettings"
msgstr "Espaces de nom (namespaces) enregistrés dans dcSettings"
@ -164,39 +232,39 @@ msgstr "paramètres relatifs effacer"
msgid "Failed to delete related settings"
msgstr "Impossible d'effacer les paramètres relatifs"
#: src/Cleaner/Tables.php:36
#: src/Cleaner/Tables.php:37
msgid "All database tables of Dotclear"
msgstr "Toutes les tables Dotclear de la base de données"
#: src/Cleaner/Tables.php:45
#: src/Cleaner/Tables.php:46
msgid "delete selected tables"
msgstr "effacer les tables sélectionnées"
#: src/Cleaner/Tables.php:46
#: src/Cleaner/Tables.php:47
msgid "delete \"%s\" table"
msgstr "Supprimer la table \"%s\""
#: src/Cleaner/Tables.php:47
#: src/Cleaner/Tables.php:48
msgid "\"%s\" table deleted"
msgstr "table \"%s\" supprimée"
#: src/Cleaner/Tables.php:48
#: src/Cleaner/Tables.php:49
msgid "Failed to delete \"%s\" table"
msgstr "Impossible de supprimer la table \"%s\""
#: src/Cleaner/Tables.php:52
#: src/Cleaner/Tables.php:53
msgid "empty selected tables"
msgstr "vider les tables selectionnées"
#: src/Cleaner/Tables.php:53
#: src/Cleaner/Tables.php:54
msgid "empty \"%s\" table"
msgstr "vider la table \"%s\""
#: src/Cleaner/Tables.php:54
#: src/Cleaner/Tables.php:55
msgid "\"%s\" table emptied"
msgstr "table \"%s\" vidée"
#: src/Cleaner/Tables.php:55
#: src/Cleaner/Tables.php:56
msgid "Failed to empty \"%s\" table"
msgstr "Impossible de vider la table \"%s\""
@ -260,47 +328,47 @@ msgstr "numéro de version de \"%s\" supprimé"
msgid "Failed to delete \"%s\" version number"
msgstr "Impossible de supprimer le numéro de version de \"%s\""
#: src/Cleaners.php:84
#: src/Cleaners.php:87
msgid "Unknown cleaner \"%s\""
msgstr "Nettoyeur \"%s\" inconnu"
#: src/Cleaners.php:87
#: src/Cleaners.php:90
msgid "Unsintaller can't remove itself"
msgstr "Le désinstalleur ne peut pas se supprimer lui-même"
#: src/Manage.php:64
#: src/Manage.php:65
msgid "Unknown module id to uninstall"
msgstr "Module a désinstaller inconnu"
#: src/Manage.php:71
#: src/Manage.php:73
msgid "There are no uninstall actions for this module"
msgstr "Il n'y a aucune action pour ce module"
#: src/Manage.php:93
#: src/Manage.php:98
msgid "Uninstall action successfuly excecuted"
msgstr "Actions de désinstallation exécutées avec succès"
#: src/Manage.php:96
#: src/Manage.php:101
msgid "No uninstall action done"
msgstr "Aucune action de désinstallation exécutée"
#: src/Manage.php:125
#: src/Manage.php:129
msgid "Are you sure you perform these ations?"
msgstr "Êtes-vous sûre de vouloir effectuer ces actions ?"
#: src/Manage.php:154
#: src/Manage.php:158
msgid "Perform selected actions"
msgstr "Effectuer les actions sélectionnées"
#: src/Manage.php:160
#: src/Manage.php:164
msgid "Uninstall theme \"%s\""
msgstr "Désinstaller le thème \"%s\""
#: src/Manage.php:160
#: src/Manage.php:164
msgid "Uninstall plugin \"%s\""
msgstr "Désinstaller le plugin \"%s\""
#: src/Manage.php:161
#: src/Manage.php:165
msgid "The module \"%s %s\" offers advanced unsintall process:"
msgstr "Le module \"%s %s\" propose un processus de désinstallation avancée :"

View File

@ -0,0 +1,190 @@
<?php
/**
* @brief Uninstaller, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugin
*
* @author Jean-Christian Denis and Contributors
*
* @copyright Jean-Christian Denis
* @copyright GPL-2.0 https://www.gnu.org/licenses/gpl-2.0.html
*/
declare(strict_types=1);
namespace Dotclear\Plugin\Uninstaller\Cleaner;
use dcCore;
use dcWorkspace;
use Dotclear\Database\Statement\{
DeleteStatement,
SelectStatement
};
use Dotclear\Plugin\Uninstaller\{
AbstractCleaner,
ActionDescriptor
};
/**
* Users preferences cleaner.
*
* Cleaner manages entire users preferences workspace
* except 'delete_related' which can pickup preference ws/id pairs
*/
class Preferences extends AbstractCleaner
{
protected function properties(): array
{
return [
'id' => 'preferences',
'name' => __('Preferences'),
'desc' => __('Users preferences workspaces'),
];
}
protected function actions(): array
{
return [
new ActionDescriptor([
'id' => 'delete_global',
'select' => __('delete selected global preferences workspaces'),
'query' => __('delete "%s" global preferences workspace'),
'success' => __('"%s" global preferences workspace deleted'),
'error' => __('Failed to delete "%s" global preferences workspace'),
]),
new ActionDescriptor([
'id' => 'delete_local',
'select' => __('delete selected users preferences workspaces'),
'query' => __('delete "%s" users preferences workspace'),
'success' => __('"%s" users preferences workspace deleted'),
'error' => __('Failed to delete "%s" users preferences workspace'),
]),
new ActionDescriptor([
'id' => 'delete_all',
'select' => __('delete selected preferences workspaces'),
'query' => __('delete "%s" preferences workspace'),
'success' => __('"%s" preferences workspace deleted'),
'error' => __('Failed to delete "%s" preferences workspace'),
]),
// $ns = 'pref_ws:pref_id;pref_ws:pref_id;...' for global and users preferences
new ActionDescriptor([
'id' => 'delete_related',
'query' => __('delete related preferences'),
'success' => __('related preferences deleted'),
'error' => __('Failed to delete related preferences'),
]),
];
}
public function distributed(): array
{
return [
'accessibility',
'interface',
'maintenance',
'profile',
'dashboard',
'favorites',
'toggles',
];
}
public function values(): array
{
$sql = new SelectStatement();
$sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME)
->columns(['pref_ws'])
->where($sql->orGroup(['user_id IS NULL', 'user_id IS NOT NULL']))
->group('pref_ws');
$res = $sql->select();
if ($res == null || $res->isEmpty()) {
return [];
}
$rs = [];
$i = 0;
while ($res->fetch()) {
$sql = new SelectStatement();
$sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME)
->fields([$sql->count('*')])
->where($sql->orGroup(['user_id IS NULL', 'user_id IS NOT NULL']))
->and('pref_ws = ' . $sql->quote($res->f('pref_ws')))
->group('pref_ws');
$rs[$i]['key'] = $res->f('pref_ws');
$rs[$i]['value'] = (int) $sql->select()?->f(0);
$i++;
}
return $rs;
}
public function execute(string $action, string $ns): bool
{
$sql = new DeleteStatement();
if ($action == 'delete_global' && self::checkNs($ns)) {
$sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME)
->where('user_id IS NULL')
->and('pref_ws = ' . $sql->quote((string) $ns))
->delete();
return true;
}
if ($action == 'delete_local' && self::checkNs($ns)) {
$sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME)
->where('user_id = ' . $sql->quote((string) dcCore::app()->blog?->id))
->and('pref_ws = ' . $sql->quote((string) $ns))
->delete();
return true;
}
if ($action == 'delete_all' && self::checkNs($ns)) {
$sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME)
->where('pref_ws = ' . $sql->quote((string) $ns))
->and($sql->orGroup(['user_id IS NULL', 'user_id IS NOT NULL']))
->delete();
return true;
}
if ($action == 'delete_related') {
// check ns match ws:id;
$reg_ws = substr(dcWorkspace::WS_NAME_SCHEMA, 2, -2);
$reg_id = substr(dcWorkspace::WS_ID_SCHEMA, 2, -2);
if (!preg_match_all('#((' . $reg_ws . '):(' . $reg_id . ');?)#', $ns, $matches)) {
return false;
}
// build ws/id requests
$or = [];
foreach ($matches[2] as $key => $name) {
$or[] = $sql->andGroup(['pref_ws = ' . $sql->quote((string) $name), 'pref_id = ' . $sql->quote((string) $matches[3][$key])]);
}
if (empty($or)) {
return false;
}
$sql->from(dcCore::app()->prefix . dcWorkspace::WS_TABLE_NAME)
->where($sql->orGroup($or))
->and($sql->orGroup(['user_id IS NULL', 'user_id IS NOT NULL']))
->delete();
return true;
}
return false;
}
/**
* Check well formed ns.
*
* @param string The ns to check
*
* @return bool True on well formed
*/
private static function checkNs(string $ns): bool
{
return preg_match(dcWorkspace::WS_NAME_SCHEMA, $ns);
}
}

View File

@ -38,6 +38,7 @@ class Prepend extends dcNsProcess
dcCore::app()->addBehavior('UninstallerCleanersConstruct', function (Cleaners $cleaners): void {
$cleaners
->add(new Cleaner\Settings())
->add(new Cleaner\Preferences())
->add(new Cleaner\Tables())
->add(new Cleaner\Versions())
->add(new Cleaner\Logs())