浏览代码

#140 Check that user logins are unique

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@796 a333f486-631f-4898-b8df-5754b55c2be0
romainq 14 年之前
父节点
当前提交
9efe25c430

+ 21 - 0
core/userrights.class.inc.php

@@ -110,6 +110,27 @@ abstract class User extends cmdbAbstractObject
 	abstract public function CanChangePassword();
 	abstract public function ChangePassword($sOldPassword, $sNewPassword);
 
+	/*
+	* Overload the standard behavior
+	*/	
+	public function DoCheckToWrite()
+	{
+		parent::DoCheckToWrite();
+
+		// Note: This MUST be factorized later: declare unique keys (set of columns) in the data model
+		$aChanges = $this->ListChanges();
+		if (array_key_exists('login', $aChanges))
+		{
+			$sNewLogin = $aChanges['login'];
+			$oSearch = DBObjectSearch::FromOQL_AllData("SELECT User WHERE login = :newlogin");
+			$oSet = new DBObjectSet($oSearch, array(), array('newlogin' => $sNewLogin));
+			if ($oSet->Count() > 0)
+			{
+				$this->m_aCheckIssues[] = Dict::Format('Class:User/Error:LoginMustBeUnique', $sNewLogin);
+			}
+		}
+	}
+
 	function GetGrantAsHtml($sClass, $iAction)
 	{
 		if (UserRights::IsActionAllowed($sClass, $iAction, null, $this)) 

+ 3 - 0
dictionaries/dictionary.itop.ui.php

@@ -108,6 +108,8 @@ Dict::Add('EN US', 'English', 'English', array(
 	'Class:User/Attribute:profile_list+' => 'Roles, granting rights for that person',
 	'Class:User/Attribute:allowed_org_list' => 'Allowed Organizations',
 	'Class:User/Attribute:allowed_org_list+' => 'The end user is allowed to see data belonging to the following organizations. If no organization is specified, there is no restriction.',
+
+	'Class:User/Error:LoginMustBeUnique' => 'Login must be unique - "%1s" is already being used.',
 ));
 
 //
@@ -648,6 +650,7 @@ Dict::Add('EN US', 'English', 'English', array(
 	'UI:PageTitle:ObjectCreated' => 'iTop Object Created.',
 	'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s created.',
 	'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Applying %1$s on object: %2$s in state %3$s to target state: %4$s.',
+	'UI:ObjectCouldNotBeWritten' => 'The object could not be written: %1$s',
 	'UI:PageTitle:FatalError' => 'iTop - Fatal Error',
 	'UI:FatalErrorMessage' => 'Fatal error, iTop cannot continue.',
 	'UI:Error_Details' => 'Error: %1$s.',

+ 1 - 0
dictionaries/es_cr.dictionary.itop.ui.php

@@ -658,6 +658,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
 	'UI:PageTitle:ObjectCreated' => 'iTop Object Created.',
 	'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s created.',
 	'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Applying %1$s on object: %2$s in state %3$s to target state: %4$s.',
+	'UI:ObjectCouldNotBeWritten' => 'The object could not be written: %1$s',
 	'UI:PageTitle:FatalError' => 'iTop - Fatal Error',
 	'UI:FatalErrorMessage' => 'Fatal error, iTop cannot continue.',
 	'UI:Error_Details' => 'Error: %1$s.',

+ 3 - 0
dictionaries/fr.dictionary.itop.ui.php

@@ -108,6 +108,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
 	'Class:User/Attribute:profile_list+' => 'Rôles, ouvrants les droits d\'accès',
 	'Class:User/Attribute:allowed_org_list' => 'Organisations permises',
 	'Class:User/Attribute:allowed_org_list+' => 'L\'utilisateur a le droit de voir les données des organisations listées ici. Si aucune organisation n\'est spécifiée, alors aucune restriction ne s\'applique.',
+
+	'Class:User/Error:LoginMustBeUnique' => 'Le login doit être unique - "%1s" est déjà utilisé.',
 ));
 
 //
@@ -651,6 +653,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
 	'UI:PageTitle:ObjectCreated' => 'iTop objet créé.',
 	'UI:Title:Object_Of_Class_Created' => '%2$s - %1$s créé(e).',
 	'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => '%1$s pour %2$s de l\'état %3$s vers l\'état %4$s.',
+	'UI:ObjectCouldNotBeWritten' => 'L\'objet ne peut pas être enregistré: %1$s',
 	'UI:PageTitle:FatalError' => 'iTop - Erreur Fatale',
 	'UI:FatalErrorMessage' => 'Erreur fatale, iTop ne peut pas continuer.',
 	'UI:Error_Details' => 'Erreur: %1$s.',

+ 91 - 91
modules/itop-knownerror-mgmt-1.0.0/fr.dict.itop-knownerror-mgmt.php

@@ -48,95 +48,95 @@
 // Class:<class_name>/Stimulus:<stimulus_code>
 // Class:<class_name>/Stimulus:<stimulus_code>+
 
-//
-// Class: KnownError
-//
-
-Dict::Add('FR FR', 'French', 'Français', array(
-	'Class:KnownError' => 'Erreur Connue',
-	'Class:KnownError+' => 'Erreur documenté pour un problème connu',
-	'Class:KnownError/Attribute:name' => 'Nom',
-	'Class:KnownError/Attribute:name+' => '',
-	'Class:KnownError/Attribute:org_id' => 'Client',
-	'Class:KnownError/Attribute:org_id+' => '',
-	'Class:KnownError/Attribute:cust_name' => 'Nom du client',
-	'Class:KnownError/Attribute:cust_name+' => '',
-	'Class:KnownError/Attribute:problem_id' => 'Problème lié',
-	'Class:KnownError/Attribute:problem_id+' => '',
-	'Class:KnownError/Attribute:problem_ref' => 'Ref',
-	'Class:KnownError/Attribute:problem_ref+' => '',
-	'Class:KnownError/Attribute:symptom' => 'Symptome',
-	'Class:KnownError/Attribute:symptom+' => '',
-	'Class:KnownError/Attribute:root_cause' => 'Cause première',
-	'Class:KnownError/Attribute:root_cause+' => '',
-	'Class:KnownError/Attribute:workaround' => 'Contournement',
-	'Class:KnownError/Attribute:workaround+' => '',
-	'Class:KnownError/Attribute:solution' => 'Solution',
-	'Class:KnownError/Attribute:solution+' => '',
-	'Class:KnownError/Attribute:error_code' => 'Code d\'erreur',
-	'Class:KnownError/Attribute:error_code+' => '',
-	'Class:KnownError/Attribute:domain' => 'Domaine',
-	'Class:KnownError/Attribute:domain+' => '',
-	'Class:KnownError/Attribute:domain/Value:Application' => 'Application',
-	'Class:KnownError/Attribute:domain/Value:Application+' => 'Application',
-	'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop',
-	'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop',
-	'Class:KnownError/Attribute:domain/Value:Network' => 'Réseau',
-	'Class:KnownError/Attribute:domain/Value:Network+' => 'Réseau',
-	'Class:KnownError/Attribute:domain/Value:Server' => 'Serveur',
-	'Class:KnownError/Attribute:domain/Value:Server+' => 'Serveur',
-	'Class:KnownError/Attribute:vendor' => 'Vendeur',
-	'Class:KnownError/Attribute:vendor+' => '',
-	'Class:KnownError/Attribute:model' => 'Modèle',
-	'Class:KnownError/Attribute:model+' => '',
-	'Class:KnownError/Attribute:version' => 'Version',
-	'Class:KnownError/Attribute:version+' => '',
-	'Class:KnownError/Attribute:ci_list' => 'CIs',
-	'Class:KnownError/Attribute:ci_list+' => '',
-	'Class:KnownError/Attribute:document_list' => 'Documents',
-	'Class:KnownError/Attribute:document_list+' => '',
-));
-
-
-//
-// Class: lnkInfraError
-//
-
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:lnkInfraError' => 'Lien erreur CI',
-	'Class:lnkInfraError+' => 'CIs liés à une erreur connue',
-	'Class:lnkInfraError/Attribute:infra_id' => 'CI',
-	'Class:lnkInfraError/Attribute:infra_id+' => '',
-	'Class:lnkInfraError/Attribute:infra_name' => 'Nom du CI',
-	'Class:lnkInfraError/Attribute:infra_name+' => '',
-	'Class:lnkInfraError/Attribute:infra_status' => 'Status du CI',
-	'Class:lnkInfraError/Attribute:infra_status+' => '',
-	'Class:lnkInfraError/Attribute:error_id' => 'Erreur',
-	'Class:lnkInfraError/Attribute:error_id+' => '',
-	'Class:lnkInfraError/Attribute:error_name' => 'Nom de l\'erreur',
-	'Class:lnkInfraError/Attribute:error_name+' => '',
-	'Class:lnkInfraError/Attribute:reason' => 'Raison',
-	'Class:lnkInfraError/Attribute:reason+' => '',
-));
-
-//
-// Class: lnkDocumentError
-//
-
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:lnkDocumentError' => 'Lien erreur document',
-	'Class:lnkDocumentError+' => 'Lien entre une erreur et un document',
-	'Class:lnkDocumentError/Attribute:doc_id' => 'Document',
-	'Class:lnkDocumentError/Attribute:doc_id+' => '',
-	'Class:lnkDocumentError/Attribute:doc_name' => 'Nom du document',
-	'Class:lnkDocumentError/Attribute:doc_name+' => '',
-	'Class:lnkDocumentError/Attribute:error_id' => 'Erreur',
-	'Class:lnkDocumentError/Attribute:error_id+' => '',
-	'Class:lnkDocumentError/Attribute:error_name' => 'Nom de l\'erreur',
-	'Class:lnkDocumentError/Attribute:error_name+' => '',
-	'Class:lnkDocumentError/Attribute:link_type' => 'Information',
-	'Class:lnkDocumentError/Attribute:link_type+' => '',
-));
-
-
+//
+// Class: KnownError
+//
+
+Dict::Add('FR FR', 'French', 'Français', array(
+	'Class:KnownError' => 'Erreur Connue',
+	'Class:KnownError+' => 'Erreur documenté pour un problème connu',
+	'Class:KnownError/Attribute:name' => 'Nom',
+	'Class:KnownError/Attribute:name+' => '',
+	'Class:KnownError/Attribute:org_id' => 'Client',
+	'Class:KnownError/Attribute:org_id+' => '',
+	'Class:KnownError/Attribute:cust_name' => 'Nom du client',
+	'Class:KnownError/Attribute:cust_name+' => '',
+	'Class:KnownError/Attribute:problem_id' => 'Problème lié',
+	'Class:KnownError/Attribute:problem_id+' => '',
+	'Class:KnownError/Attribute:problem_ref' => 'Ref',
+	'Class:KnownError/Attribute:problem_ref+' => '',
+	'Class:KnownError/Attribute:symptom' => 'Symptome',
+	'Class:KnownError/Attribute:symptom+' => '',
+	'Class:KnownError/Attribute:root_cause' => 'Cause première',
+	'Class:KnownError/Attribute:root_cause+' => '',
+	'Class:KnownError/Attribute:workaround' => 'Contournement',
+	'Class:KnownError/Attribute:workaround+' => '',
+	'Class:KnownError/Attribute:solution' => 'Solution',
+	'Class:KnownError/Attribute:solution+' => '',
+	'Class:KnownError/Attribute:error_code' => 'Code d\'erreur',
+	'Class:KnownError/Attribute:error_code+' => '',
+	'Class:KnownError/Attribute:domain' => 'Domaine',
+	'Class:KnownError/Attribute:domain+' => '',
+	'Class:KnownError/Attribute:domain/Value:Application' => 'Application',
+	'Class:KnownError/Attribute:domain/Value:Application+' => 'Application',
+	'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop',
+	'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop',
+	'Class:KnownError/Attribute:domain/Value:Network' => 'Réseau',
+	'Class:KnownError/Attribute:domain/Value:Network+' => 'Réseau',
+	'Class:KnownError/Attribute:domain/Value:Server' => 'Serveur',
+	'Class:KnownError/Attribute:domain/Value:Server+' => 'Serveur',
+	'Class:KnownError/Attribute:vendor' => 'Vendeur',
+	'Class:KnownError/Attribute:vendor+' => '',
+	'Class:KnownError/Attribute:model' => 'Modèle',
+	'Class:KnownError/Attribute:model+' => '',
+	'Class:KnownError/Attribute:version' => 'Version',
+	'Class:KnownError/Attribute:version+' => '',
+	'Class:KnownError/Attribute:ci_list' => 'CIs',
+	'Class:KnownError/Attribute:ci_list+' => '',
+	'Class:KnownError/Attribute:document_list' => 'Documents',
+	'Class:KnownError/Attribute:document_list+' => '',
+));
+
+
+//
+// Class: lnkInfraError
+//
+
+Dict::Add('FR FR', 'English', 'English', array(
+	'Class:lnkInfraError' => 'Lien erreur CI',
+	'Class:lnkInfraError+' => 'CIs liés à une erreur connue',
+	'Class:lnkInfraError/Attribute:infra_id' => 'CI',
+	'Class:lnkInfraError/Attribute:infra_id+' => '',
+	'Class:lnkInfraError/Attribute:infra_name' => 'Nom du CI',
+	'Class:lnkInfraError/Attribute:infra_name+' => '',
+	'Class:lnkInfraError/Attribute:infra_status' => 'Status du CI',
+	'Class:lnkInfraError/Attribute:infra_status+' => '',
+	'Class:lnkInfraError/Attribute:error_id' => 'Erreur',
+	'Class:lnkInfraError/Attribute:error_id+' => '',
+	'Class:lnkInfraError/Attribute:error_name' => 'Nom de l\'erreur',
+	'Class:lnkInfraError/Attribute:error_name+' => '',
+	'Class:lnkInfraError/Attribute:reason' => 'Raison',
+	'Class:lnkInfraError/Attribute:reason+' => '',
+));
+
+//
+// Class: lnkDocumentError
+//
+
+Dict::Add('FR FR', 'English', 'English', array(
+	'Class:lnkDocumentError' => 'Lien erreur document',
+	'Class:lnkDocumentError+' => 'Lien entre une erreur et un document',
+	'Class:lnkDocumentError/Attribute:doc_id' => 'Document',
+	'Class:lnkDocumentError/Attribute:doc_id+' => '',
+	'Class:lnkDocumentError/Attribute:doc_name' => 'Nom du document',
+	'Class:lnkDocumentError/Attribute:doc_name+' => '',
+	'Class:lnkDocumentError/Attribute:error_id' => 'Erreur',
+	'Class:lnkDocumentError/Attribute:error_id+' => '',
+	'Class:lnkDocumentError/Attribute:error_name' => 'Nom de l\'erreur',
+	'Class:lnkDocumentError/Attribute:error_name+' => '',
+	'Class:lnkDocumentError/Attribute:link_type' => 'Information',
+	'Class:lnkDocumentError/Attribute:link_type+' => '',
+));
+
+
 ?>

+ 90 - 33
pages/UI.php

@@ -484,7 +484,7 @@ try
 			{
 				throw new ApplicationException(Dict::Format('UI:Error:2ParametersMissing', 'class', 'id'));
 			}
-			$oObj = MetaModel::GetObject($sClass, $id);
+			$oObj = MetaModel::GetObject($sClass, $id, false);
 			if ($oObj != null)
 			{
 				$oP->set_title(Dict::Format('UI:DetailsPageTitle', $oObj->GetName(), $sClassLabel));
@@ -694,6 +694,7 @@ try
 			$bIsModifiedAllowed = (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY, $oSet) == UR_ALLOWED_YES) && !MetaModel::IsReadOnlyClass($sClass);
 			if( ($oObj != null) && $bIsModifiedAllowed )
 			{
+				// Note: code duplicated to the case 'apply_modify' when a data integrity issue has been found
 				$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
 				$oP->add("<div class=\"page_header\">\n");
 				$oP->add("<h1>".$oObj->GetIcon()."&nbsp;".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."</h1>\n");
@@ -768,6 +769,7 @@ try
 			{
 				throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'class'));
 			}
+			// Note: code duplicated to the case 'apply_modify' when a data integrity issue has been found
 			$oP->add_linked_script("../js/json.js");
 			$oP->add_linked_script("../js/forms-json-utils.js");
 			$oP->add_linked_script("../js/wizardhelper.js");
@@ -806,6 +808,7 @@ try
 			{
 				// Display the creation form
 				$sClassLabel = MetaModel::GetName($sRealClass);
+				// Note: some code has been duplicated to the case 'apply_new' when a data integrity issue has been found
 				$oP->set_title(Dict::Format('UI:CreationPageTitle_Class', $sClassLabel));
 				$oP->add("<h1>".MetaModel::GetClassIcon($sRealClass)."&nbsp;".Dict::Format('UI:CreationTitle_Class', $sClassLabel)."</h1>\n");
 				$oP->add("<div class=\"wizContainer\">\n");
@@ -872,26 +875,36 @@ try
 			{
 				throw new ApplicationException(Dict::Format('UI:Error:2ParametersMissing', 'class', 'id'));
 			}
-			$oObj = MetaModel::GetObject($sClass, $id);
-			if (!utils::IsTransactionValid($sTransactionId))
+			$bDisplayDetails = true;
+			$oObj = MetaModel::GetObject($sClass, $id, false);
+			if ($oObj == null)
 			{
+				$bDisplayDetails = false;
+				$oP->set_title(Dict::S('UI:ErrorPageTitle'));
+				$oP->P(Dict::S('UI:ObjectDoesNotExist'));
+			}
+			elseif (!utils::IsTransactionValid($sTransactionId))
+			{
+				$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
 				$oP->p("<strong>".Dict::S('UI:Error:ObjectAlreadyUpdated')."</strong>\n");
 			}
 			else
 			{
-				if ($oObj != null)
+				UpdateObject($oObj);
+
+				if (!$oObj->IsModified())
 				{
 					$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
-					$oP->add("<h1>".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."</h1>\n");
-
-					UpdateObject($oObj);
-
-					if (!$oObj->IsModified())
-					{
-						$oP->p(Dict::Format('UI:Class_Object_NotUpdated', MetaModel::GetName(get_class($oObj)), $oObj->GetName()));
-					}
-					else
+					$oP->p(Dict::Format('UI:Class_Object_NotUpdated', MetaModel::GetName(get_class($oObj)), $oObj->GetName()));
+				}
+				else
+				{
+					list($bRes, $aIssues) = $oObj->CheckToWrite();
+					if ($bRes)
 					{
+						$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
+						$oP->add("<h1>".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."</h1>\n");
+
 						$oMyChange = MetaModel::NewObject("CMDBChange");
 						$oMyChange->Set("date", time());
 						if (UserRights::IsImpersonated())
@@ -908,15 +921,35 @@ try
 			
 						$oP->p(Dict::Format('UI:Class_Object_Updated', MetaModel::GetName(get_class($oObj)), $oObj->GetName()));
 					}
-				}
-				else
-				{
-					$oP->set_title(Dict::S('UI:ErrorPageTitle'));
-					$oP->P(Dict::S('UI:ObjectDoesNotExist'));
+					else
+					{
+						$bDisplayDetails = false;
+						// Found issues, explain and give the user a second chance
+						//
+						// Note: code duplicated from the case 'modify'
+						$oP->add_linked_script("../js/json.js");
+						$oP->add_linked_script("../js/forms-json-utils.js");
+						$oP->add_linked_script("../js/wizardhelper.js");
+						$oP->add_linked_script("../js/wizard.utils.js");
+						$oP->add_linked_script("../js/linkswidget.js");
+						$oP->add_linked_script("../js/jquery.blockUI.js");
+						$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
+						$oP->add("<div class=\"page_header\">\n");
+						$oP->add("<h1>".$oObj->GetIcon()."&nbsp;".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."</h1>\n");
+						$oP->add("</div>\n");
+						$oP->add("<div class=\"wizContainer\">\n");
+						$oObj->DisplayModifyForm($oP);
+						$oP->add("</div>\n");
+						$sIssueDesc = Dict::Format('UI:ObjectCouldNotBeWritten', implode(', ', $aIssues));
+						$oP->add_ready_script("alert('".addslashes($sIssueDesc)."');");
+					}
 				}
 			}
-			$oObj = MetaModel::GetObject(get_class($oObj), $oObj->GetKey()); //Workaround: reload the object some that the linkedset are displayed properly
-			$oObj->DisplayDetails($oP);
+			if ($bDisplayDetails)
+			{
+				$oObj = MetaModel::GetObject(get_class($oObj), $oObj->GetKey()); //Workaround: reload the object so that the linkedset are displayed properly
+				$oObj->DisplayDetails($oP);
+			}
 		break;
 
 		case 'select_for_deletion':
@@ -1037,22 +1070,46 @@ try
 		{
 			$sClass = get_class($oObj);
 			$sClassLabel = MetaModel::GetName($sClass);
-			$oMyChange = MetaModel::NewObject("CMDBChange");
-			$oMyChange->Set("date", time());
-			if (UserRights::IsImpersonated())
+
+			list($bRes, $aIssues) = $oObj->CheckToWrite();
+			if ($bRes)
 			{
-				$sUserString = Dict::Format('UI:Archive_User_OnBehalfOf_User', UserRights::GetRealUser(), UserRights::GetUser());
+				$oMyChange = MetaModel::NewObject("CMDBChange");
+				$oMyChange->Set("date", time());
+				if (UserRights::IsImpersonated())
+				{
+					$sUserString = Dict::Format('UI:Archive_User_OnBehalfOf_User', UserRights::GetRealUser(), UserRights::GetUser());
+				}
+				else
+				{
+					$sUserString = UserRights::GetUser();
+				}
+				$oMyChange->Set("userinfo", $sUserString);
+				$iChangeId = $oMyChange->DBInsert();
+				$oObj->DBInsertTracked($oMyChange);
+				$oP->set_title(Dict::S('UI:PageTitle:ObjectCreated'));
+				$oP->add("<h1>".Dict::Format('UI:Title:Object_Of_Class_Created', $oObj->GetName(), $sClassLabel)."</h1>\n");
+				$oObj->DisplayDetails($oP);
 			}
 			else
 			{
-				$sUserString = UserRights::GetUser();
+				// Found issues, explain and give the user a second chance
+				//
+				// Note: code similar to the case 'modify'
+				$oP->add_linked_script("../js/json.js");
+				$oP->add_linked_script("../js/forms-json-utils.js");
+				$oP->add_linked_script("../js/wizardhelper.js");
+				$oP->add_linked_script("../js/wizard.utils.js");
+				$oP->add_linked_script("../js/linkswidget.js");
+				$oP->add_linked_script("../js/jquery.blockUI.js");
+				$oP->set_title(Dict::Format('UI:CreationPageTitle_Class', $sClassLabel));
+				$oP->add("<h1>".MetaModel::GetClassIcon($sClass)."&nbsp;".Dict::Format('UI:CreationTitle_Class', $sClassLabel)."</h1>\n");
+				$oP->add("<div class=\"wizContainer\">\n");
+				cmdbAbstractObject::DisplayCreationForm($oP, $sClass, $oObj);
+				$oP->add("</div>\n");
+				$sIssueDesc = Dict::Format('UI:ObjectCouldNotBeWritten', implode(', ', $aIssues));
+				$oP->add_ready_script("alert('".addslashes($sIssueDesc)."');");
 			}
-			$oMyChange->Set("userinfo", $sUserString);
-			$iChangeId = $oMyChange->DBInsert();
-			$oObj->DBInsertTracked($oMyChange);
-			$oP->set_title(Dict::S('UI:PageTitle:ObjectCreated'));
-			$oP->add("<h1>".Dict::Format('UI:Title:Object_Of_Class_Created', $oObj->GetName(), $sClassLabel)."</h1>\n");
-			$oObj->DisplayDetails($oP);
 		}
 		break;
 		
@@ -1099,7 +1156,7 @@ try
 		{
 			throw new ApplicationException(Dict::Format('UI:Error:3ParametersMissing', 'class', 'id', 'stimulus'));
 		}
-		$oObj = MetaModel::GetObject($sClass, $id);
+		$oObj = MetaModel::GetObject($sClass, $id, false);
 		if ($oObj != null)
 		{
 			$aTransitions = $oObj->EnumTransitions();
@@ -1191,7 +1248,7 @@ EOF
 		{
 			throw new ApplicationException(Dict::Format('UI:Error:3ParametersMissing', 'class', 'id', 'stimulus'));
 		}
-		$oObj = MetaModel::GetObject($sClass, $id);
+		$oObj = MetaModel::GetObject($sClass, $id, false);
 		if ($oObj != null)
 		{
 			$aTransitions = $oObj->EnumTransitions();