Improved the run query page: added meaningfull examples, including "ticket of the user currently logged in", and did some cosmetics on the page (examples shown in a drawer) ; needed to add some options to the OQL (date intervals)

SVN:code[122]
This commit is contained in:
Romain Quetiez
2009-09-08 15:10:31 +00:00
parent b11bfff1f5
commit e0c7620560
10 changed files with 598 additions and 490 deletions

View File

@@ -336,6 +336,12 @@ class UserRightsMatrix extends UserRightsAddOnAPI
return $oLogin->Get('userid'); return $oLogin->Get('userid');
} }
public function GetContactId($sUserName)
{
// this module has no link with the business data
return null;
}
public function GetFilter($sUserName, $sClass) public function GetFilter($sUserName, $sClass)
{ {
$oNullFilter = new DBObjectSearch($sClass); $oNullFilter = new DBObjectSearch($sClass);

View File

@@ -47,6 +47,12 @@ class UserRightsNull extends UserRightsAddOnAPI
return 1; return 1;
} }
public function GetContactId($sUserName)
{
// this module has no link with the business data
return null;
}
public function GetFilter($sUserName, $sClass) public function GetFilter($sUserName, $sClass)
{ {
$oNullFilter = new DBObjectSearch($sClass); $oNullFilter = new DBObjectSearch($sClass);

View File

@@ -733,6 +733,8 @@ class UserRightsProfile extends UserRightsAddOnAPI
protected $m_aUserProfiles = array(); // userid,profileid -> object protected $m_aUserProfiles = array(); // userid,profileid -> object
protected $m_aProPro = array(); // profileid,dimensionid -> object protected $m_aProPro = array(); // profileid,dimensionid -> object
protected $m_aLogin2UserId = array(); // login -> id
protected $m_aAdmins = array(); // id of users being linked to the profile #ADMIN_PROFILE_ID 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_aClassActionGrants = array(); // profile, class, action -> permission
@@ -747,6 +749,7 @@ class UserRightsProfile extends UserRightsAddOnAPI
while ($oUser = $oUserSet->Fetch()) while ($oUser = $oUserSet->Fetch())
{ {
$this->m_aUsers[$oUser->GetKey()] = $oUser; $this->m_aUsers[$oUser->GetKey()] = $oUser;
$this->m_aLogin2UserId[$oUser->Get('login')] = $oUser->GetKey();
} }
$oDimensionSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Dimensions")); $oDimensionSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Dimensions"));
@@ -818,15 +821,25 @@ exit;
public function GetUserId($sUserName) public function GetUserId($sUserName)
{ {
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT URP_Users WHERE login = :login"), array(), array('login' => $sUserName)); if (array_key_exists($sUserName, $this->m_aLogin2UserId))
if ($oSet->Count() < 1)
{ {
// todo: throw an exception? // This happens really when the list of users is being loaded into the cache!!!
return false; $iUserId = $this->m_aLogin2UserId[$sUserName];
return $iUserId;
} }
return null;
}
$oUser = $oSet->Fetch(); public function GetContactId($sUserName)
return $oUser->GetKey(); {
if (array_key_exists($sUserName, $this->m_aLogin2UserId))
{
// This happens really when the list of users is being loaded into the cache!!!
$iUserId = $this->m_aLogin2UserId[$sUserName];
$oUser = $this->m_aUsers[$iUserId];
return $oUser->Get('userid');
}
return null;
} }
public function GetFilter($sUserName, $sClass) public function GetFilter($sUserName, $sClass)

View File

@@ -1202,6 +1202,10 @@ abstract class MetaModel
$aScalarArgs[$sArgName] = (string) $value; $aScalarArgs[$sArgName] = (string) $value;
} }
} }
// Add standard contextual arguments
//
$aScalarArgs['current_contact_id'] = UserRights::GetContactId();
return $aScalarArgs; return $aScalarArgs;
} }

View File

@@ -125,6 +125,9 @@ class OQLLexerRaw
'/^YEAR/', '/^YEAR/',
'/^MONTH/', '/^MONTH/',
'/^DAY/', '/^DAY/',
'/^HOUR/',
'/^MINUTE/',
'/^SECOND/',
'/^DATE_ADD/', '/^DATE_ADD/',
'/^DATE_SUB/', '/^DATE_SUB/',
'/^ROUND/', '/^ROUND/',
@@ -444,44 +447,59 @@ class OQLLexerRaw
function yy_r1_43($yy_subpatterns) function yy_r1_43($yy_subpatterns)
{ {
$this->token = OQLParser::F_DATE_ADD; $this->token = OQLParser::F_HOUR;
} }
function yy_r1_44($yy_subpatterns) function yy_r1_44($yy_subpatterns)
{ {
$this->token = OQLParser::F_DATE_SUB; $this->token = OQLParser::F_MINUTE;
} }
function yy_r1_45($yy_subpatterns) function yy_r1_45($yy_subpatterns)
{ {
$this->token = OQLParser::F_ROUND; $this->token = OQLParser::F_SECOND;
} }
function yy_r1_46($yy_subpatterns) function yy_r1_46($yy_subpatterns)
{ {
$this->token = OQLParser::F_FLOOR; $this->token = OQLParser::F_DATE_ADD;
} }
function yy_r1_47($yy_subpatterns) function yy_r1_47($yy_subpatterns)
{ {
$this->token = OQLParser::NUMVAL; $this->token = OQLParser::F_DATE_SUB;
} }
function yy_r1_48($yy_subpatterns) function yy_r1_48($yy_subpatterns)
{ {
$this->token = OQLParser::STRVAL; $this->token = OQLParser::F_ROUND;
} }
function yy_r1_49($yy_subpatterns) function yy_r1_49($yy_subpatterns)
{ {
$this->token = OQLParser::NAME; $this->token = OQLParser::F_FLOOR;
} }
function yy_r1_50($yy_subpatterns) function yy_r1_50($yy_subpatterns)
{ {
$this->token = OQLParser::VARNAME; $this->token = OQLParser::NUMVAL;
} }
function yy_r1_51($yy_subpatterns) function yy_r1_51($yy_subpatterns)
{
$this->token = OQLParser::STRVAL;
}
function yy_r1_52($yy_subpatterns)
{
$this->token = OQLParser::NAME;
}
function yy_r1_53($yy_subpatterns)
{
$this->token = OQLParser::VARNAME;
}
function yy_r1_54($yy_subpatterns)
{ {
$this->token = OQLParser::DOT; $this->token = OQLParser::DOT;

View File

@@ -97,6 +97,9 @@ f_from_days = "FROM_DAYS"
f_year = "YEAR" f_year = "YEAR"
f_month = "MONTH" f_month = "MONTH"
f_day = "DAY" f_day = "DAY"
f_hour = "HOUR"
f_minute = "MINUTE"
f_second = "SECOND"
f_date_add = "DATE_ADD" f_date_add = "DATE_ADD"
f_date_sub = "DATE_SUB" f_date_sub = "DATE_SUB"
f_round = "ROUND" f_round = "ROUND"
@@ -238,6 +241,15 @@ f_month {
f_day { f_day {
$this->token = OQLParser::F_DAY; $this->token = OQLParser::F_DAY;
} }
f_hour {
$this->token = OQLParser::F_HOUR;
}
f_minute {
$this->token = OQLParser::F_MINUTE;
}
f_second {
$this->token = OQLParser::F_SECOND;
}
f_date_add { f_date_add {
$this->token = OQLParser::F_DATE_ADD; $this->token = OQLParser::F_DATE_ADD;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -118,6 +118,9 @@ arg_list(A) ::= arg_list(L) COMA argument(X). {
argument(A) ::= expression_prio4(X). { A = X; } argument(A) ::= expression_prio4(X). { A = X; }
argument(A) ::= INTERVAL expression_prio4(X) interval_unit(Y). { A = new IntervalOqlExpression(X, Y); } argument(A) ::= INTERVAL expression_prio4(X) interval_unit(Y). { A = new IntervalOqlExpression(X, Y); }
interval_unit(A) ::= F_SECOND(X). { A = X; }
interval_unit(A) ::= F_MINUTE(X). { A = X; }
interval_unit(A) ::= F_HOUR(X). { A = X; }
interval_unit(A) ::= F_DAY(X). { A = X; } interval_unit(A) ::= F_DAY(X). { A = X; }
interval_unit(A) ::= F_MONTH(X). { A = X; } interval_unit(A) ::= F_MONTH(X). { A = X; }
interval_unit(A) ::= F_YEAR(X). { A = X; } interval_unit(A) ::= F_YEAR(X). { A = X; }

View File

@@ -50,6 +50,7 @@ abstract class UserRightsAddOnAPI
abstract public function Init(); // loads data (possible optimizations) 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 CheckCredentials($sLogin, $sPassword); // returns the id of the user or false
abstract public function GetUserId($sLogin); // returns the id of the user or false abstract public function GetUserId($sLogin); // returns the id of the user or false
abstract public function GetContactId($sLogin); // returns the id of the "business" user or false
abstract public function GetFilter($sLogin, $sClass); // returns a filter object abstract public function GetFilter($sLogin, $sClass); // returns a filter object
abstract public function IsActionAllowed($iUserId, $sClass, $iActionCode, dbObjectSet $oInstances); abstract public function IsActionAllowed($iUserId, $sClass, $iActionCode, dbObjectSet $oInstances);
abstract public function IsStimulusAllowed($iUserId, $sClass, $sStimulusCode, dbObjectSet $oInstances); abstract public function IsStimulusAllowed($iUserId, $sClass, $sStimulusCode, dbObjectSet $oInstances);
@@ -171,6 +172,16 @@ class UserRights
} }
} }
public static function GetContactId($sName = '')
{
// note: returns null if the user management module is not related to the business data model
if (empty($sName))
{
$sName = self::$m_sUser;
}
return self::$m_oAddOn->GetContactId($sName);
}
public static function GetRealUser() public static function GetRealUser()
{ {
return self::$m_sRealUser; return self::$m_sRealUser;

View File

@@ -7,48 +7,21 @@ require_once('../application/startup.inc.php');
require_once('../application/loginwebpage.class.inc.php'); require_once('../application/loginwebpage.class.inc.php');
login_web_page::DoLogin(); // Check user rights and prompt if needed login_web_page::DoLogin(); // Check user rights and prompt if needed
$sOperation = utils::ReadParam('operation', 'menu');
$oContext = new UserContext();
$oAppContext = new ApplicationContext();
$iActiveNodeId = utils::ReadParam('menu', -1);
$currentOrganization = utils::ReadParam('org_id', '');
$oP = new iTopWebPage("iTop - Expression Evaluation", $currentOrganization); function ShowExamples($oP, $sExpression)
// Main program
$sExpression = utils::ReadParam('expression', '');
$sEncoding = utils::ReadParam('encoding', 'oql');
try
{ {
if ($sEncoding == 'crypted')
{
// Translate $sExpression into a oql expression
$sClearText = base64_decode($sExpression);
echo "<strong>FYI: '$sClearText'</strong><br/>\n";
$oFilter = DBObjectSearch::unserialize($sExpression);
$sExpression = $oFilter->ToOQL();
exit;
}
else
{
// leave $sExpression as is
}
$aExamples = array( $aExamples = array(
"Applications" => "SELECT bizApplication", "Applications" => "SELECT bizApplication",
"Changes planned on new year's day" => "SELECT bizChangeTicket AS ch WHERE ch.start_date >= '2009-12-31' AND ch.end_date <= '2010-01-01'", "Changes planned on new year's day" => "SELECT bizChangeTicket AS ch WHERE ch.start_date >= '2009-12-31' AND ch.end_date <= '2010-01-01'",
"Person having an 'A' in their name" => "SELECT bizPerson AS B WHERE B.name LIKE '%A%'", "Person having an 'A' in their name" => "SELECT bizPerson AS B WHERE B.name LIKE '%A%'",
"NW interfaces of equipment in production for customer 'Demo'" => "SELECT bizInterface AS if JOIN bizDevice AS dev ON if.device_id = dev.id WHERE if.status = 'production' AND dev.status = 'production' AND dev.org_name = 'Demo' AND if.physical_type = 'ethernet'" "NW interfaces of equipment in production for customer 'Demo'" => "SELECT bizInterface AS if JOIN bizDevice AS dev ON if.device_id = dev.id WHERE if.status = 'production' AND dev.status = 'production' AND dev.org_name = 'Demo' AND if.physical_type = 'ethernet'",
"My tickets" => "SELECT bizIncidentTicket AS i WHERE i.agent_id = :current_contact_id",
"People being owner of an active ticket" => "SELECT bizPerson AS p JOIN bizIncidentTicket AS i ON i.agent_id = p.id WHERE i.ticket_status != 'Closed'",
"Contracts terminating in the next thirty days" => "SELECT bizContract AS c WHERE c.end_prod > NOW() AND c.end_prod < DATE_ADD(NOW(), INTERVAL 30 DAY)",
"Orphan tickets (opened one hour ago, still not assigned)" => "SELECT bizIncidentTicket AS i WHERE i.start_date < DATE_SUB(NOW(), INTERVAL 60 MINUTE) AND i.ticket_status = 'New'",
"Long lasting incidents (duration > 8 hours)" => "SELECT bizIncidentTicket AS i WHERE i.end_date > DATE_ADD(i.start_date, INTERVAL 8 HOUR)",
); );
$oP->add("<form method=\"get\">\n");
$oP->add("Expression to evaluate:<br/>\n");
$oP->add("<textarea cols=\"50\" rows=\"20\" name=\"expression\">$sExpression</textarea>\n");
$oP->add("<input type=\"submit\" value=\" Evaluate \">\n");
$oP->add("</form>\n");
$oP->add("<h3>Examples</h3>\n");
$aDisplayData = array(); $aDisplayData = array();
foreach($aExamples as $sDescription => $sOql) foreach($aExamples as $sDescription => $sOql)
{ {
@@ -70,8 +43,54 @@ try
$aDisplayConfig['desc'] = array('label' => 'Target', 'description' => ''); $aDisplayConfig['desc'] = array('label' => 'Target', 'description' => '');
$aDisplayConfig['oql'] = array('label' => 'OQL Expression', 'description' => ''); $aDisplayConfig['oql'] = array('label' => 'OQL Expression', 'description' => '');
$aDisplayConfig['go'] = array('label' => '', 'description' => ''); $aDisplayConfig['go'] = array('label' => '', 'description' => '');
$sStyle = "SearchDrawer DrawerClosed";
$oP->add_ready_script("\$(\"#examples_drawer_handle_id\").click(function() {\$(\"#examples_contents_id\").slideToggle('normal'); $(\"#examples_drawer_handle_id\").toggleClass('open');});");
$oP->add("<div id=\"examples_contents_id\" class=\"$sStyle\">\n");
$oP->table($aDisplayConfig, $aDisplayData); $oP->table($aDisplayConfig, $aDisplayData);
$oP->add("</div>\n");
$oP->add("<div class=\"HRDrawer\"></div>\n");
$oP->add("<div id=\"examples_drawer_handle_id\" class=\"DrawerHandle\">Some examples</div>\n");
}
$sOperation = utils::ReadParam('operation', 'menu');
$oContext = new UserContext();
$oAppContext = new ApplicationContext();
$iActiveNodeId = utils::ReadParam('menu', -1);
$currentOrganization = utils::ReadParam('org_id', '');
$oP = new iTopWebPage("iTop - Expression Evaluation", $currentOrganization);
// Main program
$sExpression = utils::ReadParam('expression', '');
$sEncoding = utils::ReadParam('encoding', 'oql');
ShowExamples($oP, $sExpression);
try
{
if ($sEncoding == 'crypted')
{
// Translate $sExpression into a oql expression
$sClearText = base64_decode($sExpression);
echo "<strong>FYI: '$sClearText'</strong><br/>\n";
$oFilter = DBObjectSearch::unserialize($sExpression);
$sExpression = $oFilter->ToOQL();
exit;
}
else
{
// leave $sExpression as is
}
$oP->add("<form method=\"get\">\n");
$oP->add("Expression to evaluate:<br/>\n");
$oP->add("<textarea cols=\"80\" rows=\"15\" name=\"expression\">$sExpression</textarea>\n");
$oP->add("<input type=\"submit\" value=\" Evaluate \">\n");
$oP->add("</form>\n");
if (!empty($sExpression)) if (!empty($sExpression))
{ {
$oFilter = DBObjectSearch::FromOQL($sExpression); $oFilter = DBObjectSearch::FromOQL($sExpression);
@@ -82,7 +101,6 @@ try
$oP->p('Serialized filter: '.$oFilter->serialize()); $oP->p('Serialized filter: '.$oFilter->serialize());
$oSet = new CMDBObjectSet($oFilter); $oSet = new CMDBObjectSet($oFilter);
$oP->p('The query returned '.$oSet->count().' results(s)');
cmdbAbstractObject::DisplaySet($oP, $oSet); cmdbAbstractObject::DisplaySet($oP, $oSet);
} }
} }