Pārlūkot izejas kodu

Stop watches - reviewed history of changes (+ started refactorization of change tracking into AttributeDef)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@2174 a333f486-631f-4898-b8df-5754b55c2be0
romainq 12 gadi atpakaļ
vecāks
revīzija
fdf6366141

+ 133 - 2
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";

+ 1 - 73
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;
 	}

+ 0 - 4
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();

+ 1 - 1
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)