Fixed bug on deletion: take the inheritance into account when checking for referencing objects (eg. a ticket linked to a PC was not seen)

SVN:code[180]
This commit is contained in:
Romain Quetiez
2009-09-18 09:35:21 +00:00
parent e176e2090c
commit 637993e7eb
6 changed files with 53 additions and 30 deletions

View File

@@ -63,6 +63,11 @@ class UILinksWidget
}
$sJSON = '['.implode(',', $aCurrentValues).']';
}
else
{
//echo "JSON VA IECH<br/>\n";
}
//echo "JASON: $sJSON<br/>\n";;
// Many values (or even a unknown list) display an autocomplete
if ( (count($aAllowedValues) == 0) || (count($aAllowedValues) > 50) )
@@ -269,7 +274,7 @@ EOF;
$sHTML = "<div class=\"jqmWindow\" id=\"LinkDlg_$sId\">\n";
$sHTML .= "<div class=\"wizContainer\">\n";
$sHTML .= "<div class=\"page_header\"><h1 id=\"LinkObject_DlgTitle\">$sLinkedClass attributes</h1></div>\n";
$sHTML .= "<div class=\"page_header\"><h1 id=\"LinkObject_DlgTitle\">".MetaModel::GetName($sLinkedClass)." attributes</h1></div>\n";
$sHTML .= "<form>\n";
$index = 0;
$aAttrsMap = array();

View File

@@ -847,6 +847,29 @@ abstract class DBObject
}
return $aResults;
}
public function GetReferencingObjects()
{
$aDependentObjects = array();
$aRererencingMe = MetaModel::EnumReferencingClasses(get_class($this));
foreach($aRererencingMe as $sRemoteClass => $aExtKeys)
{
foreach($aExtKeys as $sExtKeyAttCode => $oExtKeyAttDef)
{
//$oAttDef = MetaModel::GetAttributeDef($sClass, $sExtKeyAttCode);
$oSearch = new DBObjectSearch($sRemoteClass);
$oSearch->AddCondition($sExtKeyAttCode, $this->GetKey());
$oSet = new CMDBObjectSet($oSearch);
//if ($oSet->Count() > 0)
while ($oDependentObj = $oSet->fetch())
{
$aDependentObjects[$sRemoteClass][] = $oDependentObj;
}
}
}
return $aDependentObjects;
}
}

View File

@@ -317,6 +317,14 @@ abstract class MetaModel
$sRootClass = self::GetRootClass($sClass);
return (!self::HasFinalClassField($sRootClass));
}
final static public function IsParentClass($sParentClass, $sChildClass)
{
self::_check_subclass($sChildClass);
self::_check_subclass($sParentClass);
if (in_array($sParentClass, self::$m_aParentClasses[$sChildClass])) return true;
if ($sChildClass == $sParentClass) return true;
return false;
}
final static public function IsSameFamilyBranch($sClassA, $sClassB)
{
self::_check_subclass($sClassA);
@@ -2703,7 +2711,10 @@ abstract class MetaModel
{
self::_check_subclass($sClass);
$aLinksClasses = self::EnumLinksClasses();
if ($bSkipLinkingClasses)
{
$aLinksClasses = self::EnumLinksClasses();
}
// 1-N links (referencing my class), array of sClass => array of sAttcode
$aResult = array();
@@ -2715,11 +2726,11 @@ abstract class MetaModel
foreach ($aClassAttributes as $sAttCode=>$oAttDef)
{
if (self::$m_aAttribOrigins[$sSomeClass][$sAttCode] != $sSomeClass) continue;
if ($oAttDef->IsExternalKey() && ($oAttDef->GetTargetClass() == $sClass))
if ($oAttDef->IsExternalKey() && (self::IsParentClass($oAttDef->GetTargetClass(), $sClass)))
{
if ($bInnerJoinsOnly && $oAttDef->IsNullAllowed()) continue;
// Ok, I want this one
$aExtKeys[] = $sAttCode;
$aExtKeys[$sAttCode] = $oAttDef;
}
}
if (count($aExtKeys) != 0)

View File

@@ -504,30 +504,14 @@ switch($operation)
}
else
{
// Evaluate the consequences onto the DB integrity
//
$aDependentObjects = array();
$iTotalThreat = 0;
$aRererencingMe = MetaModel::EnumReferencingClasses($sClass, false /*include N-N links*/, true /*inner joins*/);
foreach($aRererencingMe as $sRemoteClass => $aExtKeys)
{
foreach($aExtKeys as $sExtKeyAttCode)
{
//$oAttDef = MetaModel::GetAttributeDef($sClass, $sExtKeyAttCode);
$oSearch = new DBObjectSearch($sRemoteClass);
$oSearch->AddCondition($sExtKeyAttCode, $id);
$oSet = new CMDBObjectSet($oSearch);
//if ($oSet->Count() > 0)
while ($oDependentObj = $oSet->fetch())
{
$aDependentObjects[$sRemoteClass][] = $oDependentObj;
$iTotalThreat++;
}
}
}
$aDependentObjects = $oObj->GetReferencingObjects();
// Ask for a confirmation, or cancel (back to the object details)
//
$iTotalThreat = 0;
foreach ($aDependentObjects as $sRemoteClass => $aPotentialDeletes)
{
$iTotalThreat += count($aPotentialDeletes);
}
if ($iTotalThreat > 0)
{
$oP->p("Warning: $iTotalThreat object(s) are pointing to the object that you would like to delete");
@@ -550,7 +534,7 @@ switch($operation)
}
else
{
$oP->p("Please confirm that you want to delete this object");
$oP->p("Please confirm that you want to delete ".$oObj->GetHyperLink());
$oP->add("<form method=\"post\">\n");
$oP->add("<input type=\"hidden\" name=\"menu\" value=\"$iActiveNodeId\">\n");
$oP->add("<input type=\"hidden\" name=\"operation\" value=\"delete_confirmed\">\n");

View File

@@ -117,7 +117,7 @@ function Page2_ConfigFilters($oPage, $oFilter)
//
foreach (MetaModel::EnumReferencingClasses($sClass, true) as $sRemoteClass => $aRemoteKeys)
{
foreach ($aRemoteKeys as $sExtKeyAttCode)
foreach ($aRemoteKeys as $sExtKeyAttCode => $oExtKeyAttDef)
{
// Set its current values
$oSubFilter = $oFilter->GetCriteria_ReferencedBy($sRemoteClass, $sExtKeyAttCode);

View File

@@ -59,7 +59,7 @@ function DisplayReferencingClasses($oPage, $sClass)
$oPage->add("<ul>\n");
foreach ($aRefs as $sRemoteClass => $aRemoteKeys)
{
foreach ($aRemoteKeys as $sExtKeyAttCode)
foreach ($aRemoteKeys as $sExtKeyAttCode => $oExtKeyAttDef)
{
$oPage->add("<li>".MakeClassHLink($sRemoteClass)." by <em>$sExtKeyAttCode</em></li>\n");
}
@@ -117,7 +117,7 @@ function DisplayRelatedClassesBestInClass($oPage, $sClass, $iLevels = 20, &$aVis
}
foreach (MetaModel::EnumReferencingClasses($sClass) as $sRemoteClass => $aRemoteKeys)
{
foreach ($aRemoteKeys as $sExtKeyAttCode)
foreach ($aRemoteKeys as $sExtKeyAttCode => $oExtKeyAttDef)
{
$sVisited = (array_key_exists($sRemoteClass, $aVisitedClasses)) ? " ..." : "";
$oPage->add("<li>$sClass| &lt;=".MakeClassHLink($sRemoteClass)."::<em>$sExtKeyAttCode</em>$sVisited</li>\n");