mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-21 17:48:43 +02:00
Plugin API - alpha version
SVN:trunk[1124]
This commit is contained in:
91
pages/UI.php
91
pages/UI.php
@@ -28,12 +28,22 @@
|
||||
*/
|
||||
function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
{
|
||||
$bFoundManual = false;
|
||||
$bFoundStopper = false;
|
||||
$bFoundManuelOp = false; // A manual operation is needed
|
||||
$bFoundManualDel = false; // Manual deletion (or change an ext key) is needed
|
||||
$bFoundSecurityIssue = false; // Some operation not allowed to the end-user
|
||||
|
||||
$iTotalDelete = 0; // count of object that must be deleted
|
||||
$iTotalReset = 0; // count of object for which an ext key will be reset (to 0)
|
||||
$aTotalDeletedObjs = array();
|
||||
$aTotalResetedObjs = array();
|
||||
|
||||
$aRequestedByUser = array();
|
||||
foreach($aObjects as $oObj)
|
||||
{
|
||||
$aRequestedByUser[] = $oObj->GetKey();
|
||||
}
|
||||
|
||||
foreach($aObjects as $oObj)
|
||||
{
|
||||
// Evaluate the impact on the DB integrity
|
||||
@@ -50,26 +60,36 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
foreach ($aDeletes as $iId => $aData)
|
||||
{
|
||||
$oToDelete = $aData['to_delete'];
|
||||
$aTotalDeletedObjs[$sRemoteClass][$iId]['to_delete'] = $oToDelete;
|
||||
if (in_array($iId, $aRequestedByUser))
|
||||
{
|
||||
$aTotalDeletedObjs[$sRemoteClass][$iId]['requested_by_user'] = true;
|
||||
}
|
||||
$bDeleteAllowed = UserRights::IsActionAllowed($sClass, UR_ACTION_DELETE, DBObjectSet::FromObject($oToDelete));
|
||||
$aTotalDeletedObjs[$sRemoteClass][$iId]['auto_delete'] = $aData['auto_delete'];
|
||||
if (!$bDeleteAllowed)
|
||||
{
|
||||
$aTotalDeletedObjs[$sRemoteClass][$iId]['issue'] = Dict::S('UI:Delete:NotAllowedToDelete');
|
||||
$bFoundStopper = true;
|
||||
$bFoundSecurityIssue = true;
|
||||
}
|
||||
else
|
||||
elseif (isset($aData['issues']) && (count($aData['issues']) > 0))
|
||||
{
|
||||
$aTotalDeletedObjs[$sRemoteClass][$iId]['to_delete'] = $oToDelete;
|
||||
$sIssueDesc = implode(', ', $aData['issues']);
|
||||
$aTotalDeletedObjs[$sRemoteClass][$iId]['issue'] = $sIssueDesc;
|
||||
$bFoundStopper = true;
|
||||
$bFoundManuelOp = true;
|
||||
}
|
||||
|
||||
$bAutoDel = $aData['auto_delete'];
|
||||
if (!$bAutoDel)
|
||||
{
|
||||
$bFoundManual = true;
|
||||
$bFoundStopper = true;
|
||||
$bFoundManualDel = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
foreach ($aResetedObjs as $sRemoteClass => $aToReset)
|
||||
{
|
||||
$iTotalReset += count($aToReset);
|
||||
@@ -84,6 +104,7 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
if (!$bUpdateAllowed)
|
||||
{
|
||||
$bFoundStopper = true;
|
||||
$bFoundSecurityIssue = true;
|
||||
$aForbiddenKeys[] = $aRemoteAttDef->GetLabel();
|
||||
}
|
||||
$aExtKeyLabels[] = $aRemoteAttDef->GetLabel();
|
||||
@@ -117,11 +138,15 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
$oP->add("<h1>".Dict::Format('UI:Title:BulkDeletionOf_Count_ObjectsOf_Class', count($aObjects), MetaModel::GetName($sClass))."</h1>\n");
|
||||
}
|
||||
// Security - do not allow the user to force a forbidden delete by the mean of page arguments...
|
||||
if ($bFoundStopper)
|
||||
if ($bFoundSecurityIssue)
|
||||
{
|
||||
throw new CoreException(Dict::S('UI:Error:NotEnoughRightsToDelete'));
|
||||
}
|
||||
if ($bFoundManual)
|
||||
if ($bFoundManuelOp)
|
||||
{
|
||||
throw new CoreException(Dict::S('UI:Error:CannotDeleteBecauseManualOpNeeded'));
|
||||
}
|
||||
if ($bFoundManualDel)
|
||||
{
|
||||
throw new CoreException(Dict::S('UI:Error:CannotDeleteBecauseOfDepencies'));
|
||||
}
|
||||
@@ -143,10 +168,18 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
{
|
||||
$oToDelete = $aData['to_delete'];
|
||||
|
||||
if (isset($aData['requested_by_user']))
|
||||
{
|
||||
$sMessage = Dict::S('UI:Delete:Deleted');
|
||||
}
|
||||
else
|
||||
{
|
||||
$sMessage = Dict::S('UI:Delete:AutomaticallyDeleted');
|
||||
}
|
||||
$aDisplayData[] = array(
|
||||
'class' => MetaModel::GetName(get_class($oToDelete)),
|
||||
'object' => $oToDelete->GetHyperLink(),
|
||||
'consequence' => Dict::S('UI:Delete:AutomaticallyDeleted'),
|
||||
'consequence' => $sMessage,
|
||||
);
|
||||
|
||||
$oToDelete->DBDeleteTracked($oMyChange);
|
||||
@@ -194,11 +227,11 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
$oP->table($aDisplayConfig, $aDisplayData);
|
||||
}
|
||||
|
||||
// Final report
|
||||
foreach($aObjects as $oObj)
|
||||
{
|
||||
$sName = $oObj->GetName();
|
||||
$sClassLabel = MetaModel::GetName(get_class($oObj));
|
||||
$oObj->DBDeleteTracked($oMyChange);
|
||||
$oP->add("<h1>".Dict::Format('UI:Delete:_Name_Class_Deleted', $sName, $sClassLabel)."</h1>\n");
|
||||
}
|
||||
}
|
||||
@@ -226,18 +259,32 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
{
|
||||
if ($bAutoDel)
|
||||
{
|
||||
$sConsequence = Dict::S('UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed');
|
||||
if (isset($aData['requested_by_user']))
|
||||
{
|
||||
$sConsequence = Dict::Format('UI:Delete:CannotDeleteBecause', $aData['issue']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sConsequence = Dict::Format('UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible', $aData['issue']);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sConsequence = Dict::S('UI:Delete:MustBeDeletedManuallyButNotAllowed');
|
||||
$sConsequence = Dict::Format('UI:Delete:MustBeDeletedManuallyButNotPossible', $aData['issue']);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($bAutoDel)
|
||||
{
|
||||
$sConsequence = Dict::S('UI:Delete:WillBeDeletedAutomatically');
|
||||
if (isset($aData['requested_by_user']))
|
||||
{
|
||||
$sConsequence = ''; // not applicable
|
||||
}
|
||||
else
|
||||
{
|
||||
$sConsequence = Dict::S('UI:Delete:WillBeDeletedAutomatically');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -272,19 +319,23 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
}
|
||||
}
|
||||
|
||||
if ($iTotalTargets > 0)
|
||||
$iInducedDeletions = $iTotalTargets - count($aObjects);
|
||||
if ($iInducedDeletions > 0)
|
||||
{
|
||||
if (count($aObjects) == 1)
|
||||
{
|
||||
$oObj = $aObjects[0];
|
||||
$oP->p(Dict::Format('UI:Delete:Count_Objects/LinksReferencing_Object', $iTotalTargets, $oObj->GetName()));
|
||||
$oP->p(Dict::Format('UI:Delete:Count_Objects/LinksReferencing_Object', $iInducedDeletions, $oObj->GetName()));
|
||||
}
|
||||
else
|
||||
{
|
||||
$oP->p(Dict::Format('UI:Delete:Count_Objects/LinksReferencingTheObjects', $iTotalTargets));
|
||||
$oP->p(Dict::Format('UI:Delete:Count_Objects/LinksReferencingTheObjects', $iInducedDeletions));
|
||||
}
|
||||
$oP->p(Dict::S('UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity'));
|
||||
}
|
||||
|
||||
if (($iInducedDeletions > 0) || $bFoundStopper)
|
||||
{
|
||||
$aDisplayConfig = array();
|
||||
$aDisplayConfig['class'] = array('label' => 'Class', 'description' => '');
|
||||
$aDisplayConfig['object'] = array('label' => 'Object', 'description' => '');
|
||||
@@ -292,13 +343,17 @@ function DeleteObjects(WebPage $oP, $sClass, $aObjects, $bDeleteConfirmed)
|
||||
$oP->table($aDisplayConfig, $aDisplayData);
|
||||
}
|
||||
|
||||
if ($iTotalTargets > 0 && ($bFoundManual || $bFoundStopper))
|
||||
if ($bFoundStopper)
|
||||
{
|
||||
if ($bFoundStopper)
|
||||
if ($bFoundSecurityIssue)
|
||||
{
|
||||
$oP->p(Dict::S('UI:Delete:SorryDeletionNotAllowed'));
|
||||
}
|
||||
elseif ($bFoundManual)
|
||||
elseif ($bFoundManualDel)
|
||||
{
|
||||
$oP->p(Dict::S('UI:Delete:PleaseDoTheManualOperations'));
|
||||
}
|
||||
else // $bFoundManualOp
|
||||
{
|
||||
$oP->p(Dict::S('UI:Delete:PleaseDoTheManualOperations'));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user