فهرست منبع

Finalization of the user management by profile (UI to manage the accounts), and some unrelated changes:
- Using class labels in the UI
- Data model: you may specify a set of allowed values from a query (see caller_id in bizIncident class), still not 100% used in the UI but does not generate any error
- Data model: you may specify a password field (AttributePassword replacing AttributeString)
- Setup: calling UserRight::Setup() right after calling UserRight::CreateAdministrator()
- Setup: administrator account created with "my organization" and a dedicated contact
- Menus: optimized the load of std menus (queries written in OQL to get the benefit of the query cache)
- Menus: admin tools, seen only by people having the "admin" profile
- Object edition: fixed bug with the display of N-N links in the form

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@110 a333f486-631f-4898-b8df-5754b55c2be0

romainq 15 سال پیش
والد
کامیت
7e4258fdaa
36فایلهای تغییر یافته به همراه3108 افزوده شده و 2520 حذف شده
  1. 5 0
      addons/userrights/userrightsmatrix.class.inc.php
  2. 5 0
      addons/userrights/userrightsnull.class.inc.php
  3. 549 204
      addons/userrights/userrightsprofile.class.inc.php
  4. 131 109
      application/cmdbabstract.class.inc.php
  5. 1 1
      application/iotask.class.inc.php
  6. 38 23
      application/itopwebpage.class.inc.php
  7. 18 10
      application/menunode.class.inc.php
  8. 7 4
      application/ui.linkswidget.class.inc.php
  9. 3 1
      business/incident.business.php
  10. 50 3
      core/attributedef.class.inc.php
  11. 31 3
      core/dbobjectsearch.class.php
  12. 12 2
      core/expression.class.inc.php
  13. 7 59
      core/filterdef.class.inc.php
  14. 14 8
      core/metamodel.class.php
  15. 22 0
      core/userrights.class.inc.php
  16. 1 84
      core/valuesetdef.class.inc.php
  17. 1 1
      js/linkswidget.js
  18. 1 1
      pages/UniversalSearch.php
  19. 6 1
      pages/ajax.render.php
  20. 23 18
      pages/index.php
  21. 2 2
      pages/schema.php
  22. 17 0
      pages/usermanagement_userstatus.php
  23. 7 0
      setup/data/30.profiles.xml
  24. 15 0
      setup/data/31.profileprojection.xml
  25. 1659 0
      setup/data/32.actiongrant.xml
  26. 3 0
      setup/data/33.attributegrant.xml
  27. 189 0
      setup/data/34.stimulusgrant.xml
  28. 4 2
      setup/data/export.cmd
  29. 273 130
      setup/data/structure/1.menus.xml
  30. 0 4
      setup/data/structure/11.profiles.xml
  31. 5 5
      setup/data/structure/13.profileprojection.xml
  32. 0 1656
      setup/data/structure/14.actiongrant.xml
  33. 0 186
      setup/data/structure/16.stimulusgrant.xml
  34. 4 1
      setup/data/structure/export_menus.cmd
  35. 4 1
      setup/data/structure/export_profiles.cmd
  36. 1 1
      setup/index.php

+ 5 - 0
addons/userrights/userrightsmatrix.class.inc.php

@@ -178,6 +178,11 @@ class UserRightsMatrix extends UserRightsAddOnAPI
 		return true;
 	}
 
+	public function IsAdministrator($iUserId)
+	{
+		return ($iUserId == 1);
+	}
+
 	public function Setup()
 	{
 		// Users must be added manually

+ 5 - 0
addons/userrights/userrightsnull.class.inc.php

@@ -22,6 +22,11 @@ class UserRightsNull extends UserRightsAddOnAPI
 		return true;
 	}
 
+	public function IsAdministrator($iUserId)
+	{
+		return true;
+	}
+
 	public function Setup()
 	{
 		return true;

+ 549 - 204
addons/userrights/userrightsprofile.class.inc.php

@@ -14,12 +14,14 @@
  */
 
 
-// It is supposed that this profile does exist in the DB
-// Possible improvement: add it when executing the setup procedure
-//
 define('ADMIN_PROFILE_ID', 1);
 
-class URP_Users extends DBObject
+class UserRightsBaseClass extends cmdbAbstractObject
+{
+}
+
+
+class URP_Users extends UserRightsBaseClass
 {
 	public static function Init()
 	{
@@ -36,23 +38,38 @@ class URP_Users extends DBObject
 			"db_table" => "priv_urp_users",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
-		MetaModel::Init_AddAttribute(new AttributeInteger("userid", array("label"=>"User id", "description"=>"User identifier (depends on the business model)", "allowed_values"=>null, "sql"=>"userid", "default_value"=>0, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("login", array("label"=>"login", "description"=>"user identification string", "allowed_values"=>null, "sql"=>"login", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("password", array("label"=>"password", "description"=>"user authentication string", "allowed_values"=>null, "sql"=>"pwd", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("email", array("label"=>"email", "description"=>"email address", "allowed_values"=>null, "sql"=>"email", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("firstname", array("label"=>"firstname", "description"=>"first name", "allowed_values"=>null, "sql"=>"firstname", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("lastname", array("label"=>"lastname", "description"=>"last name", "allowed_values"=>null, "sql"=>"lastname", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"bizPerson", "label"=>"Contact (person)", "description"=>"Personal details from the business data", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("last_name", array("label"=>"Last name", "description"=>"Name of the corresponding contact", "allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"name")));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("first_name", array("label"=>"First name", "description"=>"First name of the corresponding contact", "allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"first_name")));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("email", array("label"=>"Email", "description"=>"Email of the corresponding contact", "allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"email")));
+
+		MetaModel::Init_AddAttribute(new AttributeString("login", array("label"=>"Login", "description"=>"user identification string", "allowed_values"=>null, "sql"=>"login", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributePassword("password", array("label"=>"Password", "description"=>"user authentication string", "allowed_values"=>null, "sql"=>"pwd", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+
+		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("profiles", array("label"=>"Profiles", "description"=>"roles, granting rights for that person", "linked_class"=>"URP_UserProfile", "ext_key_to_me"=>"userid", "ext_key_to_remote"=>"profileid", "allowed_values"=>null, "count_min"=>1, "count_max"=>0, "depends_on"=>array())));
 
 		//MetaModel::Init_InheritFilters();
 		MetaModel::Init_AddFilterFromAttribute("userid");
 		MetaModel::Init_AddFilterFromAttribute("login");
+		MetaModel::Init_AddFilterFromAttribute("password");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('userid', 'first_name', 'email', 'login')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('first_name', 'last_name', 'login')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('login', 'userid')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('login', 'userid')); // Criteria of the advanced search form
 	}
+
 }
 
-class URP_Profiles extends DBObject
+
+class URP_Profiles extends UserRightsBaseClass
 {
 	public static function Init()
 	{
@@ -69,19 +86,93 @@ class URP_Profiles extends DBObject
 			"db_table" => "priv_urp_profiles",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
-		MetaModel::Init_AddAttribute(new AttributeString("name", array("label"=>"name", "description"=>"label", "allowed_values"=>null, "sql"=>"name", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("description", array("label"=>"description", "description"=>"one line description", "allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("name", array("label"=>"Name", "description"=>"label", "allowed_values"=>null, "sql"=>"name", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("description", array("label"=>"Description", "description"=>"one line description", "allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+
+		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("users", array("label"=>"Users", "description"=>"persons having this role", "linked_class"=>"URP_UserProfile", "ext_key_to_me"=>"profileid", "ext_key_to_remote"=>"userid", "allowed_values"=>null, "count_min"=>1, "count_max"=>0, "depends_on"=>array())));
 
 		//MetaModel::Init_InheritFilters();
 		MetaModel::Init_AddFilterFromAttribute("name");
 		MetaModel::Init_AddFilterFromAttribute("description");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('name', 'description')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('name', 'description')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
+	}
+
+	function GetGrantAsHtml($oUserRights, $sClass, $sAction)
+	{
+		$oGrant = $oUserRights->GetClassActionGrant($this->GetKey(), $sClass, $sAction);
+		if (is_object($oGrant) && ($oGrant->Get('permission') == 'yes')) 
+		{
+			return '<span style="background-color: #ddffdd;">yes</span>';
+		}
+		else
+		{
+			return '<span style="background-color: #ffdddd;">no</span>';
+		}
+	}
+	
+	function DoShowGrantSumary($oPage)
+	{
+	
+		// Note: for sure, we assume that the instance is derived from UserRightsProfile
+		$oUserRights = UserRights::GetModuleInstance();
+	
+		$aDisplayData = array();
+		foreach (MetaModel::GetClasses('bizmodel') as $sClass)
+		{
+			$aStimuli = array();
+			foreach (array_keys(MetaModel::EnumStimuli($sClass)) as $sStimulusCode)
+			{
+				$oGrant = $oUserRights->GetClassStimulusGrant($this->GetKey(), $sClass, $sStimulusCode);
+				if (is_object($oGrant) && ($oGrant->Get('permission') == 'yes'))
+				{ 
+					$aStimuli[] = $sStimulusCode;
+				}
+			}
+			$sStimuli = implode(', ', $aStimuli);
+			
+			$aDisplayData[] = array(
+				'class' => MetaModel::GetName($sClass),
+				'read' => $this->GetGrantAsHtml($oUserRights, $sClass, 'Read'),
+				'bulkread' => $this->GetGrantAsHtml($oUserRights, $sClass, 'Bulk Read'),
+				'write' => $this->GetGrantAsHtml($oUserRights, $sClass, 'Modify'),
+				'bulkwrite' => $this->GetGrantAsHtml($oUserRights, $sClass, 'Bulk Modify'),
+				'stimuli' => $sStimuli,
+			);
+		}
+	
+		$aDisplayConfig = array();
+		$aDisplayConfig['class'] = array('label' => 'Class', 'description' => '');
+		$aDisplayConfig['read'] = array('label' => 'Read', 'description' => '');
+		$aDisplayConfig['bulkread'] = array('label' => 'Bulk read', 'description' => 'List objects or export massively');
+		$aDisplayConfig['write'] = array('label' => 'Write', 'description' => 'Create and edit (modify)');
+		$aDisplayConfig['bulkwrite'] = array('label' => 'Bulk write', 'description' => 'Massively create/edit (CSV import)');
+		$aDisplayConfig['stimuli'] = array('label' => 'Stimuli', 'description' => 'Allowed (compound) actions');
+		$oPage->table($aDisplayConfig, $aDisplayData);
+	}
+
+	function DisplayBareRelations(web_page $oPage)
+	{
+		parent::DisplayBareRelations($oPage);
+
+		$oPage->SetCurrentTabContainer('Related Objects');
+
+		$oPage->SetCurrentTab('Grants matrix');
+		$this->DoShowGrantSumary($oPage);		
 	}
 }
 
-class URP_Dimensions extends DBObject
+
+class URP_Dimensions extends UserRightsBaseClass
 {
 	public static function Init()
 	{
@@ -98,17 +189,25 @@ class URP_Dimensions extends DBObject
 			"db_table" => "priv_urp_dimensions",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "../business/templates/default.html",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
-		MetaModel::Init_AddAttribute(new AttributeString("name", array("label"=>"name", "description"=>"label", "allowed_values"=>null, "sql"=>"name", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("description", array("label"=>"description", "description"=>"one line description", "allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("type", array("label"=>"type", "description"=>"class name or data type (projection unit)", "allowed_values"=>new ValueSetEnumClasses('bizmodel', 'String,Integer'), "sql"=>"type", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("name", array("label"=>"Name", "description"=>"label", "allowed_values"=>null, "sql"=>"name", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("description", array("label"=>"Description", "description"=>"one line description", "allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("type", array("label"=>"Type", "description"=>"class name or data type (projection unit)", "allowed_values"=>new ValueSetEnumClasses('bizmodel', 'String,Integer'), "sql"=>"type", "default_value"=>'String', "is_null_allowed"=>false, "depends_on"=>array())));
 
 		//MetaModel::Init_InheritFilters();
 		MetaModel::Init_AddFilterFromAttribute("name");
 		MetaModel::Init_AddFilterFromAttribute("description");
 		MetaModel::Init_AddFilterFromAttribute("type");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('name', 'description', 'type')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('name', 'description')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
 	}
 
 	public function CheckProjectionSpec($oProjectionSpec, $sProjectedClass)
@@ -193,39 +292,51 @@ class URP_Dimensions extends DBObject
 	}
 }
 
-class URP_UserProfile extends DBObject
+
+class URP_UserProfile extends UserRightsBaseClass
 {
 	public static function Init()
 	{
 		$aParams = array
 		(
 			"category" => "addon/userrights",
-			"name" => "user_profile",
+			"name" => "User to profile",
 			"description" => "user profiles",
 			"key_type" => "autoincrement",
 			"key_label" => "",
-			"name_attcode" => "",
+			"name_attcode" => "userid",
 			"state_attcode" => "",
 			"reconc_keys" => array(),
 			"db_table" => "priv_urp_userprofile",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "../business/templates/default.html",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"URP_Users", "jointype"=> "", "label"=>"User", "description"=>"user account", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("userlogin", array("label"=>"Login", "description"=>"User's login", "allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"login")));
 
-		MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "label"=>"profile", "description"=>"usage profile", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "label"=>"Profile", "description"=>"usage profile", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("label"=>"Profile", "description"=>"Profile name", "allowed_values"=>null, "extkey_attcode"=> 'profileid', "target_attcode"=>"name")));
 
+		MetaModel::Init_AddAttribute(new AttributeString("reason", array("label"=>"Reason", "description"=>"explain why this person may have this role", "allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+
 		//MetaModel::Init_InheritFilters();
 		MetaModel::Init_AddFilterFromAttribute("userid");
 		MetaModel::Init_AddFilterFromAttribute("profileid");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('userid', 'profileid', 'reason')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('userid', 'profileid', 'reason')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('userid', 'profileid')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('userid', 'profileid')); // Criteria of the advanced search form
 	}
 }
 
-class URP_ProfileProjection extends DBObject
+
+class URP_ProfileProjection extends UserRightsBaseClass
 {
 	public static function Init()
 	{
@@ -236,19 +347,20 @@ class URP_ProfileProjection extends DBObject
 			"description" => "profile projections",
 			"key_type" => "autoincrement",
 			"key_label" => "",
-			"name_attcode" => "",
+			"name_attcode" => "profileid",
 			"state_attcode" => "",
 			"reconc_keys" => array(),
 			"db_table" => "priv_urp_profileprojection",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "../business/templates/default.html",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("dimensionid", array("targetclass"=>"URP_Dimensions", "jointype"=> "", "label"=>"Dimension", "description"=>"application dimension", "allowed_values"=>null, "sql"=>"dimensionid", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("dimension", array("label"=>"Dimension", "description"=>"application dimension", "allowed_values"=>null, "extkey_attcode"=> 'dimensionid', "target_attcode"=>"name")));
 
-		MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "label"=>"profile", "description"=>"usage profile", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "label"=>"Profile", "description"=>"usage profile", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("label"=>"Profile", "description"=>"Profile name", "allowed_values"=>null, "extkey_attcode"=> 'profileid', "target_attcode"=>"name")));
 
 		MetaModel::Init_AddAttribute(new AttributeString("value", array("label"=>"Value expression", "description"=>"OQL expression (using \$user) | constant | <any> | <user>+attribute code", "allowed_values"=>null, "sql"=>"value", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
@@ -257,6 +369,13 @@ class URP_ProfileProjection extends DBObject
 		//MetaModel::Init_InheritFilters();
 		MetaModel::Init_AddFilterFromAttribute("dimensionid");
 		MetaModel::Init_AddFilterFromAttribute("profileid");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('dimensionid', 'profileid', 'value', 'attribute')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('dimensionid', 'profileid', 'value', 'attribute')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('dimensionid', 'profileid')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('dimensionid', 'profileid')); // Criteria of the advanced search form
 	}
 
 	public function ProjectUser(URP_Users $oUser)
@@ -296,7 +415,8 @@ class URP_ProfileProjection extends DBObject
 	}
 }
 
-class URP_ClassProjection extends DBObject
+
+class URP_ClassProjection extends UserRightsBaseClass
 {
 	public static function Init()
 	{
@@ -307,12 +427,13 @@ class URP_ClassProjection extends DBObject
 			"description" => "class projections",
 			"key_type" => "autoincrement",
 			"key_label" => "",
-			"name_attcode" => "",
+			"name_attcode" => "dimensionid",
 			"state_attcode" => "",
 			"reconc_keys" => array(),
 			"db_table" => "priv_urp_classprojection",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "../business/templates/default.html",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
@@ -328,6 +449,13 @@ class URP_ClassProjection extends DBObject
 		MetaModel::Init_AddFilterFromAttribute("dimensionid");
 		// #@# verifier
 		MetaModel::Init_AddFilterFromAttribute("class");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('dimensionid', 'class', 'value', 'attribute')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('dimensionid', 'class', 'value', 'attribute')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('dimensionid', 'class')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('dimensionid', 'class')); // Criteria of the advanced search form
 	}
 
 	public function ProjectObject($oObject)
@@ -371,7 +499,8 @@ class URP_ClassProjection extends DBObject
 	}
 }
 
-class URP_ActionGrant extends DBObject
+
+class URP_ActionGrant extends UserRightsBaseClass
 {
 	public static function Init()
 	{
@@ -382,12 +511,13 @@ class URP_ActionGrant extends DBObject
 			"description" => "permissions on classes",
 			"key_type" => "autoincrement",
 			"key_label" => "",
-			"name_attcode" => "",
+			"name_attcode" => "profileid",
 			"state_attcode" => "",
 			"reconc_keys" => array(),
 			"db_table" => "priv_urp_grant_actions",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "../business/templates/default.html",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
@@ -395,10 +525,10 @@ class URP_ActionGrant extends DBObject
 		// Common to all grant classes (could be factorized by class inheritence, but this has to be benchmarked)
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "label"=>"Profile", "description"=>"usage profile", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("label"=>"Profile", "description"=>"usage profile", "allowed_values"=>null, "extkey_attcode"=> 'profileid', "target_attcode"=>"name")));
-		MetaModel::Init_AddAttribute(new AttributeString("class", array("label"=>"class", "description"=>"class name", "allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("label"=>"permission", "description"=>"allowed or not allowed?", "allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("class", array("label"=>"Class", "description"=>"class name", "allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("label"=>"Permission", "description"=>"allowed or not allowed?", "allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
 
-		MetaModel::Init_AddAttribute(new AttributeString("action", array("label"=>"action", "description"=>"operations to perform on the given class", "allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("action", array("label"=>"Action", "description"=>"operations to perform on the given class", "allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
 
 		//MetaModel::Init_InheritFilters();
 		// Common to all grant classes (could be factorized by class inheritence, but this has to be benchmarked)
@@ -408,10 +538,18 @@ class URP_ActionGrant extends DBObject
 		MetaModel::Init_AddFilterFromAttribute("permission");
 
 		MetaModel::Init_AddFilterFromAttribute("action");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('profileid', 'class', 'permission', 'action')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('profileid', 'class', 'permission', 'action')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('profileid', 'class', 'permission', 'action')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('profileid', 'class', 'permission', 'action')); // Criteria of the advanced search form
 	}
 }
 
-class URP_StimulusGrant extends DBObject
+
+class URP_StimulusGrant extends UserRightsBaseClass
 {
 	public static function Init()
 	{
@@ -422,12 +560,13 @@ class URP_StimulusGrant extends DBObject
 			"description" => "permissions on stimilus in the life cycle of the object",
 			"key_type" => "autoincrement",
 			"key_label" => "",
-			"name_attcode" => "",
+			"name_attcode" => "profileid",
 			"state_attcode" => "",
 			"reconc_keys" => array(),
 			"db_table" => "priv_urp_grant_stimulus",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "../business/templates/default.html",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
@@ -435,10 +574,10 @@ class URP_StimulusGrant extends DBObject
 		// Common to all grant classes (could be factorized by class inheritence, but this has to be benchmarked)
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("profileid", array("targetclass"=>"URP_Profiles", "jointype"=> "", "label"=>"Profile", "description"=>"usage profile", "allowed_values"=>null, "sql"=>"profileid", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("profile", array("label"=>"Profile", "description"=>"usage profile", "allowed_values"=>null, "extkey_attcode"=> 'profileid', "target_attcode"=>"name")));
-		MetaModel::Init_AddAttribute(new AttributeString("class", array("label"=>"class", "description"=>"class name", "allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("label"=>"permission", "description"=>"allowed or not allowed?", "allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("class", array("label"=>"Class", "description"=>"class name", "allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("label"=>"Permission", "description"=>"allowed or not allowed?", "allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
 
-		MetaModel::Init_AddAttribute(new AttributeString("stimulus", array("label"=>"stimulus", "description"=>"stimulus code", "allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("stimulus", array("label"=>"Stimulus", "description"=>"stimulus code", "allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
 
 		//MetaModel::Init_InheritFilters();
 		// Common to all grant classes (could be factorized by class inheritence, but this has to be benchmarked)
@@ -448,10 +587,18 @@ class URP_StimulusGrant extends DBObject
 		MetaModel::Init_AddFilterFromAttribute("permission");
 
 		MetaModel::Init_AddFilterFromAttribute("stimulus");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('profileid', 'class', 'permission', 'stimulus')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('profileid', 'class', 'permission', 'stimulus')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('profileid', 'class', 'permission', 'stimulus')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('profileid', 'class', 'permission', 'stimulus')); // Criteria of the advanced search form
 	}
 }
 
-class URP_AttributeGrant extends DBObject
+
+class URP_AttributeGrant extends UserRightsBaseClass
 {
 	public static function Init()
 	{
@@ -462,22 +609,30 @@ class URP_AttributeGrant extends DBObject
 			"description" => "permissions at the attributes level",
 			"key_type" => "autoincrement",
 			"key_label" => "",
-			"name_attcode" => "",
+			"name_attcode" => "actiongrantid",
 			"state_attcode" => "",
 			"reconc_keys" => array(),
 			"db_table" => "priv_urp_grant_attributes",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
+			"display_template" => "../business/templates/default.html",
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();
 
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("actiongrantid", array("targetclass"=>"URP_ActionGrant", "jointype"=> "", "label"=>"Action grant", "description"=>"action grant", "allowed_values"=>null, "sql"=>"actiongrantid", "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeString("attcode", array("label"=>"attribute", "description"=>"attribute code", "allowed_values"=>null, "sql"=>"attcode", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("attcode", array("label"=>"Attribute", "description"=>"attribute code", "allowed_values"=>null, "sql"=>"attcode", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
 
 		//MetaModel::Init_InheritFilters();
 		MetaModel::Init_AddFilterFromAttribute("actiongrantid");
 		MetaModel::Init_AddFilterFromAttribute("attcode");
+
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('actiongrantid', 'attcode')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('actiongrantid', 'attcode')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('actiongrantid', 'attcode')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('actiongrantid', 'attcode')); // Criteria of the advanced search form
 	}
 }
 
@@ -498,180 +653,66 @@ class UserRightsProfile extends UserRightsAddOnAPI
 	// Installation: create the very first user
 	public function CreateAdministrator($sAdminUser, $sAdminPwd)
 	{
+		$oOrg = new bizOrganization();
+		$oOrg->Set('name', 'My Company/Department');
+		$oOrg->Set('code', 'SOMECODE');
+		$oOrg->Set('status', 'implementation');
+		//$oOrg->Set('parent_id', xxx);
+		$iOrgId = $oOrg->DBInsertNoReload();
+
+		// Location : optional
+		//$oLocation = new bizLocation();
+		//$oLocation->Set('name', 'MyOffice');
+		//$oLocation->Set('status', 'implementation');
+		//$oLocation->Set('org_id', $iOrgId);
+		//$oLocation->Set('severity', 'high');
+		//$oLocation->Set('address', 'my building in my city');
+		//$oLocation->Set('country', 'my country');
+		//$oLocation->Set('parent_location_id', xxx);
+		//$iLocationId = $oLocation->DBInsertNoReload();
+
+		$oContact = new bizPerson();
+		$oContact->Set('name', 'My last name');
+		$oContact->Set('first_name', 'My first name');
+		$oContact->Set('status', 'production');
+		$oContact->Set('org_id', $iOrgId);
+		$oContact->Set('email', 'my.email@foo.org');
+		$oContact->Set('phone', '');
+		//$oContact->Set('location_id', $iLocationId);
+		$oContact->Set('employee_number', '');
+		$iContactId = $oContact->DBInsertNoReload();
+		
 		$oUser = new URP_Users();
 		$oUser->Set('login', $sAdminUser);
 		$oUser->Set('password', $sAdminPwd);
-		$oUser->Set('email', 'n/a');
-		$oUser->Set('firstname', 'administrator');
-		$oUser->Set('lastname', 'itop');
-		$oUser->Set('userid', 1); // let's mark it as #1 (for what purpose?)
+		$oUser->Set('userid', $iContactId);
 		$iUserId = $oUser->DBInsertNoReload();
 		
 		// Add this user to the very specific 'admin' profile
 		$oUserProfile = new URP_UserProfile();
 		$oUserProfile->Set('userid', $iUserId);
 		$oUserProfile->Set('profileid', ADMIN_PROFILE_ID);
+		$oUserProfile->Set('reason', 'By definition, the administrator must have the administrator profile');
 		$oUserProfile->DBInsertNoReload();
 		return true;
 	}
 
-	public function Setup()
+	public function IsAdministrator($iUserId)
 	{
-		// Dimensions/Profiles/Classes/Attributes/Stimuli could be added anytime
-		// This procedure will then update the matrix with expected default values
-		//
-
-		$oProfileSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Profiles"));
-		while ($oProfile = $oProfileSet->Fetch())
+		if (in_array($iUserId, $this->m_aAdmins))
 		{
-			$this->SetupProfile($oProfile);
+			return true;
 		}
-
-		$oDimensionSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Dimensions"));
-		while ($oDimension = $oDimensionSet->Fetch())
-		{
-			$this->SetupDimension($oDimension);
-		}
-		return true;
-	}
-
-	protected function SetupDimension($oDimension, $bNewDimension = false)
-	{
-		$iDimensionId = $oDimension->GetKey();
-
-		// Create projections, for any class where it applies
-		//
-		foreach(array('bizmodel', 'application', 'gui', 'core/cmdb') as $sCategory)
-		{
-			foreach (MetaModel::GetClasses($sCategory) as $sClass)
-			{
-				if ($bNewDimension)
-				{
-					$bAddCell = true;
-				}
-				else
-				{
-					$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_ClassProjection WHERE class = :class AND dimensionid = :dimension"), array(), array('class'=>$sClass, 'dimension'=>$iDimensionId));
-					$bAddCell = ($oSet->Count() < 1);
-				}
-				if ($bAddCell)
-				{
-					// Create a new entry
-					$oCProj = MetaModel::NewObject("URP_ClassProjection");
-					$oCProj->Set("dimensionid", $iDimensionId);
-					$oCProj->Set("class", $sClass);
-					$oCProj->Set("value", "true");
-					$iId = $oCProj->DBInsertNoReload();
-				}
-			}
-		}
-		// Create projections, for any existing profile
-		//
-		$oProfileSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Profiles"));
-		while ($oProfile = $oProfileSet->Fetch())
+		else
 		{
-			$iProfileId = $oProfile->GetKey();
-			if ($bNewDimension)
-			{
-				$bAddCell = true;
-			}
-			else
-			{
-				$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_ProfileProjection WHERE dimensionid = :dimension AND profileid = :profile"), array(), array('dimension'=>$iDimensionId, 'profile'=>$iProfileId));
-				$bAddCell = ($oSet->Count() < 1);
-			}
-			if ($bAddCell)
-			{
-				// Create a new entry
-				$oDProj = MetaModel::NewObject("URP_ProfileProjection");
-				$oDProj->Set("dimensionid", $iDimensionId);
-				$oDProj->Set("profileid", $iProfileId);
-				$oDProj->Set("value", "true");
-				$iId = $oDProj->DBInsertNoReload();
-			}
+			return false;
 		}
 	}
 
-	protected function SetupProfile($oProfile, $bNewProfile = false)
+	public function Setup()
 	{
-		$iProfileId = $oProfile->GetKey();
-
-		// Create grant records, for any class where it matters (the rest could be done later on)
-		//
-		foreach(array('bizmodel') as $sCategory)
-		{
-			foreach (MetaModel::GetClasses($sCategory) as $sClass)
-			{
-				foreach (self::$m_aActionCodes as $iActionCode => $sAction)
-				{
-					if ($bNewProfile)
-					{
-						$bAddCell = true;
-					}
-					else
-					{
-						$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_ActionGrant WHERE class = :class AND action = :action AND profileid = :profile"), array(), array('class'=>$sClass, 'action'=>$sAction, 'profile'=>$iProfileId));
-						$bAddCell = ($oSet->Count() < 1);
-					}
-					if ($bAddCell)
-					{
-						// Create a new entry
-						$oMyActionGrant = MetaModel::NewObject("URP_ActionGrant");
-						$oMyActionGrant->Set("profileid", $iProfileId);
-						$oMyActionGrant->Set("class", $sClass);
-						$oMyActionGrant->Set("action", $sAction);
-						$oMyActionGrant->Set("permission", "yes");
-						$iId = $oMyActionGrant->DBInsertNoReload();
-					}
-				}
-				foreach (MetaModel::EnumStimuli($sClass) as $sStimulusCode => $oStimulus)
-				{
-					if ($bNewProfile)
-					{
-						$bAddCell = true;
-					}
-					else
-					{
-						$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_StimulusGrant WHERE class = :class AND stimulus = :stimulus AND profileid = :profile"), array(), array('class'=>$sClass, 'stimulus'=>$sStimulusCode, 'profile'=>$iProfileId));
-						$bAddCell = ($oSet->Count() < 1);
-					}
-					if ($bAddCell)
-					{
-						// Create a new entry
-						$oMyStGrant = MetaModel::NewObject("URP_StimulusGrant");
-						$oMyStGrant->Set("profileid", $iProfileId);
-						$oMyStGrant->Set("class", $sClass);
-						$oMyStGrant->Set("stimulus", $sStimulusCode);
-						$oMyStGrant->Set("permission", "yes");
-						$iId = $oMyStGrant->DBInsertNoReload();
-					}
-				}
-			}
-		}
-		// Create the "My Bookmarks" menu item (parent_id = 0, rank = 6)
-		if ($bNewProfile)
-		{
-			$bAddMenu = true;
-		}
-		else
-		{
-			//$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT menuNode WHERE type = 'user' AND parent_id = 0 AND user_id = $iUserId"));
-			//$bAddMenu = ($oSet->Count() < 1);
-		}
-		$bAddMenu = false;
-		if ($bAddMenu)
-		{
-			$oMenu = MetaModel::NewObject('menuNode');
-			$oMenu->Set('type', 'user');
-			$oMenu->Set('parent_id', 0);	// It's a toplevel entry
-			$oMenu->Set('rank', 6);			// Located just above the Admin Tools section (=7)
-			$oMenu->Set('name', 'My Bookmarks');
-			$oMenu->Set('label', 'My Favorite Items');
-			$oMenu->Set('hyperlink', 'UI.php');
-			$oMenu->Set('template', '<p></p><p></p><p style="text-align:center; font-family:Georgia, Times, serif; font-size:32px;">My bookmarks</p><p style="text-align:center; font-family:Georgia, Times, serif; font-size:14px;"><i>This section contains my most favorite search results</i></p>');
-			$oMenu->Set('user_id', $iUserId);
-			$oMenu->DBInsert();
-		}
+		SetupITILProfiles::DoCreateProfiles();
+		return true;
 	}
 
 	public function Init()
@@ -689,6 +730,7 @@ class UserRightsProfile extends UserRightsAddOnAPI
 	protected $m_aAdmins = array(); // id of users being linked to the profile #ADMIN_PROFILE_ID
 
 	protected $m_aClassActionGrants = array(); // profile, class, action -> permission
+	protected $m_aClassStimulusGrants = array(); // profile, class, stimulus -> permission
 	protected $m_aObjectActionGrants = array(); // userid, class, id, action -> permission, list of attributes
 
 	public function CacheData()
@@ -787,19 +829,33 @@ exit;
 		return $oNullFilter;
 	}
 
-	protected function GetClassActionGrant($iProfile, $sClass, $sAction)
+	// This verb has been made public to allow the development of an accurate feedback for the current configuration
+	public function GetClassActionGrant($iProfile, $sClass, $sAction)
 	{
-		$aTest = @$this->m_aClassActionGrants[$iProfile][$sClass][$sAction];
-		if (isset($aTest)) return $aTest;
+		if (isset($this->m_aClassActionGrants[$iProfile][$sClass][$sAction]))
+		{
+			return $this->m_aClassActionGrants[$iProfile][$sClass][$sAction];
+		}
 
 		// Get the permission for this profile/class/action
 		$oSearch = DBObjectSearch::FromOQL("SELECT URP_ActionGrant WHERE class = :class AND action = :action AND profileid = :profile AND permission = 'yes'");
 		$oSet = new DBObjectSet($oSearch, array(), array('class'=>$sClass, 'action'=>$sAction, 'profile'=>$iProfile));
-		if ($oSet->Count() < 1)
+		if ($oSet->Count() >= 1)
 		{
-			return null;
+			$oGrantRecord = $oSet->Fetch();
+		}
+		else
+		{
+			$sParentClass = MetaModel::GetParentPersistentClass($sClass);
+			if (empty($sParentClass))
+			{
+				$oGrantRecord = null;
+			}
+			else
+			{
+				$oGrantRecord = $this->GetClassActionGrant($iProfile, $sParentClass, $sAction);
+			}
 		}
-		$oGrantRecord = $oSet->Fetch();
 
 		$this->m_aClassActionGrants[$iProfile][$sClass][$sAction] = $oGrantRecord;
 		return $oGrantRecord;
@@ -854,8 +910,7 @@ exit;
 	
 	public function IsActionAllowed($iUserId, $sClass, $iActionCode, dbObjectSet $oInstances)
 	{
-		// super admin rights
-		if (in_array($iUserId, $this->m_aAdmins)) return true;
+		if ($this->IsAdministrator($iUserId)) return true;
 
 		$oUser = $this->m_aUsers[$iUserId];
 
@@ -892,8 +947,7 @@ exit;
 
 	public function IsActionAllowedOnAttribute($iUserId, $sClass, $sAttCode, $iActionCode, dbObjectSet $oInstances)
 	{
-		// super admin rights
-		if (in_array($iUserId, $this->m_aAdmins)) return true;
+		if ($this->IsAdministrator($iUserId)) return true;
 
 		$oUser = $this->m_aUsers[$iUserId];
 
@@ -936,10 +990,33 @@ exit;
 		}
 	}
 
+	// This verb has been made public to allow the development of an accurate feedback for the current configuration
+	public function GetClassStimulusGrant($iProfile, $sClass, $sStimulusCode)
+	{
+		if (isset($this->m_aClassStimulusGrants[$iProfile][$sClass][$sStimulusCode]))
+		{
+			return $this->m_aClassStimulusGrants[$iProfile][$sClass][$sStimulusCode];
+		}
+
+		// Get the permission for this profile/class/stimulus
+		$oSearch = DBObjectSearch::FromOQL("SELECT URP_StimulusGrant WHERE class = :class AND stimulus = :stimulus AND profileid = :profile AND permission = 'yes'");
+		$oSet = new DBObjectSet($oSearch, array(), array('class'=>$sClass, 'stimulus'=>$sStimulusCode, 'profile'=>$iProfile));
+		if ($oSet->Count() >= 1)
+		{
+			$oGrantRecord = $oSet->Fetch();
+		}
+		else
+		{
+			$oGrantRecord = null;
+		}
+
+		$this->m_aClassStimulusGrants[$iProfile][$sClass][$sStimulusCode] = $oGrantRecord;
+		return $oGrantRecord;
+	}
+
 	public function IsStimulusAllowed($iUserId, $sClass, $sStimulusCode, dbObjectSet $oInstances)
 	{
-		// super admin rights
-		if (in_array($iUserId, $this->m_aAdmins)) return true;
+		if ($this->IsAdministrator($iUserId)) return true;
 
 		$oUser = $this->m_aUsers[$iUserId];
 
@@ -1069,6 +1146,274 @@ exit;
 	}
 }
 
+//
+// Here is the code that will create some profiles into our user management model, given an ITIL representation of the user profiles
+//
+class SetupITILProfiles
+{
+	/*
+	Later, maybe ?
+
+	protected static $m_aDimensions = array(
+		'organization' => array(
+			'description' => '',
+			'type' => 'bizOrganization',
+		),
+		'site' => array(
+			'description' => '',
+			'type' => '',
+		),
+	);
+	*/
+	protected static $m_aActions = array(
+		UR_ACTION_READ => 'Read',
+		UR_ACTION_MODIFY => 'Modify',
+		UR_ACTION_DELETE => 'Delete',
+		UR_ACTION_BULK_READ => 'Bulk Read',
+		UR_ACTION_BULK_MODIFY => 'Bulk Modify',
+		UR_ACTION_BULK_DELETE => 'Bulk Delete',
+	);
+
+	// It is possible to specify the same class in several modules
+	// 
+	protected static $m_aModules = array(
+		'General' => array(
+			'bizOrganization',
+		),
+		'Documentation' => array(
+			'bizDocVersion',
+			'lnkDocumentRealObject',
+			'lnkDocumentContract',
+			'lnkDocumentError',
+		),
+		'Configuration' => array(
+			'logRealObject',
+			'lnkContactRealObject',
+			'lnkInterfaces',
+			'ClientServerLinks',
+			'lnkInfraGrouping',
+		),
+		'Incident' => array(
+			'bizIncidentTicket',
+			'lnkRelatedTicket',
+			'lnkInfraTicket',
+			'lnkContactTicket',
+		),
+		'Problem' => array(
+			'bizKnownError',
+			'lnkInfraError',
+			'lnkDocumentError',
+		),
+		'Change' => array(
+			'bizChangeTicket',
+			'lnkInfraChangeTicket',
+			'lnkContactChange',
+		),
+		'Service' => array(
+			'bizContract',
+			'lnkInfraContract',
+			'lnkContactContract',
+			'lnkDocumentContract',
+		),
+	);
+	
+	protected static $m_aProfiles = array(
+		'Configuration Manager' => array(
+			'description' => 'Person in charge of the documentation of the managed CIs',
+			'write_modules' => 'Documentation,Configuration',
+			'stimuli' => array(
+				'bizServer' => 'any',
+				//'bizServer' => 'ev_store,ev_ship,ev_plug,ev_configuration_finished,ev_val_failed,ev_mtp,ev_start_change,ev_end_change,ev_decomission,ev_obsolete,ev_recycle',
+				'bizContract' => 'none',
+				'bizIncidentTicket' => 'none',
+				'bizChangeTicket' => 'none',
+			),
+		),
+	/*	'Requestor pb granularite actions (create/delete)' => array(
+			'description' => 'Person notifying an incident',
+			'write_modules' => 'Incident',
+			'stimuli' => array(
+				'bizServer' => 'none',
+				'bizContract' => 'none',
+				'bizIncidentTicket' => 'none',
+				'bizChangeTicket' => 'none',
+			),
+		),
+	*/
+		'Service Desk Agent' => array(
+			'description' => 'Person in charge of creating incident reports',
+			'write_modules' => 'Documentation,Incident',
+			'stimuli' => array(
+				'bizServer' => 'none',
+				'bizContract' => 'none',
+				'bizIncidentTicket' => 'ev_assign',
+				'bizChangeTicket' => 'none',
+			),
+		),
+		'Support Agent' => array(
+			'description' => 'Person analyzing and solving the current incidents or problems',
+			'write_modules' => 'Documentation,Incident,Problem',
+			'stimuli' => array(
+				'bizIncidentTicket' => 'any',
+				//'bizIncidentTicket' => 'ev_assign,ev_reassign,ev_start_working,ev_close',
+			),
+		),
+		'Change Implementor' => array(
+			'description' => 'Person executing the changes',
+			'write_modules' => 'Documentation,Configuration,Change',
+			'stimuli' => array(
+				'bizServer' => 'none',
+				'bizContract' => 'none',
+				'bizIncidentTicket' => 'none',
+				'bizChangeTicket' => 'ev_plan,ev_replan,ev_implement,ev_monitor',
+			),
+		),
+		'Change Supervisor' => array(
+			'description' => 'Person responsible for the overall change execution',
+			'write_modules' => 'Documentation,Change',
+			'stimuli' => array(
+				'bizServer' => 'none',
+				'bizContract' => 'none',
+				'bizIncidentTicket' => 'none',
+				'bizChangeTicket' => 'ev_validate,ev_reject,ev_reopen,ev_finish',
+			),
+		),
+		'Change Approver' => array(
+			'description' => 'Person who could be impacted by some changes',
+			'write_modules' => 'Documentation,Change',
+			'stimuli' => array(
+				'bizServer' => 'none',
+				'bizContract' => 'none',
+				'bizIncidentTicket' => 'none',
+				'bizChangeTicket' => 'ev_approve,ev_notapprove',
+			),
+		),
+		'Service Manager' => array(
+			'description' => 'Person responsible for the service delivered to the [internal] customer',
+			'write_modules' => 'Documentation,Service',
+			'stimuli' => array(
+				'bizServer' => 'none',
+				'bizContract' => 'any',
+				//'bizContract' => 'ev_freeze_version,ev_sign,ev_begin,ev_notice,ev_terminate,ev_elapsed',
+				'bizIncidentTicket' => 'none',
+				'bizChangeTicket' => 'none',
+			),
+		),
+	);
+	
+	
+	protected static function DoCreateProfileProjection($iProfile, $iDimension)
+	{
+		$oNewObj = MetaModel::NewObject("URP_ProfileProjection");
+		$oNewObj->Set('profileid', $iProfile);
+		$oNewObj->Set('dimensionid', $iDimension);
+		$oNewObj->Set('value', '<any>');
+		$oNewObj->Set('attribute', '');
+		$iId = $oNewObj->DBInsertNoReload();
+		return $iId;
+	}
+	
+	
+	protected static function DoCreateActionGrant($iProfile, $iAction, $sClass)
+	{
+		$oNewObj = MetaModel::NewObject("URP_ActionGrant");
+		$oNewObj->Set('profileid', $iProfile);
+		$oNewObj->Set('permission', true);
+		$oNewObj->Set('class', $sClass);
+		$oNewObj->Set('action', self::$m_aActions[$iAction]);
+		$iId = $oNewObj->DBInsertNoReload();
+		return $iId;
+	}
+	
+	protected static function DoCreateStimulusGrant($iProfile, $sStimulusCode, $sClass)
+	{
+		$oNewObj = MetaModel::NewObject("URP_StimulusGrant");
+		$oNewObj->Set('profileid', $iProfile);
+		$oNewObj->Set('permission', true);
+		$oNewObj->Set('class', $sClass);
+		$oNewObj->Set('stimulus', $sStimulusCode);
+		$iId = $oNewObj->DBInsertNoReload();
+		return $iId;
+	}
+	
+	protected static function DoCreateOneProfile($sName, $aProfileData)
+	{
+		$sDescription = $aProfileData['description'];
+		$aWriteModules = explode(',', $aProfileData['write_modules']);
+		$aStimuli = $aProfileData['stimuli'];
+		
+		$oNewObj = MetaModel::NewObject("URP_Profiles");
+		$oNewObj->Set('name', $sName);
+		$oNewObj->Set('description', $sDescription);
+		$iProfile = $oNewObj->DBInsertNoReload();
+	
+		// Project in every dimension
+		//
+		$oDimensionSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Dimensions"));
+		while ($oDimension = $oDimensionSet->Fetch())
+		{
+			$iDimension = $oDimension->GetKey();
+			self::DoCreateProfileProjection($iProfile, $iDimension);
+		}
+	
+		// Grant read rights for everything
+		//
+		foreach (MetaModel::GetClasses('bizmodel') as $sClass)
+		{
+			self::DoCreateActionGrant($iProfile, UR_ACTION_READ, $sClass);
+			self::DoCreateActionGrant($iProfile, UR_ACTION_BULK_READ, $sClass);
+		}
+	
+		// Grant write for given modules
+		// Start by compiling the information, because some modules may overlap
+		$aWriteableClasses = array();
+		foreach ($aWriteModules as $sModule)
+		{
+//			$oPage->p('Granting write access for the module"'.$sModule.'" - '.count(self::$m_aModules[$sModule]).' classes');
+			foreach (self::$m_aModules[$sModule] as $sClass)
+			{
+				$aWriteableClasses[] = $sClass;
+			}
+		}
+		foreach ($aWriteableClasses as $sClass)
+		{
+			self::DoCreateActionGrant($iProfile, UR_ACTION_MODIFY, $sClass);
+			self::DoCreateActionGrant($iProfile, UR_ACTION_DELETE, $sClass);
+			self::DoCreateActionGrant($iProfile, UR_ACTION_BULK_MODIFY, $sClass);
+			self::DoCreateActionGrant($iProfile, UR_ACTION_BULK_DELETE, $sClass);
+		}
+		
+		// Grant stimuli for given classes
+		foreach ($aStimuli as $sClass => $sAllowedStimuli)
+		{
+			if ($sAllowedStimuli == 'any')
+			{
+				$aAllowedStimuli = array_keys(MetaModel::EnumStimuli($sClass));
+			}
+			elseif ($sAllowedStimuli == 'none')
+			{
+				$aAllowedStimuli = array();
+			}
+			else
+			{
+				$aAllowedStimuli = explode(',', $sAllowedStimuli);
+			}
+			foreach ($aAllowedStimuli as $sStimulusCode)
+			{
+				self::DoCreateStimulusGrant($iProfile, $sStimulusCode, $sClass);
+			}
+		}
+	}
+	
+	public static function DoCreateProfiles()
+	{
+		foreach(self::$m_aProfiles as $sName => $aProfileData)
+		{
+			self::DoCreateOneProfile($sName, $aProfileData);
+		}
+	}
+}
+
 UserRights::SelectModule('UserRightsProfile');
 
 ?>

+ 131 - 109
application/cmdbabstract.class.inc.php

@@ -100,11 +100,71 @@ abstract class cmdbAbstractObject extends CMDBObject
 		return $sDisplayValue;
 	}
 
+	function DisplayBareHeader(web_page $oPage)
+	{
+		// Standard Header with name, actions menu and history block
+		//
+		$oPage->add("<div class=\"page_header\">\n");
+
+		// action menu
+		$oSingletonFilter = new DBObjectSearch(get_class($this));
+		$oSingletonFilter->AddCondition('pkey', array($this->GetKey()));
+		$oBlock = new MenuBlock($oSingletonFilter, 'popup', false);
+		$oBlock->Display($oPage, -1);
+
+		$oPage->add("<h1>".MetaModel::GetName(get_class($this)).": <span class=\"hilite\">".$this->GetDisplayName()."</span></h1>\n");
+
+		// history block (with toggle)
+		$oHistoryFilter = new DBObjectSearch('CMDBChangeOpSetAttribute');
+		$oHistoryFilter->AddCondition('objkey', $this->GetKey());
+		$oBlock = new HistoryBlock($oHistoryFilter, 'toggle', false);
+		$oBlock->Display($oPage, -1);
+
+		$oPage->add("</div>\n");
+	}
+
 	function DisplayBareDetails(web_page $oPage)
 	{
 		$oPage->add($this->GetBareDetails($oPage));		
 	}
 
+	function DisplayBareRelations(web_page $oPage)
+	{
+		// Related objects
+		$oPage->AddTabContainer('Related Objects');
+		$oPage->SetCurrentTabContainer('Related Objects');
+		foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sAttCode=>$oAttDef)
+		{
+			if ((get_class($oAttDef) == 'AttributeLinkedSetIndirect') || (get_class($oAttDef) == 'AttributeLinkedSet'))
+			{
+				$oPage->SetCurrentTab($oAttDef->GetLabel());
+				$oPage->p($oAttDef->GetDescription());
+				
+				if (get_class($oAttDef) == 'AttributeLinkedSet')
+				{
+					$sTargetClass = $oAttDef->GetLinkedClass();
+					$oFilter = new DBObjectSearch($sTargetClass);
+					$oFilter->AddCondition($oAttDef->GetExtKeyToMe(), $this->GetKey()); // @@@ condition has same name as field ??
+
+					$oBlock = new DisplayBlock($oFilter, 'list', false);
+					$oBlock->Display($oPage, 0);
+				}
+				else // get_class($oAttDef) == 'AttributeLinkedSetIndirect'
+				{
+					$sLinkClass = $oAttDef->GetLinkedClass();
+					// Transform the DBObjectSet into a CMBDObjectSet !!!
+					$aLinkedObjects = $this->Get($sAttCode)->ToArray(false);
+					if (count($aLinkedObjects) > 0)
+					{
+						$oSet = CMDBObjectSet::FromArray($sLinkClass, $aLinkedObjects);
+						$this->DisplaySet($oPage, $oSet, $oAttDef->GetExtKeyToMe(), true, false, $this->GetKey(), $oAttDef->GetExtKeyToRemote());
+					}
+				}
+			}
+		}
+		$oPage->SetCurrentTab('');
+	}
+
 	function GetDisplayName()
 	{
 		return $this->GetAsHTML(MetaModel::GetNameAttributeCode(get_class($this)));
@@ -152,56 +212,11 @@ abstract class cmdbAbstractObject extends CMDBObject
 		}
 		else
 		{
-			// Standard Header with name, actions menu and history block
-			$oPage->add("<div class=\"page_header\">\n");
-			$oSingletonFilter = new DBObjectSearch(get_class($this));
-			$oSingletonFilter->AddCondition('pkey', array($this->GetKey()));
-			$oBlock = new MenuBlock($oSingletonFilter, 'popup', false);
-			$oBlock->Display($oPage, -1);
-			$oPage->add("<h1>".Metamodel::GetName(MetaModel::GetName(get_class($this))).": <span class=\"hilite\">".$this->GetDisplayName()."</span></h1>\n");
-			$oHistoryFilter = new DBObjectSearch('CMDBChangeOpSetAttribute');
-			$oHistoryFilter->AddCondition('objkey', $this->GetKey());
-			$oBlock = new HistoryBlock($oHistoryFilter, 'toggle', false);
-			$oBlock->Display($oPage, -1);
-			$oPage->add("</div>\n");
-			
 			// Object's details
 			// template not found display the object using the *old style*
-			self::DisplayBareDetails($oPage);
-			
-			// Related objects
-			$oPage->AddTabContainer('Related Objects');
-			$oPage->SetCurrentTabContainer('Related Objects');
-			foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sAttCode=>$oAttDef)
-			{
-				if ((get_class($oAttDef) == 'AttributeLinkedSetIndirect') || (get_class($oAttDef) == 'AttributeLinkedSet'))
-				{
-					$oPage->SetCurrentTab($oAttDef->GetLabel());
-					$oPage->p($oAttDef->GetDescription());
-					
-					if (get_class($oAttDef) == 'AttributeLinkedSet')
-					{
-						$sTargetClass = $oAttDef->GetLinkedClass();
-						$oFilter = new DBObjectSearch($sTargetClass);
-						$oFilter->AddCondition($oAttDef->GetExtKeyToMe(), $this->GetKey()); // @@@ condition has same name as field ??
-
-						$oBlock = new DisplayBlock($oFilter, 'list', false);
-						$oBlock->Display($oPage, 0);
-					}
-					else // get_class($oAttDef) == 'AttributeLinkedSetIndirect'
-					{
-						$sLinkClass = $oAttDef->GetLinkedClass();
-						// Transform the DBObjectSet into a CMBDObjectSet !!!
-						$aLinkedObjects = $this->Get($sAttCode)->ToArray(false);
-						if (count($aLinkedObjects) > 0)
-						{
-							$oSet = CMDBObjectSet::FromArray($sLinkClass, $aLinkedObjects);
-							$this->DisplaySet($oPage, $oSet, $oAttDef->GetExtKeyToMe());
-						}
-					}					
-				}
-			}
-			$oPage->SetCurrentTab('');
+			$this->DisplayBareHeader($oPage);
+			$this->DisplayBareDetails($oPage);
+			$this->DisplayBareRelations($oPage);
 		}
 	}
 	
@@ -218,10 +233,10 @@ abstract class cmdbAbstractObject extends CMDBObject
 	}
 	
 	// Comment by Rom: this helper may be used to display objects of class DBObject
-	//                 -> I am using this to display the changes history 
-	public static function DisplaySet(web_page $oPage, CMDBObjectSet $oSet, $sLinkageAttribute = '', $bDisplayMenu = true, $bSelectMode = false, $iObjectId = 0)
+	//                 -> I am using this to display the changes history
+	public static function DisplaySet(web_page $oPage, CMDBObjectSet $oSet, $sLinkageAttribute = '', $bDisplayMenu = true, $bSelectMode = false, $iObjectId = 0, $sTargetAttribute = '')
 	{
-		$oPage->add(self::GetDisplaySet($oPage, $oSet, array( 'link_attr' => $sLinkageAttribute, 'object_id' => $iObjectId, 'menu' => $bDisplayMenu, 'selection_mode' => $bSelectMode)));
+		$oPage->add(self::GetDisplaySet($oPage, $oSet, array( 'link_attr' => $sLinkageAttribute, 'object_id' => $iObjectId, 'target_attr' => $sTargetAttribute, 'menu' => $bDisplayMenu, 'selection_mode' => $bSelectMode)));
 	}
 	
 	//public static function GetDisplaySet(web_page $oPage, CMDBObjectSet $oSet, $sLinkageAttribute = '', $bDisplayMenu = true, $bSelectMode = false)
@@ -238,7 +253,7 @@ abstract class cmdbAbstractObject extends CMDBObject
 		{
 			if($iLinkedObjectId == 0)
 			{
-				// if 'links' mode is requested the d of the object to link to must be specified
+				// if 'links' mode is requested the id of the object to link to must be specified
 				throw new ApplicationException("Parameter object_id is mandatory when link_attr is specified. Check the definition of the display template.");
 			}
 			if($sTargetAttr == '')
@@ -438,9 +453,9 @@ abstract class cmdbAbstractObject extends CMDBObject
 		$sClassName = $oSet->GetFilter()->GetClass();
 
 		$sHtml .= "<div class=\"mini_tabs\" id=\"mini_tabs{$iSearchFormId}\"><ul>
-				   <li><a href=\"#\" onClick=\"$('div.mini_tab{$iSearchFormId}').toggle();$('#mini_tabs{$iSearchFormId} ul li a').toggleClass('selected');\">OQL Query</a></li>
-				   <li><a class=\"selected\" href=\"#\" onClick=\"$('div.mini_tab{$iSearchFormId}').toggle();$('#mini_tabs{$iSearchFormId} ul li a').toggleClass('selected');\">Simple Search</a></li>
-				   </ul></div>\n";
+					<li><a href=\"#\" onClick=\"$('div.mini_tab{$iSearchFormId}').toggle();$('#mini_tabs{$iSearchFormId} ul li a').toggleClass('selected');\">OQL Query</a></li>
+					<li><a class=\"selected\" href=\"#\" onClick=\"$('div.mini_tab{$iSearchFormId}').toggle();$('#mini_tabs{$iSearchFormId} ul li a').toggleClass('selected');\">Simple Search</a></li>
+					</ul></div>\n";
 		// Simple search form
 		$sHtml .= "<div id=\"SimpleSearchForm{$iSearchFormId}\" class=\"mini_tab{$iSearchFormId}\">\n";
 		$sHtml .= "<h1>Search for ".MetaModel::GetName($sClassName)." Objects</h1>\n";
@@ -487,32 +502,33 @@ abstract class cmdbAbstractObject extends CMDBObject
 					}
 				}
 			}
-            $aAllowedValues = MetaModel::GetAllowedValues_flt($sClassName, $sFilterCode, array(), '');
-            if ($aAllowedValues != null)
-            {
-                //Enum field or external key, display a combo
-            	$sValue = "<select name=\"$sFilterCode\">\n";
-            	$sValue .= "<option value=\"\">* Any *</option>\n";
-            	foreach($aAllowedValues as $key => $value)
-            	{
-            		if ($sFilterValue == $key)
-            		{
-            			$sSelected = ' selected';
-            		}
-            		else
-            		{
-            			$sSelected = '';
-            		}
-            		$sValue .= "<option value=\"$key\"$sSelected>$value</option>\n";
-            	}
-            	$sValue .= "</select>\n";
-		        $sHtml .= "<td><label>".MetaModel::GetFilterLabel($sClassName, $sFilterCode).":</label></td><td>$sValue</td>\n";
-            }
-            else
-            {
-                // Any value is possible, display an input box
-		        $sHtml .= "<td><label>".MetaModel::GetFilterLabel($sClassName, $sFilterCode).":</label></td><td><input class=\"textSearch\" name=\"$sFilterCode\" value=\"$sFilterValue\"/></td>\n";
-            }
+			// #@# todo - add context information, otherwise any value will be authorized for external keys
+			$aAllowedValues = MetaModel::GetAllowedValues_flt($sClassName, $sFilterCode, array());
+			if ($aAllowedValues != null)
+			{
+				//Enum field or external key, display a combo
+				$sValue = "<select name=\"$sFilterCode\">\n";
+				$sValue .= "<option value=\"\">* Any *</option>\n";
+				foreach($aAllowedValues as $key => $value)
+				{
+					if ($sFilterValue == $key)
+					{
+						$sSelected = ' selected';
+					}
+					else
+					{
+						$sSelected = '';
+					}
+					$sValue .= "<option value=\"$key\"$sSelected>$value</option>\n";
+				}
+				$sValue .= "</select>\n";
+				$sHtml .= "<td><label>".MetaModel::GetFilterLabel($sClassName, $sFilterCode).":</label></td><td>$sValue</td>\n";
+			}
+			else
+			{
+				// Any value is possible, display an input box
+				$sHtml .= "<td><label>".MetaModel::GetFilterLabel($sClassName, $sFilterCode).":</label></td><td><input class=\"textSearch\" name=\"$sFilterCode\" value=\"$sFilterValue\"/></td>\n";
+			}
 			$index++;
 		}
 		if (($index % $numCols) != 0)
@@ -577,6 +593,10 @@ abstract class cmdbAbstractObject extends CMDBObject
 				$sHTMLValue = "<input type=\"text\" size=\"20\" name=\"attr_{$sAttCode}{$sNameSuffix}\" value=\"$value\" id=\"$iInputId\" class=\"date-pick\"/>";
 				break;
 				
+				case 'Password':
+				$sHTMLValue = "<input type=\"password\" size=\"20\" name=\"attr_{$sAttCode}{$sNameSuffix}\" value=\"$value\" id=\"$iInputId\"/>";
+				break;
+				
 				case 'Text':
 					$sHTMLValue = "<textarea name=\"attr_{$sAttCode}{$sNameSuffix}\" rows=\"8\" cols=\"40\" id=\"$iInputId\">$value</textarea>";
 				break;
@@ -588,39 +608,41 @@ abstract class cmdbAbstractObject extends CMDBObject
 							
 				case 'String':
 				default:
-			    $aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array(), '');
-				if ($aAllowedValues !== null)
-				{
-					//Enum field or external key, display a combo
-					if (count($aAllowedValues) == 0)
-					{
-						$sHTMLValue = "<input type=\"text\" size=\"70\" value=\"\" name=\"attr_{$sAttCode}{$sNameSuffix}\"  id=\"$iInputId\"/>";
-					}
-					else if (count($aAllowedValues) > 50)
+					// #@# todo - add context information (depending on dimensions)
+					$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array());
+					if ($aAllowedValues !== null)
 					{
-						// too many choices, use an autocomplete
-						// The input for the auto complete
-						$sHTMLValue = "<input type=\"text\" id=\"label_$iInputId\" size=\"50\" name=\"\" value=\"$sDisplayValue\" />";
-						// another hidden input to store & pass the object's Id
-						$sHTMLValue .= "<input type=\"hidden\" id=\"$iInputId\" name=\"attr_{$sAttCode}{$sNameSuffix}\" value=\"$value\" />\n";
-						$oPage->add_ready_script("\$('#label_$iInputId').autocomplete('./ajax.render.php', { minChars:3, onItemSelect:selectItem, onFindValue:findValue, formatItem:formatItem, autoFill:true, keyHolder:'#$iInputId', extraParams:{operation:'autocomplete', sclass:'$sClass',attCode:'".$sAttCode."'}});");
+						//Enum field or external key, display a combo
+						if (count($aAllowedValues) == 0)
+						{
+							$sHTMLValue = "<input type=\"text\" size=\"70\" value=\"\" name=\"attr_{$sAttCode}{$sNameSuffix}\" id=\"$iInputId\"/>";
+						}
+						else if (count($aAllowedValues) > 50)
+						{
+							// too many choices, use an autocomplete
+							// The input for the auto complete
+							$sHTMLValue = "<input type=\"text\" id=\"label_$iInputId\" size=\"50\" name=\"\" value=\"$sDisplayValue\" />";
+							// another hidden input to store & pass the object's Id
+							$sHTMLValue .= "<input type=\"hidden\" id=\"$iInputId\" name=\"attr_{$sAttCode}{$sNameSuffix}\" value=\"$value\" />\n";
+							$oPage->add_ready_script("\$('#label_$iInputId').autocomplete('./ajax.render.php', { minChars:3, onItemSelect:selectItem, onFindValue:findValue, formatItem:formatItem, autoFill:true, keyHolder:'#$iInputId', extraParams:{operation:'autocomplete', sclass:'$sClass',attCode:'".$sAttCode."'}});");
+						}
+						else
+						{
+							// Few choices, use a normal 'select'
+							$sHTMLValue = "<select name=\"attr_{$sAttCode}{$sNameSuffix}\" id=\"$iInputId\">\n";
+							foreach($aAllowedValues as $key => $display_value)
+							{
+								$sSelected = ($value == $key) ? ' selected' : '';
+								$sHTMLValue .= "<option value=\"$key\"$sSelected>$display_value</option>\n";
+							}
+							$sHTMLValue .= "</select>\n";
+						}
 					}
 					else
 					{
-						// Few choices, use a normal 'select'
-						$sHTMLValue = "<select name=\"attr_{$sAttCode}{$sNameSuffix}\"  id=\"$iInputId\">\n";
-						foreach($aAllowedValues as $key => $display_value)
-						{
-							$sSelected = ($value == $key) ? ' selected' : '';
-							$sHTMLValue .= "<option value=\"$key\"$sSelected>$display_value</option>\n";
-						}
-						$sHTMLValue .= "</select>\n";
+						$sHTMLValue = "<input type=\"text\" size=\"50\" name=\"attr_{$sAttCode}{$sNameSuffix}\" value=\"$value\" id=\"$iInputId\">";
 					}
-				}
-				else
-				{
-					$sHTMLValue = "<input type=\"text\" size=\"50\" name=\"attr_{$sAttCode}{$sNameSuffix}\" value=\"$value\" id=\"$iInputId\">";
-				}
+					break;
 			}
 		}
 		return $sHTMLValue;

+ 1 - 1
application/iotask.class.inc.php

@@ -31,7 +31,7 @@ class InputOutputTask extends cmdbAbstractObject
 		MetaModel::Init_AddAttribute(new AttributeEnum("source_type", array("label"=>"Source Type", "description"=>"Type of data source", "allowed_values"=>new ValueSetEnum('File, Database, Web Service'), "sql"=>"source_type", "default_value"=>"File", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeEnum("source_subtype", array("label"=>"Source Subtype", "description"=>"Subtype of Data Source", "allowed_values"=>new ValueSetEnum('Oracle, MySQL, Postgress, MSSQL, SOAP, HTTP-Get, HTTP-Post, XML/RPC, CSV, XML, Excel'), "sql"=>"source_subtype", "default_value"=>"CSV", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("source_path", array("label"=>"Source Path", "description"=>"Path to the icon o the menu", "allowed_values"=>null, "sql"=>"source_path", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeEnum("objects_class", array("label"=>"Objects Class", "description"=>"Class of the objects processed by this task", "allowed_values"=>new ValueSetEnum('bizOrganization, bizContact, bizTeam, bizPerson, bizLocation, bizServer, bizPC, bizNetworkDevice, bizInterface, bizService, bizContract, bizInfraGroup, bizIncidentTicket, bizSoftware, bizApplication, bizPatch, bizWorkgroup, lnkContactRealObject, lnkInterfaces, bizInfraGrouping' ), "sql"=>"objects_class", "default_value"=>'', "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeEnum("objects_class", array("label"=>"Objects Class", "description"=>"Class of the objects processed by this task", "allowed_values"=>new ValueSetEnumClasses(), "sql"=>"objects_class", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeEnum("test_mode", array("label"=>"Test Mode", "description"=>"If set to 'Yes' the modifications are not applied", "allowed_values"=>new ValueSetEnum('Yes,No'), "sql"=>"test_mode", "default_value"=>'No', "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeEnum("verbose_mode", array("label"=>"Verbose Mode", "description"=>"If set to 'Yes' extra debug information is added to the log", "allowed_values"=>new ValueSetEnum('Yes,No'), "sql"=>"verbose_mode", "default_value" => 'No', "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeEnum("options", array("label"=>"Options", "description"=>"Reconciliation options", "allowed_values"=>new ValueSetEnum('Full, Update Only, Creation Only'), "sql"=>"options", "default_value"=> 'Full', "is_null_allowed"=>true, "depends_on"=>array())));

+ 38 - 23
application/itopwebpage.class.inc.php

@@ -158,29 +158,44 @@ EOF
 		$this->AddToMenu("</select></form>\n");
 		$this->AddToMenu("</div>\n");
 		$this->AddToMenu("<ul id=\"browser\" class=\"dir\">\n");
-        $oAppContext = new ApplicationContext();
-        // Display the menu
-        // 1) Application defined menus
-        $oSearchFilter = $oContext->NewFilter("menuNode");
-        $oSearchFilter->AddCondition('parent_id', 0, '=');
-        $oSearchFilter->AddCondition('type', 'application', '=');
-        // There may be more criteria added later to have a specific menu based on the user's profile
-        $oSet = new CMDBObjectSet($oSearchFilter, array('rank' => true));
-        while ($oRootMenuNode = $oSet->Fetch())
-        {
-        	$oRootMenuNode->DisplayMenu($this, 'application', $oAppContext->GetAsHash());
-        }
-        // 2) User defined menus (Bookmarks)
-        $oSearchFilter = $oContext->NewFilter("menuNode");
-        $oSearchFilter->AddCondition('parent_id', 0, '=');
-        $oSearchFilter->AddCondition('type', 'user', '=');
-        $oSearchFilter->AddCondition('user_id', UserRights::GetUserId(), '=');
-        // There may be more criteria added later to have a specific menu based on the user's profile
-        $oSet = new CMDBObjectSet($oSearchFilter, array('rank' => true));
-        while ($oRootMenuNode = $oSet->Fetch())
-        {
-        	$oRootMenuNode->DisplayMenu($this, 'user', $oAppContext->GetAsHash());
-        }
+
+		// Display the menu
+		$oAppContext = new ApplicationContext();
+		// 1) Application defined menus
+		$oSearchFilter = $oContext->NewFilter("menuNode");
+		$oSearchFilter->AddCondition('parent_id', 0, '=');
+		$oSearchFilter->AddCondition('type', 'application', '=');
+		// There may be more criteria added later to have a specific menu based on the user's profile
+		$oSet = new CMDBObjectSet($oSearchFilter, array('rank' => true));
+		while ($oRootMenuNode = $oSet->Fetch())
+		{
+			$oRootMenuNode->DisplayMenu($this, 'application', $oAppContext->GetAsHash());
+		}
+		// 2) User defined menus (Bookmarks)
+		$oSearchFilter = $oContext->NewFilter("menuNode");
+		$oSearchFilter->AddCondition('parent_id', 0, '=');
+		$oSearchFilter->AddCondition('type', 'user', '=');
+		$oSearchFilter->AddCondition('user_id', UserRights::GetUserId(), '=');
+		// There may be more criteria added later to have a specific menu based on the user's profile
+		$oSet = new CMDBObjectSet($oSearchFilter, array('rank' => true));
+		while ($oRootMenuNode = $oSet->Fetch())
+		{
+			$oRootMenuNode->DisplayMenu($this, 'user', $oAppContext->GetAsHash());
+		}
+		// 3) Administrator menu
+		if (userRights::IsAdministrator())
+		{
+			$oSearchFilter = $oContext->NewFilter("menuNode");
+			$oSearchFilter->AddCondition('parent_id', 0, '=');
+			$oSearchFilter->AddCondition('type', 'administrator', '=');
+			// There may be more criteria added later to have a specific menu based on the user's profile
+			$oSet = new CMDBObjectSet($oSearchFilter, array('rank' => true));
+			while ($oRootMenuNode = $oSet->Fetch())
+			{
+				$oRootMenuNode->DisplayMenu($this, 'administrator', $oAppContext->GetAsHash());
+			}
+		}
+
 		$this->AddToMenu("</ul>\n");
     }
 

+ 18 - 10
application/menunode.class.inc.php

@@ -42,7 +42,7 @@ class menuNode extends DBObject
 		MetaModel::Init_AddAttribute(new AttributeString("hyperlink", array("label"=>"Hyperlink", "description"=>"Hyperlink to the page", "allowed_values"=>null, "sql"=>"hyperlink", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("icon_path", array("label"=>"Menu Icon", "description"=>"Path to the icon o the menu", "allowed_values"=>null, "sql"=>"icon_path", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeText("template", array("label"=>"Template", "description"=>"HTML template for the view", "allowed_values"=>null, "sql"=>"template", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeEnum("type", array("label"=>"Type", "description"=>"Type of menu", "allowed_values"=>new ValueSetEnum('application,user'), "sql"=>"type", "default_value"=>"application", "is_null_allowed"=>false, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeEnum("type", array("label"=>"Type", "description"=>"Type of menu", "allowed_values"=>new ValueSetEnum('application,user,administrator'), "sql"=>"type", "default_value"=>"application", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeInteger("rank", array("label"=>"Display rank", "description"=>"Sort order for displaying the menu", "allowed_values"=>null, "sql"=>"rank", "default_value" => 999, "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("parent_id", array("label"=>"Parent Menu Item", "description"=>"Parent Menu Item", "allowed_values"=>null, "sql"=>"parent_id", "targetclass"=>"menuNode", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("parent_name", array("label"=>"Parent Menu Item", "description"=>"Parent Menu Item", "allowed_values"=>null, "extkey_attcode"=>"parent_id", "target_attcode"=>"name")));
@@ -91,17 +91,25 @@ class menuNode extends DBObject
 
 	public function GetChildNodesSet($sType = null)
 	{
-		$oSearchFilter = new DBObjectSearch("menuNode");
-		$oSearchFilter->AddCondition('parent_id', $this->GetKey(), '=');
-		if ($sType != null)
+		$aParams = array();
+
+		if ($sType == 'user')
 		{
-			$oSearchFilter->AddCondition('type', $sType, '=');
-			if ($sType == 'user')
-			{
-			    $oSearchFilter->AddCondition('user_id', UserRights::GetUserId(), '=');
-			}
+			$sSelectChilds = 'SELECT menuNode AS m WHERE m.parent_id = :parent AND type = :type AND m.user_id = :user';
+			$aParams = array('parent' => $this->GetKey(), 'type' => $sType, 'user' => UserRights::GetUserId());
+		}
+		elseif ($sType != null)
+		{
+			$sSelectChilds = 'SELECT menuNode AS m WHERE m.parent_id = :parent AND type = :type';
+			$aParams = array('parent' => $this->GetKey(), 'type' => $sType);
+		}
+		else
+		{
+			$sSelectChilds = 'SELECT menuNode AS m WHERE m.parent_id = :parent';
+			$aParams = array('parent' => $this->GetKey());
 		}
-		$oSet = new CMDBObjectSet($oSearchFilter, array('rank' => true));
+		$oSearchFilter = DBObjectSearch::FromOQL($sSelectChilds);
+		$oSet = new CMDBObjectSet($oSearchFilter, array('rank' => true), $aParams);
 		return $oSet;
 	}
 

+ 7 - 4
application/ui.linkswidget.class.inc.php

@@ -21,6 +21,7 @@ class UILinksWidget
 	{
 		$sHTMLValue = '';
 		$sTargetClass = self::GetTargetClass($this->m_sClass, $this->m_sAttCode);
+		// #@# todo - add context information, otherwise any value will be authorized for external keys
 		$aAllowedValues = MetaModel::GetAllowedValues_att($this->m_sClass, $this->m_sAttCode, array(), '');
 		$oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $this->m_sAttCode);
 		$sExtKeyToRemote = $oAttDef->GetExtKeyToRemote();
@@ -120,6 +121,7 @@ class UILinksWidget
 	 */	 	 	  	 	 	 	
 	static public function Autocomplete(web_page $oPage, UserContext $oContext, $sClass, $sAttCode, $sName, $iMaxCount)
 	{
+		// #@# todo - add context information, otherwise any value will be authorized for external keys
 		$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array() /* $aArgs */, $sName);
 		if ($aAllowedValues != null)
 		{
@@ -154,12 +156,13 @@ class UILinksWidget
 	 * This static function is called by the Ajax Page display a set of objects being linked
 	 * to the object being created	 
 	 * @param $oPage web_page The ajax page used for the put^put (sent back to the browser
-	 * @param $sClass string The name of the class 'linking class' which is the class of the objects to display
-	 * @param $sAttCode string The name of the attribute is the main object being created
+	 * @param $sClass string The name of the 'linking class' which is the class of the objects to display
 	 * @param $sSet JSON serialized set of objects
+	 * @param $sExtKeyToMe Name of the attribute in sClass that is pointing to a given object
+	 * @param $iObjectId The id of the object $sExtKeyToMe is pointing to
 	 * @return void
 	 */	 	 	  	 	 	 	
-	static public function RenderSet($oPage, $sClass, $sJSONSet, $sExtKeyToMe)
+	static public function RenderSet($oPage, $sClass, $sJSONSet, $sExtKeyToMe, $sExtKeyToRemote, $iObjectId)
 	{
 		$aSet = json_decode($sJSONSet, true); // true means hash array instead of object
 		$oSet = CMDBObjectSet::FromScratch($sClass);
@@ -182,7 +185,7 @@ class UILinksWidget
 			}
 			$oSet->AddObject($oObj);
 		}
-		cmdbAbstractObject::DisplaySet($oPage, $oSet, $sExtKeyToMe);
+		cmdbAbstractObject::DisplaySet($oPage, $oSet, $sExtKeyToMe, true /*menu*/, false /*select*/, $iObjectId, $sExtKeyToRemote);
 	}
 
 	

+ 3 - 1
business/incident.business.php

@@ -55,7 +55,9 @@ class bizIncidentTicket extends cmdbAbstractObject
 	      MetaModel::Init_AddAttribute(new AttributeDate("next_update", array("label"=>"Next update", "description"=>"next time the Ticket is expected to be  modified", "allowed_values"=>null, "sql"=>"next_update", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
 		MetaModel::Init_AddAttribute(new AttributeDate("end_date", array("label"=>"Closed Date", "description"=>"Date when the Ticket was closed", "allowed_values"=>null, "sql"=>"closed_date", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
-	  MetaModel::Init_AddAttribute(new AttributeExternalKey("caller_id", array("targetclass"=>"bizPerson", "jointype"=> "", "label"=>"Caller", "description"=>"person that trigger incident", "allowed_values"=>null, "sql"=>"caller_id", "is_null_allowed"=>false, "depends_on"=>array())));
+	  //MetaModel::Init_AddAttribute(new AttributeExternalKey("caller_id", array("targetclass"=>"bizPerson", "jointype"=> "", "label"=>"Caller", "description"=>"person that trigger incident", "allowed_values"=>null, "sql"=>"caller_id", "is_null_allowed"=>false, "depends_on"=>array())));
+	  MetaModel::Init_AddAttribute(new AttributeExternalKey("caller_id", array("targetclass"=>"bizPerson", "jointype"=> "", "label"=>"Caller", "description"=>"person that trigger incident", "allowed_values"=>new ValueSetObjects('SELECT bizPerson AS p WHERE p.org_id = :this->customer_id'), "sql"=>"caller_id", "is_null_allowed"=>false, "depends_on"=>array('customer_id'))));
+	  //MetaModel::Init_AddAttribute(new AttributeExternalKey("caller_id", array("targetclass"=>"bizPerson", "jointype"=> "", "label"=>"Caller", "description"=>"person that trigger incident", "allowed_values"=>new ValueSetObjects('SELECT bizPerson AS p WHERE p.org_id = 1'), "sql"=>"caller_id", "is_null_allowed"=>false, "depends_on"=>array('customer_id'))));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("caller_mail", array("label"=>"Caller", "description"=>"Person that trigger this incident", "allowed_values"=>null, "extkey_attcode"=> 'caller_id', "target_attcode"=>"email")));
 	
   	MetaModel::Init_AddAttribute(new AttributeString("impact", array("label"=>"Impact", "description"=>"Impact of the Incident", "allowed_values"=>null, "sql"=>"impact", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));

+ 50 - 3
core/attributedef.class.inc.php

@@ -178,6 +178,13 @@ abstract class AttributeDefinition
 	{
 		return str_replace($sSeparator, $sSepEscape, $sValue);
 	}
+
+	public function GetAllowedValues($aArgs = array(), $sBeginsWith = '')
+	{
+		$oValSetDef = $this->GetValuesDef();
+		if (!$oValSetDef) return null;
+		return $oValSetDef->GetValues($aArgs, $sBeginsWith);
+	}
 }
 
 /**
@@ -490,7 +497,10 @@ class AttributeString extends AttributeDBField
 	}
 	public function RealValueToSQLValue($value)
 	{
-		assert(is_string($value));
+		if (!is_string($value))
+		{
+			throw new CoreWarning('Expected the attribute value to be a string', array('found_type' => gettype($value), 'value' => $value, 'class' => $this->GetCode(), 'attribute' => $this->GetHostClass()));
+		}
 		return $value;
 	}
 	public function SQLValueToRealValue($value)
@@ -499,6 +509,29 @@ class AttributeString extends AttributeDBField
 	}
 }
 
+
+/**
+ * Map a varchar column (size < ?) to an attribute that must never be shown to the user 
+ *
+ * @package     iTopORM
+ * @author      Romain Quetiez <romainquetiez@yahoo.fr>
+ * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
+ * @link        www.itop.com
+ * @since       1.0
+ * @version     $itopversion$
+ */
+class AttributePassword extends AttributeString
+{
+	static protected function ListExpectedParams()
+	{
+		return parent::ListExpectedParams();
+		//return array_merge(parent::ListExpectedParams(), array());
+	}
+
+	public function GetEditClass() {return "Password";}
+	public function GetDBFieldType() {return "VARCHAR(64)";}
+}
+
 /**
  * Map a text column (size > ?) to an attribute 
  *
@@ -778,7 +811,7 @@ class AttributeExternalKey extends AttributeDBFieldVoid
 	} 
 
 	// overloaded here so that an ext key always have the answer to
-	// "what are you possible values?"
+	// "what are your possible values?"
 	public function GetValuesDef()
 	{
 		$oValSetDef = $this->Get("allowed_values");
@@ -788,7 +821,21 @@ class AttributeExternalKey extends AttributeDBFieldVoid
 			$oValSetDef = new ValueSetObjects($this->GetTargetClass());
 		}
 		return $oValSetDef;
-	} 
+	}
+
+	public function GetAllowedValues($aArgs = array(), $sBeginsWith = '')
+	{
+		try
+		{
+			return parent::GetAllowedValues($aArgs, $sBeginsWith);
+		}
+		catch (MissingQueryArgument $e)
+		{
+			// Some required arguments could not be found, enlarge to any existing value
+			$oValSetDef = new ValueSetObjects($this->GetTargetClass());
+			return $oValSetDef->GetValues($aArgs, $sBeginsWith);
+		}
+	}
 }
 
 /**

+ 31 - 3
core/dbobjectsearch.class.php

@@ -16,7 +16,6 @@
 /**
  * Sibusql - value set start 
  * @package     iTopORM
- * @info        zis is private 
  */
 define('VS_START', '{');
 /**
@@ -465,7 +464,7 @@ class DBObjectSearch
 
 	public function RenderCondition()
 	{
-		return $this->m_oSearchCondition->Render($this->m_aParams);
+		return $this->m_oSearchCondition->Render($this->m_aParams, true);
 	}
 
 	public function serialize()
@@ -507,7 +506,15 @@ class DBObjectSearch
 			$sRelCode = $aRelatedTo['relcode'];
 			$iMaxDepth = $aRelatedTo['maxdepth'];
 			
-			$sValue .= "T:".$oFilter->serialize().":$sRelCode:$iMaxDepth";
+			$sValue .= "T:".$oFilter->serialize().":$sRelCode:$iMaxDepth\n";
+		}
+		if (count($this->m_aParams) > 0)
+		{
+			foreach($this->m_aParams as $sName => $sArgValue)
+			{
+				// G stands for arGument
+				$sValue .= "G:$sName:$sArgValue\n";
+			}
 		}
 		return base64_encode($sValue);
 	}
@@ -554,6 +561,11 @@ class DBObjectSearch
 				$sRelCode = $aCondition[2];
 				$iMaxDepth = $aCondition[3];
 				$oFilter->AddCondition_RelatedTo($oSubFilter, $sRelCode, $iMaxDepth);
+				break;
+			case "G":
+				$oFilter->m_aParams[$aCondition[1]] = $aCondition[2];
+				break;
+
 			default:
 				throw new CoreException("invalid filter definition (cannot unserialize the data, clear text = '$sClearText')");
 			}
@@ -600,6 +612,22 @@ class DBObjectSearch
 	public function ToOQL(&$aParams = null)
 	{
 		$bRetrofitParams = (!is_null($aParams));
+		if (is_null($aParams))
+		{
+			if (count($this->m_aParams) > 0)
+			{
+				$aParams = $this->m_aParams;
+			}
+			$bRetrofitParams = false;
+		}
+		else
+		{
+			if (count($this->m_aParams) > 0)
+			{
+				$aParams = array_merge($aParams, $this->m_aParams);
+			}
+			$bRetrofitParams = true;
+		}
 
 		$sRes = "SELECT ".$this->GetClass().' AS '.$this->GetClassAlias();
 		$sRes .= $this->ToOQL_Joins();

+ 12 - 2
core/expression.class.inc.php

@@ -11,6 +11,11 @@
  * @since       1.0
  * @version     1.1.1.1 $
  */
+
+class MissingQueryArgument extends CoreException
+{
+}
+
 abstract class Expression
 {
 	// recursive translation of identifiers
@@ -301,7 +306,7 @@ class VariableExpression extends UnaryExpression
 	// recursive rendering
 	public function Render(&$aArgs = null, $bRetrofitParams = false)
 	{
-		if (is_null($aArgs) || $bRetrofitParams)
+		if (is_null($aArgs))
 		{
 			return ':'.$this->m_sName;
 		}
@@ -309,9 +314,14 @@ class VariableExpression extends UnaryExpression
 		{
 			return CMDBSource::Quote($aArgs[$this->m_sName]);
 		}
+		elseif ($bRetrofitParams)
+		{
+			//$aArgs[$this->m_sName] = null;
+			return ':'.$this->m_sName;
+		}
 		else
 		{
-			throw new CoreException('Missing query argument', array('expecting'=>$this->m_sName, 'available'=>$aArgs));
+			throw new MissingQueryArgument('Missing query argument', array('expecting'=>$this->m_sName, 'available'=>$aArgs));
 		}
 	}
 }

+ 7 - 59
core/filterdef.class.inc.php

@@ -209,7 +209,13 @@ class FilterFromAttribute extends FilterDefinition
 	{
 		$oAttDef = $this->Get("refattribute");
 		return $oAttDef->GetValuesDef();
-	} 
+	}
+
+	public function GetAllowedValues($aArgs = array(), $sBeginsWith = '')
+	{
+		$oAttDef = $this->Get("refattribute");
+		return $oAttDef->GetAllowedValues($aArgs, $sBeginsWith);
+	}
 
 	public function GetOperators()
 	{
@@ -235,62 +241,4 @@ class FilterFromAttribute extends FilterDefinition
 	}
 }
 
-/**
- * Match against a given column (experimental -to be cleaned up later) 
- *
- * @package     iTopORM
- * @author      Romain Quetiez <romainquetiez@yahoo.fr>
- * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @link        www.itop.com
- * @since       1.0
- * @version     $itopversion$
- */
-class FilterDBValues extends FilterDefinition
-{
-	static protected function ListExpectedParams()
-	{
-		return array_merge(parent::ListExpectedParams(), array("dbfield"));
-	}
-
-	public function GetType() {return "Values from DB";}
-	public function GetTypeDesc() {return "Match against the existing values in a field";}
-
-	public function GetLabel()
-	{
-		return "enum de valeurs DB";
-	} 
-
-	public function GetValuesDef()
-	{
-		return null;
-	}
-
-	public function GetOperators()
-	{
-		return array(
-			"IN"=>"in",
-		);
-	}
-	public function GetLooseOperator()
-	{
-		return "IN";
-	}
-
-	public function GetFilterSQLExpr($sOpCode, $value)
-	{
-		$sFieldName = $this->Get("dbfield");
-		if (is_array($value) && !empty($value))
-		{
-			$sValueList = "'".implode("', '", $value)."'";
-			return "$sFieldName IN ($sValueList)";
-		}
-		return "1=1";
-	}
-
-	public function TemporaryGetSQLCol()
-	{
-		return $this->Get("dbfield");
-	}
-}
-
 ?>

+ 14 - 8
core/metamodel.class.php

@@ -665,19 +665,13 @@ abstract class MetaModel
 	public static function GetAllowedValues_att($sClass, $sAttCode, $aArgs = array(), $sBeginsWith = '')
 	{
 		$oAttDef = self::GetAttributeDef($sClass, $sAttCode);
-		if (!$oAttDef) return null;
-		$oValSetDef = $oAttDef->GetValuesDef();
-		if (!$oValSetDef) return null;
-		return $oValSetDef->GetValues($aArgs, $sBeginsWith);
+		return $oAttDef->GetAllowedValues($aArgs, $sBeginsWith);
 	}
 
 	public static function GetAllowedValues_flt($sClass, $sFltCode, $aArgs = array(), $sBeginsWith = '')
 	{
 		$oFltDef = self::GetClassFilterDef($sClass, $sFltCode);
-		if (!$oFltDef) return null;
-		$oValSetDef = $oFltDef->GetValuesDef();
-		if (!$oValSetDef) return null;
-		return $oValSetDef->GetValues($aArgs, $sBeginsWith);
+		return $oFltDef->GetAllowedValues($aArgs, $sBeginsWith);
 	}
 
 	//
@@ -820,6 +814,18 @@ abstract class MetaModel
 				self::$m_aFilterDefs[$sClass][$sClassAttCode] = $oClassFlt;
 				self::$m_aFilterOrigins[$sClass][$sClassAttCode] = self::GetRootClass($sClass);
 			}
+
+			// Define defaults values for the standard ZLists
+			//
+			foreach (self::$m_aListInfos as $sListCode => $aListConfig)
+			{
+				if (!isset(self::$m_aListData[$sClass][$sListCode]))
+				{
+					$aAllAttributes = array_keys(self::$m_aAttribDefs[$sClass]);
+					self::$m_aListData[$sClass][$sListCode] = $aAllAttributes;
+					//echo "<p>$sClass: $sListCode (".count($aAllAttributes)." attributes)</p>\n";
+				}
+			}
 		}
 
 	}

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

@@ -45,6 +45,8 @@ define('UR_ACTION_APPLICATION_DEFINED', 10000); // Application specific actions
 abstract class UserRightsAddOnAPI
 {
 	abstract public function Setup(); // initial installation
+	abstract public function CreateAdministrator($sAdminUser, $sAdminPwd); // could be used during initial installation
+
 	abstract public function Init(); // loads data (possible optimizations)
 	abstract public function CheckCredentials($sLogin, $sPassword); // returns the id of the user or false
 	abstract public function GetUserId($sLogin); // returns the id of the user or false
@@ -52,6 +54,7 @@ abstract class UserRightsAddOnAPI
 	abstract public function IsActionAllowed($iUserId, $sClass, $iActionCode, dbObjectSet $oInstances);
 	abstract public function IsStimulusAllowed($iUserId, $sClass, $sStimulusCode, dbObjectSet $oInstances);
 	abstract public function IsActionAllowedOnAttribute($iUserId, $sClass, $sAttCode, $iActionCode, dbObjectSet $oInstances);
+	abstract public function IsAdministrator($iUserId);
 }
 
 
@@ -94,6 +97,11 @@ class UserRights
 		self::$m_iRealUserId = 0;
 	}
 
+	public static function GetModuleInstance()
+	{
+		return self::$m_oAddOn;
+	}
+
 	// Installation: create the very first user
 	public static function CreateAdministrator($sAdminUser, $sAdminPwd)
 	{
@@ -236,6 +244,20 @@ class UserRights
 			return self::$m_oAddOn->IsActionAllowedOnAttribute($iUserId, $sClass, $sAttCode, $iActionCode, $oInstances);
 		}
 	}
+
+	public static function IsAdministrator($iUserId = null)
+	{
+		if (!self::CheckLogin()) return false;
+
+		if (is_null($iUserId))
+		{
+			return self::$m_oAddOn->IsAdministrator(self::$m_iUserId);
+		}
+		else
+		{
+			return self::$m_oAddOn->IsAdministrator($iUserId);
+		}
+	}
 }
 
 

+ 1 - 84
core/valuesetdef.class.inc.php

@@ -19,8 +19,6 @@ abstract class ValueSetDefinition
 {
 	protected $m_bIsLoaded = false;
 	protected $m_aValues = array();
-	protected $m_aArgsObj = array();
-	protected $m_aArgsApp = array();
 
 
 	// Displayable description that could be computed out of the std usage context
@@ -64,15 +62,6 @@ abstract class ValueSetDefinition
 		return $aRet;
 	}
 
-	public function ListArgsFromContextApp()
-	{
-		return $this->m_aArgsObj;
-	}
-	public function ListArgsFromContextObj()
-	{
-		return $this->m_aArgsApp;
-	}
-
 	abstract protected function LoadValues($aArgs);
 }
 
@@ -109,7 +98,7 @@ class ValueSetObjects extends ValueSetDefinition
 
 		if (empty($this->m_sValueAttCode))
 		{
-		   $this->m_sValueAttCode = MetaModel::GetNameAttributeCode($oFilter->GetClass());
+			$this->m_sValueAttCode = MetaModel::GetNameAttributeCode($oFilter->GetClass());
 		}
 
 		$oObjects = new DBObjectSet($oFilter, $this->m_aOrderBy, $aArgs);
@@ -128,78 +117,6 @@ class ValueSetObjects extends ValueSetDefinition
 
 
 /**
- * Set of existing values for an attribute, given a search filter and a relation id 
- *
- * @package     iTopORM
- * @author      Romain Quetiez <romainquetiez@yahoo.fr>
- * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @link        www.itop.com
- * @since       1.0
- * @version     $itopversion$
- */
-class ValueSetRelatedObjects extends ValueSetObjects
-{
-	public function __construct($sFilterExp, $sRelCode, $sClass, $sValueAttCode = '', $aOrderBy = array())
-	{
-		$sFullFilterExp = "$sClass: RELATED ($sRelCode, 1) TO ($sFilterExp)";
-		parent::__construct($sFullFilterExp, $sValueAttCode, $aOrderBy);
-	}
-}
-
-
-/**
- * Set oof existing values for an attribute, given a set of objects (AttributeLinkedSet) 
- *
- * @package     iTopORM
- * @author      Romain Quetiez <romainquetiez@yahoo.fr>
- * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @link        www.itop.com
- * @since       1.0
- * @version     $itopversion$
- */
-class ValueSetRelatedObjectsFromLinkedSet extends ValueSetDefinition
-{
-	protected $m_sLinkedSetAttCode;
-	protected $m_sRelCode;
-	protected $m_sValueAttCode;
-	protected $m_aOrderBy;
-
-	public function __construct($sLinkedSetAttCode, $sRelCode, $sValueAttCode = '', $aOrderBy = array())
-	{
-		$this->m_sLinkedSetAttCode = $sLinkedSetAttCode;
-		$this->m_sRelCode = $sRelCode;
-		$this->m_sValueAttCode = $sValueAttCode;
-		$this->m_aOrderBy = $aOrderBy;
-	}
-
-	protected function LoadValues($aArgs)
-	{
-		$this->m_aValues = array();
-
-        if (empty($this->m_sValueAttCode))
-        {
-            $this->m_sValueAttCode = MetaModel::GetNameAttributeCode($oFilter->GetClass());
-        }
-
-        $oCurrentObject = @$aArgs['*this*'];
-        if (!is_object($oCurrentObject)) return false;
-
-		$oObjects = $oCurrentObject->Get($this->m_sLinkedSetAttCode);
-		while ($oObject = $oObjects->Fetch())
-		{
-			$this->m_aValues[$oObject->GetKey()] = $oObject->Get($this->m_sValueAttCode);
-		}
-		return true;
-	}
-	
-	public function GetValuesDescription()
-	{
-		return 'Objects related ('.$this->m_sRelCode.') to objects linked through '.$this->m_sLinkedSetAttCode;
-	}
-}
-
-
-/**
  * Fixed set values (could be hardcoded in the business model) 
  *
  * @package     iTopORM

+ 1 - 1
js/linkswidget.js

@@ -29,7 +29,7 @@ function LinksWidget(id, sLinkedClass, sExtKeyToMe, sExtKeyToRemote, aAttributes
 		{
 			sLinks = JSON.stringify(this.aLinks);
 			$('#'+this.id).val(sLinks);
-			$('#'+this.id+'_values').load('ajax.render.php?operation=ui.linkswidget.linkedset&sclass='+this.sLinkedClass+'&sextkeytome='+this.sExtKeyToMe,
+			$('#'+this.id+'_values').load('ajax.render.php?operation=ui.linkswidget.linkedset&sclass='+this.sLinkedClass+'&sextkeytome='+this.sExtKeyToMe+'&sextkeytoremote='+this.sExtKeyToRemote+'&myid='+this.id,
 			{'sset' : sLinks});		
 		}
 	}

+ 1 - 1
pages/UniversalSearch.php

@@ -96,7 +96,7 @@ EOF;
 		$bChildItem = utils::ReadPostedParam('child_item', false);
 		$oMenuNode->Set('label', $sDescription);
 		$oMenuNode->Set('name', $sLabel);
-		$oMenuNode->Set('icon_path', '/images/std_view.gif');
+		$oMenuNode->Set('icon_path', '../images/std_view.gif');
 		$oMenuNode->Set('template', $sMenuNodeContent);
 		$oMenuNode->Set('hyperlink', 'UI.php');
 		$oMenuNode->Set('type', 'user');

+ 6 - 1
pages/ajax.render.php

@@ -84,6 +84,8 @@ switch($operation)
 	}
 	foreach($oWizardHelper->GetFieldsForAllowedValues() as $sAttCode)
 	{
+		// MetaModel::GetAllowedValues_att() => array(id => value)
+		// Improvement: what if the list is too long?
 		$oWizardHelper->SetAllowedValuesHtml($sAttCode, "Possible values ($sAttCode)");
 	}
 	$oPage->add($oWizardHelper->ToJSON());
@@ -192,7 +194,9 @@ switch($operation)
 	$sClass = utils::ReadParam('sclass', 'bizContact');
 	$sJSONSet = stripslashes(utils::ReadParam('sset', ''));
 	$sExtKeyToMe = utils::ReadParam('sextkeytome', '');
-	UILinksWidget::RenderSet($oPage, $sClass, $sJSONSet, $sExtKeyToMe);
+	$sExtKeyToRemote = utils::ReadParam('sextkeytoremote', '');
+	$iObjectId = utils::ReadParam('id', -1);
+	UILinksWidget::RenderSet($oPage, $sClass, $sJSONSet, $sExtKeyToMe, $sExtKeyToRemote, $iObjectId);
 	break;
 	
 	case 'autocomplete':
@@ -208,6 +212,7 @@ switch($operation)
 		if ($oThis = MetaModel::GetObject($sClass, $key))
 		{
 			$aArgs['*this*'] = $oThis;
+			$aArgs['this'] = $oThis;
 		}
 	} 
 	$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, $aArgs, $sName);

+ 23 - 18
pages/index.php

@@ -87,7 +87,7 @@ function DisplayDetails(web_page $oPage, $sClassName, $sKey)
 	global $oContext;
     //$oObj = MetaModel::GetObject($sClassName, $sKey);
     $oObj = $oContext->GetObject($sClassName, $sKey);
-    $oPage->p("Details of ".get_class($oObj)." - $sKey");
+    $oPage->p("Details of ".MetaModel::GetName($sClassName)." - $sKey");
 
 	$oObj->DisplayDetails($oPage);
 	
@@ -140,7 +140,7 @@ function DisplayChangesLog(web_page $oPage, $sClassName, $sKey)
 	global $oContext;
     //$oObj = MetaModel::GetObject($sClassName, $sKey);
     $oObj = $oContext->GetObject($sClassName, $sKey);
-    $oPage->p("Changes log for ".get_class($oObj)." - $sKey");
+    $oPage->p("Changes log for ".MetaModel::GetName($sClassName)." - $sKey");
 
 	$oObj->DisplayChangesLog($oPage);
 	
@@ -219,7 +219,7 @@ function DisplayEditForm(web_page $oPage, $sClassName, $sKey)
     	$oPage->p("You are not allowed to edit this object.");
 		return;
 	}
-    $oPage->p("Edition of ".get_class($oObj)." - $sKey\n");
+    $oPage->p("Edition of ".MetaModel::GetName($sClassName)." - $sKey\n");
 	
 	$aDetails = array();
     $oPage->add("<form method=\"post\">\n");
@@ -332,7 +332,7 @@ function UpdateObject(web_page $oPage, $sClassName, $sKey, $aAttributes)
 		$iChangeId = $oMyChange->DBInsert();
 		$oObj->DBUpdateTracked($oMyChange);
 
-		$oPage->p(get_class($oObj)." updated\n");
+		$oPage->p(MetaModel::GetName($sClassName)." updated\n");
 	}
 	else
 	{
@@ -342,13 +342,14 @@ function UpdateObject(web_page $oPage, $sClassName, $sKey, $aAttributes)
 	// By Rom
 	// $oObj->DisplayDetails($oPage);
 	// replaced by...	
-	DisplayDetails($oPage, get_class($oObj), $oObj->GetKey());
+	DisplayDetails($oPage, $sClassName, $sKey);
 	$oPage->p("<a href=\"\">Return to main page</a>");
 }
 
 function DeleteObject(web_page $oPage, $sClassName, $sKey)
 {
 	global $oContext;
+	$sClassLabel = MetaModel::GetName($sClassName);
     //$oObj = MetaModel::GetObject($sClassName, $sKey);
     $oObj = $oContext->GetObject($sClassName, $sKey);
 	if ($oObj == null)
@@ -356,7 +357,7 @@ function DeleteObject(web_page $oPage, $sClassName, $sKey)
     	$oPage->p("You are not allowed to delete this object.");
 		return;
 	}
-    $oPage->p("Deletion of $sClassName - $sKey");
+    $oPage->p("Deletion of $sClassLabel - $sKey");
 
 	if ($oObj->CheckToDelete())
 	{
@@ -368,13 +369,13 @@ function DeleteObject(web_page $oPage, $sClassName, $sKey)
 		$iChangeId = $oMyChange->DBInsert();
 		$oObj->DBDeleteTracked($oMyChange);
 
-		$oPage->p("$sClassName deleted\n");
+		$oPage->p("$sClassLabel deleted\n");
 	}
 	else
 	{
 		$oPage->p("<strong>Error: object can not be deleted!</strong>\n");
 		// By Rom
-		DisplayDetails($oPage, get_class($oObj), $oObj->GetKey());
+		DisplayDetails($oPage, $sClassName, $sKey);
 	}
 	$oPage->p("<a href=\"\">Return to main page</a>");
 }
@@ -382,7 +383,8 @@ function DeleteObject(web_page $oPage, $sClassName, $sKey)
 function CreateObject(web_page $oPage, $sClassName, $aAttributes)
 {
     $oObj = MetaModel::NewObject($sClassName);
-    $oPage->p("Creation of ".get_class($oObj)." object.");
+    $sClassLabel = MetaModel::GetName(get_class($oObj));
+    $oPage->p("Creation of $sClassLabel object.");
 
 	foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef)
 	{
@@ -401,7 +403,7 @@ function CreateObject(web_page $oPage, $sClassName, $aAttributes)
 		$iChangeId = $oMyChange->DBInsert();
 		$oObj->DBInsertTracked($oMyChange);
 
-		$oPage->p(get_class($oObj)." created\n");
+		$oPage->p($sClassLabel." created\n");
 
 		// By Rom
 		// $oObj->DisplayDetails($oPage);
@@ -419,6 +421,7 @@ function CreateObject(web_page $oPage, $sClassName, $aAttributes)
 function AddLinks($oPage, $sClassName, $sKey, $sLinkClass, $sExtKeyToMe, $sExtKeyToPartner, $sFilter)
 {
 	global $oContext;
+	$sClassLabel = MetaModel::GetName($sClassName);
     //$oObj = MetaModel::GetObject($sClassName, $sKey);
     $oObj = $oContext->GetObject($sClassName, $sKey);
 	if ($oObj == null)
@@ -426,7 +429,7 @@ function AddLinks($oPage, $sClassName, $sKey, $sLinkClass, $sExtKeyToMe, $sExtKe
     	$oPage->p("You are not allowed to modify (create links on) this object.");
 		return;
 	}
-    $oPage->p("Creating links for $sClassName - $sKey");
+    $oPage->p("Creating links for $sClassLabel - $sKey");
 
 	$oFilter = CMDBSearchFilter::unserialize($sFilter);
 	$oPage->p("Linking to ".$oFilter->__DescribeHTML()); 
@@ -447,7 +450,7 @@ function AddLinks($oPage, $sClassName, $sKey, $sLinkClass, $sExtKeyToMe, $sExtKe
 				$iChangeId = $oMyChange->DBInsert();
 				$oNewLink->DBInsertTracked($oMyChange);
 		
-				$oPage->p(get_class($oNewLink)." created\n");
+				$oPage->p(MetaModel::GetName($sLinkClass)." created\n");
 			}
 			else
 			{
@@ -595,19 +598,21 @@ switch($operation)
 		$oPage->add("</ul>\n");
 		foreach( $aTopLevelClasses as $sClassName)
 		{
+			$sClassLabel = MetaModel::GetName($sClassName);
 			$oPage->add("<div id=\"tab_$sClassName\">");
 			if (count(MetaModel::GetSubclasses($sClassName)) > 0)
 			{
 				$sActiveSubclass = ReadParam('subclassname', '');
 				foreach(MetaModel::GetSubclasses($sClassName) as $sSubclassName)
 				{
+					$sSubclassLabel = MetaModel::GetName($sSubclassName);
 					//$oSearchFilter = new CMDBSearchFilter($sSubclassName);
 					$oSearchFilter = $oContext->NewFilter($sSubclassName);
 					$oSearchFilter ->AddCondition('org_id', $sCurrentOrganization, '=');
 
 					$oPage->add("<div style=\"border:1px solid #97a5b0; margin-top:0.5em;\">\n");
 					$oPage->add("<div style=\"padding:0.25em;background-color:#f0f0f0\">\n");
-					$oPage->p("<strong>$sSubclassName</strong> - ".MetaModel::GetClassDescription($sSubclassName));
+					$oPage->p("<strong>$sSubclassLabel</strong> - ".MetaModel::GetClassDescription($sSubclassName));
 					$oPage->add("<form method=\"get\">\n");
 					$oPage->add("<input type=\"hidden\" name=\"classname\" value=\"$sClassName\">\n");
 					$oPage->add("<input type=\"hidden\" name=\"subclassname\" value=\"$sSubclassName\">\n");
@@ -634,7 +639,7 @@ switch($operation)
 					$iMatchesCount = $oSet->Count();
 					if ($iMatchesCount == 0)
 					{
-						$oPage->p("No $sSubclassName matches these criteria.");
+						$oPage->p("No $sSubclassLabel matches these criteria.");
 						$oPage->small_p("(".$oSearchFilter->__DescribeHTML().")");
 					}
 					else
@@ -642,7 +647,7 @@ switch($operation)
 						$oPage->p("$iMatchesCount item(s) found.");
 						cmdbAbstractObject::DisplaySet($oPage, $oSet);
 					}
-					$oPage->p("<a href=\"?operation=new&class=$sSubclassName\">Create a new $sSubclassName</a>\n");
+					$oPage->p("<a href=\"?operation=new&class=$sSubclassName\">Create a new $sSubclassLabel</a>\n");
 					$oPage->add("</div>\n");
 				}
 			}
@@ -655,7 +660,7 @@ switch($operation)
 
 				$oPage->add("<div style=\"border:1px solid #97a5b0; margin-top:0.5em;\">\n");
 				$oPage->add("<div style=\"padding:0.25em;background-color:#f0f0f0\">\n");
-				$oPage->p("<strong>$sClassName</strong> - ".MetaModel::GetClassDescription($sClassName));
+				$oPage->p("<strong>$sClassLabel</strong> - ".MetaModel::GetClassDescription($sClassName));
 				$oPage->add("<form method=\"get\">\n");
 				$oPage->add("<input type=\"hidden\" name=\"classname\" value=\"$sClassName\">\n");
 				$oPage->add("<input type=\"hidden\" name=\"org\" value=\"$sCurrentOrganization\">\n");
@@ -681,7 +686,7 @@ switch($operation)
 				$iMatchesCount = $oSet->Count();
 				if ($iMatchesCount == 0)
 				{
-					$oPage->p("No $sClassName matches these criteria.");
+					$oPage->p("No $sClassLabel matches these criteria.");
 					$oPage->small_p("(".$oSearchFilter->__DescribeHTML().")");
 				}
 				else
@@ -690,7 +695,7 @@ switch($operation)
 					cmdbAbstractObject::DisplaySet($oPage, $oSet);
 					$oPage->small_p("(".$oSearchFilter->__DescribeHTML().")");
 				}
-				$oPage->p("<a href=\"?operation=new&ctx=$iContext&class=$sClassName\">Create a new $sClassName</a>\n");
+				$oPage->p("<a href=\"?operation=new&ctx=$iContext&class=$sClassName\">Create a new $sClassLabel</a>\n");
 				$oPage->add("</div>\n");
 				$oPage->add("</div>\n");
 			}

+ 2 - 2
pages/schema.php

@@ -333,8 +333,8 @@ function DisplayClassDetails($oPage, $sClass)
 		{
 		   $sValue = $oAttDef->GetDescription();
 		}
-        $sType = $oAttDef->GetType().' ('.$oAttDef->GetTypeDesc().')';
-        $sOrigin = MetaModel::GetAttributeOrigin($sClass, $sAttCode);
+		$sType = $oAttDef->GetType().' ('.$oAttDef->GetTypeDesc().')';
+		$sOrigin = MetaModel::GetAttributeOrigin($sClass, $sAttCode);
 		$sAllowedValues = "";
 		$oAllowedValuesDef = $oAttDef->GetValuesDef();
 		$sMoreInfo = "";

+ 17 - 0
pages/usermanagement_userstatus.php

@@ -263,6 +263,23 @@ if ($iUser == -1)
 }
 else
 {
+	$oPage->p('<h2>How is it computing the user rights?</h2>');
+
+	$oPage->p('<h3>1st, find the profiles that apply</h3>');
+	$oPage->p('<p>Project the current object in every existing dimension</p>');
+	$oPage->p('<p>Project the observed profile in every existing dimension (might depend on the user)</p>');
+	$oPage->p('<p>If an overlap is found in any dimension, then the profile applies</p>');
+
+	$oPage->p('<h3>2nd, interpret the profiles</h3>');
+	$oPage->p('<p>Note: granting rights for specific attributes is not fully implemented. It is still not taking into account the inheritance of rights AND the UI will not take that information into account!</p>');
+	$oPage->p('<p>Actions: looks into URP_ActionGrant for a permission (yes or no) and goes up into the class hierarchy until an answer is found, defaults to <em>no</em></p>');
+	$oPage->p('<p>Stimuli: looks into URP_StimulusGrant for a permission (yes or no), defaults to <em>no</em></p>');
+	
+
+	$oPage->p('<h3>3rd, keep the most permissive one</h3>');
+	$oPage->p('<p>If one profile says YES, then the answer is YES</p>');
+	
+
 	$oUser = MetaModel::GetObject('URP_Users', $iUser);
 
 	$oPage->p('<h2>Projections for user '.$oUser->GetName().'</h2>');

+ 7 - 0
setup/data/30.profiles.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+<URP_Profiles id="100">
+<name>Delivery Manager France</name>
+<description>Persons in charge of the operations for French customers</description>
+</URP_Profiles>
+</Set>

+ 15 - 0
setup/data/31.profileprojection.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+<URP_ProfileProjection id="1">
+<dimensionid>1</dimensionid>
+<profileid>100</profileid>
+<value>1;2</value>
+<attribute></attribute>
+</URP_ProfileProjection>
+<URP_ProfileProjection id="3">
+<dimensionid>2</dimensionid>
+<profileid>100</profileid>
+<value>&lt;any&gt;</value>
+<attribute></attribute>
+</URP_ProfileProjection>
+</Set>

+ 1659 - 0
setup/data/32.actiongrant.xml

@@ -0,0 +1,1659 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+<URP_ActionGrant id="1">
+<profileid>100</profileid>
+<class>bizOrganization</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="2">
+<profileid>100</profileid>
+<class>bizOrganization</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="3">
+<profileid>100</profileid>
+<class>bizOrganization</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="4">
+<profileid>100</profileid>
+<class>bizOrganization</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="5">
+<profileid>100</profileid>
+<class>bizOrganization</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="6">
+<profileid>100</profileid>
+<class>bizOrganization</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="7">
+<profileid>100</profileid>
+<class>logRealObject</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="8">
+<profileid>100</profileid>
+<class>logRealObject</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="9">
+<profileid>100</profileid>
+<class>logRealObject</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="10">
+<profileid>100</profileid>
+<class>logRealObject</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="11">
+<profileid>100</profileid>
+<class>logRealObject</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="12">
+<profileid>100</profileid>
+<class>logRealObject</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="13">
+<profileid>100</profileid>
+<class>bizContact</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="14">
+<profileid>100</profileid>
+<class>bizContact</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="15">
+<profileid>100</profileid>
+<class>bizContact</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="16">
+<profileid>100</profileid>
+<class>bizContact</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="17">
+<profileid>100</profileid>
+<class>bizContact</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="18">
+<profileid>100</profileid>
+<class>bizContact</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="19">
+<profileid>100</profileid>
+<class>bizPerson</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="20">
+<profileid>100</profileid>
+<class>bizPerson</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="21">
+<profileid>100</profileid>
+<class>bizPerson</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="22">
+<profileid>100</profileid>
+<class>bizPerson</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="23">
+<profileid>100</profileid>
+<class>bizPerson</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="24">
+<profileid>100</profileid>
+<class>bizPerson</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="25">
+<profileid>100</profileid>
+<class>bizTeam</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="26">
+<profileid>100</profileid>
+<class>bizTeam</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="27">
+<profileid>100</profileid>
+<class>bizTeam</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="28">
+<profileid>100</profileid>
+<class>bizTeam</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="29">
+<profileid>100</profileid>
+<class>bizTeam</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="30">
+<profileid>100</profileid>
+<class>bizTeam</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="31">
+<profileid>100</profileid>
+<class>bizDocument</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="32">
+<profileid>100</profileid>
+<class>bizDocument</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="33">
+<profileid>100</profileid>
+<class>bizDocument</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="34">
+<profileid>100</profileid>
+<class>bizDocument</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="35">
+<profileid>100</profileid>
+<class>bizDocument</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="36">
+<profileid>100</profileid>
+<class>bizDocument</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="37">
+<profileid>100</profileid>
+<class>bizDocVersion</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="38">
+<profileid>100</profileid>
+<class>bizDocVersion</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="39">
+<profileid>100</profileid>
+<class>bizDocVersion</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="40">
+<profileid>100</profileid>
+<class>bizDocVersion</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="41">
+<profileid>100</profileid>
+<class>bizDocVersion</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="42">
+<profileid>100</profileid>
+<class>bizDocVersion</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="43">
+<profileid>100</profileid>
+<class>lnkDocumentRealObject</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="44">
+<profileid>100</profileid>
+<class>lnkDocumentRealObject</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="45">
+<profileid>100</profileid>
+<class>lnkDocumentRealObject</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="46">
+<profileid>100</profileid>
+<class>lnkDocumentRealObject</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="47">
+<profileid>100</profileid>
+<class>lnkDocumentRealObject</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="48">
+<profileid>100</profileid>
+<class>lnkDocumentRealObject</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="49">
+<profileid>100</profileid>
+<class>lnkContactRealObject</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="50">
+<profileid>100</profileid>
+<class>lnkContactRealObject</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="51">
+<profileid>100</profileid>
+<class>lnkContactRealObject</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="52">
+<profileid>100</profileid>
+<class>lnkContactRealObject</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="53">
+<profileid>100</profileid>
+<class>lnkContactRealObject</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="54">
+<profileid>100</profileid>
+<class>lnkContactRealObject</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="55">
+<profileid>100</profileid>
+<class>logInfra</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="56">
+<profileid>100</profileid>
+<class>logInfra</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="57">
+<profileid>100</profileid>
+<class>logInfra</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="58">
+<profileid>100</profileid>
+<class>logInfra</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="59">
+<profileid>100</profileid>
+<class>logInfra</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="60">
+<profileid>100</profileid>
+<class>logInfra</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="61">
+<profileid>100</profileid>
+<class>bizLocation</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="62">
+<profileid>100</profileid>
+<class>bizLocation</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="63">
+<profileid>100</profileid>
+<class>bizLocation</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="64">
+<profileid>100</profileid>
+<class>bizLocation</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="65">
+<profileid>100</profileid>
+<class>bizLocation</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="66">
+<profileid>100</profileid>
+<class>bizLocation</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="67">
+<profileid>100</profileid>
+<class>bizCircuit</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="68">
+<profileid>100</profileid>
+<class>bizCircuit</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="69">
+<profileid>100</profileid>
+<class>bizCircuit</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="70">
+<profileid>100</profileid>
+<class>bizCircuit</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="71">
+<profileid>100</profileid>
+<class>bizCircuit</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="72">
+<profileid>100</profileid>
+<class>bizCircuit</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="73">
+<profileid>100</profileid>
+<class>bizInterface</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="74">
+<profileid>100</profileid>
+<class>bizInterface</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="75">
+<profileid>100</profileid>
+<class>bizInterface</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="76">
+<profileid>100</profileid>
+<class>bizInterface</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="77">
+<profileid>100</profileid>
+<class>bizInterface</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="78">
+<profileid>100</profileid>
+<class>bizInterface</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="79">
+<profileid>100</profileid>
+<class>lnkInterfaces</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="80">
+<profileid>100</profileid>
+<class>lnkInterfaces</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="81">
+<profileid>100</profileid>
+<class>lnkInterfaces</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="82">
+<profileid>100</profileid>
+<class>lnkInterfaces</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="83">
+<profileid>100</profileid>
+<class>lnkInterfaces</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="84">
+<profileid>100</profileid>
+<class>lnkInterfaces</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="85">
+<profileid>100</profileid>
+<class>bizDevice</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="86">
+<profileid>100</profileid>
+<class>bizDevice</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="87">
+<profileid>100</profileid>
+<class>bizDevice</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="88">
+<profileid>100</profileid>
+<class>bizDevice</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="89">
+<profileid>100</profileid>
+<class>bizDevice</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="90">
+<profileid>100</profileid>
+<class>bizDevice</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="91">
+<profileid>100</profileid>
+<class>bizPC</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="92">
+<profileid>100</profileid>
+<class>bizPC</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="93">
+<profileid>100</profileid>
+<class>bizPC</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="94">
+<profileid>100</profileid>
+<class>bizPC</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="95">
+<profileid>100</profileid>
+<class>bizPC</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="96">
+<profileid>100</profileid>
+<class>bizPC</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="97">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="98">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="99">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="100">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="101">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="102">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="103">
+<profileid>100</profileid>
+<class>bizNetworkDevice</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="104">
+<profileid>100</profileid>
+<class>bizNetworkDevice</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="105">
+<profileid>100</profileid>
+<class>bizNetworkDevice</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="106">
+<profileid>100</profileid>
+<class>bizNetworkDevice</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="107">
+<profileid>100</profileid>
+<class>bizNetworkDevice</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="108">
+<profileid>100</profileid>
+<class>bizNetworkDevice</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="109">
+<profileid>100</profileid>
+<class>bizInfraGroup</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="110">
+<profileid>100</profileid>
+<class>bizInfraGroup</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="111">
+<profileid>100</profileid>
+<class>bizInfraGroup</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="112">
+<profileid>100</profileid>
+<class>bizInfraGroup</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="113">
+<profileid>100</profileid>
+<class>bizInfraGroup</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="114">
+<profileid>100</profileid>
+<class>bizInfraGroup</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="115">
+<profileid>100</profileid>
+<class>bizApplication</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="116">
+<profileid>100</profileid>
+<class>bizApplication</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="117">
+<profileid>100</profileid>
+<class>bizApplication</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="118">
+<profileid>100</profileid>
+<class>bizApplication</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="119">
+<profileid>100</profileid>
+<class>bizApplication</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="120">
+<profileid>100</profileid>
+<class>bizApplication</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="121">
+<profileid>100</profileid>
+<class>lnkInfraGrouping</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="122">
+<profileid>100</profileid>
+<class>lnkInfraGrouping</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="123">
+<profileid>100</profileid>
+<class>lnkInfraGrouping</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="124">
+<profileid>100</profileid>
+<class>lnkInfraGrouping</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="125">
+<profileid>100</profileid>
+<class>lnkInfraGrouping</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="126">
+<profileid>100</profileid>
+<class>lnkInfraGrouping</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="127">
+<profileid>100</profileid>
+<class>lnkClientServer</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="128">
+<profileid>100</profileid>
+<class>lnkClientServer</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="129">
+<profileid>100</profileid>
+<class>lnkClientServer</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="130">
+<profileid>100</profileid>
+<class>lnkClientServer</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="131">
+<profileid>100</profileid>
+<class>lnkClientServer</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="132">
+<profileid>100</profileid>
+<class>lnkClientServer</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="133">
+<profileid>100</profileid>
+<class>bizPatch</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="134">
+<profileid>100</profileid>
+<class>bizPatch</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="135">
+<profileid>100</profileid>
+<class>bizPatch</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="136">
+<profileid>100</profileid>
+<class>bizPatch</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="137">
+<profileid>100</profileid>
+<class>bizPatch</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="138">
+<profileid>100</profileid>
+<class>bizPatch</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="139">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="140">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>no</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="141">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>no</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="142">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="143">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>no</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="144">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>no</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="145">
+<profileid>100</profileid>
+<class>lnkRelatedTicket</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="146">
+<profileid>100</profileid>
+<class>lnkRelatedTicket</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="147">
+<profileid>100</profileid>
+<class>lnkRelatedTicket</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="148">
+<profileid>100</profileid>
+<class>lnkRelatedTicket</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="149">
+<profileid>100</profileid>
+<class>lnkRelatedTicket</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="150">
+<profileid>100</profileid>
+<class>lnkRelatedTicket</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="151">
+<profileid>100</profileid>
+<class>lnkInfraTicket</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="152">
+<profileid>100</profileid>
+<class>lnkInfraTicket</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="153">
+<profileid>100</profileid>
+<class>lnkInfraTicket</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="154">
+<profileid>100</profileid>
+<class>lnkInfraTicket</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="155">
+<profileid>100</profileid>
+<class>lnkInfraTicket</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="156">
+<profileid>100</profileid>
+<class>lnkInfraTicket</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="157">
+<profileid>100</profileid>
+<class>lnkContactTicket</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="158">
+<profileid>100</profileid>
+<class>lnkContactTicket</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="159">
+<profileid>100</profileid>
+<class>lnkContactTicket</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="160">
+<profileid>100</profileid>
+<class>lnkContactTicket</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="161">
+<profileid>100</profileid>
+<class>lnkContactTicket</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="162">
+<profileid>100</profileid>
+<class>lnkContactTicket</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="163">
+<profileid>100</profileid>
+<class>bizWorkgroup</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="164">
+<profileid>100</profileid>
+<class>bizWorkgroup</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="165">
+<profileid>100</profileid>
+<class>bizWorkgroup</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="166">
+<profileid>100</profileid>
+<class>bizWorkgroup</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="167">
+<profileid>100</profileid>
+<class>bizWorkgroup</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="168">
+<profileid>100</profileid>
+<class>bizWorkgroup</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="169">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="170">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="171">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="172">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="173">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="174">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="175">
+<profileid>100</profileid>
+<class>lnkInfraContract</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="176">
+<profileid>100</profileid>
+<class>lnkInfraContract</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="177">
+<profileid>100</profileid>
+<class>lnkInfraContract</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="178">
+<profileid>100</profileid>
+<class>lnkInfraContract</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="179">
+<profileid>100</profileid>
+<class>lnkInfraContract</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="180">
+<profileid>100</profileid>
+<class>lnkInfraContract</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="181">
+<profileid>100</profileid>
+<class>lnkContactContract</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="182">
+<profileid>100</profileid>
+<class>lnkContactContract</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="183">
+<profileid>100</profileid>
+<class>lnkContactContract</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="184">
+<profileid>100</profileid>
+<class>lnkContactContract</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="185">
+<profileid>100</profileid>
+<class>lnkContactContract</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="186">
+<profileid>100</profileid>
+<class>lnkContactContract</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="187">
+<profileid>100</profileid>
+<class>lnkDocumentContract</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="188">
+<profileid>100</profileid>
+<class>lnkDocumentContract</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="189">
+<profileid>100</profileid>
+<class>lnkDocumentContract</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="190">
+<profileid>100</profileid>
+<class>lnkDocumentContract</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="191">
+<profileid>100</profileid>
+<class>lnkDocumentContract</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="192">
+<profileid>100</profileid>
+<class>lnkDocumentContract</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="193">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="194">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="195">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="196">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="197">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="198">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="199">
+<profileid>100</profileid>
+<class>lnkInfraChangeTicket</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="200">
+<profileid>100</profileid>
+<class>lnkInfraChangeTicket</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="201">
+<profileid>100</profileid>
+<class>lnkInfraChangeTicket</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="202">
+<profileid>100</profileid>
+<class>lnkInfraChangeTicket</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="203">
+<profileid>100</profileid>
+<class>lnkInfraChangeTicket</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="204">
+<profileid>100</profileid>
+<class>lnkInfraChangeTicket</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="205">
+<profileid>100</profileid>
+<class>lnkContactChange</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="206">
+<profileid>100</profileid>
+<class>lnkContactChange</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="207">
+<profileid>100</profileid>
+<class>lnkContactChange</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="208">
+<profileid>100</profileid>
+<class>lnkContactChange</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="209">
+<profileid>100</profileid>
+<class>lnkContactChange</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="210">
+<profileid>100</profileid>
+<class>lnkContactChange</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="211">
+<profileid>100</profileid>
+<class>bizKnownError</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="212">
+<profileid>100</profileid>
+<class>bizKnownError</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="213">
+<profileid>100</profileid>
+<class>bizKnownError</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="214">
+<profileid>100</profileid>
+<class>bizKnownError</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="215">
+<profileid>100</profileid>
+<class>bizKnownError</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="216">
+<profileid>100</profileid>
+<class>bizKnownError</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="217">
+<profileid>100</profileid>
+<class>lnkInfraError</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="218">
+<profileid>100</profileid>
+<class>lnkInfraError</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="219">
+<profileid>100</profileid>
+<class>lnkInfraError</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="220">
+<profileid>100</profileid>
+<class>lnkInfraError</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="221">
+<profileid>100</profileid>
+<class>lnkInfraError</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="222">
+<profileid>100</profileid>
+<class>lnkInfraError</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="223">
+<profileid>100</profileid>
+<class>lnkDocumentError</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="224">
+<profileid>100</profileid>
+<class>lnkDocumentError</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="225">
+<profileid>100</profileid>
+<class>lnkDocumentError</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="226">
+<profileid>100</profileid>
+<class>lnkDocumentError</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="227">
+<profileid>100</profileid>
+<class>lnkDocumentError</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="228">
+<profileid>100</profileid>
+<class>lnkDocumentError</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="229">
+<profileid>100</profileid>
+<class>AuditCategory</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="230">
+<profileid>100</profileid>
+<class>AuditCategory</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="231">
+<profileid>100</profileid>
+<class>AuditCategory</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="232">
+<profileid>100</profileid>
+<class>AuditCategory</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="233">
+<profileid>100</profileid>
+<class>AuditCategory</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="234">
+<profileid>100</profileid>
+<class>AuditCategory</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="235">
+<profileid>100</profileid>
+<class>AuditRule</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="236">
+<profileid>100</profileid>
+<class>AuditRule</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="237">
+<profileid>100</profileid>
+<class>AuditRule</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="238">
+<profileid>100</profileid>
+<class>AuditRule</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="239">
+<profileid>100</profileid>
+<class>AuditRule</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="240">
+<profileid>100</profileid>
+<class>AuditRule</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="241">
+<profileid>100</profileid>
+<class>menuNode</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="242">
+<profileid>100</profileid>
+<class>menuNode</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="243">
+<profileid>100</profileid>
+<class>menuNode</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="244">
+<profileid>100</profileid>
+<class>menuNode</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="245">
+<profileid>100</profileid>
+<class>menuNode</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="246">
+<profileid>100</profileid>
+<class>menuNode</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="247">
+<profileid>100</profileid>
+<class>CMDBChange</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="248">
+<profileid>100</profileid>
+<class>CMDBChange</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="249">
+<profileid>100</profileid>
+<class>CMDBChange</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="250">
+<profileid>100</profileid>
+<class>CMDBChange</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="251">
+<profileid>100</profileid>
+<class>CMDBChange</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="252">
+<profileid>100</profileid>
+<class>CMDBChange</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="253">
+<profileid>100</profileid>
+<class>CMDBChangeOp</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="254">
+<profileid>100</profileid>
+<class>CMDBChangeOp</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="255">
+<profileid>100</profileid>
+<class>CMDBChangeOp</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="256">
+<profileid>100</profileid>
+<class>CMDBChangeOp</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="257">
+<profileid>100</profileid>
+<class>CMDBChangeOp</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="258">
+<profileid>100</profileid>
+<class>CMDBChangeOp</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="259">
+<profileid>100</profileid>
+<class>CMDBChangeOpCreate</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="260">
+<profileid>100</profileid>
+<class>CMDBChangeOpCreate</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="261">
+<profileid>100</profileid>
+<class>CMDBChangeOpCreate</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="262">
+<profileid>100</profileid>
+<class>CMDBChangeOpCreate</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="263">
+<profileid>100</profileid>
+<class>CMDBChangeOpCreate</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="264">
+<profileid>100</profileid>
+<class>CMDBChangeOpCreate</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="265">
+<profileid>100</profileid>
+<class>CMDBChangeOpDelete</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="266">
+<profileid>100</profileid>
+<class>CMDBChangeOpDelete</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="267">
+<profileid>100</profileid>
+<class>CMDBChangeOpDelete</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="268">
+<profileid>100</profileid>
+<class>CMDBChangeOpDelete</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="269">
+<profileid>100</profileid>
+<class>CMDBChangeOpDelete</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="270">
+<profileid>100</profileid>
+<class>CMDBChangeOpDelete</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="271">
+<profileid>100</profileid>
+<class>CMDBChangeOpSetAttribute</class>
+<permission>yes</permission>
+<action>read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="272">
+<profileid>100</profileid>
+<class>CMDBChangeOpSetAttribute</class>
+<permission>yes</permission>
+<action>modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="273">
+<profileid>100</profileid>
+<class>CMDBChangeOpSetAttribute</class>
+<permission>yes</permission>
+<action>delete</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="274">
+<profileid>100</profileid>
+<class>CMDBChangeOpSetAttribute</class>
+<permission>yes</permission>
+<action>bulk read</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="275">
+<profileid>100</profileid>
+<class>CMDBChangeOpSetAttribute</class>
+<permission>yes</permission>
+<action>bulk modify</action>
+</URP_ActionGrant>
+<URP_ActionGrant id="276">
+<profileid>100</profileid>
+<class>CMDBChangeOpSetAttribute</class>
+<permission>yes</permission>
+<action>bulk delete</action>
+</URP_ActionGrant>
+</Set>

+ 3 - 0
setup/data/33.attributegrant.xml

@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+</Set>

+ 189 - 0
setup/data/34.stimulusgrant.xml

@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Set>
+<URP_StimulusGrant id="1">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_store</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="2">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_ship</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="3">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_plug</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="4">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_configuration_finished</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="5">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_val_failed</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="6">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_mtp</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="7">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_start_change</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="8">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_end_change</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="9">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_decommission</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="10">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_obsolete</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="11">
+<profileid>100</profileid>
+<class>bizServer</class>
+<permission>no</permission>
+<stimulus>ev_recycle</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="12">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>no</permission>
+<stimulus>ev_assign</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="13">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>no</permission>
+<stimulus>ev_reassign</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="14">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>no</permission>
+<stimulus>ev_start_working</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="15">
+<profileid>100</profileid>
+<class>bizIncidentTicket</class>
+<permission>no</permission>
+<stimulus>ev_close</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="16">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>no</permission>
+<stimulus>ev_freeze_version</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="17">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>no</permission>
+<stimulus>ev_sign</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="18">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>no</permission>
+<stimulus>ev_begin</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="19">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>no</permission>
+<stimulus>ev_notice</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="20">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>no</permission>
+<stimulus>ev_terminate</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="21">
+<profileid>100</profileid>
+<class>bizContract</class>
+<permission>no</permission>
+<stimulus>ev_elapsed</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="22">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>yes</permission>
+<stimulus>ev_validate</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="23">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>yes</permission>
+<stimulus>ev_reject</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="24">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<stimulus>ev_reopen</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="25">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<stimulus>ev_plan</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="26">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>yes</permission>
+<stimulus>ev_approve</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="27">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<stimulus>ev_replan</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="28">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>yes</permission>
+<stimulus>ev_notapprove</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="29">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<stimulus>ev_implement</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="30">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>no</permission>
+<stimulus>ev_monitor</stimulus>
+</URP_StimulusGrant>
+<URP_StimulusGrant id="31">
+<profileid>100</profileid>
+<class>bizChangeTicket</class>
+<permission>yes</permission>
+<stimulus>ev_finish</stimulus>
+</URP_StimulusGrant>
+</Set>

+ 4 - 2
setup/data/export.cmd

@@ -1,6 +1,8 @@
 SET WEBROOT=http://localhost:81
-SET USER=Erwan
-SET PWD=Taloc
+SET EXPORT=%WEBROOT%/webservices/export.php
+
+SET USER=admin
+SET PWD=admin
 
 REM The order (numbering) of the files is important since
 REM it dictates the order to import them back

+ 273 - 130
setup/data/structure/1.menus.xml

@@ -1,25 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Set>
-<menuNode id="17">
-<parent_id>0</parent_id>
-<name>Admin Tools</name>
-<label>iTop consultant tools</label>
+<menuNode id="1">
+<name>Tools</name>
+<label>Advanced tools</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p style=&quot;text-align:center; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:32px;&quot;&gt;Tools for the iTop consultant&lt;/p&gt;
 &lt;p style=&quot;text-align:center; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:14px;&quot;&gt;&lt;i&gt;This section contains links to useful tools for extending or debugging iTop&lt;/i&gt;&lt;/p&gt;
-
-
 </template>
-<rank>7</rank>
 <type>application</type>
+<rank>7</rank>
+<parent_id>0</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="59">
-<parent_id>5</parent_id>
+<menuNode id="2">
 <name>All Applications</name>
 <label>All Applications</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizApplication&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizApplication&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -29,14 +29,16 @@
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizApplication&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizApplication&lt;/itopblock&gt;
 &lt;/div&gt;
 </template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>14</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="47">
-<parent_id>5</parent_id>
+<menuNode id="3">
 <name>All Circuits</name>
 <label>All Circuits</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizCircuit&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizCircuit&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -46,27 +48,31 @@
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizCircuit&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizCircuit&lt;/itopblock&gt;
 &lt;/div&gt;
 </template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>14</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="75">
-<parent_id>64</parent_id>
+<menuNode id="4">
 <name>All Contracts</name>
 <label>All Contracts</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizContract&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizContract&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>2</rank>
 <type>application</type>
+<rank>2</rank>
+<parent_id>31</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="48">
-<parent_id>5</parent_id>
+<menuNode id="5">
 <name>All Interfaces</name>
 <label>All Interfaces</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizInterface&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -76,14 +82,16 @@
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizInterface&lt;/itopblock&gt;
 &lt;/div&gt;
 </template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>14</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="46">
-<parent_id>5</parent_id>
+<menuNode id="6">
 <name>All Network devices</name>
 <label>All Network devices</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizNetworkDevice&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizNetworkDevice&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -93,14 +101,16 @@
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizNetworkDevice&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizNetworkDevice&lt;/itopblock&gt;
 &lt;/div&gt;
 </template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>14</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="60">
-<parent_id>5</parent_id>
+<menuNode id="7">
 <name>All Patches</name>
 <label>All Patches</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizPatch&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizPatch&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -110,14 +120,16 @@
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizPatch&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizPatch&lt;/itopblock&gt;
 &lt;/div&gt;
 </template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>14</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="6">
-<parent_id>5</parent_id>
+<menuNode id="8">
 <name>All PCs</name>
 <label>All PCs</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizPC&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -127,14 +139,16 @@
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizPC&lt;/itopblock&gt;
 &lt;/div&gt;
 </template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>14</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="45">
-<parent_id>5</parent_id>
+<menuNode id="9">
 <name>All Servers</name>
 <label>All Servers</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizServer&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -144,23 +158,27 @@
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizServer&lt;/itopblock&gt;
 &lt;/div&gt;
 </template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>14</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="58">
-<parent_id>1</parent_id>
+<menuNode id="10">
 <name>Audit</name>
 <label>Audit</label>
 <hyperlink>./audit.php</hyperlink>
+<icon_path></icon_path>
 <template></template>
-<rank>4</rank>
 <type>application</type>
+<rank>4</rank>
+<parent_id>15</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="66">
-<parent_id>0</parent_id>
+<menuNode id="11">
 <name>Change Management</name>
 <label>Change Management</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;style&gt;
 .dashboard {
 vertical-align:top;
@@ -192,43 +210,49 @@ text-align:center;
 &lt;/tr&gt;
 &lt;/table&gt;
 </template>
-<rank>4</rank>
 <type>application</type>
+<rank>4</rank>
+<parent_id>0</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="74">
-<parent_id>66</parent_id>
+<menuNode id="12">
 <name>Closed Changes</name>
 <label>Closed Changes</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizChangeTicket: ticket_status = &apos;Closed&apos;&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizChangeTicket: ticket_status = &apos;Closed&apos;&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>2</rank>
 <type>application</type>
+<rank>2</rank>
+<parent_id>11</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="63">
-<parent_id>61</parent_id>
+<menuNode id="13">
 <name>Closed Incident</name>
 <label>List of closed ticket</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizIncidentTicket: ticket_status Contains &apos;Open&apos; AND severity Contains &apos;critical&apos;&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizIncidentTicket: ticket_status = &apos;Closed&apos;&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>2</rank>
 <type>application</type>
+<rank>2</rank>
+<parent_id>22</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="5">
-<parent_id>1</parent_id>
+<menuNode id="14">
 <name>Configuration Items</name>
 <label>All about devices</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
-&lt;p style=&quot;text-align:left; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:40px;&quot;&gt;&lt;img src=&quot;/images/devices_big.gif&quot; align=&quot;baseline&quot;&gt;Devices Overview&lt;/p&gt;
+&lt;p style=&quot;text-align:left; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:40px;&quot;&gt;&lt;img src=&quot;../images/devices_big.gif&quot; align=&quot;baseline&quot;&gt;Devices Overview&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;table border=&quot;0&quot; padding=&quot;5&quot; class=&quot;layout&quot;&gt;
@@ -252,14 +276,16 @@ text-align:center;
 &lt;/td&gt;
 &lt;/tr&gt;
 &lt;/table&gt;</template>
-<rank>2</rank>
 <type>application</type>
+<rank>2</rank>
+<parent_id>15</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="1">
-<parent_id>0</parent_id>
+<menuNode id="15">
 <name>Configuration Management</name>
 <label>Configuration Management</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;style&gt;
 td.dashboard {
  vertical-align:top;
@@ -290,15 +316,17 @@ td.dashboard {
 &lt;/table&gt;
 
 </template>
-<rank>2</rank>
 <type>application</type>
+<rank>2</rank>
+<parent_id>0</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="2">
-<parent_id>1</parent_id>
+<menuNode id="16">
 <name>Contacts</name>
 <label>Everything about Contacts</label>
 <hyperlink>UI.php</hyperlink>
-<template>&lt;img src=&quot;/images/users2-big.png&quot; style=&quot;float:right&quot;&gt;
+<icon_path></icon_path>
+<template>&lt;img src=&quot;../images/users2-big.png&quot; style=&quot;float:right&quot;&gt;
 &lt;p style=&quot;text-align:left; font-family:Verdana, Arial, sans-serif; font-size:24px;&quot;&gt;Contacts Overview&lt;/p&gt;
 &lt;table border=&quot;0&quot; padding=&quot;5&quot; class=&quot;layout&quot;&gt;
 &lt;tr&gt;
@@ -317,32 +345,27 @@ td.dashboard {
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;count&quot; parameters=&quot;group_by:status&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizContact&lt;/itopblock&gt;
 &lt;/td&gt;
 &lt;/table&gt;</template>
-<rank>1</rank>
 <type>application</type>
+<rank>1</rank>
+<parent_id>15</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="19">
-<parent_id>17</parent_id>
+<menuNode id="17">
 <name>CSV import</name>
 <label>Bulk creation or update</label>
 <hyperlink>csvimport.php</hyperlink>
+<icon_path></icon_path>
 <template></template>
-<rank>998</rank>
 <type>application</type>
-</menuNode>
-<menuNode id="18">
-<parent_id>17</parent_id>
-<name>Data Model</name>
-<label>Overview of the Data Model</label>
-<hyperlink>schema.php</hyperlink>
-<template></template>
 <rank>999</rank>
-<type>application</type>
-</menuNode>
-<menuNode id="12">
 <parent_id>1</parent_id>
+<user_id>0</user_id>
+</menuNode>
+<menuNode id="19">
 <name>Document</name>
 <label>Any object of class &apos;Document&apos;</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizDocument&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -351,23 +374,17 @@ td.dashboard {
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizDocument&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>6</rank>
-<type>application</type>
-</menuNode>
-<menuNode id="50">
-<parent_id>17</parent_id>
-<name>Export</name>
-<label>Export any filter in HTML, CSV or XML</label>
-<hyperlink>../webservices/export.php</hyperlink>
-<template></template>
-<rank>1000</rank>
 <type>application</type>
+<rank>6</rank>
+<parent_id>15</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="49">
-<parent_id>1</parent_id>
+
+<menuNode id="21">
 <name>Grouping</name>
 <label>All Groups</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizInfraGroup&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizInfraGroup&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -380,14 +397,16 @@ td.dashboard {
 
 
 </template>
-<rank>3</rank>
 <type>application</type>
+<rank>3</rank>
+<parent_id>15</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="61">
-<parent_id>0</parent_id>
+<menuNode id="22">
 <name>Incident Management</name>
 <label>Incident Management</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;style&gt;
 .dashboard {
 vertical-align:top;
@@ -419,27 +438,31 @@ text-align:center;
 &lt;/tr&gt;
 &lt;/table&gt;
 </template>
-<rank>3</rank>
 <type>application</type>
+<rank>3</rank>
+<parent_id>0</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="72">
-<parent_id>61</parent_id>
+<menuNode id="23">
 <name>Known Errors</name>
 <label>Known Errors</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizKnownErrort&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizKnownError&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizKnownError&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizKnownError&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>22</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="9">
-<parent_id>1</parent_id>
+<menuNode id="24">
 <name>Locations</name>
 <label>Any locations</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizLocation&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizLocation&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
@@ -448,88 +471,92 @@ text-align:center;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizLocation&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizLocation&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>5</rank>
 <type>application</type>
+<rank>5</rank>
+<parent_id>15</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="65">
-<parent_id>64</parent_id>
+<menuNode id="25">
 <name>Negociating contracts</name>
 <label>Negociating contracts</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizContract: status = &apos;Negotiating&apos;&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizContract: status = &apos;Negotiating&apos;&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>1</rank>
 <type>application</type>
+<rank>1</rank>
+<parent_id>31</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="68">
-<parent_id>66</parent_id>
+<menuNode id="26">
 <name>Open Changes</name>
 <label>Open Changes</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizChangeTicket: ticket_status != &apos;Closed&apos;&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizChangeTicket: ticket_status != &apos;Closed&apos;&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>1</rank>
 <type>application</type>
+<rank>1</rank>
+<parent_id>11</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="62">
-<parent_id>61</parent_id>
+<menuNode id="27">
 <name>Open Incidents</name>
 <label>List of open incidents</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizIncidentTicket: ticket_status Contains &apos;Open&apos; AND severity Contains &apos;critical&apos;&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizIncidentTicket: ticket_status != &apos;Closed&apos;&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>1</rank>
 <type>application</type>
+<rank>1</rank>
+<parent_id>22</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="14">
-<parent_id>2</parent_id>
+<menuNode id="28">
 <name>Persons</name>
 <label>Any contact of class &apos;Person&apos;</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizPerson&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizPerson&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>7</rank>
-<type>application</type>
-</menuNode>
-<menuNode id="51">
-<parent_id>17</parent_id>
-<name>Run queries</name>
-<label>Run any query</label>
-<hyperlink>./sibusql.php</hyperlink>
-<template></template>
-<rank>1001</rank>
 <type>application</type>
+<rank>7</rank>
+<parent_id>16</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="73">
-<parent_id>66</parent_id>
+
+<menuNode id="30">
 <name>Scheduled Outages</name>
 <label>Scheduled Outages</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizChangeTicket&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizChangeTicket: outage = &apos;Yes&apos; AND ticket_status != &apos;Closed&apos;&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizChangeTicket&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizChangeTicket: outage = &apos;Yes&apos; AND ticket_status != &apos;Closed&apos;&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>999</rank>
 <type>application</type>
+<rank>999</rank>
+<parent_id>11</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="64">
-<parent_id>0</parent_id>
+<menuNode id="31">
 <name>Service Management</name>
 <label>Service Management</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;style&gt;
 .dashboard {
 vertical-align:top;
@@ -558,44 +585,160 @@ text-align:center;
 &lt;/tr&gt;
 &lt;/table&gt;
 </template>
-<rank>5</rank>
 <type>application</type>
+<rank>5</rank>
+<parent_id>0</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="43">
-<parent_id>2</parent_id>
+<menuNode id="32">
 <name>Teams</name>
 <label>Any contact of class &apos;team&apos;</label>
 <hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizTeam&lt;/itopblock&gt;
 &lt;div id=&quot;BottomPane&quot;&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;itopblock BlockClass=&quot;DisplayBlock&quot; objectclass=&quot;bizContact&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/sibusql&quot;&gt;bizTeam&lt;/itopblock&gt;
 &lt;/div&gt;</template>
-<rank>8</rank>
-<type>application</type>
-</menuNode>
-<menuNode id="16">
-<parent_id>17</parent_id>
-<name>Universal Search</name>
-<label>Search for anything...</label>
-<hyperlink>UniversalSearch.php</hyperlink>
-<template></template>
-<rank>999</rank>
 <type>application</type>
+<rank>8</rank>
+<parent_id>16</parent_id>
+<user_id>0</user_id>
 </menuNode>
-<menuNode id="76">
-<parent_id>0</parent_id>
+
+<menuNode id="34">
 <name>Welcome</name>
 <label>Welcome</label>
 <hyperlink>./UI.php</hyperlink>
+<icon_path></icon_path>
 <template>&lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p style=&quot;text-align:center; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:32px;&quot;&gt;Welcome to iTop&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p style=&quot;text-align:center; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:14px;&quot;&gt;&lt;i&gt;Version 0.8&lt;/i&gt;&lt;/p&gt;
+</template>
+<type>application</type>
+<rank>1</rank>
+<parent_id>0</parent_id>
+<user_id>0</user_id>
+</menuNode>
+
+<menuNode id="100">
+<name>Admin tools</name>
+<label>Admin tools</label>
+<hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
+<template>&lt;p&gt;&lt;/p&gt;
+&lt;p&gt;&lt;/p&gt;
+&lt;p style=&quot;text-align:center; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:32px;&quot;&gt;User management&lt;/p&gt;
+&lt;p&gt;&lt;/p&gt;
+&lt;p style=&quot;text-align:center; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:14px;&quot;&gt;&lt;i&gt;User management by profiles&lt;/i&gt;&lt;/p&gt;
+</template>
+<type>administrator</type>
+<rank>1000</rank>
+<parent_id>0</parent_id>
+<user_id>0</user_id>
+</menuNode>
+
+<menuNode id="101">
+<name>Data Model</name>
+<label>Overview of the Data Model</label>
+<hyperlink>schema.php</hyperlink>
+<icon_path></icon_path>
+<template></template>
+<type>administrator</type>
+<rank>1500</rank>
+<parent_id>100</parent_id>
+<user_id>0</user_id>
+</menuNode>
 
+<menuNode id="102">
+<name>Universal Search</name>
+<label>Search for anything...</label>
+<hyperlink>UniversalSearch.php</hyperlink>
+<icon_path></icon_path>
+<template></template>
+<type>administrator</type>
+<rank>1600</rank>
+<parent_id>100</parent_id>
+<user_id>0</user_id>
+</menuNode>
+
+<menuNode id="110">
+<name>User management</name>
+<label>User management</label>
+<hyperlink>UI.php</hyperlink>
+<icon_path></icon_path>
+<template>&lt;p&gt;&lt;/p&gt;
+&lt;p&gt;&lt;/p&gt;
+&lt;p style=&quot;text-align:center; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:32px;&quot;&gt;User management&lt;/p&gt;
+&lt;p&gt;&lt;/p&gt;
+&lt;p style=&quot;text-align:center; font-family:Georgia, &apos;Times New Roman&apos;, Times, serif; font-size:14px;&quot;&gt;&lt;i&gt;User management by profiles&lt;/i&gt;&lt;/p&gt;
 </template>
+<type>administrator</type>
 <rank>1</rank>
+<parent_id>100</parent_id>
+<user_id>0</user_id>
+</menuNode>
+
+<menuNode id="111">
+<name>User logins</name>
+<label>User logins</label>
+<hyperlink>UI.php</hyperlink>
+<icon_path>../images/std_view.gif</icon_path>
+<template>&lt;div id=&quot;TopPane&quot;&gt;
+&lt;itopblock BlockClass=&quot;DisplayBlock&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/oql&quot;&gt;SELECT URP_Users AS URP_Users WHERE 1&lt;/itopblock&gt;
+&lt;/div&gt;
+&lt;div id=&quot;BottomPane&quot;&gt;
+&lt;p&gt;&lt;/p&gt;
+&lt;itopblock BlockClass=&quot;DisplayBlock&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/oql&quot;&gt;SELECT URP_Users AS URP_Users WHERE 1&lt;/itopblock&gt;
+&lt;/div&gt;</template>
+<type>administrator</type>
+<rank>10</rank>
+<parent_id>110</parent_id>
+<user_id>0</user_id>
+</menuNode>
+
+<menuNode id="112">
+<name>Profiles</name>
+<label>User profiles</label>
+<hyperlink>UI.php</hyperlink>
+<icon_path>../images/std_view.gif</icon_path>
+<template>&lt;div id=&quot;TopPane&quot;&gt;
+&lt;itopblock BlockClass=&quot;DisplayBlock&quot; type=&quot;search&quot; asynchronous=&quot;false&quot; encoding=&quot;text/oql&quot;&gt;SELECT URP_Profiles AS URP_Profiles WHERE 1&lt;/itopblock&gt;
+&lt;/div&gt;
+&lt;div id=&quot;BottomPane&quot;&gt;
+&lt;p&gt;&lt;/p&gt;
+&lt;itopblock BlockClass=&quot;DisplayBlock&quot; type=&quot;list&quot; asynchronous=&quot;false&quot; encoding=&quot;text/oql&quot;&gt;SELECT URP_Profiles AS URP_Profiles WHERE 1&lt;/itopblock&gt;
+&lt;/div&gt;</template>
+<type>administrator</type>
+<rank>11</rank>
+<parent_id>110</parent_id>
+<user_id>0</user_id>
+</menuNode>
+
+<menuNode id="113">
+<name>Export</name>
+<label>Export any filter in HTML, CSV or XML</label>
+<hyperlink>../webservices/export.php</hyperlink>
+<icon_path></icon_path>
+<template></template>
 <type>application</type>
+<rank>1001</rank>
+<parent_id>100</parent_id>
+<user_id>0</user_id>
 </menuNode>
+
+<menuNode id="114">
+<name>Run queries</name>
+<label>Run any query</label>
+<hyperlink>./sibusql.php</hyperlink>
+<icon_path></icon_path>
+<template></template>
+<type>application</type>
+<rank>1002</rank>
+<parent_id>100</parent_id>
+<user_id>0</user_id>
+</menuNode>
+
 </Set>

+ 0 - 4
setup/data/structure/11.profiles.xml

@@ -4,8 +4,4 @@
 <name>Administrator</name>
 <description>Has the rights on everything (ignores the grant records)</description>
 </URP_Profiles>
-<URP_Profiles id="2">
-<name>Delivery Manager France</name>
-<description>Persons in charge of the operations for French customers</description>
-</URP_Profiles>
 </Set>

+ 5 - 5
setup/data/structure/13.profileprojection.xml

@@ -2,14 +2,14 @@
 <Set>
 <URP_ProfileProjection id="1">
 <dimensionid>1</dimensionid>
-<profileid>2</profileid>
-<value>1;2</value>
+<profileid>1</profileid>
+<value>true</value>
 <attribute></attribute>
 </URP_ProfileProjection>
-<URP_ProfileProjection id="3">
+<URP_ProfileProjection id="2">
 <dimensionid>2</dimensionid>
-<profileid>2</profileid>
-<value>&lt;any&gt;</value>
+<profileid>1</profileid>
+<value>true</value>
 <attribute></attribute>
 </URP_ProfileProjection>
 </Set>

+ 0 - 1656
setup/data/structure/14.actiongrant.xml

@@ -1,1659 +1,3 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Set>
-<URP_ActionGrant id="1">
-<profileid>2</profileid>
-<class>bizOrganization</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="2">
-<profileid>2</profileid>
-<class>bizOrganization</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="3">
-<profileid>2</profileid>
-<class>bizOrganization</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="4">
-<profileid>2</profileid>
-<class>bizOrganization</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="5">
-<profileid>2</profileid>
-<class>bizOrganization</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="6">
-<profileid>2</profileid>
-<class>bizOrganization</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="7">
-<profileid>2</profileid>
-<class>logRealObject</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="8">
-<profileid>2</profileid>
-<class>logRealObject</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="9">
-<profileid>2</profileid>
-<class>logRealObject</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="10">
-<profileid>2</profileid>
-<class>logRealObject</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="11">
-<profileid>2</profileid>
-<class>logRealObject</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="12">
-<profileid>2</profileid>
-<class>logRealObject</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="13">
-<profileid>2</profileid>
-<class>bizContact</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="14">
-<profileid>2</profileid>
-<class>bizContact</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="15">
-<profileid>2</profileid>
-<class>bizContact</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="16">
-<profileid>2</profileid>
-<class>bizContact</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="17">
-<profileid>2</profileid>
-<class>bizContact</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="18">
-<profileid>2</profileid>
-<class>bizContact</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="19">
-<profileid>2</profileid>
-<class>bizPerson</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="20">
-<profileid>2</profileid>
-<class>bizPerson</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="21">
-<profileid>2</profileid>
-<class>bizPerson</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="22">
-<profileid>2</profileid>
-<class>bizPerson</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="23">
-<profileid>2</profileid>
-<class>bizPerson</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="24">
-<profileid>2</profileid>
-<class>bizPerson</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="25">
-<profileid>2</profileid>
-<class>bizTeam</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="26">
-<profileid>2</profileid>
-<class>bizTeam</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="27">
-<profileid>2</profileid>
-<class>bizTeam</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="28">
-<profileid>2</profileid>
-<class>bizTeam</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="29">
-<profileid>2</profileid>
-<class>bizTeam</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="30">
-<profileid>2</profileid>
-<class>bizTeam</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="31">
-<profileid>2</profileid>
-<class>bizDocument</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="32">
-<profileid>2</profileid>
-<class>bizDocument</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="33">
-<profileid>2</profileid>
-<class>bizDocument</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="34">
-<profileid>2</profileid>
-<class>bizDocument</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="35">
-<profileid>2</profileid>
-<class>bizDocument</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="36">
-<profileid>2</profileid>
-<class>bizDocument</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="37">
-<profileid>2</profileid>
-<class>bizDocVersion</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="38">
-<profileid>2</profileid>
-<class>bizDocVersion</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="39">
-<profileid>2</profileid>
-<class>bizDocVersion</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="40">
-<profileid>2</profileid>
-<class>bizDocVersion</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="41">
-<profileid>2</profileid>
-<class>bizDocVersion</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="42">
-<profileid>2</profileid>
-<class>bizDocVersion</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="43">
-<profileid>2</profileid>
-<class>lnkDocumentRealObject</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="44">
-<profileid>2</profileid>
-<class>lnkDocumentRealObject</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="45">
-<profileid>2</profileid>
-<class>lnkDocumentRealObject</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="46">
-<profileid>2</profileid>
-<class>lnkDocumentRealObject</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="47">
-<profileid>2</profileid>
-<class>lnkDocumentRealObject</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="48">
-<profileid>2</profileid>
-<class>lnkDocumentRealObject</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="49">
-<profileid>2</profileid>
-<class>lnkContactRealObject</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="50">
-<profileid>2</profileid>
-<class>lnkContactRealObject</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="51">
-<profileid>2</profileid>
-<class>lnkContactRealObject</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="52">
-<profileid>2</profileid>
-<class>lnkContactRealObject</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="53">
-<profileid>2</profileid>
-<class>lnkContactRealObject</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="54">
-<profileid>2</profileid>
-<class>lnkContactRealObject</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="55">
-<profileid>2</profileid>
-<class>logInfra</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="56">
-<profileid>2</profileid>
-<class>logInfra</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="57">
-<profileid>2</profileid>
-<class>logInfra</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="58">
-<profileid>2</profileid>
-<class>logInfra</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="59">
-<profileid>2</profileid>
-<class>logInfra</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="60">
-<profileid>2</profileid>
-<class>logInfra</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="61">
-<profileid>2</profileid>
-<class>bizLocation</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="62">
-<profileid>2</profileid>
-<class>bizLocation</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="63">
-<profileid>2</profileid>
-<class>bizLocation</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="64">
-<profileid>2</profileid>
-<class>bizLocation</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="65">
-<profileid>2</profileid>
-<class>bizLocation</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="66">
-<profileid>2</profileid>
-<class>bizLocation</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="67">
-<profileid>2</profileid>
-<class>bizCircuit</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="68">
-<profileid>2</profileid>
-<class>bizCircuit</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="69">
-<profileid>2</profileid>
-<class>bizCircuit</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="70">
-<profileid>2</profileid>
-<class>bizCircuit</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="71">
-<profileid>2</profileid>
-<class>bizCircuit</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="72">
-<profileid>2</profileid>
-<class>bizCircuit</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="73">
-<profileid>2</profileid>
-<class>bizInterface</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="74">
-<profileid>2</profileid>
-<class>bizInterface</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="75">
-<profileid>2</profileid>
-<class>bizInterface</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="76">
-<profileid>2</profileid>
-<class>bizInterface</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="77">
-<profileid>2</profileid>
-<class>bizInterface</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="78">
-<profileid>2</profileid>
-<class>bizInterface</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="79">
-<profileid>2</profileid>
-<class>lnkInterfaces</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="80">
-<profileid>2</profileid>
-<class>lnkInterfaces</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="81">
-<profileid>2</profileid>
-<class>lnkInterfaces</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="82">
-<profileid>2</profileid>
-<class>lnkInterfaces</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="83">
-<profileid>2</profileid>
-<class>lnkInterfaces</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="84">
-<profileid>2</profileid>
-<class>lnkInterfaces</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="85">
-<profileid>2</profileid>
-<class>bizDevice</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="86">
-<profileid>2</profileid>
-<class>bizDevice</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="87">
-<profileid>2</profileid>
-<class>bizDevice</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="88">
-<profileid>2</profileid>
-<class>bizDevice</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="89">
-<profileid>2</profileid>
-<class>bizDevice</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="90">
-<profileid>2</profileid>
-<class>bizDevice</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="91">
-<profileid>2</profileid>
-<class>bizPC</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="92">
-<profileid>2</profileid>
-<class>bizPC</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="93">
-<profileid>2</profileid>
-<class>bizPC</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="94">
-<profileid>2</profileid>
-<class>bizPC</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="95">
-<profileid>2</profileid>
-<class>bizPC</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="96">
-<profileid>2</profileid>
-<class>bizPC</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="97">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="98">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="99">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="100">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="101">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="102">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="103">
-<profileid>2</profileid>
-<class>bizNetworkDevice</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="104">
-<profileid>2</profileid>
-<class>bizNetworkDevice</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="105">
-<profileid>2</profileid>
-<class>bizNetworkDevice</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="106">
-<profileid>2</profileid>
-<class>bizNetworkDevice</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="107">
-<profileid>2</profileid>
-<class>bizNetworkDevice</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="108">
-<profileid>2</profileid>
-<class>bizNetworkDevice</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="109">
-<profileid>2</profileid>
-<class>bizInfraGroup</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="110">
-<profileid>2</profileid>
-<class>bizInfraGroup</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="111">
-<profileid>2</profileid>
-<class>bizInfraGroup</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="112">
-<profileid>2</profileid>
-<class>bizInfraGroup</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="113">
-<profileid>2</profileid>
-<class>bizInfraGroup</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="114">
-<profileid>2</profileid>
-<class>bizInfraGroup</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="115">
-<profileid>2</profileid>
-<class>bizApplication</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="116">
-<profileid>2</profileid>
-<class>bizApplication</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="117">
-<profileid>2</profileid>
-<class>bizApplication</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="118">
-<profileid>2</profileid>
-<class>bizApplication</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="119">
-<profileid>2</profileid>
-<class>bizApplication</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="120">
-<profileid>2</profileid>
-<class>bizApplication</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="121">
-<profileid>2</profileid>
-<class>lnkInfraGrouping</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="122">
-<profileid>2</profileid>
-<class>lnkInfraGrouping</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="123">
-<profileid>2</profileid>
-<class>lnkInfraGrouping</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="124">
-<profileid>2</profileid>
-<class>lnkInfraGrouping</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="125">
-<profileid>2</profileid>
-<class>lnkInfraGrouping</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="126">
-<profileid>2</profileid>
-<class>lnkInfraGrouping</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="127">
-<profileid>2</profileid>
-<class>lnkClientServer</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="128">
-<profileid>2</profileid>
-<class>lnkClientServer</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="129">
-<profileid>2</profileid>
-<class>lnkClientServer</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="130">
-<profileid>2</profileid>
-<class>lnkClientServer</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="131">
-<profileid>2</profileid>
-<class>lnkClientServer</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="132">
-<profileid>2</profileid>
-<class>lnkClientServer</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="133">
-<profileid>2</profileid>
-<class>bizPatch</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="134">
-<profileid>2</profileid>
-<class>bizPatch</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="135">
-<profileid>2</profileid>
-<class>bizPatch</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="136">
-<profileid>2</profileid>
-<class>bizPatch</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="137">
-<profileid>2</profileid>
-<class>bizPatch</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="138">
-<profileid>2</profileid>
-<class>bizPatch</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="139">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="140">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>no</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="141">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>no</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="142">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="143">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>no</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="144">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>no</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="145">
-<profileid>2</profileid>
-<class>lnkRelatedTicket</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="146">
-<profileid>2</profileid>
-<class>lnkRelatedTicket</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="147">
-<profileid>2</profileid>
-<class>lnkRelatedTicket</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="148">
-<profileid>2</profileid>
-<class>lnkRelatedTicket</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="149">
-<profileid>2</profileid>
-<class>lnkRelatedTicket</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="150">
-<profileid>2</profileid>
-<class>lnkRelatedTicket</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="151">
-<profileid>2</profileid>
-<class>lnkInfraTicket</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="152">
-<profileid>2</profileid>
-<class>lnkInfraTicket</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="153">
-<profileid>2</profileid>
-<class>lnkInfraTicket</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="154">
-<profileid>2</profileid>
-<class>lnkInfraTicket</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="155">
-<profileid>2</profileid>
-<class>lnkInfraTicket</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="156">
-<profileid>2</profileid>
-<class>lnkInfraTicket</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="157">
-<profileid>2</profileid>
-<class>lnkContactTicket</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="158">
-<profileid>2</profileid>
-<class>lnkContactTicket</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="159">
-<profileid>2</profileid>
-<class>lnkContactTicket</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="160">
-<profileid>2</profileid>
-<class>lnkContactTicket</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="161">
-<profileid>2</profileid>
-<class>lnkContactTicket</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="162">
-<profileid>2</profileid>
-<class>lnkContactTicket</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="163">
-<profileid>2</profileid>
-<class>bizWorkgroup</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="164">
-<profileid>2</profileid>
-<class>bizWorkgroup</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="165">
-<profileid>2</profileid>
-<class>bizWorkgroup</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="166">
-<profileid>2</profileid>
-<class>bizWorkgroup</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="167">
-<profileid>2</profileid>
-<class>bizWorkgroup</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="168">
-<profileid>2</profileid>
-<class>bizWorkgroup</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="169">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="170">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="171">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="172">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="173">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="174">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="175">
-<profileid>2</profileid>
-<class>lnkInfraContract</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="176">
-<profileid>2</profileid>
-<class>lnkInfraContract</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="177">
-<profileid>2</profileid>
-<class>lnkInfraContract</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="178">
-<profileid>2</profileid>
-<class>lnkInfraContract</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="179">
-<profileid>2</profileid>
-<class>lnkInfraContract</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="180">
-<profileid>2</profileid>
-<class>lnkInfraContract</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="181">
-<profileid>2</profileid>
-<class>lnkContactContract</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="182">
-<profileid>2</profileid>
-<class>lnkContactContract</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="183">
-<profileid>2</profileid>
-<class>lnkContactContract</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="184">
-<profileid>2</profileid>
-<class>lnkContactContract</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="185">
-<profileid>2</profileid>
-<class>lnkContactContract</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="186">
-<profileid>2</profileid>
-<class>lnkContactContract</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="187">
-<profileid>2</profileid>
-<class>lnkDocumentContract</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="188">
-<profileid>2</profileid>
-<class>lnkDocumentContract</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="189">
-<profileid>2</profileid>
-<class>lnkDocumentContract</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="190">
-<profileid>2</profileid>
-<class>lnkDocumentContract</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="191">
-<profileid>2</profileid>
-<class>lnkDocumentContract</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="192">
-<profileid>2</profileid>
-<class>lnkDocumentContract</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="193">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="194">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="195">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="196">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="197">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="198">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="199">
-<profileid>2</profileid>
-<class>lnkInfraChangeTicket</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="200">
-<profileid>2</profileid>
-<class>lnkInfraChangeTicket</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="201">
-<profileid>2</profileid>
-<class>lnkInfraChangeTicket</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="202">
-<profileid>2</profileid>
-<class>lnkInfraChangeTicket</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="203">
-<profileid>2</profileid>
-<class>lnkInfraChangeTicket</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="204">
-<profileid>2</profileid>
-<class>lnkInfraChangeTicket</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="205">
-<profileid>2</profileid>
-<class>lnkContactChange</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="206">
-<profileid>2</profileid>
-<class>lnkContactChange</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="207">
-<profileid>2</profileid>
-<class>lnkContactChange</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="208">
-<profileid>2</profileid>
-<class>lnkContactChange</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="209">
-<profileid>2</profileid>
-<class>lnkContactChange</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="210">
-<profileid>2</profileid>
-<class>lnkContactChange</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="211">
-<profileid>2</profileid>
-<class>bizKnownError</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="212">
-<profileid>2</profileid>
-<class>bizKnownError</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="213">
-<profileid>2</profileid>
-<class>bizKnownError</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="214">
-<profileid>2</profileid>
-<class>bizKnownError</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="215">
-<profileid>2</profileid>
-<class>bizKnownError</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="216">
-<profileid>2</profileid>
-<class>bizKnownError</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="217">
-<profileid>2</profileid>
-<class>lnkInfraError</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="218">
-<profileid>2</profileid>
-<class>lnkInfraError</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="219">
-<profileid>2</profileid>
-<class>lnkInfraError</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="220">
-<profileid>2</profileid>
-<class>lnkInfraError</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="221">
-<profileid>2</profileid>
-<class>lnkInfraError</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="222">
-<profileid>2</profileid>
-<class>lnkInfraError</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="223">
-<profileid>2</profileid>
-<class>lnkDocumentError</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="224">
-<profileid>2</profileid>
-<class>lnkDocumentError</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="225">
-<profileid>2</profileid>
-<class>lnkDocumentError</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="226">
-<profileid>2</profileid>
-<class>lnkDocumentError</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="227">
-<profileid>2</profileid>
-<class>lnkDocumentError</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="228">
-<profileid>2</profileid>
-<class>lnkDocumentError</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="229">
-<profileid>2</profileid>
-<class>AuditCategory</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="230">
-<profileid>2</profileid>
-<class>AuditCategory</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="231">
-<profileid>2</profileid>
-<class>AuditCategory</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="232">
-<profileid>2</profileid>
-<class>AuditCategory</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="233">
-<profileid>2</profileid>
-<class>AuditCategory</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="234">
-<profileid>2</profileid>
-<class>AuditCategory</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="235">
-<profileid>2</profileid>
-<class>AuditRule</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="236">
-<profileid>2</profileid>
-<class>AuditRule</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="237">
-<profileid>2</profileid>
-<class>AuditRule</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="238">
-<profileid>2</profileid>
-<class>AuditRule</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="239">
-<profileid>2</profileid>
-<class>AuditRule</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="240">
-<profileid>2</profileid>
-<class>AuditRule</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="241">
-<profileid>2</profileid>
-<class>menuNode</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="242">
-<profileid>2</profileid>
-<class>menuNode</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="243">
-<profileid>2</profileid>
-<class>menuNode</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="244">
-<profileid>2</profileid>
-<class>menuNode</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="245">
-<profileid>2</profileid>
-<class>menuNode</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="246">
-<profileid>2</profileid>
-<class>menuNode</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="247">
-<profileid>2</profileid>
-<class>CMDBChange</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="248">
-<profileid>2</profileid>
-<class>CMDBChange</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="249">
-<profileid>2</profileid>
-<class>CMDBChange</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="250">
-<profileid>2</profileid>
-<class>CMDBChange</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="251">
-<profileid>2</profileid>
-<class>CMDBChange</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="252">
-<profileid>2</profileid>
-<class>CMDBChange</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="253">
-<profileid>2</profileid>
-<class>CMDBChangeOp</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="254">
-<profileid>2</profileid>
-<class>CMDBChangeOp</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="255">
-<profileid>2</profileid>
-<class>CMDBChangeOp</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="256">
-<profileid>2</profileid>
-<class>CMDBChangeOp</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="257">
-<profileid>2</profileid>
-<class>CMDBChangeOp</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="258">
-<profileid>2</profileid>
-<class>CMDBChangeOp</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="259">
-<profileid>2</profileid>
-<class>CMDBChangeOpCreate</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="260">
-<profileid>2</profileid>
-<class>CMDBChangeOpCreate</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="261">
-<profileid>2</profileid>
-<class>CMDBChangeOpCreate</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="262">
-<profileid>2</profileid>
-<class>CMDBChangeOpCreate</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="263">
-<profileid>2</profileid>
-<class>CMDBChangeOpCreate</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="264">
-<profileid>2</profileid>
-<class>CMDBChangeOpCreate</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="265">
-<profileid>2</profileid>
-<class>CMDBChangeOpDelete</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="266">
-<profileid>2</profileid>
-<class>CMDBChangeOpDelete</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="267">
-<profileid>2</profileid>
-<class>CMDBChangeOpDelete</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="268">
-<profileid>2</profileid>
-<class>CMDBChangeOpDelete</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="269">
-<profileid>2</profileid>
-<class>CMDBChangeOpDelete</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="270">
-<profileid>2</profileid>
-<class>CMDBChangeOpDelete</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="271">
-<profileid>2</profileid>
-<class>CMDBChangeOpSetAttribute</class>
-<permission>yes</permission>
-<action>read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="272">
-<profileid>2</profileid>
-<class>CMDBChangeOpSetAttribute</class>
-<permission>yes</permission>
-<action>modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="273">
-<profileid>2</profileid>
-<class>CMDBChangeOpSetAttribute</class>
-<permission>yes</permission>
-<action>delete</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="274">
-<profileid>2</profileid>
-<class>CMDBChangeOpSetAttribute</class>
-<permission>yes</permission>
-<action>bulk read</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="275">
-<profileid>2</profileid>
-<class>CMDBChangeOpSetAttribute</class>
-<permission>yes</permission>
-<action>bulk modify</action>
-</URP_ActionGrant>
-<URP_ActionGrant id="276">
-<profileid>2</profileid>
-<class>CMDBChangeOpSetAttribute</class>
-<permission>yes</permission>
-<action>bulk delete</action>
-</URP_ActionGrant>
 </Set>

+ 0 - 186
setup/data/structure/16.stimulusgrant.xml

@@ -1,189 +1,3 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Set>
-<URP_StimulusGrant id="1">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_store</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="2">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_ship</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="3">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_plug</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="4">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_configuration_finished</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="5">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_val_failed</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="6">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_mtp</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="7">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_start_change</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="8">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_end_change</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="9">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_decommission</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="10">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_obsolete</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="11">
-<profileid>2</profileid>
-<class>bizServer</class>
-<permission>no</permission>
-<stimulus>ev_recycle</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="12">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>no</permission>
-<stimulus>ev_assign</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="13">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>no</permission>
-<stimulus>ev_reassign</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="14">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>no</permission>
-<stimulus>ev_start_working</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="15">
-<profileid>2</profileid>
-<class>bizIncidentTicket</class>
-<permission>no</permission>
-<stimulus>ev_close</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="16">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>no</permission>
-<stimulus>ev_freeze_version</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="17">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>no</permission>
-<stimulus>ev_sign</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="18">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>no</permission>
-<stimulus>ev_begin</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="19">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>no</permission>
-<stimulus>ev_notice</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="20">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>no</permission>
-<stimulus>ev_terminate</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="21">
-<profileid>2</profileid>
-<class>bizContract</class>
-<permission>no</permission>
-<stimulus>ev_elapsed</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="22">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>yes</permission>
-<stimulus>ev_validate</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="23">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>yes</permission>
-<stimulus>ev_reject</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="24">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<stimulus>ev_reopen</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="25">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<stimulus>ev_plan</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="26">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>yes</permission>
-<stimulus>ev_approve</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="27">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<stimulus>ev_replan</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="28">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>yes</permission>
-<stimulus>ev_notapprove</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="29">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<stimulus>ev_implement</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="30">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>no</permission>
-<stimulus>ev_monitor</stimulus>
-</URP_StimulusGrant>
-<URP_StimulusGrant id="31">
-<profileid>2</profileid>
-<class>bizChangeTicket</class>
-<permission>yes</permission>
-<stimulus>ev_finish</stimulus>
-</URP_StimulusGrant>
 </Set>

+ 4 - 1
setup/data/structure/export_menus.cmd

@@ -1,7 +1,10 @@
 SET WEBROOT=http://localhost:81
+SET EXPORT=%WEBROOT%/webservices/export.php
+
 SET USER=admin
 SET PWD=admin
 
 REM The order (numbering) of the files is important since
 REM it dictates the order to import them back
-wget --output-document=1.menus.xml --post-data="auth_user=%USER%&auth_pwd=%PWD%&operation=login" "%WEBROOT%/pages/export.php?expression=SELECT menuNode WHERE type%%3D%%27application%%27&format=xml"
+wget --output-document=1.menus.xml --post-data="auth_user=%USER%&auth_pwd=%PWD%&operation=login" "%EXPORT%?expression=SELECT menuNode WHERE type%%3D%%27application%%27&format=xml"
+pause

+ 4 - 1
setup/data/structure/export_profiles.cmd

@@ -1,4 +1,6 @@
-SET WEBROOT=http://localhost:81
+SET WEBROOT=http://localhost:81/trunk
+SET EXPORT="%WEBROOT%/webservices/export.php"
+
 SET USER=admin
 SET PWD=admin
 
@@ -11,3 +13,4 @@ wget --output-document=13.profileprojection.xml --post-data="auth_user=%USER%&au
 wget --output-document=14.actiongrant.xml --post-data="auth_user=%USER%&auth_pwd=%PWD%&operation=login" "%EXPORT%?expression=SELECT URP_ActionGrant&format=xml"
 wget --output-document=15.attributegrant.xml --post-data="auth_user=%USER%&auth_pwd=%PWD%&operation=login" "%EXPORT%?expression=SELECT URP_AttributeGrant&format=xml"
 wget --output-document=16.stimulusgrant.xml --post-data="auth_user=%USER%&auth_pwd=%PWD%&operation=login" "%EXPORT%?expression=SELECT URP_StimulusGrant&format=xml"
+pause

+ 1 - 1
setup/index.php

@@ -376,7 +376,7 @@ function DisplayStep4(setup_web_page $oP, Config $oConfig, $sAdminUser, $sAdminP
 	$oP->add("<h2>Creation of the administrator account</h2>\n");
 
 	$oP->add("<form method=\"post\"\">\n");
-	if (CreateAdminAccount($oP, $oConfig, $sAdminUser, $sAdminPwd))
+	if (CreateAdminAccount($oP, $oConfig, $sAdminUser, $sAdminPwd) && UserRights::Setup())
 	{
 		$oP->add("<h2>Step 4: Loading of sample data</h2>\n");
 		$oP->p("<fieldset><legend> Do you want to load sample data into the database ? </legend>\n");