diff --git a/core/attributedef.class.inc.php b/core/attributedef.class.inc.php index 982346052..d504e1362 100644 --- a/core/attributedef.class.inc.php +++ b/core/attributedef.class.inc.php @@ -437,7 +437,69 @@ abstract class AttributeDefinition if (!$oValSetDef) return null; return $oValSetDef->GetValues($aArgs, $sContains); } - + + public function GetAsHTMLForHistory($sOldValue, $sNewValue, $sLabel = null) + { + if (is_null($sLabel)) + { + $sLabel = $this->GetLabel(); + } + + if($this->IsExternalKey()) + { + $sTargetClass = $this->GetTargetClass(); + $sOldValue = (int)$sOldValue ? MetaModel::GetHyperLink($sTargetClass, (int)$sOldValue) : null; + $sNewValue = (int)$sNewValue ? MetaModel::GetHyperLink($sTargetClass, (int)$sNewValue) : null; + } + if ( (($this->GetType() == 'String') || ($this->GetType() == 'Text')) && + (strlen($sNewValue) > strlen($sOldValue)) ) + { + // Check if some text was not appended to the field + if (substr($sNewValue,0, strlen($sOldValue)) == $sOldValue) // Text added at the end + { + $sDelta = substr($sNewValue, strlen($sOldValue)); + $sResult = Dict::Format('Change:Text_AppendedTo_AttName', $sDelta, $sLabel); + } + else if (substr($sNewValue, -strlen($sOldValue)) == $sOldValue) // Text added at the beginning + { + $sDelta = substr($sNewValue, 0, strlen($sNewValue) - strlen($sOldValue)); + $sResult = Dict::Format('Change:Text_AppendedTo_AttName', $sDelta, $sLabel); + } + else + { + if (strlen($sOldValue) == 0) + { + $sResult = Dict::Format('Change:AttName_SetTo', $sLabel, $sNewValue); + } + else + { + if (is_null($sNewValue)) + { + $sNewValue = Dict::S('UI:UndefinedObject'); + } + $sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sLabel, $sNewValue, $sOldValue); + } + } + } + else + { + if (strlen($sOldValue) == 0) + { + $sResult = Dict::Format('Change:AttName_SetTo', $sLabel, $sNewValue); + } + else + { + if (is_null($sNewValue)) + { + $sNewValue = Dict::S('UI:UndefinedObject'); + } + $sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sLabel, $sNewValue, $sOldValue); + } + } + return $sResult; + } + + /** * Parses a string to find some smart search patterns and build the corresponding search/OQL condition * Each derived class is reponsible for defining and processing their own smart patterns, the base class @@ -2155,6 +2217,14 @@ class AttributeEnum extends AttributeString return $this->GetValueLabel($sValue); } + public function GetAsHTMLForHistory($sOldValue, $sNewValue, $sLabel = null) + { + $sOldValue = is_null($sOldValue) ? null : $this->GetAsHTML($sOldValue); + $sNewValue = is_null($sNewValue) ? null : $this->GetAsHTML($sNewValue); + $sResult = parent::GetAsHTMLForHistory($sOldValue, $sNewValue, $sLabel); + return $sResult; + } + public function GetAllowedValues($aArgs = array(), $sContains = '') { $aRawValues = parent::GetAllowedValues($aArgs, $sContains); @@ -3591,6 +3661,54 @@ class AttributeStopWatch extends AttributeDefinition throw new CoreException("Unknown item code '$sItemCode' for attribute ".$this->GetHostClass().'::'.$this->GetCode()); } + public function GetSubItemAsHTMLForHistory($sItemCode, $sOldValue, $sNewValue, $sLabel) + { + switch($sItemCode) + { + case 'timespent': + $sHtmlOld = (int)$sOldValue ? AttributeDuration::FormatDuration($sOldValue) : null; + $sHtmlNew = (int)$sNewValue ? AttributeDuration::FormatDuration($sNewValue) : null; + break; + case 'started': + case 'laststart': + case 'stopped': + $sHtmlOld = (int)$sOldValue ? date(self::GetDateFormat(), (int)$sOldValue) : null; + $sHtmlNew = (int)$sNewValue ? date(self::GetDateFormat(), (int)$sNewValue) : null; + break; + + default: + foreach ($this->ListThresholds() as $iThreshold => $aFoo) + { + $sThPrefix = $iThreshold.'_'; + if (substr($sItemCode, 0, strlen($sThPrefix)) == $sThPrefix) + { + // The current threshold is concerned + $sThresholdCode = substr($sItemCode, strlen($sThPrefix)); + switch($sThresholdCode) + { + case 'deadline': + $sHtmlOld = (int)$sOldValue ? date(self::GetDateFormat(true /*full*/), (int)$sOldValue) : null; + $sHtmlNew = (int)$sNewValue ? date(self::GetDateFormat(true /*full*/), (int)$sNewValue) : null; + break; + case 'passed': + $sHtmlOld = (int)$sOldValue ? '1' : '0'; + $sHtmlNew = (int)$sNewValue ? '1' : '0'; + break; + case 'triggered': + $sHtmlOld = (int)$sOldValue ? '1' : '0'; + $sHtmlNew = (int)$sNewValue ? '1' : '0'; + break; + case 'overrun': + $sHtmlOld = (int)$sOldValue > 0 ? AttributeDuration::FormatDuration((int)$sOldValue) : ''; + $sHtmlNew = (int)$sNewValue > 0 ? AttributeDuration::FormatDuration((int)$sNewValue) : ''; + } + } + } + } + $sRes = parent::GetAsHTMLForHistory($sHtmlOld, $sHtmlNew, $sLabel); + return $sRes; + } + static protected function GetDateFormat($bFull = false) { if ($bFull) @@ -3769,7 +3887,6 @@ class AttributeSubItem extends AttributeDefinition return $res; } - public function GetAsHTML($value, $oHostObject = null) { $oParent = $this->GetTargetAttDef(); @@ -3791,6 +3908,14 @@ class AttributeSubItem extends AttributeDefinition return $res; } + public function GetAsHTMLForHistory($sOldValue, $sNewValue, $sLabel = null) + { + $sLabel = $this->GetLabel(); + + $oParent = $this->GetTargetAttDef(); + $sValue = $oParent->GetSubItemAsHTMLForHistory($this->Get('item_code'), $sOldValue, $sNewValue, $sLabel); + return $sValue; + } } /** @@ -4331,6 +4456,12 @@ class AttributeFriendlyName extends AttributeComputedFieldVoid return Str::pure2html((string)$sValue); } + // Do not display friendly names in the history of change + public function GetAsHTMLForHistory($sOldValue, $sNewValue, $sLabel = null) + { + return ''; + } + public function GetBasicFilterLooseOperator() { return "Contains"; diff --git a/core/cmdbchangeop.class.inc.php b/core/cmdbchangeop.class.inc.php index 93610c7c7..aa2117699 100644 --- a/core/cmdbchangeop.class.inc.php +++ b/core/cmdbchangeop.class.inc.php @@ -200,9 +200,6 @@ class CMDBChangeOpSetAttributeScalar extends CMDBChangeOpSetAttribute */ public function GetDescription() { - // Temporary, until we change the options of GetDescription() -needs a more global revision - $bIsHtml = true; - $sResult = ''; $oTargetObjectClass = $this->Get('objclass'); $oTargetObjectKey = $this->Get('objkey'); @@ -218,76 +215,7 @@ class CMDBChangeOpSetAttributeScalar extends CMDBChangeOpSetAttribute $sAttName = $oAttDef->GetLabel(); $sNewValue = $this->Get('newvalue'); $sOldValue = $this->Get('oldvalue'); - if ($oAttDef instanceof AttributeEnum) - { - // translate the enum values - $sOldValue = $oAttDef->GetAsHTML($sOldValue); - $sNewValue = $oAttDef->GetAsHTML($sNewValue); - if (strlen($sOldValue) == 0) - { - $sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sNewValue); - } - else - { - $sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue); - } - } - elseif ( (($oAttDef->GetType() == 'String') || ($oAttDef->GetType() == 'Text')) && - (strlen($sNewValue) > strlen($sOldValue)) ) - { - // Check if some text was not appended to the field - if (substr($sNewValue,0, strlen($sOldValue)) == $sOldValue) // Text added at the end - { - $sDelta = substr($sNewValue, strlen($sOldValue)); - $sResult = Dict::Format('Change:Text_AppendedTo_AttName', $sDelta, $sAttName); - } - else if (substr($sNewValue, -strlen($sOldValue)) == $sOldValue) // Text added at the beginning - { - $sDelta = substr($sNewValue, 0, strlen($sNewValue) - strlen($sOldValue)); - $sResult = Dict::Format('Change:Text_AppendedTo_AttName', $sDelta, $sAttName); - } - else - { - if (strlen($sOldValue) == 0) - { - $sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sNewValue); - } - else - { - $sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue); - } - } - } - elseif($bIsHtml && $oAttDef->IsExternalKey()) - { - $sTargetClass = $oAttDef->GetTargetClass(); - $sFrom = MetaModel::GetHyperLink($sTargetClass, $sOldValue); - $sTo = MetaModel::GetHyperLink($sTargetClass, $sNewValue); - $sResult = "$sAttName set to $sTo (previous: $sFrom)"; - if (strlen($sFrom) == 0) - { - $sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sTo); - } - else - { - $sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sTo, $sFrom); - } - } - elseif ($oAttDef instanceOf AttributeBlob) - { - $sResult = "#@# Issue... found an attribute for which other type of tracking should be made"; - } - else - { - if (strlen($sOldValue) == 0) - { - $sResult = Dict::Format('Change:AttName_SetTo', $sAttName, $sNewValue); - } - else - { - $sResult = Dict::Format('Change:AttName_SetTo_NewValue_PreviousValue_OldValue', $sAttName, $sNewValue, $sOldValue); - } - } + $sResult = $oAttDef->GetAsHTMLForHistory($sOldValue, $sNewValue); } return $sResult; } diff --git a/core/cmdbobject.class.inc.php b/core/cmdbobject.class.inc.php index d24b3b4e2..1994d904f 100644 --- a/core/cmdbobject.class.inc.php +++ b/core/cmdbobject.class.inc.php @@ -256,10 +256,6 @@ abstract class CMDBObject extends DBObject $oMyChangeOp->Set("objclass", get_class($this)); $oMyChangeOp->Set("objkey", $this->GetKey()); $oMyChangeOp->Set("attcode", $sAttCode); - if (is_null($original)) - { - $original = 'undefined'; - } $oMyChangeOp->Set("oldvalue", $original); $oMyChangeOp->Set("newvalue", $value); $iId = $oMyChangeOp->DBInsertNoReload(); diff --git a/core/ormstopwatch.class.inc.php b/core/ormstopwatch.class.inc.php index c0d2e8aac..73cae09b4 100644 --- a/core/ormstopwatch.class.inc.php +++ b/core/ormstopwatch.class.inc.php @@ -88,7 +88,7 @@ return false; return (string) $this->iTimeSpent; } - public function DefineThreshold($iPercent, $tDeadline = null, $bPassed = false, $bTriggered = false, $iOverrun = 0) + public function DefineThreshold($iPercent, $tDeadline = null, $bPassed = false, $bTriggered = false, $iOverrun = null) { $this->aThresholds[$iPercent] = array( 'deadline' => $tDeadline, // unix time (seconds)