mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-13 07:24:13 +01:00
N°454 - Check data validity during CSV import
* "simulate" phase is more permissive on new hierarchical entries * Better check during "apply" phase SVN:trunk[5005]
This commit is contained in:
@@ -109,11 +109,11 @@ class CellStatus_Modify extends CellChangeSpec
|
|||||||
|
|
||||||
class CellStatus_Issue extends CellStatus_Modify
|
class CellStatus_Issue extends CellStatus_Modify
|
||||||
{
|
{
|
||||||
protected $m_sReason;
|
protected $m_sDictEntry;
|
||||||
|
|
||||||
public function __construct($proposedValue, $previousValue, $sReason)
|
public function __construct($proposedValue, $previousValue, $sReason)
|
||||||
{
|
{
|
||||||
$this->m_sReason = $sReason;
|
$this->m_sDictEntry = $sReason;
|
||||||
parent::__construct($proposedValue, $previousValue);
|
parent::__construct($proposedValue, $previousValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,9 +121,9 @@ class CellStatus_Issue extends CellStatus_Modify
|
|||||||
{
|
{
|
||||||
if (is_null($this->m_proposedValue))
|
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
|
else
|
||||||
{
|
{
|
||||||
// Check for additional rules
|
// Check for additional rules
|
||||||
$oReconFilter = $oExtKey->GetAllowedValuesAsFilter(array('this' => $oTargetObj));
|
//$oReconFilter = $oExtKey->GetAllowedValuesAsFilter(array('this' => $oTargetObj));
|
||||||
//$oReconFilter = new DBObjectSearch($oExtKey->GetTargetClass());
|
$oReconFilter = new DBObjectSearch($oExtKey->GetTargetClass());
|
||||||
|
|
||||||
$aCacheKeys = array();
|
$aCacheKeys = array();
|
||||||
foreach ($aKeyConfig as $sForeignAttCode => $iCol)
|
foreach ($aKeyConfig as $sForeignAttCode => $iCol)
|
||||||
@@ -414,13 +414,12 @@ class BulkChange
|
|||||||
$oForeignObj = $oExtObjects->Fetch();
|
$oForeignObj = $oExtObjects->Fetch();
|
||||||
$iForeignKey = $oForeignObj->GetKey();
|
$iForeignKey = $oForeignObj->GetKey();
|
||||||
}
|
}
|
||||||
// Cannot cache the entry in this case as the conditions can change...
|
$this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey] = array(
|
||||||
//$this->m_aExtKeysMappingCache[$sAttCode][$sCacheKey] = array(
|
'c' => $iCount,
|
||||||
// 'c' => $iCount,
|
'k' => $iForeignKey,
|
||||||
// 'k' => $iForeignKey,
|
'oql' => $oReconFilter->ToOql(),
|
||||||
// 'oql' => $oReconFilter->ToOql(),
|
'h' => 0, // number of hits on this cache entry
|
||||||
// 'h' => 0, // number of hits on this cache entry
|
);
|
||||||
//);
|
|
||||||
}
|
}
|
||||||
switch($iCount)
|
switch($iCount)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1203,9 +1203,10 @@ abstract class DBObject implements iDisplay
|
|||||||
if (!MetaModel::SkipCheckExtKeys() || $oAtt->IsHierarchicalKey())
|
if (!MetaModel::SkipCheckExtKeys() || $oAtt->IsHierarchicalKey())
|
||||||
{
|
{
|
||||||
// Check allowed values
|
// Check allowed values
|
||||||
$aValues = $oAtt->GetAllowedValues($this->ToArgsForQuery());
|
$aValues = $oAtt->GetAllowedValues(array('this' => $this));
|
||||||
if (!array_key_exists($toCheck, $aValues))
|
if (!array_key_exists($toCheck, $aValues))
|
||||||
{
|
{
|
||||||
|
// TODO Better error message
|
||||||
return "Value not allowed [$toCheck]";
|
return "Value not allowed [$toCheck]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1260,7 +1261,8 @@ abstract class DBObject implements iDisplay
|
|||||||
if ($res !== true)
|
if ($res !== true)
|
||||||
{
|
{
|
||||||
// $res contains the error description
|
// $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)
|
if (count($this->m_aCheckIssues) > 0)
|
||||||
@@ -1673,7 +1675,8 @@ abstract class DBObject implements iDisplay
|
|||||||
if (!$bRes)
|
if (!$bRes)
|
||||||
{
|
{
|
||||||
$sIssues = implode(', ', $aIssues);
|
$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
|
// Stop watches
|
||||||
@@ -1938,7 +1941,8 @@ abstract class DBObject implements iDisplay
|
|||||||
if (!$bRes)
|
if (!$bRes)
|
||||||
{
|
{
|
||||||
$sIssues = implode(', ', $aIssues);
|
$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)
|
// Save the original values (will be reset to the new values when the object get written to the DB)
|
||||||
|
|||||||
Reference in New Issue
Block a user