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:trunk[122]
This commit is contained in:
Romain Quetiez
2009-09-08 15:10:31 +00:00
parent f3367cd587
commit c97db0e5e3
10 changed files with 598 additions and 490 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -97,6 +97,9 @@ f_from_days = "FROM_DAYS"
f_year = "YEAR"
f_month = "MONTH"
f_day = "DAY"
f_hour = "HOUR"
f_minute = "MINUTE"
f_second = "SECOND"
f_date_add = "DATE_ADD"
f_date_sub = "DATE_SUB"
f_round = "ROUND"
@@ -238,6 +241,15 @@ f_month {
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 {
$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) ::= 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_MONTH(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 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 GetContactId($sLogin); // returns the id of the "business" user or false
abstract public function GetFilter($sLogin, $sClass); // returns a filter object
abstract public function IsActionAllowed($iUserId, $sClass, $iActionCode, 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()
{
return self::$m_sRealUser;

View File

@@ -7,48 +7,21 @@ require_once('../application/startup.inc.php');
require_once('../application/loginwebpage.class.inc.php');
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);
// Main program
$sExpression = utils::ReadParam('expression', '');
$sEncoding = utils::ReadParam('encoding', 'oql');
try
function ShowExamples($oP, $sExpression)
{
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(
"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'",
"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();
foreach($aExamples as $sDescription => $sOql)
{
@@ -70,8 +43,54 @@ try
$aDisplayConfig['desc'] = array('label' => 'Target', 'description' => '');
$aDisplayConfig['oql'] = array('label' => 'OQL Expression', '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->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))
{
$oFilter = DBObjectSearch::FromOQL($sExpression);
@@ -82,7 +101,6 @@ try
$oP->p('Serialized filter: '.$oFilter->serialize());
$oSet = new CMDBObjectSet($oFilter);
$oP->p('The query returned '.$oSet->count().' results(s)');
cmdbAbstractObject::DisplaySet($oP, $oSet);
}
}