From 1437eff77d8fc3133ba2e176e71477fd7b1caad3 Mon Sep 17 00:00:00 2001 From: odain Date: Fri, 6 Mar 2026 15:05:11 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B08761=20-=20Assist=20in=20cleaning=20up?= =?UTF-8?q?=20data=20prior=20to=20uninstalling=20extensions=20-=20handle?= =?UTF-8?q?=20transaction=20ID=20+=20add=20deletion=20plan=20screen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataFeatureRemovalController.php | 36 +++++++++++++++++-- .../templates/DeletionPlan.html.twig | 4 +++ .../templates/ExtensionRemovalData.html.twig | 17 +++++++++ .../ExtensionRemovalDataTab.html.twig | 8 ----- ...aturesTab.html.twig => Features.html.twig} | 0 .../templates/Main.html.twig | 4 +-- 6 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 datamodels/2.x/combodo-data-feature-removal/templates/DeletionPlan.html.twig create mode 100644 datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalData.html.twig delete mode 100644 datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalDataTab.html.twig rename datamodels/2.x/combodo-data-feature-removal/templates/{FeaturesTab.html.twig => Features.html.twig} (100%) diff --git a/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php b/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php index 3bc225e1d..e597be60a 100644 --- a/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php +++ b/datamodels/2.x/combodo-data-feature-removal/src/Controller/DataFeatureRemovalController.php @@ -12,6 +12,7 @@ require_once APPROOT.'setup/feature_removal/DryRemovalRuntimeEnvironment.php'; use Combodo\iTop\Application\TwigBase\Controller\Controller; use Combodo\iTop\AuthentToken\Helper\TokenAuthLog; +use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalException; use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalHelper; use Combodo\iTop\DataFeatureRemoval\Model\DataFeatureRemoverAuditRuleService; use Combodo\iTop\DataFeatureRemoval\Model\DataFeatureRemoverExtensionService; @@ -19,6 +20,7 @@ use Combodo\iTop\Setup\FeatureRemoval\DryRemovalRuntimeEnvironment; use Combodo\iTop\Setup\FeatureRemoval\SetupAudit; use Dict; use Exception; +use IssueLog; use MetaModel; use utils; @@ -51,8 +53,10 @@ class DataFeatureRemovalController extends Controller $iTotalCount = 0; $aData = []; $aColumns = []; + $aClasses = []; foreach (DataFeatureRemoverAuditRuleService::GetInstance()->ReadCheckRules() as $oRule) { $sContent = $oRule->Get('class_name'); + $aClasses[]=$sContent; $sModuleName = MetaModel::GetModuleName($sContent); $aExtensions = DataFeatureRemoverExtensionService::GetInstance()->GetIncludingExtensions($sModuleName); $sExtensions = implode(' ', $aExtensions); @@ -79,10 +83,12 @@ HTML, $aParams['aCheckRules'] = $this->GetTableData('Analysis', $aColumns, $aData); $aParams['rule_count'] = $iTotalCount; + $aParams['aClasses'] = $aClasses; } public function OperationAnalyze() { + $this->ValidateTransactionId(); $aSelectedExtensionsFromUI = utils::ReadPostedParam('aExtensions', []); $this->aSelectedExtensionsForCheck = []; foreach ($aSelectedExtensionsFromUI as $sCode => $aData) { @@ -98,7 +104,7 @@ HTML, $this->Analyze(); $this->OperationMain(); } catch (Exception $e) { - \IssueLog::Error(__METHOD__, null, ['stack' => $e->getTraceAsString(), 'exception' => $e->getMessage()]); + IssueLog::Error(__METHOD__, null, ['stack' => $e->getTraceAsString(), 'exception' => $e->getMessage()]); $this->OperationMain($e->getMessage()); } } @@ -182,8 +188,34 @@ HTML, private function Save(array $aGetRemovedClasses) { - \IssueLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]); + IssueLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]); DataFeatureRemoverAuditRuleService::GetInstance()->SaveChecks($aGetRemovedClasses); } + + public function OperationDeletionPlan() { + $aParams = []; + $this->ValidateTransactionId(); + + $aClasses = utils::ReadPostedParam('classes', null, utils::ENUM_SANITIZATION_FILTER_CLASS); + $aParams ['sClasses']= var_export($aClasses, true); + $this->DisplayPage($aParams); + } + + /** + * @return void + * @throws \Combodo\iTop\MFABase\Helper\MFABaseException + */ + public function ValidateTransactionId(): void + { + if (empty($_POST)) { + return; + } + + $sTransactionId = utils::ReadPostedParam('transaction_id', null, utils::ENUM_SANITIZATION_FILTER_TRANSACTION_ID); + IssueLog::Debug(__FUNCTION__.": Transaction [$sTransactionId]"); + if (empty($sTransactionId) || !utils::IsTransactionValid($sTransactionId, false)) { + throw new DataFeatureRemovalException(Dict::S("iTopUpdate:Error:InvalidToken")); + } + } } diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/DeletionPlan.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/DeletionPlan.html.twig new file mode 100644 index 000000000..ab0f7d6d7 --- /dev/null +++ b/datamodels/2.x/combodo-data-feature-removal/templates/DeletionPlan.html.twig @@ -0,0 +1,4 @@ +{# @copyright Copyright (C) 2010-2026 Combodo SARL #} +{# @license http://opensource.org/licenses/AGPL-3.0 #} + +{{ sClasses}} \ No newline at end of file diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalData.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalData.html.twig new file mode 100644 index 000000000..e1072552b --- /dev/null +++ b/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalData.html.twig @@ -0,0 +1,17 @@ +{# @copyright Copyright (C) 2010-2024 Combodo SAS #} +{# @license http://opensource.org/licenses/AGPL-3.0 #} + +{% UIPanel Neutral { sTitle:'DataFeatureRemoval:Analysis:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:Analysis:SubTitle'|dict_format(rule_count) } %} + {% UIDataTable ForForm { sRef:'aCheckRules', aColumns:aCheckRules.Columns, aData:aCheckRules.Data} %}{% EndUIDataTable %} +{% EndUIPanel %} + +{% UIForm Standard {} %} + {% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %} + {% UIInput ForHidden { sName:'operation', sValue:'DeletionPlan'} %} + {% for sKey, sClass in aClasses %} + {% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %} + {% endfor %} + {% UIToolbar ForButton {} %} + {% UIButton ForPrimaryAction {sLabel:'UI:Button:PlanDeletion'|dict_s, sName:'btn_plandeletion', sId:'btn_plandeletion', bIsSubmit:true} %} + {% EndUIToolbar %} +{% EndUIForm %} diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalDataTab.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalDataTab.html.twig deleted file mode 100644 index dbe39a956..000000000 --- a/datamodels/2.x/combodo-data-feature-removal/templates/ExtensionRemovalDataTab.html.twig +++ /dev/null @@ -1,8 +0,0 @@ -{# @copyright Copyright (C) 2010-2024 Combodo SAS #} -{# @license http://opensource.org/licenses/AGPL-3.0 #} - -{% UIForm Standard {} %} - {% UIPanel Neutral { sTitle:'DataFeatureRemoval:Analysis:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:Analysis:SubTitle'|dict_format(rule_count) } %} - {% UIDataTable ForForm { sRef:'aCheckRules', aColumns:aCheckRules.Columns, aData:aCheckRules.Data} %}{% EndUIDataTable %} - {% EndUIPanel %} -{% EndUIForm %} diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/FeaturesTab.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/Features.html.twig similarity index 100% rename from datamodels/2.x/combodo-data-feature-removal/templates/FeaturesTab.html.twig rename to datamodels/2.x/combodo-data-feature-removal/templates/Features.html.twig diff --git a/datamodels/2.x/combodo-data-feature-removal/templates/Main.html.twig b/datamodels/2.x/combodo-data-feature-removal/templates/Main.html.twig index d1552287f..d63dbfc87 100644 --- a/datamodels/2.x/combodo-data-feature-removal/templates/Main.html.twig +++ b/datamodels/2.x/combodo-data-feature-removal/templates/Main.html.twig @@ -23,6 +23,6 @@ {% endif %} - {% include 'FeaturesTab.html.twig' %} - {% include 'ExtensionRemovalDataTab.html.twig' %} + {% include 'Features.html.twig' %} + {% include 'ExtensionRemovalData.html.twig' %} {% EndUIPanel %}