Bläddra i källkod

Continuing the integration of the new data model...

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@539 a333f486-631f-4898-b8df-5754b55c2be0
dflaven 15 år sedan
förälder
incheckning
fe9bd40bb3

+ 26 - 16
application/cmdbabstract.class.inc.php

@@ -87,7 +87,7 @@ abstract class cmdbAbstractObject extends CMDBObject
 			// AND make the name be a mandatory field
 			//
 			$sObject = MetaModel::GetObject($sObjClass, $sObjKey);
-			$sLabel = $sObject->GetDisplayName();
+			$sLabel = $sObject->GetName();
 		}
 		// Safety net
 		//
@@ -110,7 +110,7 @@ abstract class cmdbAbstractObject extends CMDBObject
 		$oBlock = new MenuBlock($oSingletonFilter, 'popup', false);
 		$oBlock->Display($oPage, -1);
 		$oPage->add("<div class=\"page_header\"><h1><img src=\"".$this->GetIcon()."\" style=\"margin-right:10px;margin-top: -16px;vertical-align:middle;\">\n");
-		$oPage->add(MetaModel::GetName(get_class($this)).": <span class=\"hilite\">".$this->GetDisplayName()."</span></h1>\n");
+		$oPage->add(MetaModel::GetName(get_class($this)).": <span class=\"hilite\">".$this->GetName()."</span></h1>\n");
 		$oPage->add("</div>\n");
 	}
 
@@ -131,9 +131,13 @@ abstract class cmdbAbstractObject extends CMDBObject
 
 	function DisplayBareRelations(WebPage $oPage)
 	{
-		// Related objects
-		foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sAttCode=>$oAttDef)
+		// Related objects: display all the linkset attributes, each as a separate tab
+		// First in the order described by the 'display' ZList, then the remaining ones
+		$aList = $this->FlattenZList(MetaModel::GetZListItems(get_class($this), 'details'));
+		$aList = array_unique(array_merge($aList, array_keys(MetaModel::ListAttributeDefs(get_class($this)))));
+		foreach($aList as $sAttCode)
 		{
+			$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
 			if ($oAttDef->IsLinkset())
 			{
 				$oPage->SetCurrentTab($oAttDef->GetLabel());
@@ -172,16 +176,6 @@ abstract class cmdbAbstractObject extends CMDBObject
 		$oPage->SetCurrentTab('');
 	}
 
-	function GetDisplayName()
-	{
-		$sDisplayName = '';
-		if (MetaModel::GetNameAttributeCode(get_class($this)) != '')
-		{
-			$sDisplayName = $this->GetAsHTML(MetaModel::GetNameAttributeCode(get_class($this)));
-		}
-		return $sDisplayName;
-	}
-
 	function GetBareProperties(WebPage $oPage)
 	{
 		$sHtml = '';
@@ -190,8 +184,6 @@ abstract class cmdbAbstractObject extends CMDBObject
 		$aDetails = array();
 		$sClass = get_class($this);
 		$aDetailsList = MetaModel::GetZListItems($sClass, 'details');
-		$aFullList = MetaModel::ListAttributeDefs($sClass);
-		$aList = $aDetailsList;
 		$aDetailsStruct = self::ProcessZlist($aDetailsList, array('UI:PropertiesTab' => array()), 'UI:PropertiesTab', 'col1', '');
 		// Compute the list of properties to display, first the attributes in the 'details' list, then 
 		// all the remaining attributes that are not external fields
@@ -1384,6 +1376,24 @@ EOF
 		}
 		return $aDetails;
 	}
+
+	protected function FlattenZList($aList)
+	{
+		$aResult = array();
+		foreach($aList as $value)
+		{
+			if (!is_array($value))
+			{
+				$aResult[] = $value;
+			}
+			else
+			{
+				$aResult = array_merge($aResult, $this->FlattenZList($value));
+			}
+		}
+		return $aResult;
+	}
+		
 	protected function GetFieldAsHtml($sClass, $sAttCode, $sStateAttCode)
 	{
 		$retVal = null;

+ 3 - 2
business/itop.business.class.inc.php

@@ -573,14 +573,15 @@ class DatabaseInstance extends FunctionalCI
 
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("application_id", array("targetclass"=>"ApplicationInstance", "jointype"=>null, "allowed_values"=>null, "sql"=>"application_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("application_name", array("allowed_values"=>null, "extkey_attcode"=>"application_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("application_version", array("allowed_values"=>null, "extkey_attcode"=>"application_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributePassword("admin_login", array("allowed_values"=>null, "sql"=>"admin_login", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributePassword("admin_password", array("allowed_values"=>null, "sql"=>"admin_password", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeWikiText("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('name', 'status', 'owner_id', 'importance', 'application_id', 'admin_login', 'admin_password', 'description'));
+		MetaModel::Init_SetZListItems('details', array('name', 'status', 'owner_id', 'importance', 'application_id', 'application_version', 'admin_login', 'admin_password', 'description'));
 		MetaModel::Init_SetZListItems('advanced_search', array('name', 'status', 'owner_id', 'importance', 'application_id', 'description'));
 		MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'owner_id', 'importance', 'application_id', 'description'));
-		MetaModel::Init_SetZListItems('list', array('status', 'owner_id', 'importance', 'application_id'));
+		MetaModel::Init_SetZListItems('list', array('status', 'owner_id', 'importance', 'application_id', 'application_version'));
 	}
 }
 class ApplicationSolution extends FunctionalCI

+ 60 - 0
modules/itop-config-mgmt-1.0.0/data.sample.application.xml

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+<Application alias="Application" id="2">
+<name>Apache Web Server</name>
+<description></description>
+</Application>
+<DBServer alias="Application" id="1">
+<name>MySQL 5</name>
+<description>MySQL Server version 5</description>
+</DBServer>
+<ApplicationInstance alias="ApplicationInstance" id="5">
+<name>Apache Web Server</name>
+<status>production</status>
+<owner_id>2</owner_id>
+<importance>medium</importance>
+<device_id>4</device_id>
+<licence_id>0</licence_id>
+<application_id>2</application_id>
+<version>2.2</version>
+<description>Apache 2.2 with PHP 5.3.4</description>
+</ApplicationInstance>
+<ApplicationInstance alias="ApplicationInstance" id="2">
+<name>MySQL 5 prod</name>
+<status>production</status>
+<owner_id>2</owner_id>
+<importance>medium</importance>
+<device_id>1</device_id>
+<licence_id>0</licence_id>
+<application_id>1</application_id>
+<version>5.0.27</version>
+<description></description>
+</ApplicationInstance>
+<DatabaseInstance alias="DatabaseInstance" id="3">
+<name>itop_beta</name>
+<status>implementation</status>
+<owner_id>2</owner_id>
+<importance>medium</importance>
+<db_server_instance_id>2</db_server_instance_id>
+<admin_login>root</admin_login>
+<admin_password></admin_password>
+<description>iTop beta test instance</description>
+</DatabaseInstance>
+<ApplicationSolution alias="ApplicationSolution" id="6">
+<name>iTop demo</name>
+<status>production</status>
+<owner_id>2</owner_id>
+<importance>high</importance>
+<description>Demo instance of iTop</description>
+</ApplicationSolution>
+<lnkSolutionToCI alias="lnkSolutionToCI" id="1">
+<solution_id>6</solution_id>
+<ci_id>5</ci_id>
+<utility>itop beta instance</utility>
+</lnkSolutionToCI>
+<lnkSolutionToCI alias="lnkSolutionToCI" id="2">
+<solution_id>6</solution_id>
+<ci_id>3</ci_id>
+<utility>itop beta instance</utility>
+</lnkSolutionToCI>
+</Set>

+ 30 - 0
modules/itop-config-mgmt-1.0.0/data.sample.business.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+<BusinessProcess alias="BusinessProcess" id="7">
+<name>iTop demonstration</name>
+<status>production</status>
+<owner_id>2</owner_id>
+<importance>medium</importance>
+<description>Demonstrating iTop on line</description>
+</BusinessProcess>
+<lnkProcessToSolution alias="lnkProcessToSolution" id="2">
+<solution_id>6</solution_id>
+<process_id>7</process_id>
+<reason>On demand demo of iTop</reason>
+</lnkProcessToSolution>
+<lnkCIToContact alias="lnkCIToContact" id="1">
+<ci_id>7</ci_id>
+<contact_id>3</contact_id>
+<role>Operations Manager</role>
+</lnkCIToContact>
+<lnkCIToContact alias="lnkCIToContact" id="2">
+<ci_id>7</ci_id>
+<contact_id>4</contact_id>
+<role>Support Specialist</role>
+</lnkCIToContact>
+<lnkCIToContact alias="lnkCIToContact" id="3">
+<ci_id>8</ci_id>
+<contact_id>6</contact_id>
+<role>Datacenter Network Engineer</role>
+</lnkCIToContact>
+</Set>

+ 51 - 0
modules/itop-config-mgmt-1.0.0/data.sample.contact.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+<Person alias="Contact" id="4">
+<name>Dumas</name>
+<status>active</status>
+<org_id>2</org_id>
+<email>alexandre.dumas@demo-noemail.net</email>
+<phone></phone>
+<location_id>1</location_id>
+<first_name>Alexandre</first_name>
+<employee_id>20100002</employee_id>
+</Person>
+<Person alias="Contact" id="3">
+<name>Hugo</name>
+<status>active</status>
+<org_id>2</org_id>
+<email>victor.hugo@demo-noemail.net</email>
+<phone></phone>
+<location_id>1</location_id>
+<first_name>Victor</first_name>
+<employee_id>20100001</employee_id>
+</Person>
+<Person alias="Contact" id="1">
+<name>My last name</name>
+<status>active</status>
+<org_id>1</org_id>
+<email>my.email@foo.org</email>
+<phone></phone>
+<location_id>0</location_id>
+<first_name></first_name>
+<employee_id></employee_id>
+</Person>
+<Person alias="Contact" id="5">
+<name>Verne</name>
+<status>active</status>
+<org_id>2</org_id>
+<email>jules.verne@demo-noemail.net</email>
+<phone></phone>
+<location_id>1</location_id>
+<first_name>Jules</first_name>
+<employee_id>20100003</employee_id>
+</Person>
+<lnkTeamToContact alias="lnkTeamToContact" id="1">
+<team_id>2</team_id>
+<contact_id>4</contact_id>
+</lnkTeamToContact>
+<lnkTeamToContact alias="lnkTeamToContact" id="2">
+<team_id>2</team_id>
+<contact_id>5</contact_id>
+</lnkTeamToContact>
+</Set>

+ 5 - 3
modules/itop-config-mgmt-1.0.0/data.sample.location.xml

@@ -3,9 +3,11 @@
 <Location alias="Location" id="1">
 <name>Headquarters</name>
 <status>active</status>
-<org_id>1</org_id>
-<address></address>
-<country></country>
+<org_id>2</org_id>
+<address>1, rue de la Paix</address>
+<postal_code>75000</postal_code>
+<city>Paris</city>
+<country>France</country>
 <parent_id>0</parent_id>
 </Location>
 </Set>

+ 2 - 2
modules/itop-config-mgmt-1.0.0/data.sample.organization.xml

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Set>
-<Organization alias="Organization" id="1">
+<Organization alias="Organization" id="2">
 <name>Demo company</name>
-<code></code>
+<code>DEMO</code>
 <status>active</status>
 <parent_id>0</parent_id>
 </Organization>

+ 43 - 0
modules/itop-config-mgmt-1.0.0/data.sample.server.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+<Server alias="Server" id="1">
+<name>dbserver1.demo.net</name>
+<status>implementation</status>
+<owner_id>2</owner_id>
+<importance>medium</importance>
+<brand>Hewlett-Packard</brand>
+<model>Proliant DL380 G5</model>
+<serial_number>US0123421</serial_number>
+<asset_ref>DEMO-2314</asset_ref>
+<description>Dedicated database server running MySQL</description>
+<location_id>1</location_id>
+<location_details>Bottom of Rack 1 in DC</location_details>
+<management_ip>192.168.10.49</management_ip>
+<default_gateway>192.168.10.254</default_gateway>
+<cpu>4 x 3GHz</cpu>
+<ram>8 GB</ram>
+<hdd>5 x 72 GB  RAID 5</hdd>
+<os_family>Linux</os_family>
+<os_version>Debian 5 (Lenny)</os_version>
+</Server>
+<Server alias="Server" id="4">
+<name>itop.demo.net</name>
+<status>production</status>
+<owner_id>2</owner_id>
+<importance>high</importance>
+<brand>Hewlet-Packard</brand>
+<model>Proliant DL380 G5</model>
+<serial_number>US4123423</serial_number>
+<asset_ref>DEMO-2321</asset_ref>
+<description>Web server for running the iTop demo</description>
+<location_id>1</location_id>
+<location_details></location_details>
+<management_ip>192.168.10.50</management_ip>
+<default_gateway>192.168.10.254</default_gateway>
+<cpu>4 x 3GHz</cpu>
+<ram>8 GB</ram>
+<hdd>5 x 72 GB  RAID 5</hdd>
+<os_family>Linux</os_family>
+<os_version>Debian 5 (Lenny)</os_version>
+</Server>
+</Set>

+ 5 - 5
modules/itop-config-mgmt-1.0.0/data.sample.team.xml

@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Set>
-<Team alias="Team" id="1">
-<name>My team</name>
+<Team alias="Team" id="2">
+<name>Hardware Support Team</name>
 <status>active</status>
-<org_id>1</org_id>
-<email>myteam@combodo.com</email>
+<org_id>2</org_id>
+<email>pcsupport@demo-noemail.net</email>
 <phone></phone>
 <location_id>1</location_id>
 </Team>
-</Set>
+</Set>

+ 27 - 2
modules/itop-config-mgmt-1.0.0/en.dict.itop-config-mgmt.php

@@ -113,6 +113,10 @@ Dict::Add('EN US', 'English', 'English', array(
 	'Class:Location/Attribute:org_name+' => '',
 	'Class:Location/Attribute:address' => 'Address',
 	'Class:Location/Attribute:address+' => 'Postal address',
+	'Class:Location/Attribute:postal_code' => 'Postal code',
+	'Class:Location/Attribute:postal_code+' => 'ZIP/Postal code',
+	'Class:Location/Attribute:city' => 'City',
+	'Class:Location/Attribute:city+' => '',
 	'Class:Location/Attribute:country' => 'Country',
 	'Class:Location/Attribute:country+' => '',
 	'Class:Location/Attribute:parent_id' => 'Parent location',
@@ -183,6 +187,25 @@ Dict::Add('EN US', 'English', 'English', array(
 ));
 
 //
+// Class: lnkTeamToContact
+//
+
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:lnkTeamToContact' => 'Team Members',
+	'Class:lnkTeamToContact+' => 'Members of a team',
+	'Class:lnkTeamToContact/Attribute:team_id' => 'Team',
+	'Class:lnkTeamToContact/Attribute:team_id+' => '',
+	'Class:lnkTeamToContact/Attribute:contact_id' => 'Member',
+	'Class:lnkTeamToContact/Attribute:contact_id+' => '',
+	'Class:lnkTeamToContact/Attribute:contact_location_id' => 'Location',
+	'Class:lnkTeamToContact/Attribute:contact_location_id+' => '',
+	'Class:lnkTeamToContact/Attribute:contact_email' => 'eMail',
+	'Class:lnkTeamToContact/Attribute:contact_email+' => '',
+	'Class:lnkTeamToContact/Attribute:contact_phone' => 'Phone',
+	'Class:lnkTeamToContact/Attribute:contact_phone+' => '',
+));
+
+//
 // Class: Document
 //
 
@@ -445,8 +468,10 @@ Dict::Add('EN US', 'English', 'English', array(
 Dict::Add('EN US', 'English', 'English', array(
 	'Class:DatabaseInstance' => 'Database instance',
 	'Class:DatabaseInstance+' => '',
-	'Class:DatabaseInstance/Attribute:application_id' => 'Database software',
-	'Class:DatabaseInstance/Attribute:application_id+' => '',
+	'Class:DatabaseInstance/Attribute:db_server_instance_id' => 'Database software',
+	'Class:DatabaseInstance/Attribute:db_server_instance_id+' => '',
+	'Class:DatabaseInstance/Attribute:db_server_instance_version' => 'Database version',
+	'Class:DatabaseInstance/Attribute:db_server_instance_version+' => '',
 	'Class:DatabaseInstance/Attribute:application_name' => 'Database software',
 	'Class:DatabaseInstance/Attribute:application_name+' => '',
 	'Class:DatabaseInstance/Attribute:admin_login' => 'Admin login',

+ 26 - 16
modules/itop-config-mgmt-1.0.0/model.itop-config-mgmt.php

@@ -83,14 +83,16 @@ class Location extends cmdbAbstractObject
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("org_id", array("targetclass"=>"Organization", "jointype"=>null, "allowed_values"=>null, "sql"=>"org_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("org_name", array("allowed_values"=>null, "extkey_attcode"=>"org_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeText("address", array("allowed_values"=>null, "sql"=>"address", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("postal_code", array("allowed_values"=>null, "sql"=>"postal_code", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("city", array("allowed_values"=>null, "sql"=>"city", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("country", array("allowed_values"=>null, "sql"=>"country", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("parent_id", array("targetclass"=>"Location", "jointype"=>null, "allowed_values"=>null, "sql"=>"parent_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("parent_name", array("allowed_values"=>null, "extkey_attcode"=>"parent_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('name', 'status', 'org_id', 'address', 'country', 'parent_id'));
+		MetaModel::Init_SetZListItems('details', array('name', 'status', 'org_id', 'address', 'postal_code', 'city', 'country', 'parent_id'));
 		MetaModel::Init_SetZListItems('advanced_search', array('name', 'status', 'org_id', 'country'));
-		MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'org_id', 'country'));
-		MetaModel::Init_SetZListItems('list', array('status', 'org_id', 'country'));
+		MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'org_id', 'city', 'country'));
+		MetaModel::Init_SetZListItems('list', array('status', 'org_id', 'city', 'country'));
 	}
 }
 abstract class Contact extends cmdbAbstractObject
@@ -119,7 +121,7 @@ abstract class Contact extends cmdbAbstractObject
 		MetaModel::Init_AddAttribute(new AttributeExternalField("org_name", array("allowed_values"=>null, "extkey_attcode"=>"org_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeEmailAddress("email", array("allowed_values"=>null, "sql"=>"email", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("phone", array("allowed_values"=>null, "sql"=>"phone", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeExternalKey("location_id", array("targetclass"=>"Location", "jointype"=>null, "allowed_values"=>null, "sql"=>"location_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("location_id", array("targetclass"=>"Location", "jointype"=>null, "allowed_values"=>new ValueSetObjects('SELECT Location AS L WHERE L.org_id = :this->org_id'), "sql"=>"location_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array('org_id'))));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("location_name", array("allowed_values"=>null, "extkey_attcode"=>"location_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("contract_list", array("linked_class"=>"lnkContractToContact", "ext_key_to_me"=>"contact_id", "ext_key_to_remote"=>"contract_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("ticket_list", array("linked_class"=>"lnkTicketToContact", "ext_key_to_me"=>"contact_id", "ext_key_to_remote"=>"ticket_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
@@ -155,10 +157,15 @@ class Person extends Contact
 		MetaModel::Init_AddAttribute(new AttributeString("first_name", array("allowed_values"=>null, "sql"=>"first_name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("employee_id", array("allowed_values"=>null, "sql"=>"employee_id", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('name', 'status', 'org_id', 'email', 'phone', 'location_id', 'contract_list', 'ticket_list', 'ci_list', 'first_name', 'employee_id'));
+		MetaModel::Init_SetZListItems('details', array('first_name', 'name', 'org_id', 'status', 'location_id', 'email', 'phone', 'employee_id', 'contract_list', 'ticket_list', 'ci_list'));
 		MetaModel::Init_SetZListItems('advanced_search', array('name', 'status', 'org_id', 'email', 'phone', 'location_id', 'first_name', 'employee_id'));
 		MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'org_id', 'email', 'phone', 'location_id', 'first_name', 'employee_id'));
-		MetaModel::Init_SetZListItems('list', array('status', 'org_id', 'email', 'phone', 'location_id', 'first_name', 'employee_id'));
+		MetaModel::Init_SetZListItems('list', array('status', 'org_id', 'email', 'phone', 'location_id', 'employee_id'));
+	}
+	
+	public function GetName()
+	{
+		return $this->Get('first_name').' '.$this->Get('name');
 	}
 }
 class Team extends Contact
@@ -183,7 +190,7 @@ class Team extends Contact
 
 		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("member_list", array("linked_class"=>"lnkTeamToContact", "ext_key_to_me"=>"team_id", "ext_key_to_remote"=>"contact_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('name', 'status', 'org_id', 'email', 'phone', 'location_id', 'contract_list', 'ticket_list', 'ci_list', 'member_list'));
+		MetaModel::Init_SetZListItems('details', array('name', 'status', 'org_id', 'location_id', 'email', 'phone', 'member_list','contract_list', 'ticket_list', 'ci_list'));
 		MetaModel::Init_SetZListItems('advanced_search', array('name', 'status', 'org_id', 'email', 'phone', 'location_id'));
 		MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'org_id', 'email', 'phone', 'location_id'));
 		MetaModel::Init_SetZListItems('list', array('status', 'org_id', 'email', 'phone', 'location_id'));
@@ -213,11 +220,15 @@ class lnkTeamToContact extends cmdbAbstractObject
 		MetaModel::Init_AddAttribute(new AttributeExternalField("team_name", array("allowed_values"=>null, "extkey_attcode"=>"team_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("contact_id", array("targetclass"=>"Contact", "jointype"=>null, "allowed_values"=>null, "sql"=>"contact_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("contact_name", array("allowed_values"=>null, "extkey_attcode"=>"contact_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("contact_location_id", array("allowed_values"=>null, "extkey_attcode"=>"contact_id", "target_attcode"=>"location_id", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("contact_location_name", array("allowed_values"=>null, "extkey_attcode"=>"contact_id", "target_attcode"=>"location_name", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("contact_email", array("allowed_values"=>null, "extkey_attcode"=>"contact_id", "target_attcode"=>"email", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("contact_phone", array("allowed_values"=>null, "extkey_attcode"=>"contact_id", "target_attcode"=>"phone", "is_null_allowed"=>true, "depends_on"=>array())));
 
 		MetaModel::Init_SetZListItems('details', array('team_id', 'contact_id'));
 		MetaModel::Init_SetZListItems('advanced_search', array('team_id', 'contact_id'));
 		MetaModel::Init_SetZListItems('standard_search', array('team_id', 'contact_id'));
-		MetaModel::Init_SetZListItems('list', array('team_id', 'contact_id'));
+		MetaModel::Init_SetZListItems('list', array('team_id', 'contact_id', 'contact_location_id', 'contact_email', 'contact_phone'));
 	}
 }
 abstract class Document extends cmdbAbstractObject
@@ -550,8 +561,6 @@ class DBServer extends Application
 		MetaModel::Init_Params($aParams);
 		MetaModel::Init_InheritAttributes();
 
-		MetaModel::Init_OverloadAttributeParams("instance_list", array("linked_class"=>"DatabaseInstance"));
-
 		MetaModel::Init_SetZListItems('details', array('name', 'description', 'instance_list'));
 		MetaModel::Init_SetZListItems('advanced_search', array('name', 'description'));
 		MetaModel::Init_SetZListItems('standard_search', array('name', 'description'));
@@ -707,16 +716,17 @@ class DatabaseInstance extends FunctionalCI
 		MetaModel::Init_Params($aParams);
 		MetaModel::Init_InheritAttributes();
 
-		MetaModel::Init_AddAttribute(new AttributeExternalKey("application_id", array("targetclass"=>"DBServer", "jointype"=>null, "allowed_values"=>null, "sql"=>"application_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeExternalField("application_name", array("allowed_values"=>null, "extkey_attcode"=>"application_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("db_server_instance_id", array("targetclass"=>"ApplicationInstance", "jointype"=>null, "allowed_values"=>new ValueSetObjects('SELECT ApplicationInstance AS DBSrvInstance JOIN DBServer AS DBServerSW ON DBSrvInstance.application_id = DBServerSW.id WHERE DBServerSW.finalclass=\'DBServer\''), "sql"=>"db_server_instance_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("db_server_instance_name", array("allowed_values"=>null, "extkey_attcode"=>"db_server_instance_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("db_server_instance_version", array("allowed_values"=>null, "extkey_attcode"=>"db_server_instance_id", "target_attcode"=>"version", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributePassword("admin_login", array("allowed_values"=>null, "sql"=>"admin_login", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributePassword("admin_password", array("allowed_values"=>null, "sql"=>"admin_password", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeWikiText("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('name', 'status', 'owner_id', 'importance', 'application_id', 'admin_login', 'admin_password', 'description'));
-		MetaModel::Init_SetZListItems('advanced_search', array('name', 'status', 'owner_id', 'importance', 'application_id', 'description'));
-		MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'owner_id', 'importance', 'application_id', 'description'));
-		MetaModel::Init_SetZListItems('list', array('status', 'owner_id', 'importance', 'application_id'));
+		MetaModel::Init_SetZListItems('details', array('name', 'status', 'owner_id', 'importance', 'db_server_instance_id', 'db_server_instance_version', 'admin_login', 'admin_password', 'description'));
+		MetaModel::Init_SetZListItems('advanced_search', array('name', 'status', 'owner_id', 'importance', 'db_server_instance_id', 'db_server_instance_version', 'description'));
+		MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'owner_id', 'importance', 'db_server_instance_id', 'db_server_instance_version', 'description'));
+		MetaModel::Init_SetZListItems('list', array('status', 'owner_id', 'importance', 'db_server_instance_id', 'db_server_instance_version'));
 	}
 }
 class ApplicationSolution extends FunctionalCI

+ 4 - 0
modules/itop-config-mgmt-1.0.0/module.itop-config-mgmt.php

@@ -32,6 +32,10 @@ SetupWebPage::AddModule(
 			'data.sample.organization.xml',
 			'data.sample.location.xml',
 			'data.sample.team.xml',
+			'data.sample.contact.xml',
+			'data.sample.server.xml',
+			'data.sample.application.xml',
+			'data.sample.business.xml',
 		),
 		
 		// Documentation

+ 1 - 1
modules/itop-tickets-1.0.0/module.itop-tickets.php

@@ -14,7 +14,7 @@ SetupWebPage::AddModule(
 		'dependencies' => array(
 		),
 		'mandatory' => true,
-		'visible' => false,
+		'visible' => true,
 
 		// Components
 		//

+ 2 - 1
pages/UI.php

@@ -439,7 +439,7 @@ try
 			$oObj = $oContext->GetObject($sClass, $id);
 			if ($oObj != null)
 			{
-				$oP->set_title(Dict::Format('UI:DetailsPageTitle', $oObj->GetDisplayName(), $sClassLabel));
+				$oP->set_title(Dict::Format('UI:DetailsPageTitle', $oObj->GetName(), $sClassLabel));
 				$oObj->DisplayDetails($oP);
 			}
 			else
@@ -783,6 +783,7 @@ try
 				$oP->add('<p>'.Dict::Format('UI:SelectTheTypeOf_Class_ToCreate', $sClassLabel));
 				$aDefaults = utils::ReadParam('default', array());
 				$oP->add($oAppContext->GetForForm());
+				$oP->add("<input type=\"hidden\" name=\"checkSubclass\" value=\"0\">\n");
 				$oP->add("<input type=\"hidden\" name=\"state\" value=\"$sStateCode\">\n");
 				$oP->add("<input type=\"hidden\" name=\"operation\" value=\"new\">\n");
 				foreach($aDefaults as $key => $value)

+ 1 - 1
pages/ajax.render.php

@@ -301,7 +301,7 @@ switch($operation)
 	$oSet = new CMDBObjectSet($oFilter);
 	while( $oObj = $oSet->fetch())
 	{
-		$oPage->add('<option title="Here is more information..." value="'.$oObj->GetKey().'">'.$oObj->GetDisplayName().'</option>');
+		$oPage->add('<option title="Here is more information..." value="'.$oObj->GetKey().'">'.$oObj->GetName().'</option>');
 	}
 	break;
 	

+ 41 - 8
setup/xmldataloader.class.inc.php

@@ -233,20 +233,53 @@ class XMLDataLoader
 	 * Store an object in the database and remember the mapping
 	 * between its original ID and the newly created ID in the database
 	 */  
-	protected function StoreObject($sClass, $oTargetObj, $iSrcId)
+	protected function StoreObject($sClass, $oTargetObj, $iSrcId, $bSearch = false)
 	{
 		$iObjId = 0;
 		try
 		{
-			if (is_subclass_of($oTargetObj, 'CMDBObject'))
+			if ($bSearch)
 			{
-		        $iObjId = $oTargetObj->DBInsertTrackedNoReload($this->m_oChange);
-			}
-			else
+				// Check if the object does not already exist, based on its usual reconciliation keys...
+				$aReconciliationKeys = MetaModel::GetReconcKeys($sClass);
+				if (count($aReconciliationKeys) > 0)
+				{
+					// Some reconciliation keys have been defined, use them to search for the object
+					$oSearch = new DBObjectSearch($sClass);
+					$iConditionsCount  = 0;
+					foreach($aReconciliationKeys as $sAttCode)
+					{
+						if ($oTargetObj->Get($sAttCode) != '')
+						{
+							$oSearch->AddCondition($sAttCode, $oTargetObj->Get($sAttCode));
+							$iConditionsCount++;
+						}
+					}
+					if ($iConditionsCount > 0) // Search only if there are some valid conditions...
+					{
+						$oSet = new DBObjectSet($oSearch);
+						if ($oSet->count() == 1)
+						{
+							// The object already exists, reuse it
+							$oExistingObject = $oSet->Fetch();
+							$iObjId = $oExistingObject->GetKey();
+						}
+					}
+				}
+			}	
+			
+			if ($iObjId == 0)
 			{
-		        $iObjId = $oTargetObj->DBInsertNoReload();
-			}
-	        
+				// No similar object found for sure, let's create it
+				if (is_subclass_of($oTargetObj, 'CMDBObject'))
+				{
+			        $iObjId = $oTargetObj->DBInsertTrackedNoReload($this->m_oChange);
+				}
+				else
+				{
+			        $iObjId = $oTargetObj->DBInsertNoReload();
+				}
+			}	        
 		}
 		catch(Exception $e)
 		{