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:
Eric Espié
2017-10-11 15:31:57 +00:00
parent 29f0b74824
commit 56e14fc107
2 changed files with 20 additions and 17 deletions

View File

@@ -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)
{ {

View File

@@ -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)