Sfoglia il codice sorgente

N°454 - Check data validity during CSV import
* "simulate" phase is more permissive on new hierarchical entries
* Better check during "apply" phase

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@5005 a333f486-631f-4898-b8df-5754b55c2be0

eespie 7 anni fa
parent
commit
df3fd969d6
2 ha cambiato i file con 20 aggiunte e 17 eliminazioni
  1. 12 13
      core/bulkchange.class.inc.php
  2. 8 4
      core/dbobject.class.php

+ 12 - 13
core/bulkchange.class.inc.php

@@ -109,11 +109,11 @@ class CellStatus_Modify extends CellChangeSpec
 
 class CellStatus_Issue extends CellStatus_Modify
 {
-	protected $m_sReason;
+	protected $m_sDictEntry;
 
 	public function __construct($proposedValue, $previousValue, $sReason)
 	{
-		$this->m_sReason = $sReason;
+		$this->m_sDictEntry = $sReason;
 		parent::__construct($proposedValue, $previousValue);
 	}
 
@@ -121,9 +121,9 @@ class CellStatus_Issue extends CellStatus_Modify
 	{
 		if (is_null($this->m_proposedValue))
 		{
-			return Dict::Format('UI:CSVReport-Value-SetIssue', $this->m_sReason);
+			return Dict::Format('UI:CSVReport-Value-SetIssue', $this->m_sDictEntry);
 		}
-		return Dict::Format('UI:CSVReport-Value-ChangeIssue', $this->m_proposedValue, $this->m_sReason);
+		return Dict::Format('UI:CSVReport-Value-ChangeIssue', $this->m_proposedValue, $this->m_sDictEntry);
 	}
 }
 
@@ -367,8 +367,8 @@ class BulkChange
 			else
 			{
 				// Check for additional rules
-				$oReconFilter = $oExtKey->GetAllowedValuesAsFilter(array('this' => $oTargetObj));
-				//$oReconFilter = new DBObjectSearch($oExtKey->GetTargetClass());
+				//$oReconFilter = $oExtKey->GetAllowedValuesAsFilter(array('this' => $oTargetObj));
+				$oReconFilter = new DBObjectSearch($oExtKey->GetTargetClass());
 
 				$aCacheKeys = array();
 				foreach ($aKeyConfig as $sForeignAttCode => $iCol)
@@ -414,13 +414,12 @@ class BulkChange
 						$oForeignObj = $oExtObjects->Fetch();
 						$iForeignKey = $oForeignObj->GetKey();
 					}
-					// Cannot cache the entry in this case as the conditions can change...
-					//$this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey] = array(
-					//	'c' => $iCount,
-					//	'k' => $iForeignKey,
-					//	'oql' => $oReconFilter->ToOql(),
-					//	'h' => 0, // number of hits on this cache entry
-					//);
+					$this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey] = array(
+						'c' => $iCount,
+						'k' => $iForeignKey,
+						'oql' => $oReconFilter->ToOql(),
+						'h' => 0, // number of hits on this cache entry
+					);
 				}
 				switch($iCount)
 				{

+ 8 - 4
core/dbobject.class.php

@@ -1203,9 +1203,10 @@ abstract class DBObject implements iDisplay
 			if (!MetaModel::SkipCheckExtKeys() || $oAtt->IsHierarchicalKey())
 			{
 				// Check allowed values
-				$aValues = $oAtt->GetAllowedValues($this->ToArgsForQuery());
+				$aValues = $oAtt->GetAllowedValues(array('this' => $this));
 				if (!array_key_exists($toCheck, $aValues))
 				{
+					// TODO Better error message
 					return "Value not allowed [$toCheck]";
 				}
 		}
@@ -1260,7 +1261,8 @@ abstract class DBObject implements iDisplay
 			if ($res !== true)
 			{
 				// $res contains the error description
-				$this->m_aCheckIssues[] = "Unexpected value for attribute '$sAttCode': $res";
+				$sAttributeName = Dict::S('Class:'.get_class($this).'/Attribute:'.$sAttCode);
+				$this->m_aCheckIssues[] = "Unexpected value for attribute '$sAttributeName': $res";
 			}
 		}
 		if (count($this->m_aCheckIssues) > 0)
@@ -1673,7 +1675,8 @@ abstract class DBObject implements iDisplay
 		if (!$bRes)
 		{
 			$sIssues = implode(', ', $aIssues);
-			throw new CoreException("Object not following integrity rules", array('issues' => $sIssues, 'class' => get_class($this), 'id' => $this->GetKey()));
+			$sClassName = Dict::S('Class:'.get_class($this));
+			throw new CoreException("Object not following integrity rules", array('<br>issues' => $sIssues, '<br>class' => $sClassName, '<br>id' => $this->GetKey()));
 		}
 
 		// Stop watches
@@ -1938,7 +1941,8 @@ abstract class DBObject implements iDisplay
 			if (!$bRes)
 			{
 				$sIssues = implode(', ', $aIssues);
-				throw new CoreException("Object not following integrity rules", array('issues' => $sIssues, 'class' => get_class($this), 'id' => $this->GetKey()));
+				$sClassName = Dict::S('Class:'.get_class($this));
+				throw new CoreException("Object not following integrity rules", array('<br>issues' => $sIssues, '<br>class' => $sClassName, '<br>id' => $this->GetKey()));
 			}
 
 			// Save the original values (will be reset to the new values when the object get written to the DB)