public static function setUpBeforeClass() { parent::setUpBeforeClass(); $super = SecurityTestHelper::createSuperAdmin(); Yii::app()->user->userModel = $super; $jim = UserTestHelper::createBasicUser('jim'); $values = array('Test1', 'Test2', 'Test3', 'Sample', 'Demo'); $customFieldData = CustomFieldData::getByName('ImportTestDropDown'); $customFieldData->serializedData = serialize($values); $saved = $customFieldData->save(); assert($saved); // Not Coding Standard $values = array('Multi 1', 'Multi 2', 'Multi 3'); $customFieldData = CustomFieldData::getByName('ImportTestMultiDropDown'); $customFieldData->serializedData = serialize($values); $saved = $customFieldData->save(); assert($saved); // Not Coding Standard $values = array('Cloud 1', 'Cloud 2', 'Cloud 3'); $customFieldData = CustomFieldData::getByName('ImportTestTagCloud'); $customFieldData->serializedData = serialize($values); $saved = $customFieldData->save(); assert($saved); // Not Coding Standard //Ensure the external system id column is present. $userTableName = User::getTableName(); ExternalSystemIdUtil::addExternalIdColumnIfMissing($userTableName); ExternalSystemIdUtil::updateByModel($super, 'A'); ExternalSystemIdUtil::updateByModel($jim, 'B'); ExternalSystemIdUtil::addExternalIdColumnIfMissing(ImportModelTestItem::getTableName()); ExternalSystemIdUtil::addExternalIdColumnIfMissing(ImportModelTestItem2::getTableName()); ExternalSystemIdUtil::addExternalIdColumnIfMissing(ImportModelTestItem3::getTableName()); ExternalSystemIdUtil::addExternalIdColumnIfMissing(ImportModelTestItem4::getTableName()); }
/** * Given a row of data, resolve each value of the row for import and either create or update an existing model. * @param object $importRules * @param array $rowData * @param array $mappingData * @param object $importRowDataResultsUtil */ public static function importByImportRulesRowData(ImportRules $importRules, $rowBean, $mappingData, ImportRowDataResultsUtil $importRowDataResultsUtil, ExplicitReadWriteModelPermissions $explicitReadWriteModelPermissions) { assert('$rowBean instanceof RedBean_OODBBean'); assert('is_array($mappingData)'); $makeNewModel = true; $modelClassName = $importRules->getModelClassName(); $externalSystemId = null; $importSanitizeResultsUtil = new ImportSanitizeResultsUtil(); $afterSaveActionsData = array(); $attributeValueData = array(); $skippedColumns = array(); $model = new $modelClassName(); $model->setScenario('importModel'); //Process the 'id' column first if available. if (false !== ($idColumnName = static::getMappedColumnNameByMappingData('id', $mappingData))) { $columnMappingData = $mappingData[$idColumnName]; $attributeValueData = static::getAttributeValueData($importRules, $idColumnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil); assert('count($attributeValueData) == 0 || count($attributeValueData) == 1'); if (isset($attributeValueData['id']) && $attributeValueData['id'] != null) { $model = $modelClassName::getById($attributeValueData['id']); } elseif (isset($attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME]) && $attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME] != null) { $externalSystemId = $attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME]; } $skippedColumns[] = $idColumnName; } //Dedupe fields processing if (static::processDedupeAttributesToCheckForSkipIfRequired($importRules, $model, $mappingData, $rowBean, $importRowDataResultsUtil, $importSanitizeResultsUtil, $skippedColumns) !== true) { if (null != ($matchedModel = $importSanitizeResultsUtil->getMatchedModel())) { $model = $matchedModel; $makeNewModel = false; } //Process the dedupe fields foreach ($importRules->getDedupeAttributes() as $dedupeField) { $sourceColumnName = static::getMappedColumnNameByMappingData($dedupeField, $mappingData); if (false !== $sourceColumnName) { $columnMappingData = $mappingData[$sourceColumnName]; static::processImportInformationForAttributeDataAndPopulateModel($importRules, $sourceColumnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil, $model, $afterSaveActionsData); } } } else { //as the row should be skipped return; } //Process the rest of the mapped colummns. ignoring owner. foreach ($mappingData as $columnName => $columnMappingData) { if ($columnMappingData['attributeIndexOrDerivedType'] != null && $columnMappingData['attributeIndexOrDerivedType'] != 'owner' && in_array($columnName, $skippedColumns) === false) { static::processImportInformationForAttributeDataAndPopulateModel($importRules, $columnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil, $model, $afterSaveActionsData); } } //Process the owner column if present foreach ($mappingData as $columnName => $columnMappingData) { if ($columnMappingData['attributeIndexOrDerivedType'] != null && $columnMappingData['attributeIndexOrDerivedType'] == 'owner' && in_array($columnName, $skippedColumns) === false) { static::processImportInformationForAttributeDataAndPopulateModel($importRules, $columnName, $columnMappingData, $rowBean, $importSanitizeResultsUtil, $model, $afterSaveActionsData); } } $validated = $model->validate(); if ($validated && $importSanitizeResultsUtil->shouldSaveModel()) { $saved = $model->save(); if ($saved) { static::processAfterSaveActions($afterSaveActionsData, $model); if ($externalSystemId != null) { ExternalSystemIdUtil::updateByModel($model, $externalSystemId); } $importRowDataResultsUtil->addMessage(Zurmo::t('ImportModule', '{modelLabel} saved correctly: {linkToModel}', array('{modelLabel}' => $model->getModelLabelByTypeAndLanguage('Singular'), '{linkToModel}' => static::resolveLinkMessageToModel($model)))); $importRowDataResultsUtil->addMessages($importSanitizeResultsUtil->getRelatedModelMessages()); if ($makeNewModel) { if ($model instanceof SecurableItem) { $model->setScenario('doNotSetModifiedDateTimeOrUser'); try { $resolved = ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($model, $explicitReadWriteModelPermissions); $importRowDataResultsUtil->setStatusToCreated(); if (!$resolved) { $importRowDataResultsUtil->addMessage('The record saved, but there was a problem ' . 'setting the security permissions. It will at least be viewable by the owner.'); $importRowDataResultsUtil->setStatusToError(); } } catch (AccessDeniedSecurityException $e) { $importRowDataResultsUtil->addMessage('The record saved, but you do not have permissions ' . 'to set the security the way you did. The record will only be viewable by the owner.'); $importRowDataResultsUtil->setStatusToError(); } $model->setScenario('importModel'); } else { $importRowDataResultsUtil->setStatusToCreated(); } } else { $importRowDataResultsUtil->setStatusToUpdated(); } } else { $importRowDataResultsUtil->addMessage('The record failed to save. Reason unknown.'); $importRowDataResultsUtil->setStatusToError(); } } else { if (!$importSanitizeResultsUtil->shouldSaveModel()) { $importRowDataResultsUtil->addMessages($importSanitizeResultsUtil->getMessages()); } $messages = RedBeanModelErrorsToMessagesUtil::makeMessagesByModel($model); if (count($messages) > 0) { $importRowDataResultsUtil->addMessages($messages); } $importRowDataResultsUtil->setStatusToError(); } }
/** * Given a row of data, resolve each value of the row for import and either create or update an existing model. * @param object $importRules * @param array $rowData * @param array $mappingData * @param object $importRowDataResultsUtil */ public static function importByImportRulesRowData(ImportRules $importRules, $rowBean, $mappingData, ImportRowDataResultsUtil $importRowDataResultsUtil, ExplicitReadWriteModelPermissions $explicitReadWriteModelPermissions) { assert('$rowBean instanceof RedBean_OODBBean'); assert('is_array($mappingData)'); $makeNewModel = true; $modelClassName = $importRules->getModelClassName(); $externalSystemId = null; $importSanitizeResultsUtil = new ImportSanitizeResultsUtil(); $afterSaveActionsData = array(); //Process the 'id' column first if available. if (false !== ($idColumnName = static::getIdColumnNameByMappingData($mappingData))) { $columnMappingData = $mappingData[$idColumnName]; $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRules::getType(), $columnMappingData['attributeIndexOrDerivedType']); $valueReadyToSanitize = static::resolveValueToSanitizeByValueAndColumnType($rowBean->{$idColumnName}, $columnMappingData['type']); $attributeValueData = $attributeImportRules->resolveValueForImport($valueReadyToSanitize, $columnMappingData, $importSanitizeResultsUtil); assert('count($attributeValueData) == 0 || count($attributeValueData) == 1'); if (isset($attributeValueData['id']) && $attributeValueData['id'] != null) { $model = $modelClassName::getById($attributeValueData['id']); $makeNewModel = false; } elseif (isset($attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME]) && $attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME] != null) { $externalSystemId = $attributeValueData[ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME]; } } if ($makeNewModel) { $model = new $modelClassName(); $model->setScenario('importModel'); } //Process the rest of the mapped colummns. ignoring owner. foreach ($mappingData as $columnName => $columnMappingData) { if ($columnMappingData['attributeIndexOrDerivedType'] != null && $columnMappingData['attributeIndexOrDerivedType'] != 'owner' && $idColumnName != $columnName) { static::sanitizeValueAndPopulateModel($rowBean, $importRules, $model, $columnName, $modelClassName, $columnMappingData, $importSanitizeResultsUtil, $afterSaveActionsData); } } //Process the owner column if present foreach ($mappingData as $columnName => $columnMappingData) { if ($columnMappingData['attributeIndexOrDerivedType'] != null && $columnMappingData['attributeIndexOrDerivedType'] == 'owner' && $idColumnName != $columnName) { static::sanitizeValueAndPopulateModel($rowBean, $importRules, $model, $columnName, $modelClassName, $columnMappingData, $importSanitizeResultsUtil, $afterSaveActionsData); } } $validated = $model->validate(); if ($validated && $importSanitizeResultsUtil->shouldSaveModel()) { $saved = $model->save(); if ($saved) { static::processAfterSaveActions($afterSaveActionsData, $model); if ($externalSystemId != null) { ExternalSystemIdUtil::updateByModel($model, $externalSystemId); } $importRowDataResultsUtil->addMessage(Zurmo::t('ImportModule', 'Record saved correctly.')); if ($makeNewModel) { if ($model instanceof SecurableItem) { try { $resolved = ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($model, $explicitReadWriteModelPermissions); $importRowDataResultsUtil->setStatusToCreated(); if (!$resolved) { $importRowDataResultsUtil->addMessage('The record saved, but there was a problem ' . 'setting the security permissions. It will at least be viewable by the owner.'); $importRowDataResultsUtil->setStatusToError(); } } catch (AccessDeniedSecurityException $e) { $importRowDataResultsUtil->addMessage('The record saved, but you do not have permissions ' . 'to set the security the way you did. The record will only be viewable by the owner.'); $importRowDataResultsUtil->setStatusToError(); } } else { $importRowDataResultsUtil->setStatusToCreated(); } } else { $importRowDataResultsUtil->setStatusToUpdated(); } } else { $importRowDataResultsUtil->addMessage('The record failed to save. Reason unknown.'); $importRowDataResultsUtil->setStatusToError(); } } else { if (!$importSanitizeResultsUtil->shouldSaveModel()) { $importRowDataResultsUtil->addMessages($importSanitizeResultsUtil->getMessages()); } $messages = RedBeanModelErrorsToMessagesUtil::makeMessagesByModel($model); if (count($messages) > 0) { $importRowDataResultsUtil->addMessages($messages); } $importRowDataResultsUtil->setStatusToError(); } }