mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-13 15:34:12 +01:00
Compare commits
101 Commits
feature/89
...
1.2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fac1084b1d | ||
|
|
e623467782 | ||
|
|
32208fcbfc | ||
|
|
dcbff406f7 | ||
|
|
017dfe641c | ||
|
|
fad258cd2d | ||
|
|
3470ce18e8 | ||
|
|
af710c549f | ||
|
|
ee938d674d | ||
|
|
423de35cf5 | ||
|
|
6a7af8ad73 | ||
|
|
89732d6e52 | ||
|
|
cddeab2c90 | ||
|
|
d9d84703ae | ||
|
|
c3de9ecf10 | ||
|
|
cf37a50b3d | ||
|
|
4db30648c2 | ||
|
|
8de84d5ec7 | ||
|
|
459a271d11 | ||
|
|
9da00b83b2 | ||
|
|
0c8ef6a690 | ||
|
|
cdefd7a4c6 | ||
|
|
4f057ac29f | ||
|
|
ab16588f87 | ||
|
|
07d8da9d99 | ||
|
|
c539f19ce9 | ||
|
|
3635e60850 | ||
|
|
b278b84f46 | ||
|
|
04647970a8 | ||
|
|
fe58f6bd19 | ||
|
|
0d6cd529a1 | ||
|
|
2a155fe8ee | ||
|
|
3f381a3530 | ||
|
|
7fadb5e08b | ||
|
|
5d4476f48b | ||
|
|
2fbb37cc2f | ||
|
|
6801ecb266 | ||
|
|
fa821d3a9b | ||
|
|
00f9deeaa5 | ||
|
|
58cfc1d51b | ||
|
|
af8b3b972d | ||
|
|
07671f40fd | ||
|
|
3da5c65fe4 | ||
|
|
489be44b90 | ||
|
|
912088d017 | ||
|
|
06620133b6 | ||
|
|
95d7a24630 | ||
|
|
cb0e1d8ef3 | ||
|
|
d321ebc8e4 | ||
|
|
c149ec8e2c | ||
|
|
281adfb043 | ||
|
|
4244029087 | ||
|
|
78e173d5fb | ||
|
|
6b8abce03a | ||
|
|
33a7005069 | ||
|
|
006a6037d1 | ||
|
|
e2f8be1745 | ||
|
|
ebae45f6a5 | ||
|
|
0685835d49 | ||
|
|
1b1e88f9a4 | ||
|
|
b90f443e75 | ||
|
|
4da64a64b1 | ||
|
|
6673e171dc | ||
|
|
afee7297cc | ||
|
|
3cc8b5b88a | ||
|
|
b2e6981b24 | ||
|
|
c0a79fa573 | ||
|
|
02ad6d19fe | ||
|
|
d16308ab62 | ||
|
|
4598959bc2 | ||
|
|
65a3755f81 | ||
|
|
dc46c65499 | ||
|
|
9d691c8e56 | ||
|
|
99f897bff7 | ||
|
|
8d83447222 | ||
|
|
dcc8ad08a4 | ||
|
|
c1b0b73b51 | ||
|
|
81173decca | ||
|
|
9aca062bf5 | ||
|
|
09aba95d0a | ||
|
|
1683ca2dd6 | ||
|
|
9e732d6045 | ||
|
|
69df343bd2 | ||
|
|
eb8f49ebfe | ||
|
|
398e294604 | ||
|
|
d04c6bccd5 | ||
|
|
f00c7c6bc2 | ||
|
|
d30e8c359f | ||
|
|
2bd4a61c00 | ||
|
|
e35c8323df | ||
|
|
e4e814281d | ||
|
|
635cb424a2 | ||
|
|
e95aa6cc69 | ||
|
|
c58fd17fc9 | ||
|
|
efdec7a343 | ||
|
|
2352c05d36 | ||
|
|
23634964a5 | ||
|
|
619252db99 | ||
|
|
ca4dbd833c | ||
|
|
f62a3b22a3 | ||
|
|
88416bca5d |
@@ -557,6 +557,10 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
||||
{
|
||||
$oContact->Set('org_id', $iOrgId);
|
||||
}
|
||||
if (MetaModel::IsValidAttCode('Person', 'phone'))
|
||||
{
|
||||
$oContact->Set('phone', '+00 000 000 000');
|
||||
}
|
||||
$oContact->Set('email', 'my.email@foo.org');
|
||||
$iContactId = $oContact->DBInsertTrackedNoReload($oChange, true /* skip security */);
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ require_once(APPROOT.'/application/displayblock.class.inc.php');
|
||||
require_once(APPROOT.'/application/sqlblock.class.inc.php');
|
||||
require_once(APPROOT.'/application/audit.category.class.inc.php');
|
||||
require_once(APPROOT.'/application/audit.rule.class.inc.php');
|
||||
require_once(APPROOT.'/application/query.class.inc.php');
|
||||
//require_once(APPROOT.'/application/menunode.class.inc.php');
|
||||
require_once(APPROOT.'/application/utils.inc.php');
|
||||
|
||||
|
||||
@@ -77,12 +77,16 @@ class ApplicationContext
|
||||
protected $aValues;
|
||||
protected static $aDefaultValues; // Cache shared among all instances
|
||||
|
||||
public function __construct()
|
||||
public function __construct($bReadContext = true)
|
||||
{
|
||||
$this->aNames = array(
|
||||
'org_id', 'menu'
|
||||
);
|
||||
$this->ReadContext();
|
||||
if ($bReadContext)
|
||||
{
|
||||
$this->ReadContext();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -185,7 +185,7 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
|
||||
$sTip .= Dict::S('Core:Synchro:LastSynchro').'<br/>'.$aStruct['last_synchro']."</p>";
|
||||
}
|
||||
$sSynchroIcon = ' <img style="vertical-align:middle;" id="synchro_icon" src="../images/locked.png"/>';
|
||||
$oPage->add_ready_script("$('#synchro_icon').qtip( { content: '$sTip', show: 'mouseover', hide: 'unfocus', style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );");
|
||||
$oPage->add_ready_script("$('#synchro_icon').qtip( { content: '$sTip', show: 'mouseover', hide: { fixed: true }, style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );");
|
||||
}
|
||||
|
||||
$oPage->add("<div class=\"page_header\"><h1>".$this->GetIcon()." \n");
|
||||
@@ -208,6 +208,11 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
|
||||
{
|
||||
$aFieldsMap = $this->GetBareProperties($oPage, $bEditMode, $sPrefix, $aExtraParams);
|
||||
|
||||
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
|
||||
{
|
||||
$oExtensionInstance->OnDisplayProperties($this, $oPage, $bEditMode);
|
||||
}
|
||||
|
||||
// Special case to display the case log, if any...
|
||||
// WARNING: if you modify the loop below, also check the corresponding code in UpdateObject and DisplayModifyForm
|
||||
foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sAttCode => $oAttDef)
|
||||
@@ -219,11 +224,6 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
|
||||
}
|
||||
}
|
||||
|
||||
foreach (MetaModel::EnumPlugins('iApplicationUIExtension') as $oExtensionInstance)
|
||||
{
|
||||
$oExtensionInstance->OnDisplayProperties($this, $oPage, $bEditMode);
|
||||
}
|
||||
|
||||
return $aFieldsMap;
|
||||
}
|
||||
|
||||
@@ -655,8 +655,26 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
|
||||
$bTruncated = isset($aExtraParams['truncated']) ? $aExtraParams['truncated'] == true : true;
|
||||
$bSelectMode = isset($aExtraParams['selection_mode']) ? $aExtraParams['selection_mode'] == true : false;
|
||||
$bSingleSelectMode = isset($aExtraParams['selection_type']) ? ($aExtraParams['selection_type'] == 'single') : false;
|
||||
$aExtraFields = isset($aExtraParams['extra_fields']) ? explode(',', trim($aExtraParams['extra_fields'])) : array();
|
||||
|
||||
|
||||
$aExtraFieldsRaw = isset($aExtraParams['extra_fields']) ? explode(',', trim($aExtraParams['extra_fields'])) : array();
|
||||
$aExtraFields = array();
|
||||
foreach ($aExtraFieldsRaw as $sFieldName)
|
||||
{
|
||||
// Ignore attributes not of the main queried class
|
||||
if (preg_match('/^(.*)\.(.*)$/', $sFieldName, $aMatches))
|
||||
{
|
||||
$sClassAlias = $aMatches[1];
|
||||
$sAttCode = $aMatches[2];
|
||||
if ($sClassAlias == $oSet->GetFilter()->GetClassAlias())
|
||||
{
|
||||
$aExtraFields[] = $sAttCode;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$aExtraFields[] = $sFieldName;
|
||||
}
|
||||
}
|
||||
$sHtml = '';
|
||||
$oAppContext = new ApplicationContext();
|
||||
$sClassName = $oSet->GetFilter()->GetClass();
|
||||
@@ -883,7 +901,9 @@ EOF
|
||||
$sDisplayList = json_encode($aList);
|
||||
$sCssCount = isset($aExtraParams['cssCount']) ? ", cssCount: '{$aExtraParams['cssCount']}'" : '';
|
||||
$iPageSize = MetaModel::GetConfig()->GetMinDisplayLimit();
|
||||
$oPage->add_ready_script("$('#{$iListId} table.listResults').tablesorter( { $sHeaders widgets: ['myZebra', 'truncatedList']} ).tablesorterPager({container: $('#pager{$iListId}'), totalRows:$iCount, size: $iPageSize, filter: '$sFilter', extra_params: '$sExtraParams', select_mode: '$sSelectMode', displayKey: $sDisplayKey, displayList: $sDisplayList $sCssCount});\n");
|
||||
$oSet->ApplyParameters();
|
||||
$sOQL = addslashes($oSet->GetFilter()->serialize());
|
||||
$oPage->add_ready_script("$('#{$iListId} table.listResults').tablesorter( { $sHeaders widgets: ['myZebra', 'truncatedList']} ).tablesorterPager({container: $('#pager{$iListId}'), totalRows:$iCount, size: $iPageSize, filter: '$sOQL', extra_params: '$sExtraParams', select_mode: '$sSelectMode', displayKey: $sDisplayKey, displayList: $sDisplayList $sCssCount});\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -940,7 +960,28 @@ EOF
|
||||
$bDisplayMenu = isset($aExtraParams['menu']) ? $aExtraParams['menu'] == true : true;
|
||||
// Check if there is a list of aliases to limit the display to...
|
||||
$aDisplayAliases = isset($aExtraParams['display_aliases']) ? explode(',', $aExtraParams['display_aliases']) : array();
|
||||
|
||||
$sZListName = isset($aExtraParams['zlist']) ? ($aExtraParams['zlist']) : 'list';
|
||||
|
||||
$aExtraFieldsRaw = isset($aExtraParams['extra_fields']) ? explode(',', trim($aExtraParams['extra_fields'])) : array();
|
||||
$aExtraFields = array();
|
||||
foreach ($aExtraFieldsRaw as $sFieldName)
|
||||
{
|
||||
// Ignore attributes not of the main queried class
|
||||
if (preg_match('/^(.*)\.(.*)$/', $sFieldName, $aMatches))
|
||||
{
|
||||
$sClassAlias = $aMatches[1];
|
||||
$sAttCode = $aMatches[2];
|
||||
if (array_key_exists($sClassAlias, $oSet->GetSelectedClasses()))
|
||||
{
|
||||
$aExtraFields[$sClassAlias][] = $sAttCode;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$aExtraFields['*'] = $sAttCode;
|
||||
}
|
||||
}
|
||||
|
||||
$sHtml = '';
|
||||
$oAppContext = new ApplicationContext();
|
||||
$aClasses = $oSet->GetFilter()->GetSelectedClasses();
|
||||
@@ -956,12 +997,36 @@ EOF
|
||||
$aAttribs = array();
|
||||
foreach($aAuthorizedClasses as $sAlias => $sClassName) // TO DO: check if the user has enough rights to view the classes of the list...
|
||||
{
|
||||
$aList[$sClassName] = MetaModel::GetZListItems($sClassName, 'list');
|
||||
if (array_key_exists($sAlias, $aExtraFields))
|
||||
{
|
||||
$aList[$sAlias] = $aExtraFields[$sAlias];
|
||||
}
|
||||
else
|
||||
{
|
||||
$aList[$sAlias] = array();
|
||||
}
|
||||
if ($sZListName !== false)
|
||||
{
|
||||
$aDefaultList = self::FlattenZList(MetaModel::GetZListItems($sClassName, $sZListName));
|
||||
|
||||
$aList[$sAlias] = array_merge($aDefaultList, $aList[$sAlias]);
|
||||
}
|
||||
|
||||
// Filter the list to removed linked set since we are not able to display them here
|
||||
foreach($aList[$sAlias] as $index => $sAttCode)
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
|
||||
if ($oAttDef instanceof AttributeLinkedSet)
|
||||
{
|
||||
// Removed from the display list
|
||||
unset($aList[$sAlias][$index]);
|
||||
}
|
||||
}
|
||||
if ($bViewLink)
|
||||
{
|
||||
$aAttribs['key_'.$sAlias] = array('label' => MetaModel::GetName($sClassName), 'description' => '');
|
||||
}
|
||||
foreach($aList[$sClassName] as $sAttCode)
|
||||
foreach($aList[$sAlias] as $sAttCode)
|
||||
{
|
||||
$aAttribs[$sAttCode.'_'.$sAlias] = array('label' => MetaModel::GetLabel($sClassName, $sAttCode), 'description' => MetaModel::GetDescription($sClassName, $sAttCode));
|
||||
}
|
||||
@@ -970,7 +1035,7 @@ EOF
|
||||
$aAttToLoad = array(); // attributes to load
|
||||
foreach($aAuthorizedClasses as $sAlias => $sClassName)
|
||||
{
|
||||
foreach($aList[$sClassName] as $sAttCode)
|
||||
foreach($aList[$sAlias] as $sAttCode)
|
||||
{
|
||||
$aAttToLoad[$sAlias][] = $sAttCode;
|
||||
}
|
||||
@@ -1004,7 +1069,7 @@ EOF
|
||||
$aRow['key_'.$sAlias] = $aObjects[$sAlias]->GetHyperLink();
|
||||
}
|
||||
}
|
||||
foreach($aList[$sClassName] as $sAttCode)
|
||||
foreach($aList[$sAlias] as $sAttCode)
|
||||
{
|
||||
if (is_null($aObjects[$sAlias]))
|
||||
{
|
||||
@@ -1087,6 +1152,8 @@ EOF
|
||||
$aHeader = array();
|
||||
foreach($aAuthorizedClasses as $sAlias => $sClassName)
|
||||
{
|
||||
$aList[$sAlias] = array();
|
||||
|
||||
foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode => $oAttDef)
|
||||
{
|
||||
if (is_null($aFields) || (count($aFields) == 0))
|
||||
@@ -1094,20 +1161,20 @@ EOF
|
||||
// Standard list of attributes (no link sets)
|
||||
if ($oAttDef->IsScalar() && ($oAttDef->IsWritable() || $oAttDef->IsExternalField()))
|
||||
{
|
||||
$aList[$sClassName][$sAttCode] = $oAttDef;
|
||||
$aList[$sAlias][$sAttCode] = $oAttDef;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// User defined list of attributes
|
||||
if (in_array($sAttCode, $aFields))
|
||||
if (in_array($sAttCode, $aFields) || in_array($sAlias.'.'.$sAttCode, $aFields))
|
||||
{
|
||||
$aList[$sClassName][$sAttCode] = $oAttDef;
|
||||
$aList[$sAlias][$sAttCode] = $oAttDef;
|
||||
}
|
||||
}
|
||||
}
|
||||
$aHeader[] = 'id';
|
||||
foreach($aList[$sClassName] as $sAttCode => $oAttDef)
|
||||
foreach($aList[$sAlias] as $sAttCode => $oAttDef)
|
||||
{
|
||||
$sStar = '';
|
||||
if ($oAttDef->IsExternalField())
|
||||
@@ -1154,7 +1221,7 @@ EOF
|
||||
{
|
||||
$aRow[] = $oObj->GetKey();
|
||||
}
|
||||
foreach($aList[$sClassName] as $sAttCode => $oAttDef)
|
||||
foreach($aList[$sAlias] as $sAttCode => $oAttDef)
|
||||
{
|
||||
if (is_null($oObj))
|
||||
{
|
||||
@@ -1172,6 +1239,149 @@ EOF
|
||||
return $sHtml;
|
||||
}
|
||||
|
||||
static function DisplaySetAsHTMLSpreadsheet(WebPage $oPage, CMDBObjectSet $oSet, $aParams = array())
|
||||
{
|
||||
$oPage->add(self::GetSetAsHTMLSpreadsheet($oSet, $aParams));
|
||||
}
|
||||
|
||||
/**
|
||||
* Spreadsheet output: designed for end users doing some reporting
|
||||
* Then the ids are excluded and replaced by the corresponding friendlyname
|
||||
*/
|
||||
static function GetSetAsHTMLSpreadsheet(DBObjectSet $oSet, $aParams = array())
|
||||
{
|
||||
$aFields = null;
|
||||
if (isset($aParams['fields']) && (strlen($aParams['fields']) > 0))
|
||||
{
|
||||
$aFields = explode(',', $aParams['fields']);
|
||||
}
|
||||
|
||||
$aList = array();
|
||||
|
||||
$oAppContext = new ApplicationContext();
|
||||
$aClasses = $oSet->GetFilter()->GetSelectedClasses();
|
||||
$aAuthorizedClasses = array();
|
||||
foreach($aClasses as $sAlias => $sClassName)
|
||||
{
|
||||
if (UserRights::IsActionAllowed($sClassName, UR_ACTION_READ, $oSet) && (UR_ALLOWED_YES || UR_ALLOWED_DEPENDS))
|
||||
{
|
||||
$aAuthorizedClasses[$sAlias] = $sClassName;
|
||||
}
|
||||
}
|
||||
$aAttribs = array();
|
||||
$aHeader = array();
|
||||
foreach($aAuthorizedClasses as $sAlias => $sClassName)
|
||||
{
|
||||
$aList[$sAlias] = array();
|
||||
|
||||
foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode => $oAttDef)
|
||||
{
|
||||
if (is_null($aFields) || (count($aFields) == 0))
|
||||
{
|
||||
// Standard list of attributes (no link sets)
|
||||
if ($oAttDef->IsScalar() && ($oAttDef->IsWritable() || $oAttDef->IsExternalField()))
|
||||
{
|
||||
$aList[$sAlias][$sAttCode] = $oAttDef;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// User defined list of attributes
|
||||
if (in_array($sAttCode, $aFields) || in_array($sAlias.'.'.$sAttCode, $aFields))
|
||||
{
|
||||
$aList[$sAlias][$sAttCode] = $oAttDef;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Replace external key by the corresponding friendly name (if not already in the list)
|
||||
foreach($aList[$sAlias] as $sAttCode => $oAttDef)
|
||||
{
|
||||
if ($oAttDef->IsExternalKey())
|
||||
{
|
||||
unset($aList[$sAlias][$sAttCode]);
|
||||
$sFriendlyNameAttCode = $sAttCode.'_friendlyname';
|
||||
if (!array_key_exists($sFriendlyNameAttCode, $aList[$sAlias]) && MetaModel::IsValidAttCode($sClassName, $sFriendlyNameAttCode))
|
||||
{
|
||||
$oFriendlyNameAtt = MetaModel::GetAttributeDef($sClassName, $sFriendlyNameAttCode);
|
||||
$aList[$sAlias][$sFriendlyNameAttCode] = $oFriendlyNameAtt;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach($aList[$sAlias] as $sAttCode => $oAttDef)
|
||||
{
|
||||
if ($oAttDef->IsExternalField())
|
||||
{
|
||||
$sExtKeyLabel = MetaModel::GetLabel($sClassName, $oAttDef->GetKeyAttCode());
|
||||
$oExtKeyAttDef = MetaModel::GetAttributeDef($sClassName, $oAttDef->GetKeyAttCode());
|
||||
$sRemoteAttLabel = MetaModel::GetLabel($oAttDef->GetTargetClass(), $oAttDef->GetExtAttCode());
|
||||
$oTargetAttDef = MetaModel::GetAttributeDef($oAttDef->GetTargetClass(), $oAttDef->GetExtAttCode());
|
||||
$sSuffix = '';
|
||||
if ($oTargetAttDef->IsExternalKey())
|
||||
{
|
||||
$sSuffix = '->id';
|
||||
}
|
||||
$sColLabel = $sExtKeyLabel.'->'.$sRemoteAttLabel.$sSuffix;
|
||||
}
|
||||
else
|
||||
{
|
||||
$sColLabel = MetaModel::GetLabel($sClassName, $sAttCode);
|
||||
}
|
||||
$oFinalAttDef = $oAttDef->GetFinalAttDef();
|
||||
if (get_class($oFinalAttDef) == 'AttributeDateTime')
|
||||
{
|
||||
$aHeader[] = $sColLabel.' ('.Dict::S('UI:SplitDateTime-Date').')';
|
||||
$aHeader[] = $sColLabel.' ('.Dict::S('UI:SplitDateTime-Time').')';
|
||||
}
|
||||
else
|
||||
{
|
||||
$aHeader[] = $sColLabel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$sHtml = "<table border=\"1\">\n";
|
||||
$sHtml .= "<tr>\n";
|
||||
$sHtml .= "<td>".implode("</td><td>", $aHeader)."</td>\n";
|
||||
$sHtml .= "</tr>\n";
|
||||
$oSet->Seek(0);
|
||||
while ($aObjects = $oSet->FetchAssoc())
|
||||
{
|
||||
$aRow = array();
|
||||
foreach($aAuthorizedClasses as $sAlias => $sClassName)
|
||||
{
|
||||
$oObj = $aObjects[$sAlias];
|
||||
foreach($aList[$sAlias] as $sAttCode => $oAttDef)
|
||||
{
|
||||
if (is_null($oObj))
|
||||
{
|
||||
$aRow[] = '<td></td>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$oFinalAttDef = $oAttDef->GetFinalAttDef();
|
||||
if (get_class($oFinalAttDef) == 'AttributeDateTime')
|
||||
{
|
||||
$iDate = AttributeDateTime::GetAsUnixSeconds($oObj->Get($sAttCode));
|
||||
$aRow[] = '<td>'.date('Y-m-d', $iDate).'</td>';
|
||||
$aRow[] = '<td>'.date('h:i:s', $iDate).'</td>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$aRow[] = '<td>'.(string) $oObj->Get($sAttCode).'</td>';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$sHtml .= implode("\n", $aRow);
|
||||
$sHtml .= "</tr>\n";
|
||||
}
|
||||
$sHtml .= "</table>\n";
|
||||
|
||||
return $sHtml;
|
||||
}
|
||||
|
||||
static function DisplaySetAsXML(WebPage $oPage, CMDBObjectSet $oSet, $aParams = array())
|
||||
{
|
||||
$oAppContext = new ApplicationContext();
|
||||
@@ -1186,7 +1396,7 @@ EOF
|
||||
}
|
||||
$aAttribs = array();
|
||||
$aList = array();
|
||||
$aList[$sClassName] = MetaModel::GetZListItems($sClassName, 'details');
|
||||
$aList[$sAlias] = MetaModel::GetZListItems($sClassName, 'details');
|
||||
$oPage->add("<Set>\n");
|
||||
$oSet->Seek(0);
|
||||
while ($aObjects = $oSet->FetchAssoc())
|
||||
@@ -1305,12 +1515,14 @@ EOF
|
||||
$aMapCriteria[$aCriteria['filtercode']][] = array('value' => $aCriteria['value'], 'opcode' => $aCriteria['opcode']);
|
||||
}
|
||||
$aList = MetaModel::GetZListItems($sClassName, 'standard_search');
|
||||
$aConsts = $oSet->ListConstantFields(); // Some fields are constants based on the query/context
|
||||
$sClassAlias = $oSet->GetFilter()->GetClassAlias();
|
||||
foreach($aList as $sFilterCode)
|
||||
{
|
||||
//$oAppContext->Reset($sFilterCode); // Make sure the same parameter will not be passed twice
|
||||
$sHtml .= '<span style="white-space: nowrap;padding:5px;display:inline-block;">';
|
||||
$sFilterValue = '';
|
||||
$sFilterValue = utils::ReadParam($sFilterCode, '', false, 'raw_data');
|
||||
$sFilterValue = isset($aConsts[$sClassAlias][$sFilterCode]) ? $aConsts[$sClassAlias][$sFilterCode] : '';
|
||||
$sFilterValue = utils::ReadParam($sFilterCode, $sFilterValue, false, 'raw_data');
|
||||
$sFilterOpCode = null; // Use the default 'loose' OpCode
|
||||
if (empty($sFilterValue))
|
||||
{
|
||||
@@ -1507,6 +1719,7 @@ EOF
|
||||
$sHTMLValue = "<input title=\"$sHelpText\" type=\"password\" size=\"30\" name=\"attr_{$sFieldPrefix}{$sAttCode}{$sNameSuffix}\" value=\"".htmlentities($value, ENT_QUOTES, 'UTF-8')."\" id=\"$iId\"/> {$sValidationField}";
|
||||
break;
|
||||
|
||||
case 'OQLExpression':
|
||||
case 'Text':
|
||||
$aEventsList[] ='validate';
|
||||
$aEventsList[] ='keyup';
|
||||
@@ -1528,7 +1741,21 @@ EOF
|
||||
{
|
||||
$sStyle = 'style="'.implode('; ', $aStyles).'"';
|
||||
}
|
||||
$sHTMLValue = "<table><tr><td><textarea class=\"resizable\" title=\"$sHelpText\" name=\"attr_{$sFieldPrefix}{$sAttCode}{$sNameSuffix}\" rows=\"8\" cols=\"40\" id=\"$iId\" $sStyle>".htmlentities($sEditValue, ENT_QUOTES, 'UTF-8')."</textarea></td><td>{$sValidationField}</td></tr></table>";
|
||||
if ($oAttDef->GetEditClass() == 'OQLExpression')
|
||||
{
|
||||
$sTestResId = 'query_res_'.$sFieldPrefix.$sAttCode.$sNameSuffix; //$oPage->GetUniqueId();
|
||||
$sBaseUrl = utils::GetAbsoluteUrlAppRoot().'pages/run_query.php?expression=';
|
||||
$sInitialUrl = $sBaseUrl.urlencode($sEditValue);
|
||||
$sAdditionalStuff = "<a id=\"$sTestResId\" target=\"_blank\" href=\"$sInitialUrl\">".Dict::S('UI:Edit:TestQuery')."</a>";
|
||||
$oPage->add_ready_script("$('#$iId').bind('change keyup', function(evt, sFormId) { $('#$sTestResId').attr('href', '$sBaseUrl'+encodeURIComponent($(this).val())); } );");
|
||||
}
|
||||
else
|
||||
{
|
||||
$sAdditionalStuff = "";
|
||||
}
|
||||
// Ok, the text area is drawn here
|
||||
$sHTMLValue = "<table><tr><td><textarea class=\"resizable\" title=\"$sHelpText\" name=\"attr_{$sFieldPrefix}{$sAttCode}{$sNameSuffix}\" rows=\"8\" cols=\"40\" id=\"$iId\" $sStyle>".htmlentities($sEditValue, ENT_QUOTES, 'UTF-8')."</textarea>$sAdditionalStuff</td><td>{$sValidationField}</td></tr></table>";
|
||||
|
||||
break;
|
||||
|
||||
case 'CaseLog':
|
||||
@@ -1565,8 +1792,9 @@ EOF
|
||||
case 'LinkedSet':
|
||||
$aEventsList[] ='validate';
|
||||
$aEventsList[] ='change';
|
||||
$oWidget = new UILinksWidget($sClass, $sAttCode, $iId, $sNameSuffix, $oAttDef->DuplicatesAllowed());
|
||||
$sHTMLValue = $oWidget->Display($oPage, $value);
|
||||
$oWidget = new UILinksWidget($sClass, $sAttCode, $iId, $sNameSuffix, $oAttDef->DuplicatesAllowed(), $aArgs);
|
||||
$oObj = isset($aArgs['this']) ? $aArgs['this'] : null;
|
||||
$sHTMLValue = $oWidget->Display($oPage, $value, array(), $sFormPrefix, $oObj);
|
||||
break;
|
||||
|
||||
case 'Document':
|
||||
@@ -1606,7 +1834,7 @@ EOF
|
||||
$aExtKeyParams = $aArgs;
|
||||
$aExtKeyParams['iFieldSize'] = $oAttDef->GetMaxSize();
|
||||
$aExtKeyParams['iMinChars'] = $oAttDef->GetMinAutoCompleteChars();
|
||||
$sHTMLValue = UIExtKeyWidget::DisplayFromAttCode($oPage, $sAttCode, $sClass, $oAttDef->GetLabel(), $oAllowedValues, $value, $iId, $bMandatory, $sFieldName, $sFormPrefix, $aArgs);
|
||||
$sHTMLValue = UIExtKeyWidget::DisplayFromAttCode($oPage, $sAttCode, $sClass, $oAttDef->GetLabel(), $oAllowedValues, $value, $iId, $bMandatory, $sFieldName, $sFormPrefix, $aExtKeyParams);
|
||||
$sHTMLValue .= "<!-- iFlags: $iFlags bMandatory: $bMandatory -->\n";
|
||||
break;
|
||||
|
||||
@@ -1733,7 +1961,7 @@ EOF
|
||||
if ($iKey > 0)
|
||||
{
|
||||
// The object already exists in the database, it's a modification
|
||||
$sButtons = "<input type=\"hidden\" name=\"id\" value=\"$iKey\">\n";
|
||||
$sButtons = "<input id=\"{$sPrefix}_id\" type=\"hidden\" name=\"id\" value=\"$iKey\">\n";
|
||||
$sButtons .= "<input type=\"hidden\" name=\"operation\" value=\"{$sOperation}\">\n";
|
||||
$sButtons .= "<button type=\"button\" class=\"action cancel\"><span>".Dict::S('UI:Button:Cancel')."</span></button> \n";
|
||||
$sButtons .= "<button type=\"submit\" class=\"action\"><span>{$sApplyButton}</span></button>\n";
|
||||
@@ -1819,6 +2047,10 @@ EOF
|
||||
$oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
|
||||
|
||||
$aFieldsMap = $this->DisplayBareProperties($oPage, true, $sPrefix, $aExtraParams);
|
||||
if ($iKey > 0)
|
||||
{
|
||||
$aFieldsMap['id'] = $sPrefix.'_id';
|
||||
}
|
||||
// Now display the relations, one tab per relation
|
||||
if (!isset($aExtraParams['noRelations']))
|
||||
{
|
||||
|
||||
@@ -1107,7 +1107,7 @@ class MenuBlock extends DisplayBlock
|
||||
if (count($aTransitions))
|
||||
{
|
||||
$this->AddMenuSeparator($aActions);
|
||||
$aStimuli = Metamodel::EnumStimuli($sClass);
|
||||
$aStimuli = Metamodel::EnumStimuli(get_class($oObj));
|
||||
foreach($aTransitions as $sStimulusCode => $aTransitionDef)
|
||||
{
|
||||
$iActionAllowed = (get_class($aStimuli[$sStimulusCode]) == 'StimulusUserAction') ? UserRights::IsStimulusAllowed($sClass, $sStimulusCode, $oSet) : UR_ALLOWED_NO;
|
||||
|
||||
@@ -146,7 +146,12 @@ class iTopWebPage extends NiceWebPage
|
||||
// that the tabs aren't changed on click, and any custom event name can be
|
||||
// specified. Note that if you define a callback for the 'select' event, it
|
||||
// will be executed for the selected tab whenever the hash changes.
|
||||
tabs.tabs({ event: 'change'});
|
||||
tabs.tabs({ event: 'change', 'show': function(event, ui) {
|
||||
$('.resizable', ui.panel).resizable(); // Make resizable everything that claims to be resizable !
|
||||
}
|
||||
});
|
||||
|
||||
$('.resizable').filter(':visible').resizable();
|
||||
}
|
||||
catch(err)
|
||||
{
|
||||
@@ -198,7 +203,6 @@ EOF
|
||||
}
|
||||
});
|
||||
|
||||
$('.resizable').resizable(); // Make resizable everything that claims to be resizable !
|
||||
// Adjust initial size
|
||||
$('.v-resizable').each( function()
|
||||
{
|
||||
@@ -403,6 +407,11 @@ EOF
|
||||
return '$sAbsURLAppRoot';
|
||||
}
|
||||
|
||||
function GetAbsoluteUrlModulesRoot()
|
||||
{
|
||||
return '$sAbsURLAppRoot'+'modules/';
|
||||
}
|
||||
|
||||
function AddAppContext(sURL)
|
||||
{
|
||||
var sContext = '$sAppContext';
|
||||
@@ -515,7 +524,7 @@ EOF
|
||||
*/
|
||||
$sFavoriteOrgs = '';
|
||||
$oWidget = new UIExtKeyWidget('Organization', 'org_id');
|
||||
$sHtml .= $oWidget->Display($this, 50, false, '', $oSet, $iCurrentOrganization, 'org_id', false, 'c[org_id]', '', array('iFieldSize' => 20, 'sDefaultValue' => Dict::S('UI:AllOrganizations')), $bSearchMode = true);
|
||||
$sHtml .= $oWidget->Display($this, 50, false, '', $oSet, $iCurrentOrganization, 'org_id', false, 'c[org_id]', '', array('iFieldSize' => 20, 'iMinChars' => MetaModel::GetConfig()->Get('min_autocomplete_chars'), 'sDefaultValue' => Dict::S('UI:AllOrganizations')), $bSearchMode = true);
|
||||
$this->add_ready_script('$("#org_id").bind("extkeychange", function() { $("#SiloSelection form").submit(); } )');
|
||||
$this->add_ready_script("$('#label_org_id').click( function() { $(this).val(''); $('#org_id').val(''); return true; } );\n");
|
||||
// Add other dimensions/context information to this form
|
||||
@@ -589,13 +598,13 @@ EOF
|
||||
{
|
||||
// Make sure that the URL to the script contains the application's version number
|
||||
// so that the new script do NOT get reloaded from the cache when the application is upgraded
|
||||
if (strpos('?', $s_script) === false)
|
||||
if (strpos($s_script, '?') === false)
|
||||
{
|
||||
$s_script .= "?version=".ITOP_VERSION;
|
||||
$s_script .= "?itopversion=".ITOP_VERSION;
|
||||
}
|
||||
else
|
||||
{
|
||||
$s_script .= "&version=".ITOP_VERSION;
|
||||
$s_script .= "&itopversion=".ITOP_VERSION;
|
||||
}
|
||||
echo "<script type=\"text/javascript\" src=\"$s_script\"></script>\n";
|
||||
}
|
||||
@@ -624,6 +633,8 @@ EOF
|
||||
echo "</style>\n";
|
||||
}
|
||||
echo "<link rel=\"search\" type=\"application/opensearchdescription+xml\" title=\"iTop\" href=\"".utils::GetAbsoluteUrlAppRoot()."pages/opensearch.xml.php\" />\n";
|
||||
echo "<link rel=\"shortcut icon\" href=\"".utils::GetAbsoluteUrlAppRoot()."images/favicon.ico\" />\n";
|
||||
|
||||
echo "</head>\n";
|
||||
echo "<body>\n";
|
||||
|
||||
|
||||
@@ -29,7 +29,9 @@ require_once(APPROOT."/application/nicewebpage.class.inc.php");
|
||||
*/
|
||||
|
||||
class LoginWebPage extends NiceWebPage
|
||||
{
|
||||
{
|
||||
protected static $m_sLoginFailedMessage = '';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct("iTop Login");
|
||||
@@ -89,6 +91,11 @@ EOF
|
||||
);
|
||||
}
|
||||
|
||||
public static function SetLoginFailedMessage($sMessage)
|
||||
{
|
||||
self::$m_sLoginFailedMessage = $sMessage;
|
||||
}
|
||||
|
||||
public function DisplayLoginForm($sLoginType, $bFailedLogin = false)
|
||||
{
|
||||
switch($sLoginType)
|
||||
@@ -119,7 +126,14 @@ EOF
|
||||
$this->add("<h1>".Dict::S('UI:Login:Welcome')."</h1>\n");
|
||||
if ($bFailedLogin)
|
||||
{
|
||||
$this->add("<p class=\"hilite\">".Dict::S('UI:Login:IncorrectLoginPassword')."</p>\n");
|
||||
if (self::$m_sLoginFailedMessage != '')
|
||||
{
|
||||
$this->add("<p class=\"hilite\">".self::$m_sLoginFailedMessage."</p>\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->add("<p class=\"hilite\">".Dict::S('UI:Login:IncorrectLoginPassword')."</p>\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -133,6 +147,7 @@ EOF
|
||||
$this->add("</table>\n");
|
||||
$this->add("<input type=\"hidden\" name=\"loginop\" value=\"login\" />\n");
|
||||
$this->add("</form>\n");
|
||||
$this->add(Dict::S('UI:Login:About'));
|
||||
$this->add("</div>\n");
|
||||
break;
|
||||
}
|
||||
@@ -250,77 +265,17 @@ EOF
|
||||
// check CAS authentication
|
||||
if (phpCAS::isAuthenticated())
|
||||
{
|
||||
// Check is a membership is required
|
||||
$sCASMemberships = MetaModel::GetConfig()->Get('cas_memberof');
|
||||
$bFound = false;
|
||||
if (!empty($sCASMemberships))
|
||||
{
|
||||
if (phpCAS::hasAttribute('memberOf'))
|
||||
{
|
||||
// A list of groups is specified, the user must a be member of (at least) one of them to pass
|
||||
$aCASMemberships = array();
|
||||
$aTmp = explode(';', $sCASMemberships);
|
||||
setlocale(LC_ALL, "en_US.utf8"); // !!! WARNING: this is needed to have the iconv //TRANSLIT working fine below !!!
|
||||
foreach($aTmp as $sGroupName)
|
||||
{
|
||||
$aCASMemberships[] = trim(iconv('UTF-8', 'ASCII//TRANSLIT', $sGroupName)); // Just in case remove accents and spaces...
|
||||
}
|
||||
|
||||
$aMemberOf = phpCAS::getAttribute('memberOf');
|
||||
if (!is_array($aMemberOf)) $aMemberOf = array($aMemberOf); // Just one entry, turn it into an array
|
||||
$aFilteredGroupNames = array();
|
||||
foreach($aMemberOf as $sGroupName)
|
||||
{
|
||||
$sGroupName = trim(iconv('UTF-8', 'ASCII//TRANSLIT', $sGroupName)); // Remove accents and spaces as well
|
||||
$aFilteredGroupNames[] = $sGroupName;
|
||||
if (in_array($sGroupName, $aCASMemberships))
|
||||
{
|
||||
$bFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!$bFound)
|
||||
{
|
||||
phpCAS :: log("User ".phpCAS::getUser().", none of his/her groups (".implode('; ', $aFilteredGroupNames).") match any of the required groups: ".implode('; ', $aCASMemberships));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Too bad, the user is not part of any of the group => not allowed
|
||||
phpCAS :: log("No 'memberOf' attribute found for user ".phpCAS::getUser().". Are you using the SAML protocol (S1) ?");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// No membership required, anybody will pass
|
||||
$bFound = true;
|
||||
}
|
||||
|
||||
if ($bFound)
|
||||
{
|
||||
$sAuthUser = phpCAS::getUser();
|
||||
$sAuthPwd = '';
|
||||
$sLoginMode = 'cas';
|
||||
$sAuthentication = 'external';
|
||||
}
|
||||
else
|
||||
{
|
||||
// The user is not part of the allowed groups, => log out
|
||||
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php';
|
||||
$sCASLogoutUrl = MetaModel::GetConfig()->Get('cas_logout_redirect_service');
|
||||
if (empty($sCASLogoutUrl))
|
||||
{
|
||||
$sCASLogoutUrl = $sUrl;
|
||||
}
|
||||
phpCAS::logoutWithRedirectService($sCASLogoutUrl); // Redirects to the CAS logout page
|
||||
}
|
||||
$sAuthUser = phpCAS::getUser();
|
||||
$sAuthPwd = '';
|
||||
$sLoginMode = 'cas';
|
||||
$sAuthentication = 'external';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'form':
|
||||
// iTop standard mode: form based authentication
|
||||
$sAuthUser = utils::ReadPostedParam('auth_user', '', 'raw_data');
|
||||
$sAuthPwd = utils::ReadPostedParam('auth_pwd', '', 'raw_data');
|
||||
$sAuthUser = utils::ReadPostedParam('auth_user', '', false, 'raw_data');
|
||||
$sAuthPwd = utils::ReadPostedParam('auth_pwd', '', false, 'raw_data');
|
||||
if ($sAuthUser != '')
|
||||
{
|
||||
$sLoginMode = 'form';
|
||||
@@ -359,9 +314,9 @@ EOF
|
||||
case 'url':
|
||||
// Credentials passed directly in the url
|
||||
$sAuthUser = utils::ReadParam('auth_user', '', false, 'raw_data');
|
||||
if ($sAuthUser != '')
|
||||
$sAuthPwd = utils::ReadParam('auth_pwd', null, false, 'raw_data');
|
||||
if (($sAuthUser != '') && ($sAuthPwd != null))
|
||||
{
|
||||
$sAuthPwd = utils::ReadParam('auth_pwd', '', false, 'raw_data');
|
||||
$sLoginMode = 'url';
|
||||
}
|
||||
break;
|
||||
@@ -388,7 +343,7 @@ EOF
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!UserRights::CheckCredentials($sAuthUser, $sAuthPwd, $sAuthentication))
|
||||
if (!UserRights::CheckCredentials($sAuthUser, $sAuthPwd, $sLoginMode, $sAuthentication))
|
||||
{
|
||||
//echo "Check Credentials returned false for user $sAuthUser!";
|
||||
self::ResetSession();
|
||||
@@ -469,8 +424,8 @@ EOF
|
||||
{
|
||||
$sAuthUser = $_SESSION['auth_user'];
|
||||
UserRights::Login($sAuthUser); // Set the user's language
|
||||
$sOldPwd = utils::ReadPostedParam('old_pwd', 'raw_data');
|
||||
$sNewPwd = utils::ReadPostedParam('new_pwd', 'raw_data');
|
||||
$sOldPwd = utils::ReadPostedParam('old_pwd', '', false, 'raw_data');
|
||||
$sNewPwd = utils::ReadPostedParam('new_pwd', '', false, 'raw_data');
|
||||
if (UserRights::CanChangePassword() && ((!UserRights::CheckCredentials($sAuthUser, $sOldPwd)) || (!UserRights::ChangePassword($sOldPwd, $sNewPwd))))
|
||||
{
|
||||
$oPage = new LoginWebPage();
|
||||
@@ -497,7 +452,6 @@ EOF
|
||||
header('Location: '.utils::GetAbsoluteUrlAppRoot().'portal/index.php');
|
||||
}
|
||||
return $sMessage;
|
||||
}
|
||||
|
||||
}
|
||||
} // End of class
|
||||
?>
|
||||
|
||||
@@ -104,6 +104,11 @@ class ApplicationMenu
|
||||
self::$aMenusIndex[$iParentIndex]['children'][] = array ('rank' => $fRank, 'index' => $index);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// the menu already exists, let's combine the conditions that make it visible
|
||||
self::$aMenusIndex[$index]['node']->AddCondition($oMenuNode);
|
||||
}
|
||||
return $index;
|
||||
}
|
||||
|
||||
@@ -287,22 +292,22 @@ abstract class MenuNode
|
||||
/**
|
||||
* Class of objects to check if the menu is enabled, null if none
|
||||
*/
|
||||
protected $m_sEnableClass;
|
||||
protected $m_aEnableClasses;
|
||||
|
||||
/**
|
||||
* User Rights Action code to check if the menu is enabled, null if none
|
||||
*/
|
||||
protected $m_iEnableAction;
|
||||
protected $m_aEnableActions;
|
||||
|
||||
/**
|
||||
* User Rights allowed results (actually a bitmask) to check if the menu is enabled, null if none
|
||||
*/
|
||||
protected $m_iEnableActionResults;
|
||||
protected $m_aEnableActionResults;
|
||||
|
||||
/**
|
||||
* Stimulus to check: if the user can 'apply' this stimulus, then she/he can see this menu
|
||||
*/
|
||||
protected $m_sEnableStimulus;
|
||||
protected $m_aEnableStimuli;
|
||||
|
||||
/**
|
||||
* Create a menu item, sets the condition to have it displayed and inserts it into the application's main menu
|
||||
@@ -318,10 +323,10 @@ abstract class MenuNode
|
||||
public function __construct($sMenuId, $iParentIndex = -1, $fRank = 0, $sEnableClass = null, $iActionCode = null, $iAllowedResults = UR_ALLOWED_YES, $sEnableStimulus = null)
|
||||
{
|
||||
$this->sMenuId = $sMenuId;
|
||||
$this->m_sEnableClass = $sEnableClass;
|
||||
$this->m_iEnableAction = $iActionCode;
|
||||
$this->m_iEnableActionResults = $iAllowedResults;
|
||||
$this->m_sEnableStimulus = $sEnableStimulus;
|
||||
$this->m_aEnableClasses = array($sEnableClass);
|
||||
$this->m_aEnableActions = array($iActionCode);
|
||||
$this->m_aEnableActionResults = array($iAllowedResults);
|
||||
$this->m_aEnableStimuli = array($sEnableStimulus);
|
||||
$this->index = ApplicationMenu::InsertMenu($this, $iParentIndex, $fRank);
|
||||
}
|
||||
|
||||
@@ -351,38 +356,54 @@ abstract class MenuNode
|
||||
return $this->AddParams(utils::GetAbsoluteUrlAppRoot().'pages/UI.php', $aExtraParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a limiting display condition for the same menu node. The conditions will be combined with a AND
|
||||
* @param $oMenuNode MenuNode Another definition of the same menu node, with potentially different access restriction
|
||||
* @return void
|
||||
*/
|
||||
public function AddCondition(MenuNode $oMenuNode)
|
||||
{
|
||||
foreach($oMenuNode->m_aEnableClasses as $index => $sClass )
|
||||
{
|
||||
$this->m_aEnableClasses[] = $sClass;
|
||||
$this->m_aEnableActions[] = $oMenuNode->m_aEnableActions[$index];
|
||||
$this->m_aEnableActionResults[] = $oMenuNode->m_aEnableActionResults[$index];
|
||||
$this->m_aEnableStimuli[] = $oMenuNode->m_aEnableStimuli[$index];
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Tells whether the menu is enabled (i.e. displayed) for the current user
|
||||
* @return bool True if enabled, false otherwise
|
||||
*/
|
||||
public function IsEnabled()
|
||||
{
|
||||
if ($this->m_sEnableClass != null)
|
||||
foreach($this->m_aEnableClasses as $index => $sClass)
|
||||
{
|
||||
if (MetaModel::IsValidClass($this->m_sEnableClass))
|
||||
if ($sClass != null)
|
||||
{
|
||||
if ($this->m_sEnableStimulus != null)
|
||||
if (MetaModel::IsValidClass($sClass))
|
||||
{
|
||||
if (!UserRights::IsStimulusAllowed($this->m_sEnableClass, $this->m_sEnableStimulus))
|
||||
if ($this->m_aEnableStimuli[$index] != null)
|
||||
{
|
||||
return false;
|
||||
if (!UserRights::IsStimulusAllowed($sClass, $this->m_aEnableStimuli[$index]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if ($this->m_aEnableActions[$index] != null)
|
||||
{
|
||||
$iResult = UserRights::IsActionAllowed($sClass, $this->m_aEnableActions[$index]);
|
||||
if (!($iResult & $this->m_aEnableActionResults[$index]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($this->m_iEnableAction != null)
|
||||
else
|
||||
{
|
||||
$iResult = UserRights::IsActionAllowed($this->m_sEnableClass, $this->m_iEnableAction);
|
||||
if (($iResult & $this->m_iEnableActionResults))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
107
application/query.class.inc.php
Normal file
107
application/query.class.inc.php
Normal file
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Persistent class Event and derived
|
||||
* Application internal events
|
||||
* There is also a file log
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
abstract class Query extends cmdbAbstractObject
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb,view_in_gui,application",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "name",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_query",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "realclass",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
//MetaModel::Init_InheritAttributes();
|
||||
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeText("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
|
||||
MetaModel::Init_AddAttribute(new AttributeString("fields", array("allowed_values"=>null, "sql"=>"fields", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('name', 'description', 'fields')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('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
|
||||
}
|
||||
}
|
||||
|
||||
class QueryOQL extends Query
|
||||
{
|
||||
public static function Init()
|
||||
{
|
||||
$aParams = array
|
||||
(
|
||||
"category" => "core/cmdb,view_in_gui,application",
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "name",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"db_table" => "priv_query_oql",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
"display_template" => "",
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_InheritAttributes();
|
||||
MetaModel::Init_AddAttribute(new AttributeOQL("oql", array("allowed_values"=>null, "sql"=>"oql", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('name', 'description', 'oql', 'fields')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('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 DisplayBareProperties(WebPage $oPage, $bEditMode = false, $sPrefix = '', $aExtraParams = array())
|
||||
{
|
||||
parent::DisplayBareProperties($oPage, $bEditMode, $sPrefix, $aExtraParams);
|
||||
|
||||
if (!$bEditMode)
|
||||
{
|
||||
$sUrl = utils::GetAbsoluteUrlAppRoot().'webservices/export.php?format=spreadsheet&login_mode=basic&query='.$this->GetKey();
|
||||
$sOql = $this->Get('oql');
|
||||
$oSearch = DBObjectSearch::FromOQL($sOql);
|
||||
$aParameters = $oSearch->GetQueryParams();
|
||||
foreach($aParameters as $sParam => $val)
|
||||
{
|
||||
$sUrl .= '&arg_'.$sParam.'=["'.$sParam.'"]';
|
||||
}
|
||||
$oPage->p(Dict::S('UI:Query:UrlForExcel').':<br/><textarea cols="80" rows="3" READONLY>'.$sUrl.'</textarea>');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -40,13 +40,15 @@ class SqlBlock
|
||||
protected $m_aColumns;
|
||||
protected $m_sTitle;
|
||||
protected $m_sType;
|
||||
protected $m_aParams;
|
||||
|
||||
public function __construct($sQuery, $aColumns, $sTitle, $sType)
|
||||
public function __construct($sQuery, $aColumns, $sTitle, $sType, $aParams = array())
|
||||
{
|
||||
$this->m_sQuery = $sQuery;
|
||||
$this->m_aColumns = $aColumns;
|
||||
$this->m_sTitle = $sTitle;
|
||||
$this->m_sType = $sType;
|
||||
$this->m_aParams = $aParams;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -54,9 +56,14 @@ class SqlBlock
|
||||
/*
|
||||
*
|
||||
* <sqlblock>
|
||||
* <sql>SELECT date_format(start_date, '%d') AS Date, count(*) AS Count FROM ticket WHERE DATE_SUB(NOW(), INTERVAL 15 DAY) < start_date AND finalclass = 'UserIssue' GROUP BY date_format(start_date, '%d')</sql>
|
||||
* <sql>SELECT date_format(start_date, '%d') AS Date, count(*) AS Count FROM ticket WHERE DATE_SUB(NOW(), INTERVAL 15 DAY) < start_date AND finalclass = 'UserIssue' GROUP BY date_format(start_date, '%d') AND $CONDITION(param1, ticket.org_id)$</sql>
|
||||
* <type>table</type>
|
||||
* <title>UserRequest:Overview-Title</title>
|
||||
* <parameter>
|
||||
* <name>param1</name>
|
||||
* <type>context</type>
|
||||
* <mapping>org_id</mapping>
|
||||
* </parameter>
|
||||
* <column>
|
||||
* <name>Date</name>
|
||||
* <label>UserRequest:Overview-Date</label>
|
||||
@@ -73,6 +80,11 @@ class SqlBlock
|
||||
* - sql: a (My)SQL query. Do not forget to use html entities (e.g. < for <)
|
||||
* - type: table (default), bars or pie. If bars or pie is selected only the two first columns are taken into account.
|
||||
* - title: optional title, typed in clear or given as a dictionnary entry
|
||||
* - parameter: specifies how to map the context parameters (namely org_id) to a given named parameter in the query.
|
||||
* The expression $CONDITION(<param_name>, <sql_column_name>) will be automatically replaced by:
|
||||
* either the string "1" if there is no restriction on the organisation in iTop
|
||||
* or the string "(<sql_column_name>=<value_of_org_id>)" if there is a limitation to one organizations in iTop
|
||||
* or the string "(<sql_column_name> IN (<values_of_org_id>))" if there is a limitation to a given set of organizations in iTop
|
||||
* - column: specification of a column (not displayed if omitted)
|
||||
* - column / name: name of the column in the SQL query (use aliases)
|
||||
* - column / label: label, typed in clear or given as a dictionnary entry
|
||||
@@ -144,8 +156,96 @@ class SqlBlock
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new SqlBlock($sQuery, $aColumns, $sTitle, $sType);
|
||||
$aParams = array();
|
||||
if (isset($oXml->parameter))
|
||||
{
|
||||
foreach ($oXml->parameter AS $oParamData)
|
||||
{
|
||||
if (!isset($oParamData->name))
|
||||
{
|
||||
throw new Exception("Missing tag 'name' for parameter in sqlblock/column");
|
||||
}
|
||||
$sName = (string) $oParamData->name;
|
||||
if (strlen($sName) == 0)
|
||||
{
|
||||
throw new Exception("Empty tag 'name' for parameter in sqlblock/column");
|
||||
}
|
||||
if (!isset($oParamData->mapping))
|
||||
{
|
||||
throw new Exception("Missing tag 'mapping' for parameter in sqlblock/column");
|
||||
}
|
||||
$sMapping = (string) $oParamData->mapping;
|
||||
if (strlen($sMapping) == 0)
|
||||
{
|
||||
throw new Exception("Empty tag 'mapping' for parameter in sqlblock/column");
|
||||
}
|
||||
|
||||
if (isset($oParamData->type))
|
||||
{
|
||||
$sParamType = $oParamData->type;
|
||||
}
|
||||
else
|
||||
{
|
||||
$sParamType = 'context';
|
||||
}
|
||||
$aParams[$sName] = array('mapping' => $sMapping, 'type' => $sParamType);
|
||||
}
|
||||
}
|
||||
|
||||
return new SqlBlock($sQuery, $aColumns, $sTitle, $sType, $aParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies the defined parameters into the SQL query
|
||||
* @return string the SQL query to execute
|
||||
*/
|
||||
public function BuildQuery()
|
||||
{
|
||||
$oAppContext = new ApplicationContext();
|
||||
$sQuery = $this->m_sQuery;
|
||||
$sQuery = str_replace('$DB_PREFIX$', MetaModel::GetConfig()->GetDBSubname(), $sQuery); // put the tables DB prefix (if any)
|
||||
foreach($this->m_aParams as $sName => $aParam)
|
||||
{
|
||||
if ($aParam['type'] == 'context')
|
||||
{
|
||||
$sSearchPattern = '/\$CONDITION\('.$sName.',([^\)]+)\)\$/';
|
||||
$value = $oAppContext->GetCurrentValue($aParam['mapping']);
|
||||
if (empty($value))
|
||||
{
|
||||
$sSQLExpr = '(1)';
|
||||
}
|
||||
else
|
||||
{
|
||||
// Special case for managing the hierarchy of organizations
|
||||
if (($aParam['mapping'] == 'org_id') && ( MetaModel::IsValidClass('Organization')))
|
||||
{
|
||||
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass('Organization');
|
||||
if ($sHierarchicalKeyCode != false)
|
||||
{
|
||||
// organizations are in hierarchy... gather all the orgs below the given one...
|
||||
$sOQL = "SELECT Organization AS node JOIN Organization AS root ON node.$sHierarchicalKeyCode BELOW root.id WHERE root.id = :value";
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL), array(), array('value' => $value));
|
||||
$aOrgIds = array();
|
||||
while($oOrg = $oSet->Fetch())
|
||||
{
|
||||
$aOrgIds[]= $oOrg->GetKey();
|
||||
}
|
||||
$sSQLExpr = '($1 IN('.implode(',', $aOrgIds).'))';
|
||||
}
|
||||
else
|
||||
{
|
||||
$sSQLExpr = '($1 = '.CMDBSource::Quote($value).')';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sSQLExpr = '($1 = '.CMDBSource::Quote($value).')';
|
||||
}
|
||||
}
|
||||
$sQuery = preg_replace($sSearchPattern, $sSQLExpr, $sQuery);
|
||||
}
|
||||
}
|
||||
return $sQuery;
|
||||
}
|
||||
|
||||
public function RenderContent(WebPage $oPage, $aExtraParams = array())
|
||||
@@ -160,7 +260,8 @@ class SqlBlock
|
||||
}
|
||||
// $oPage->add($this->GetRenderContent($oPage, $aExtraParams, $sId));
|
||||
|
||||
$res = CMDBSource::Query($this->m_sQuery);
|
||||
$sQuery = $this->BuildQuery();
|
||||
$res = CMDBSource::Query($sQuery);
|
||||
$aQueryCols = CMDBSource::GetColumns($res);
|
||||
|
||||
// Prepare column definitions (check + give default values)
|
||||
|
||||
@@ -65,6 +65,7 @@ class UIExtKeyWidget
|
||||
{
|
||||
protected $iId;
|
||||
protected $sTargetClass;
|
||||
protected $sAttCode;
|
||||
|
||||
//public function __construct($sAttCode, $sClass, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sNameSuffix = '', $sFieldPrefix = '', $sFormPrefix = '')
|
||||
static public function DisplayFromAttCode($oPage, $sAttCode, $sClass, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName = '', $sFormPrefix = '', $aArgs, $bSearchMode = false)
|
||||
@@ -81,14 +82,15 @@ class UIExtKeyWidget
|
||||
{
|
||||
$sDisplayStyle = 'select'; // In search mode, always use a drop-down list
|
||||
}
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
|
||||
return $oWidget->Display($oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName, $sFormPrefix, $aArgs, $bSearchMode, $sDisplayStyle);
|
||||
}
|
||||
|
||||
public function __construct($sTargetClass, $iInputId)
|
||||
public function __construct($sTargetClass, $iInputId, $sAttCode = '')
|
||||
{
|
||||
$this->sTargetClass = $sTargetClass;
|
||||
$this->iId = $iInputId;
|
||||
$this->sAttCode = $sAttCode;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -182,7 +184,7 @@ class UIExtKeyWidget
|
||||
$sHTMLValue .= "</select>\n";
|
||||
$oPage->add_ready_script(
|
||||
<<<EOF
|
||||
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', true, $sWizHelper);
|
||||
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', true, $sWizHelper, '{$this->sAttCode}');
|
||||
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
|
||||
$('#$this->iId').bind('update', function() { oACWidget_{$this->iId}.Update(); } );
|
||||
$('#$this->iId').bind('change', function() { $(this).trigger('extkeychange') } );
|
||||
@@ -217,7 +219,7 @@ EOF
|
||||
// Scripts to start the autocomplete and bind some events to it
|
||||
$oPage->add_ready_script(
|
||||
<<<EOF
|
||||
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', false, $sWizHelper);
|
||||
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', false, $sWizHelper, '{$this->sAttCode}');
|
||||
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
|
||||
$('#label_$this->iId').autocomplete(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', { scroll:true, minChars:{$iMinChars}, autoFill:false, matchContains:true, mustMatch: true, keyHolder:'#{$this->iId}', extraParams:{operation:'ac_extkey', sTargetClass:'{$this->sTargetClass}',sFilter:'$sFilter', json: function() { return $sWizHelperJSON; } }});
|
||||
$('#label_$this->iId').keyup(function() { if ($(this).val() == '') { $('#$this->iId').val(''); } } ); // Useful for search forms: empty value in the "label", means no value, immediatly !
|
||||
@@ -262,13 +264,24 @@ EOF
|
||||
return $sHTMLValue;
|
||||
}
|
||||
|
||||
public function GetSearchDialog(WebPage $oPage, $sTitle)
|
||||
public function GetSearchDialog(WebPage $oPage, $sTitle, $oCurrObject = null)
|
||||
{
|
||||
$sHTML = '<div class="wizContainer" style="vertical-align:top;"><div id="dc_'.$this->iId.'">';
|
||||
|
||||
$oFilter = new DBObjectSearch($this->sTargetClass);
|
||||
$oSet = new CMDBObjectSet($oFilter);
|
||||
$oBlock = new DisplayBlock($oFilter, 'search', false);
|
||||
if ( ($oCurrObject != null) && ($this->sAttCode != ''))
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef(get_class($oCurrObject), $this->sAttCode);
|
||||
$aParams = array('query_params' => array('this' => $oCurrObject));
|
||||
$oSet = $oAttDef->GetAllowedValuesAsObjectSet($aParams);
|
||||
$oFilter = $oSet->GetFilter();
|
||||
}
|
||||
else
|
||||
{
|
||||
$aParam = array();
|
||||
$oFilter = new DBObjectSearch($this->sTargetClass);
|
||||
$oSet = new CMDBObjectSet($oFilter);
|
||||
}
|
||||
$oBlock = new DisplayBlock($oFilter, 'search', false, $aParams);
|
||||
$sHTML .= $oBlock->GetDisplay($oPage, $this->iId, array('open' => true, 'currentId' => $this->iId));
|
||||
$sHTML .= "<form id=\"fr_{$this->iId}\" OnSubmit=\"return oACWidget_{$this->iId}.DoOk();\">\n";
|
||||
$sHTML .= "<div id=\"dr_{$this->iId}\" style=\"vertical-align:top;background: #fff;height:100%;overflow:auto;padding:0;border:0;\">\n";
|
||||
@@ -306,7 +319,7 @@ EOF
|
||||
try
|
||||
{
|
||||
$oFilter = DBObjectSearch::FromOQL($sFilter);
|
||||
$oBlock = new DisplayBlock($oFilter, 'list', false);
|
||||
$oBlock = new DisplayBlock($oFilter, 'list', false, array('query_params' => array('this' => $oObj)));
|
||||
$oBlock->Display($oP, $this->iId.'_results', array('this' => $oObj, 'cssCount'=> '#count_'.$this->iId, 'menu' => false, 'selection_mode' => true, 'selection_type' => 'single')); // Don't display the 'Actions' menu on the results
|
||||
}
|
||||
catch(MissingQueryArgument $e)
|
||||
@@ -315,8 +328,8 @@ EOF
|
||||
// TODO check if we can improve this behavior...
|
||||
$sOQL = 'SELECT '.$sRemoteClass;
|
||||
$oFilter = DBObjectSearch::FromOQL($sOQL);
|
||||
$oBlock = new DisplayBlock($oFilter, 'list', false);
|
||||
$oBlock->Display($oP, $this->iId.'_results', array('cssCount'=> '#count_'.$this->iId, 'menu' => false, 'selection_mode' => true, 'selection_type' => 'single')); // Don't display the 'Actions' menu on the results
|
||||
//$oBlock = new DisplayBlock($oFilter, 'list', false);
|
||||
//$oBlock->Display($oP, $this->iId.'_results', array('cssCount'=> '#count_'.$this->iId, 'menu' => false, 'selection_mode' => true, 'selection_type' => 'single')); // Don't display the 'Actions' menu on the results
|
||||
}
|
||||
}
|
||||
|
||||
@@ -353,7 +366,7 @@ EOF
|
||||
/**
|
||||
* Get the form to create a new object of the 'target' class
|
||||
*/
|
||||
public function GetObjectCreationForm(WebPage $oPage)
|
||||
public function GetObjectCreationForm(WebPage $oPage, $oCurrObject)
|
||||
{
|
||||
// Set all the default values in an object and clone this "default" object
|
||||
$oNewObj = MetaModel::NewObject($this->sTargetClass);
|
||||
@@ -362,7 +375,24 @@ EOF
|
||||
$oAppContext = new ApplicationContext();
|
||||
$oAppContext->InitObjectFromContext($oNewObj);
|
||||
|
||||
// 2nd - set values from the page argument 'default'
|
||||
// 2nd set the default values from the constraint on the external key... if any
|
||||
if ( ($oCurrObject != null) && ($this->sAttCode != ''))
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef(get_class($oCurrObject), $this->sAttCode);
|
||||
$aParams = array('this' => $oCurrObject);
|
||||
$oSet = $oAttDef->GetAllowedValuesAsObjectSet($aParams);
|
||||
$aConsts = $oSet->ListConstantFields();
|
||||
$sClassAlias = $oSet->GetFilter()->GetClassAlias();
|
||||
if (isset($aConsts[$sClassAlias]))
|
||||
{
|
||||
foreach($aConsts[$sClassAlias] as $sAttCode => $value)
|
||||
{
|
||||
$oNewObj->Set($sAttCode, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3rd - set values from the page argument 'default'
|
||||
$oNewObj->UpdateObjectFromArg('default');
|
||||
|
||||
$sDialogTitle = addslashes($this->sTitle);
|
||||
|
||||
@@ -34,6 +34,7 @@ class UILinksWidget
|
||||
protected $m_iInputId;
|
||||
protected $m_aAttributes;
|
||||
protected $m_sExtKeyToRemote;
|
||||
protected $m_sExtKeyToMe;
|
||||
protected $m_sLinkedClass;
|
||||
protected $m_sRemoteClass;
|
||||
protected $m_bDuplicatesAllowed;
|
||||
@@ -50,6 +51,7 @@ class UILinksWidget
|
||||
$oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $this->m_sAttCode);
|
||||
$this->m_sLinkedClass = $oAttDef->GetLinkedClass();
|
||||
$this->m_sExtKeyToRemote = $oAttDef->GetExtKeyToRemote();
|
||||
$this->m_sExtKeyToMe = $oAttDef->GetExtKeyToMe();
|
||||
$oLinkingAttDef = MetaModel::GetAttributeDef($this->m_sLinkedClass, $this->m_sExtKeyToRemote);
|
||||
$this->m_sRemoteClass = $oLinkingAttDef->GetTargetClass();
|
||||
$sExtKeyToMe = $oAttDef->GetExtKeyToMe();
|
||||
@@ -97,7 +99,7 @@ class UILinksWidget
|
||||
* @param Hash $aArgs Extra context arguments
|
||||
* @return string The HTML fragment of the one-row form
|
||||
*/
|
||||
protected function GetFormRow(WebPage $oP, DBObject $oLinkedObj, $linkObjOrId = null, $aArgs = array() )
|
||||
protected function GetFormRow(WebPage $oP, DBObject $oLinkedObj, $linkObjOrId = null, $aArgs = array(), $oCurrentObj )
|
||||
{
|
||||
$sPrefix = "$this->m_sAttCode{$this->m_sNameSuffix}";
|
||||
$aRow = array();
|
||||
@@ -107,6 +109,7 @@ class UILinksWidget
|
||||
$sPrefix .= "[$key][";
|
||||
$sNameSuffix = "]"; // To make a tabular form
|
||||
$aArgs['prefix'] = $sPrefix;
|
||||
$aArgs['this'] = $linkObjOrId;
|
||||
$aRow['form::checkbox'] = "<input class=\"selection\" type=\"checkbox\" onClick=\"oWidget".$this->m_iInputId.".OnSelectChange();\" value=\"$key\">";
|
||||
$aRow['form::checkbox'] .= "<input type=\"hidden\" name=\"attr_{$sPrefix}id{$sNameSuffix}\" value=\"$key\">";
|
||||
foreach($this->m_aEditableFields as $sFieldCode)
|
||||
@@ -121,8 +124,13 @@ class UILinksWidget
|
||||
{
|
||||
// form for creating a new record
|
||||
$sPrefix .= "[$linkObjOrId][";
|
||||
$oNewLinkObj = MetaModel::NewObject($this->m_sLinkedClass);
|
||||
$oRemoteObj = MetaModel::GetObject($this->m_sRemoteClass, -$linkObjOrId);
|
||||
$oNewLinkObj->Set($this->m_sExtKeyToRemote, $oRemoteObj); // Setting the extkey with the object alsoo fills the related external fields
|
||||
$oNewLinkObj->Set($this->m_sExtKeyToMe, $oCurrentObj); // Setting the extkey with the object alsoo fills the related external fields
|
||||
$sNameSuffix = "]"; // To make a tabular form
|
||||
$aArgs['prefix'] = $sPrefix;
|
||||
$aArgs['this'] = $oNewLinkObj;
|
||||
$aRow['form::checkbox'] = "<input class=\"selection\" type=\"checkbox\" onClick=\"oWidget".$this->m_iInputId.".OnSelectChange();\" value=\"$linkObjOrId\">";
|
||||
$aRow['form::checkbox'] .= "<input type=\"hidden\" name=\"attr_{$sPrefix}id{$sNameSuffix}\" value=\"\">";
|
||||
foreach($this->m_aEditableFields as $sFieldCode)
|
||||
@@ -207,9 +215,11 @@ class UILinksWidget
|
||||
* @param WebPage $oP The web page used for all the output
|
||||
* @param DBObjectSet The initial value of the linked set
|
||||
* @param Hash $aArgs Extra context arguments
|
||||
* @param string $sFormPrefix prefix of the fields in the current form
|
||||
* @param DBObject $oCurrentObj the current object to which the linkset is related
|
||||
* @return string The HTML fragment to be inserted into the page
|
||||
*/
|
||||
public function Display(WebPage $oPage, DBObjectSet $oValue, $aArgs = array())
|
||||
public function Display(WebPage $oPage, DBObjectSet $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj)
|
||||
{
|
||||
$sHtmlValue = '';
|
||||
$sTargetClass = self::GetTargetClass($this->m_sClass, $this->m_sAttCode);
|
||||
@@ -223,27 +233,28 @@ class UILinksWidget
|
||||
if ($oCurrentLink->IsNew())
|
||||
{
|
||||
$key = -$oLinkedObj->GetKey();
|
||||
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $key, $aArgs);
|
||||
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $key, $aArgs, $oCurrentObj);
|
||||
}
|
||||
else
|
||||
{
|
||||
$key = $oCurrentLink->GetKey();
|
||||
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs);
|
||||
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs, $oCurrentObj);
|
||||
}
|
||||
|
||||
}
|
||||
$sHtmlValue .= $this->DisplayFormTable($oPage, $this->m_aTableConfig, $aForm);
|
||||
$sDuplicates = ($this->m_bDuplicatesAllowed) ? 'true' : 'false';
|
||||
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
|
||||
$oPage->add_ready_script(<<<EOF
|
||||
oWidget{$this->m_iInputId} = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}', $sDuplicates);
|
||||
oWidget{$this->m_iInputId} = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}', $sDuplicates, $sWizHelper);
|
||||
oWidget{$this->m_iInputId}.Init();
|
||||
EOF
|
||||
);
|
||||
$sHtmlValue .= "<span style=\"float:left;\"> <img src=\"../images/tv-item-last.gif\"> <input id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_btnRemove\" type=\"button\" value=\"".Dict::S('UI:RemoveLinkedObjectsOf_Class')."\" onClick=\"oWidget{$this->m_iInputId}.RemoveSelected();\" >";
|
||||
$sHtmlValue .= " <input id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_btnAdd\" type=\"button\" value=\"".Dict::Format('UI:AddLinkedObjectsOf_Class', MetaModel::GetName($this->m_sRemoteClass))."\" onClick=\"oWidget{$this->m_iInputId}.AddObjects();\"></span>\n";
|
||||
$sHtmlValue .= " <input id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_btnAdd\" type=\"button\" value=\"".Dict::Format('UI:AddLinkedObjectsOf_Class', MetaModel::GetName($this->m_sRemoteClass))."\" onClick=\"oWidget{$this->m_iInputId}.AddObjects();\"><span id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_indicatorAdd\"></span></span>\n";
|
||||
$sHtmlValue .= "<span style=\"clear:both;\"><p> </p></span>\n";
|
||||
$sHtmlValue .= "</div>\n";
|
||||
$oPage->add_at_the_end($this->GetObjectPickerDialog($oPage), "dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}"); // To prevent adding forms inside the main form
|
||||
$oPage->add_at_the_end("<div id=\"dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}\"></div>"); // To prevent adding forms inside the main form
|
||||
return $sHtmlValue;
|
||||
}
|
||||
|
||||
@@ -266,12 +277,11 @@ EOF
|
||||
return $sTargetClass;
|
||||
}
|
||||
|
||||
protected function GetObjectPickerDialog($oPage)
|
||||
public function GetObjectPickerDialog($oPage, $oCurrentObj)
|
||||
{
|
||||
$sHtml = "<div id=\"dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}\">";
|
||||
$sHtml .= "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n";
|
||||
$sHtml = "<div class=\"wizContainer\" style=\"vertical-align:top;\">\n";
|
||||
$oFilter = new DBObjectSearch($this->m_sRemoteClass);
|
||||
$oSet = new CMDBObjectSet($oFilter);
|
||||
$this->SetSearchDefaultFromContext($oCurrentObj, $oFilter);
|
||||
$oBlock = new DisplayBlock($oFilter, 'search', false);
|
||||
$sHtml .= $oBlock->GetDisplay($oPage, "SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}", array('open' => true));
|
||||
$sHtml .= "<form id=\"ObjectsAddForm_{$this->m_sAttCode}{$this->m_sNameSuffix}\" OnSubmit=\"return oWidget{$this->m_iInputId}.DoAddObjects(this.id);\">\n";
|
||||
@@ -282,12 +292,11 @@ EOF
|
||||
$sHtml .= "<input type=\"button\" value=\"".Dict::S('UI:Button:Cancel')."\" onClick=\"$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog('close');\"> <input id=\"btn_ok_{$this->m_sAttCode}{$this->m_sNameSuffix}\" disabled=\"disabled\" type=\"submit\" value=\"".Dict::S('UI:Button:Add')."\">";
|
||||
$sHtml .= "</div>\n";
|
||||
$sHtml .= "</form>\n";
|
||||
$sHtml .= "</div>\n";
|
||||
$oPage->add($sHtml);
|
||||
$oPage->add_ready_script("$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, resizeStop: oWidget{$this->m_iInputId}.UpdateSizes });");
|
||||
$oPage->add_ready_script("$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog('option', {title:'".addslashes(Dict::Format('UI:AddObjectsOf_Class_LinkedWith_Class', MetaModel::GetName($this->m_sLinkedClass), MetaModel::GetName($this->m_sClass)))."'});");
|
||||
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix} form').bind('submit.uilinksWizard', oWidget{$this->m_iInputId}.SearchObjectsToAdd);");
|
||||
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}').resize(oWidget{$this->m_iInputId}.UpdateSizes);");
|
||||
return $sHtml;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -344,7 +353,7 @@ EOF
|
||||
$oBlock->Display($oP, "ResultsToAdd_{$this->m_sAttCode}", array('menu' => false, 'cssCount'=> '#count_'.$this->m_sAttCode.$this->m_sNameSuffix , 'selection_mode' => true)); // Don't display the 'Actions' menu on the results
|
||||
}
|
||||
|
||||
public function DoAddObjects(WebPage $oP, $oFullSetFilter)
|
||||
public function DoAddObjects(WebPage $oP, $oFullSetFilter, $oCurrentObj)
|
||||
{
|
||||
$aLinkedObjectIds = utils::ReadMultipleSelection($oFullSetFilter);
|
||||
|
||||
@@ -353,7 +362,7 @@ EOF
|
||||
$oLinkedObj = MetaModel::GetObject($this->m_sRemoteClass, $iObjectId);
|
||||
if (is_object($oLinkedObj))
|
||||
{
|
||||
$aRow = $this->GetFormRow($oP, $oLinkedObj, -$iObjectId ); // Not yet created link get negative Ids
|
||||
$aRow = $this->GetFormRow($oP, $oLinkedObj, -$iObjectId, array(), $oCurrentObj ); // Not yet created link get negative Ids
|
||||
$oP->add($this->DisplayFormRow($oP, $this->m_aTableConfig, $aRow, -$iObjectId));
|
||||
}
|
||||
else
|
||||
@@ -362,5 +371,47 @@ EOF
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the default search parameters based on 1) a 'current' object and 2) the silos defined by the context
|
||||
* @param DBObject $oSourceObj
|
||||
* @param DBObjectSearch $oSearch
|
||||
*/
|
||||
protected function SetSearchDefaultFromContext($oSourceObj, &$oSearch)
|
||||
{
|
||||
$oAppContext = new ApplicationContext();
|
||||
$sSrcClass = get_class($oSourceObj);
|
||||
$sDestClass = $oSearch->GetClass();
|
||||
foreach($oAppContext->GetNames() as $key)
|
||||
{
|
||||
// Find the value of the object corresponding to each 'context' parameter
|
||||
$aCallSpec = array($sSrcClass, 'MapContextParam');
|
||||
$sAttCode = '';
|
||||
if (is_callable($aCallSpec))
|
||||
{
|
||||
$sAttCode = call_user_func($aCallSpec, $key); // Returns null when there is no mapping for this parameter
|
||||
}
|
||||
|
||||
if (MetaModel::IsValidAttCode($sSrcClass, $sAttCode))
|
||||
{
|
||||
$oAttDef = MetaModel::GetAttributeDef($sSrcClass, $sAttCode);
|
||||
$defaultValue = $oSourceObj->Get($sAttCode);
|
||||
|
||||
// Find the attcode for the same 'context' parameter in the destination class
|
||||
// and sets its value as the default value for the search condition
|
||||
$aCallSpec = array($sDestClass, 'MapContextParam');
|
||||
$sAttCode = '';
|
||||
if (is_callable($aCallSpec))
|
||||
{
|
||||
$sAttCode = call_user_func($aCallSpec, $key); // Returns null when there is no mapping for this parameter
|
||||
}
|
||||
|
||||
if (MetaModel::IsValidAttCode($sDestClass, $sAttCode) && !empty($defaultValue))
|
||||
{
|
||||
$oSearch->AddCondition($sAttCode, $defaultValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -46,6 +46,7 @@ class utils
|
||||
|
||||
// Parameters loaded from a file, parameters of the page/command line still have precedence
|
||||
private static $m_aParamsFromFile = null;
|
||||
private static $m_aParamSource = array();
|
||||
|
||||
protected static function LoadParamFile($sParamFile)
|
||||
{
|
||||
@@ -82,6 +83,7 @@ class utils
|
||||
$sParam = $aMatches[1];
|
||||
$value = trim($aMatches[2]);
|
||||
self::$m_aParamsFromFile[$sParam] = $value;
|
||||
self::$m_aParamSource[$sParam] = $sParamFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,6 +101,25 @@ class utils
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the source file from which the parameter has been found,
|
||||
* usefull when it comes to pass user credential to a process executed
|
||||
* in the background
|
||||
* @param $sName Parameter name
|
||||
* @return The file name if any, or null
|
||||
*/
|
||||
public static function GetParamSourceFile($sName)
|
||||
{
|
||||
if (array_key_exists($sName, self::$m_aParamSource))
|
||||
{
|
||||
return self::$m_aParamSource[$sName];
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static function IsModeCLI()
|
||||
{
|
||||
$sSAPIName = php_sapi_name();
|
||||
@@ -152,10 +173,18 @@ class utils
|
||||
|
||||
public static function Sanitize($value, $defaultValue, $sSanitizationFilter)
|
||||
{
|
||||
$retValue = self::Sanitize_Internal($value, $sSanitizationFilter);
|
||||
if ($retValue === false)
|
||||
if ($value === $defaultValue)
|
||||
{
|
||||
$retValue = $defaultValue;
|
||||
// Preserve the real default value (can be used to detect missing mandatory parameters)
|
||||
$retValue = $value;
|
||||
}
|
||||
else
|
||||
{
|
||||
$retValue = self::Sanitize_Internal($value, $sSanitizationFilter);
|
||||
if ($retValue === false)
|
||||
{
|
||||
$retValue = $defaultValue;
|
||||
}
|
||||
}
|
||||
return $retValue;
|
||||
}
|
||||
@@ -431,8 +460,6 @@ class utils
|
||||
|
||||
/**
|
||||
* Returns the absolute URL to the server's root path
|
||||
* @param $sCurrentRelativePath string NO MORE USED, kept for backward compatibility only !
|
||||
* @param $bForceHTTPS bool True to force HTTPS, false otherwise
|
||||
* @return string The absolute URL to the server's root, without the first slash
|
||||
*/
|
||||
static public function GetAbsoluteUrlAppRoot()
|
||||
@@ -521,6 +548,17 @@ class utils
|
||||
return $sAppRootUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the absolute URL to the modules root path
|
||||
* Hardcoded here for compatibility with iTop 2.0 modules
|
||||
* @return string The absolute URL to the modules
|
||||
*/
|
||||
static public function GetAbsoluteUrlModulesRoot()
|
||||
{
|
||||
$sUrl = self::GetAbsoluteUrlAppRoot().'modules/';
|
||||
return $sUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells whether or not log off operation is supported.
|
||||
* Actually in only one case:
|
||||
@@ -601,5 +639,86 @@ class utils
|
||||
}
|
||||
echo "<p><pre>".print_r($aLightTrace, true)."</pre></p>\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the given iTop PHP script, passing it the current credentials
|
||||
* Only CLI mode is supported, because of the need to hand the credentials over to the next process
|
||||
* Throws an exception if the execution fails or could not be attempted (config issue)
|
||||
* @param string $sScript Name and relative path to the file (relative to the iTop root dir)
|
||||
* @param hash $aArguments Associative array of 'arg' => 'value'
|
||||
* @return array(iCode, array(output lines))
|
||||
*/
|
||||
/**
|
||||
*/
|
||||
static function ExecITopScript($sScriptName, $aArguments)
|
||||
{
|
||||
$aDisabled = explode(', ', ini_get('disable_functions'));
|
||||
if (in_array('exec', $aDisabled))
|
||||
{
|
||||
throw new Exception("The PHP exec() function has been disabled on this server");
|
||||
}
|
||||
|
||||
$sPHPExec = trim(MetaModel::GetConfig()->Get('php_path'));
|
||||
if (strlen($sPHPExec) == 0)
|
||||
{
|
||||
throw new Exception("The path to php must not be empty. Please set a value for 'php_path' in your configuration file.");
|
||||
}
|
||||
|
||||
$sAuthUser = self::ReadParam('auth_user', '', 'raw_data');
|
||||
$sAuthPwd = self::ReadParam('auth_pwd', '', 'raw_data');
|
||||
$sParamFile = self::GetParamSourceFile('auth_user');
|
||||
if (is_null($sParamFile))
|
||||
{
|
||||
$aArguments['auth_user'] = $sAuthUser;
|
||||
$aArguments['auth_pwd'] = $sAuthPwd;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aArguments['param_file'] = $sParamFile;
|
||||
}
|
||||
|
||||
$aArgs = array();
|
||||
foreach($aArguments as $sName => $value)
|
||||
{
|
||||
// Note: See comment from the 23-Apr-2004 03:30 in the PHP documentation
|
||||
// It suggests to rely on pctnl_* function instead of using escapeshellargs
|
||||
$aArgs[] = "--$sName=".escapeshellarg($value);
|
||||
}
|
||||
$sArgs = implode(' ', $aArgs);
|
||||
|
||||
$sScript = realpath(APPROOT.$sScriptName);
|
||||
if (!file_exists($sScript))
|
||||
{
|
||||
throw new Exception("Could not find the script file '$sScriptName' from the directory '".APPROOT."'");
|
||||
}
|
||||
|
||||
$sCommand = '"'.$sPHPExec.'" '.escapeshellarg($sScript).' -- '.$sArgs;
|
||||
|
||||
if (version_compare(phpversion(), '5.3.0', '<'))
|
||||
{
|
||||
if (substr(PHP_OS,0,3) == 'WIN')
|
||||
{
|
||||
// Under Windows, and for PHP 5.2.x, the whole command has to be quoted
|
||||
// Cf PHP doc: http://php.net/manual/fr/function.exec.php, comment from the 27-Dec-2010
|
||||
$sCommand = '"'.$sCommand.'"';
|
||||
}
|
||||
}
|
||||
|
||||
$sLastLine = exec($sCommand, $aOutput, $iRes);
|
||||
if ($iRes == 1)
|
||||
{
|
||||
throw new Exception(Dict::S('Core:ExecProcess:Code1')." - ".$sCommand);
|
||||
}
|
||||
elseif ($iRes == 255)
|
||||
{
|
||||
$sErrors = implode("\n", $aOutput);
|
||||
throw new Exception(Dict::S('Core:ExecProcess:Code255')." - ".$sCommand.":\n".$sErrors);
|
||||
}
|
||||
|
||||
//$aOutput[] = $sCommand;
|
||||
return array($iRes, $aOutput);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -372,13 +372,13 @@ class WebPage
|
||||
{
|
||||
// Make sure that the URL to the script contains the application's version number
|
||||
// so that the new script do NOT get reloaded from the cache when the application is upgraded
|
||||
if (strpos('?', $s_script) === false)
|
||||
if (strpos($s_script, '?') === false)
|
||||
{
|
||||
$s_script .= "?version=".ITOP_VERSION;
|
||||
$s_script .= "?itopversion=".ITOP_VERSION;
|
||||
}
|
||||
else
|
||||
{
|
||||
$s_script .= "&version=".ITOP_VERSION;
|
||||
$s_script .= "&itopversion=".ITOP_VERSION;
|
||||
}
|
||||
echo "<script type=\"text/javascript\" src=\"$s_script\"></script>\n";
|
||||
}
|
||||
@@ -413,6 +413,10 @@ class WebPage
|
||||
}
|
||||
echo "</style>\n";
|
||||
}
|
||||
if (class_exists('MetaModel') && MetaModel::GetConfig())
|
||||
{
|
||||
echo "<link rel=\"shortcut icon\" href=\"".utils::GetAbsoluteUrlAppRoot()."images/favicon.ico\" />\n";
|
||||
}
|
||||
echo "</head>\n";
|
||||
echo "<body>\n";
|
||||
echo self::FilterXSS($this->s_content);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
define('APPROOT', dirname(__FILE__).'/');
|
||||
define('MODULESROOT', APPROOT.'modules/');
|
||||
if (function_exists('microtime'))
|
||||
{
|
||||
$fItopStarted = microtime(true);
|
||||
|
||||
@@ -42,7 +42,7 @@ abstract class Action extends cmdbAbstractObject
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "name",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('name'),
|
||||
"db_table" => "priv_action",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "realclass",
|
||||
@@ -106,7 +106,7 @@ abstract class ActionNotification extends Action
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "name",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('name'),
|
||||
"db_table" => "priv_action_notification",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -139,7 +139,7 @@ class ActionEmail extends ActionNotification
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "name",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('name'),
|
||||
"db_table" => "priv_action_email",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -183,6 +183,7 @@ class ActionEmail extends ActionNotification
|
||||
try
|
||||
{
|
||||
$oSearch = DBObjectSearch::FromOQL($sOQL);
|
||||
$oSearch->AllowAllData();
|
||||
}
|
||||
catch (OQLException $e)
|
||||
{
|
||||
@@ -275,6 +276,7 @@ class ActionEmail extends ActionNotification
|
||||
protected function _DoExecute($oTrigger, $aContextArgs, &$oLog)
|
||||
{
|
||||
$sPreviousUrlMaker = ApplicationContext::SetUrlMakerClass();
|
||||
$aHeaders = array();
|
||||
try
|
||||
{
|
||||
$this->m_iRecipients = 0;
|
||||
@@ -294,7 +296,9 @@ class ActionEmail extends ActionNotification
|
||||
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
|
||||
|
||||
$oObj = $aContextArgs['this->object()'];
|
||||
$sReference = '<iTop/'.get_class($oObj).'/'.$oObj->GetKey().'>';
|
||||
$sMessageId = sprintf('<iTop_%s_%d_%f@%s.openitop.org>', get_class($oObj), $oObj->GetKey(), microtime(true /* get as float*/), MetaModel::GetConfig()->Get('session_name'));
|
||||
$sReference = $sMessageId;
|
||||
$aHeaders['Message-ID'] = $sMessageId;
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
@@ -315,7 +319,7 @@ class ActionEmail extends ActionNotification
|
||||
if (isset($sBody)) $oLog->Set('body', $sBody);
|
||||
}
|
||||
|
||||
$oEmail = new EMail();
|
||||
$oEmail = new EMail('', '', '', $aHeaders);
|
||||
|
||||
if ($this->IsBeingTested())
|
||||
{
|
||||
|
||||
@@ -170,6 +170,10 @@ abstract class AttributeDefinition
|
||||
return "";
|
||||
// e.g: return array("Site", "infrid", "name");
|
||||
}
|
||||
public function GetFinalAttDef()
|
||||
{
|
||||
return $this;
|
||||
}
|
||||
public function IsDirectField() {return false;}
|
||||
public function IsScalar() {return false;}
|
||||
public function IsLinkSet() {return false;}
|
||||
@@ -206,6 +210,15 @@ abstract class AttributeDefinition
|
||||
}
|
||||
return $sLabel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the label corresponding to the given value
|
||||
* To be overloaded for localized enums
|
||||
*/
|
||||
public function GetValueLabel($sValue)
|
||||
{
|
||||
return GetAsHTML($sValue);
|
||||
}
|
||||
|
||||
public function GetLabel_Obsolete()
|
||||
{
|
||||
@@ -1333,7 +1346,12 @@ class AttributeFinalClass extends AttributeString
|
||||
{
|
||||
return '=';
|
||||
}
|
||||
|
||||
|
||||
public function GetValueLabel($sValue)
|
||||
{
|
||||
if (empty($sValue)) return '';
|
||||
return MetaModel::GetName($sValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1625,7 +1643,7 @@ class AttributeLongText extends AttributeText
|
||||
*
|
||||
* @package iTopORM
|
||||
*/
|
||||
class AttributeCaseLog extends AttributeText
|
||||
class AttributeCaseLog extends AttributeLongText
|
||||
{
|
||||
public function GetNullValue()
|
||||
{
|
||||
@@ -1862,6 +1880,7 @@ class AttributeIPAddress extends AttributeString
|
||||
*/
|
||||
class AttributeOQL extends AttributeText
|
||||
{
|
||||
public function GetEditClass() {return "OQLExpression";}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2719,6 +2738,13 @@ class AttributeExternalField extends AttributeDefinition
|
||||
}
|
||||
|
||||
public function GetEditClass() {return "ExtField";}
|
||||
|
||||
public function GetFinalAttDef()
|
||||
{
|
||||
$oExtAttDef = $this->GetExtAttDef();
|
||||
return $oExtAttDef->GetFinalAttDef();
|
||||
}
|
||||
|
||||
protected function GetSQLCol()
|
||||
{
|
||||
// throw new CoreException("external attribute: does it make any sense to request its type ?");
|
||||
@@ -3480,6 +3506,43 @@ class AttributeFriendlyName extends AttributeComputedFieldVoid
|
||||
|
||||
public function GetKeyAttCode() {return $this->Get("extkey_attcode");}
|
||||
|
||||
public function GetLabel($sDefault = null)
|
||||
{
|
||||
$sLabel = parent::GetLabel('');
|
||||
if (strlen($sLabel) == 0)
|
||||
{
|
||||
$sKeyAttCode = $this->Get("extkey_attcode");
|
||||
if ($sKeyAttCode == 'id')
|
||||
{
|
||||
return Dict::S('Core:FriendlyName-Label');
|
||||
}
|
||||
else
|
||||
{
|
||||
$oExtKeyAttDef = MetaModel::GetAttributeDef($this->GetHostClass(), $sKeyAttCode);
|
||||
$sLabel = $oExtKeyAttDef->GetLabel($this->m_sCode);
|
||||
}
|
||||
}
|
||||
return $sLabel;
|
||||
}
|
||||
public function GetDescription($sDefault = null)
|
||||
{
|
||||
$sLabel = parent::GetDescription('');
|
||||
if (strlen($sLabel) == 0)
|
||||
{
|
||||
$sKeyAttCode = $this->Get("extkey_attcode");
|
||||
if ($sKeyAttCode == 'id')
|
||||
{
|
||||
return Dict::S('Core:FriendlyName-Description');
|
||||
}
|
||||
else
|
||||
{
|
||||
$oExtKeyAttDef = MetaModel::GetAttributeDef($this->GetHostClass(), $sKeyAttCode);
|
||||
$sLabel = $oExtKeyAttDef->GetDescription('');
|
||||
}
|
||||
}
|
||||
return $sLabel;
|
||||
}
|
||||
|
||||
// n/a, the friendly name is made of a complex expression (see GetNameSpec)
|
||||
protected function GetSQLCol() {return "";}
|
||||
|
||||
|
||||
@@ -76,6 +76,7 @@ require_once('cmdbchangeop.class.inc.php');
|
||||
// Romain: temporary moved into application.inc.php (see explanations there)
|
||||
//require_once('event.class.inc.php');
|
||||
|
||||
require_once('templatestring.class.inc.php');
|
||||
require_once('csvparser.class.inc.php');
|
||||
require_once('bulkchange.class.inc.php');
|
||||
|
||||
@@ -279,9 +280,10 @@ abstract class CMDBObject extends DBObject
|
||||
{
|
||||
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_MODIFY);
|
||||
|
||||
$oPreviousChange = self::$m_oCurrChange;
|
||||
self::$m_oCurrChange = $oChange;
|
||||
$ret = $this->DBInsertTracked_Internal();
|
||||
self::$m_oCurrChange = null;
|
||||
self::$m_oCurrChange = $oPreviousChange;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
@@ -289,9 +291,10 @@ abstract class CMDBObject extends DBObject
|
||||
{
|
||||
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_MODIFY);
|
||||
|
||||
$oPreviousChange = self::$m_oCurrChange;
|
||||
self::$m_oCurrChange = $oChange;
|
||||
$ret = $this->DBInsertTracked_Internal(true);
|
||||
self::$m_oCurrChange = null;
|
||||
self::$m_oCurrChange = $oPreviousChange;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
@@ -320,9 +323,10 @@ abstract class CMDBObject extends DBObject
|
||||
|
||||
public function DBCloneTracked(CMDBChange $oChange, $newKey = null)
|
||||
{
|
||||
$oPreviousChange = self::$m_oCurrChange;
|
||||
self::$m_oCurrChange = $oChange;
|
||||
$this->DBCloneTracked_Internal($newKey);
|
||||
self::$m_oCurrChange = null;
|
||||
self::$m_oCurrChange = $oPreviousChange;
|
||||
}
|
||||
|
||||
protected function DBCloneTracked_Internal($newKey = null)
|
||||
@@ -347,9 +351,10 @@ abstract class CMDBObject extends DBObject
|
||||
{
|
||||
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_MODIFY);
|
||||
|
||||
$oPreviousChange = self::$m_oCurrChange;
|
||||
self::$m_oCurrChange = $oChange;
|
||||
$this->DBUpdateTracked_Internal();
|
||||
self::$m_oCurrChange = null;
|
||||
self::$m_oCurrChange = $oPreviousChange;
|
||||
}
|
||||
|
||||
protected function DBUpdateTracked_Internal()
|
||||
@@ -382,9 +387,10 @@ abstract class CMDBObject extends DBObject
|
||||
{
|
||||
$this->CheckUserRights($bSkipStrongSecurity, UR_ACTION_DELETE);
|
||||
|
||||
$oPreviousChange = self::$m_oCurrChange;
|
||||
self::$m_oCurrChange = $oChange;
|
||||
$this->DBDeleteTracked_Internal($oDeletionPlan);
|
||||
self::$m_oCurrChange = null;
|
||||
self::$m_oCurrChange = $oPreviousChange;
|
||||
}
|
||||
|
||||
protected function DBDeleteTracked_Internal(&$oDeletionPlan = null)
|
||||
@@ -406,9 +412,10 @@ abstract class CMDBObject extends DBObject
|
||||
|
||||
public static function BulkDeleteTracked(CMDBChange $oChange, DBObjectSearch $oFilter)
|
||||
{
|
||||
$oPreviousChange = self::$m_oCurrChange;
|
||||
self::$m_oCurrChange = $oChange;
|
||||
$this->BulkDeleteTracked_Internal($oFilter);
|
||||
self::$m_oCurrChange = null;
|
||||
self::$m_oCurrChange = $oPreviousChange;
|
||||
}
|
||||
|
||||
protected static function BulkDeleteTracked_Internal(DBObjectSearch $oFilter)
|
||||
@@ -445,9 +452,10 @@ abstract class CMDBObject extends DBObject
|
||||
|
||||
public static function BulkUpdateTracked(CMDBChange $oChange, DBObjectSearch $oFilter, array $aValues)
|
||||
{
|
||||
$oPreviousChange = self::$m_oCurrChange;
|
||||
self::$m_oCurrChange = $oChange;
|
||||
$this->BulkUpdateTracked_Internal($oFilter, $aValues);
|
||||
self::$m_oCurrChange = null;
|
||||
self::$m_oCurrChange = $oPreviousChange;
|
||||
}
|
||||
|
||||
protected static function BulkUpdateTracked_Internal(DBObjectSearch $oFilter, array $aValues)
|
||||
|
||||
@@ -124,6 +124,14 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
),
|
||||
'php_path' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'Path to the php executable in CLI mode',
|
||||
'default' => 'php',
|
||||
'value' => 'php',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'session_name' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'The name of the cookie used to store the PHP session id',
|
||||
@@ -383,6 +391,24 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'cas_user_synchro' => array(
|
||||
'type' => 'bool',
|
||||
'description' => 'Whether or not to synchronize users with CAS/LDAP',
|
||||
// examples... not used (nor 'description')
|
||||
'default' => 0,
|
||||
'value' => 0,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'cas_profile_pattern' => array(
|
||||
'type' => 'string',
|
||||
'description' => 'A regular expression pattern to extract the name of the iTop profile from the name of an LDAP/CAS group',
|
||||
// examples... not used (nor 'description')
|
||||
'default' => '/^cn=([^,]+),/',
|
||||
'value' => '/^cn=([^,]+),/',
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => true,
|
||||
),
|
||||
'cas_debug' => array(
|
||||
'type' => 'bool',
|
||||
'description' => 'Activate the CAS debug',
|
||||
@@ -544,6 +570,7 @@ class Config
|
||||
'application/menunode.class.inc.php',
|
||||
'application/user.preferences.class.inc.php',
|
||||
'application/audit.rule.class.inc.php',
|
||||
'application/query.class.inc.php',
|
||||
// Romain - That's dirty, because those classes are in fact part of the core
|
||||
// but I needed those classes to be derived from cmdbAbstractObject
|
||||
// (to be managed via the GUI) and this class in not really known from
|
||||
|
||||
@@ -154,7 +154,7 @@ abstract class DBObject
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function Reload()
|
||||
public function Reload()
|
||||
{
|
||||
assert($this->m_bIsInDB);
|
||||
$aRow = MetaModel::MakeSingleRow(get_class($this), $this->m_iKey, false/*, $this->m_bAllowAllData*/);
|
||||
@@ -367,6 +367,34 @@ abstract class DBObject
|
||||
}
|
||||
|
||||
public function Get($sAttCode)
|
||||
{
|
||||
if (($iPos = strpos($sAttCode, '->')) === false)
|
||||
{
|
||||
return $this->GetStrict($sAttCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sExtKeyAttCode = substr($sAttCode, 0, $iPos);
|
||||
$sRemoteAttCode = substr($sAttCode, $iPos + 2);
|
||||
if (!MetaModel::IsValidAttCode(get_class($this), $sExtKeyAttCode))
|
||||
{
|
||||
throw new CoreException("Unknown external key '$sExtKeyAttCode' for the class ".get_class($this));
|
||||
}
|
||||
$oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sExtKeyAttCode);
|
||||
$sRemoteClass = $oKeyAttDef->GetTargetClass();
|
||||
$oRemoteObj = MetaModel::GetObject($sRemoteClass, $this->GetStrict($sExtKeyAttCode), false);
|
||||
if (is_null($oRemoteObj))
|
||||
{
|
||||
return '';
|
||||
}
|
||||
else
|
||||
{
|
||||
return $oRemoteObj->Get($sRemoteAttCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function GetStrict($sAttCode)
|
||||
{
|
||||
if (!array_key_exists($sAttCode, MetaModel::ListAttributeDefs(get_class($this))))
|
||||
{
|
||||
@@ -460,7 +488,7 @@ abstract class DBObject
|
||||
}
|
||||
|
||||
// That's a standard attribute (might be an ext field or a direct field, etc.)
|
||||
return $oAtt->GetAsHTML($this->Get($sAttCode));
|
||||
return $oAtt->GetAsHTML($this->Get($sAttCode), $this);
|
||||
}
|
||||
|
||||
public function GetEditValue($sAttCode)
|
||||
@@ -904,7 +932,7 @@ abstract class DBObject
|
||||
|
||||
$oDeletionPlan->AddToDelete($oReplica, DEL_SILENT);
|
||||
|
||||
if ($oDataSource->GetKey() == SynchroDataSource::GetCurrentTaskId())
|
||||
if ($oDataSource->GetKey() == SynchroExecution::GetCurrentTaskId())
|
||||
{
|
||||
// The current task has the right to delete the object
|
||||
continue;
|
||||
@@ -1580,19 +1608,22 @@ abstract class DBObject
|
||||
if (!$bRet) $bSuccess = false;
|
||||
}
|
||||
|
||||
// Change state triggers...
|
||||
$sClass = get_class($this);
|
||||
$sClassList = implode("', '", MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateLeave AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sPreviousState'"));
|
||||
while ($oTrigger = $oSet->Fetch())
|
||||
if ($bSuccess)
|
||||
{
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateEnter AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sNewState'"));
|
||||
while ($oTrigger = $oSet->Fetch())
|
||||
{
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
// Change state triggers...
|
||||
$sClass = get_class($this);
|
||||
$sClassList = implode("', '", MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateLeave AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sPreviousState'"));
|
||||
while ($oTrigger = $oSet->Fetch())
|
||||
{
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateEnter AS t WHERE t.target_class IN ('$sClassList') AND t.state='$sNewState'"));
|
||||
while ($oTrigger = $oSet->Fetch())
|
||||
{
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
}
|
||||
|
||||
return $bSuccess;
|
||||
@@ -1831,7 +1862,7 @@ abstract class DBObject
|
||||
$oSet = $this->GetMasterReplica();
|
||||
while($aData = $oSet->FetchAssoc())
|
||||
{
|
||||
if ($aData['datasource']->GetKey() == SynchroDataSource::GetCurrentTaskId())
|
||||
if ($aData['datasource']->GetKey() == SynchroExecution::GetCurrentTaskId())
|
||||
{
|
||||
// Ignore the current task (check to write => ok)
|
||||
continue;
|
||||
|
||||
@@ -73,7 +73,18 @@ class DBObjectSearch
|
||||
public function IsDataFiltered() {return $this->m_bDataFiltered; }
|
||||
public function SetDataFiltered() {$this->m_bDataFiltered = true;}
|
||||
|
||||
public function GetClassName($sAlias) {return $this->m_aClasses[$sAlias];}
|
||||
public function GetClassName($sAlias)
|
||||
{
|
||||
if (array_key_exists($sAlias, $this->m_aClasses))
|
||||
{
|
||||
return $this->m_aClasses[$sAlias];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new CoreException("Invalid class alias '$sAlias'");
|
||||
}
|
||||
}
|
||||
|
||||
public function GetJoinedClasses() {return $this->m_aClasses;}
|
||||
|
||||
public function GetClass()
|
||||
@@ -737,16 +748,43 @@ class DBObjectSearch
|
||||
{
|
||||
return $this->m_aRelatedTo;
|
||||
}
|
||||
|
||||
public function SetInternalParams($aParams)
|
||||
{
|
||||
return $this->m_aParams = $aParams;
|
||||
}
|
||||
|
||||
public function GetInternalParams()
|
||||
{
|
||||
return $this->m_aParams;
|
||||
}
|
||||
|
||||
public function GetQueryParams()
|
||||
{
|
||||
$aParams = array();
|
||||
$this->m_oSearchCondition->Render($aParams, true);
|
||||
return $aParams;
|
||||
}
|
||||
|
||||
public function ListConstantFields()
|
||||
{
|
||||
return $this->m_oSearchCondition->ListConstantFields();
|
||||
}
|
||||
|
||||
public function RenderCondition()
|
||||
{
|
||||
return $this->m_oSearchCondition->Render($this->m_aParams, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn the parameters (:xxx) into scalar values in order to easily
|
||||
* serialize a search
|
||||
*/
|
||||
public function ApplyParameters($aArgs)
|
||||
{
|
||||
return $this->m_oSearchCondition->ApplyParameters(array_merge($this->m_aParams, $aArgs));
|
||||
}
|
||||
|
||||
public function serialize($bDevelopParams = false, $aContextParams = null)
|
||||
{
|
||||
$sOql = $this->ToOql($bDevelopParams, $aContextParams);
|
||||
|
||||
@@ -687,6 +687,56 @@ class DBObjectSet
|
||||
$this->Rewind();
|
||||
return $oCommonObj;
|
||||
}
|
||||
|
||||
/**
|
||||
* List the constant fields (and their value) in the given query
|
||||
* @return Hash [Alias][AttCode] => value
|
||||
*/
|
||||
public function ListConstantFields()
|
||||
{
|
||||
$aScalarArgs = $this->ExpandArgs();
|
||||
$aConst = $this->m_oFilter->ListConstantFields();
|
||||
|
||||
foreach($aConst as $sClassAlias => $aVals)
|
||||
{
|
||||
foreach($aVals as $sCode => $oExpr)
|
||||
{
|
||||
if ($oExpr instanceof ScalarExpression)
|
||||
{
|
||||
$aConst[$sClassAlias][$sCode] = $oExpr->GetValue();
|
||||
}
|
||||
else //Variable
|
||||
{
|
||||
$aConst[$sClassAlias][$sCode] = $aScalarArgs[$oExpr->GetName()];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $aConst;
|
||||
}
|
||||
|
||||
protected function ExpandArgs()
|
||||
{
|
||||
$aScalarArgs = $this->m_oFilter->GetInternalParams();
|
||||
foreach($this->m_aArgs as $sArgName => $value)
|
||||
{
|
||||
if (MetaModel::IsValidObject($value))
|
||||
{
|
||||
$aScalarArgs = array_merge($aScalarArgs, $value->ToArgs($sArgName));
|
||||
}
|
||||
else
|
||||
{
|
||||
$aScalarArgs[$sArgName] = (string) $value;
|
||||
}
|
||||
}
|
||||
$aScalarArgs['current_contact_id'] = UserRights::GetContactId();
|
||||
return $aScalarArgs;
|
||||
}
|
||||
|
||||
public function ApplyParameters()
|
||||
{
|
||||
$aScalarArgs = $this->ExpandArgs();
|
||||
$this->m_oFilter->ApplyParameters($aScalarArgs);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -97,7 +97,7 @@ class Dict
|
||||
}
|
||||
|
||||
|
||||
public static function GetCurrentLanguage()
|
||||
public static function GetUserLanguage()
|
||||
{
|
||||
if (self::$m_sCurrentLanguage == null) // May happen when no user is logged in (i.e login screen, non authentifed page)
|
||||
{
|
||||
@@ -124,12 +124,12 @@ class Dict
|
||||
{
|
||||
// Attempt to find the string in the user language
|
||||
//
|
||||
if (!array_key_exists(self::GetCurrentLanguage(), self::$m_aData))
|
||||
if (!array_key_exists(self::GetUserLanguage(), self::$m_aData))
|
||||
{
|
||||
// It may happen, when something happens before the dictionnaries get loaded
|
||||
return $sStringCode;
|
||||
}
|
||||
$aCurrentDictionary = self::$m_aData[self::GetCurrentLanguage()];
|
||||
$aCurrentDictionary = self::$m_aData[self::GetUserLanguage()];
|
||||
if (array_key_exists($sStringCode, $aCurrentDictionary))
|
||||
{
|
||||
return $aCurrentDictionary[$sStringCode];
|
||||
|
||||
@@ -35,6 +35,7 @@ class EMail
|
||||
protected $m_sSubject;
|
||||
protected $m_sTo;
|
||||
protected $m_aHeaders; // array of key=>value
|
||||
protected $m_aAttachments;
|
||||
|
||||
public function __construct($sTo = '', $sSubject = '', $sBody = '', $aHeaders = array())
|
||||
{
|
||||
@@ -42,6 +43,7 @@ class EMail
|
||||
$this->m_sSubject = $sSubject;
|
||||
$this->m_sBody = $sBody;
|
||||
$this->m_aHeaders = $aHeaders;
|
||||
$this->m_aAttachments = array();
|
||||
}
|
||||
|
||||
// Errors management : not that simple because we need that function to be
|
||||
@@ -73,8 +75,14 @@ class EMail
|
||||
{
|
||||
$sHeaders = 'MIME-Version: 1.0' . "\r\n";
|
||||
// ! the case is important for MS-Outlook
|
||||
$sHeaders .= 'Content-Type: text/html; charset=UTF-8' . "\r\n";
|
||||
$sHeaders .= 'Content-Transfer-Encoding: 8bit' . "\r\n";
|
||||
if (!array_key_exists('Content-Type', $this->m_aHeaders))
|
||||
{
|
||||
$sHeaders .= 'Content-Type: text/html; charset=UTF-8' . "\r\n";
|
||||
}
|
||||
if (!array_key_exists('Content-Transfer-Encoding', $this->m_aHeaders))
|
||||
{
|
||||
$sHeaders .= 'Content-Transfer-Encoding: 8bit' . "\r\n";
|
||||
}
|
||||
foreach ($this->m_aHeaders as $sKey => $sValue)
|
||||
{
|
||||
$sHeaders .= "$sKey: $sValue\r\n";
|
||||
@@ -87,7 +95,7 @@ class EMail
|
||||
$bRes = mail
|
||||
(
|
||||
str_replace(array("\n", "\r"), ' ', $this->m_sTo), // Prevent header injection
|
||||
str_replace(array("\n", "\r"), ' ', $this->m_sSubject), // Prevent header injection
|
||||
$this->EncodeHeaderField($this->m_sSubject), // Prevent header injection & MIME Encode charsets
|
||||
$this->m_sBody,
|
||||
$sHeaders
|
||||
);
|
||||
@@ -110,6 +118,7 @@ class EMail
|
||||
|
||||
public function Send(&$aIssues, $bForceSynchronous = false, $oLog = null)
|
||||
{
|
||||
$this->BuildMessage(); // assemble the attachments into the header/body structure
|
||||
if ($bForceSynchronous)
|
||||
{
|
||||
return $this->SendSynchronous($aIssues, $oLog);
|
||||
@@ -135,6 +144,11 @@ class EMail
|
||||
$this->m_aHeaders[$sKey] = $sValue;
|
||||
}
|
||||
}
|
||||
|
||||
public function SetMessageId($sId)
|
||||
{
|
||||
$this->AddToHeader('Message-ID', $sId);
|
||||
}
|
||||
|
||||
public function SetReferences($sReferences)
|
||||
{
|
||||
@@ -181,6 +195,48 @@ class EMail
|
||||
$this->AddToHeader('Reply-To', $sAddress);
|
||||
}
|
||||
|
||||
public function AddAttachment($data, $sFileName, $sMimeType)
|
||||
{
|
||||
$this->m_aAttachments[] = array('data' => $data, 'filename' => $sFileName, 'mimeType' => $sMimeType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes care of the attachments (if any) to build the header/body of the message before storing or sending it
|
||||
*/
|
||||
protected function BuildMessage()
|
||||
{
|
||||
if (count($this->m_aAttachments) == 0) return; // Nothing to do if there are no attachments
|
||||
|
||||
$sDelimiter = '== iTopEmailPart---'.md5(date('r', time()))." ==";
|
||||
$sContentType = isset($this->m_aHeaders['Content-Type']) ? $this->m_aHeaders['Content-Type'] : 'text/html; charset="UTF-8"';
|
||||
$sContentHeader = "Content-Type: $sContentType\r\n";
|
||||
$this->m_aHeaders['Content-Type'] = "multipart/mixed; boundary=\"{$sDelimiter}\"";
|
||||
|
||||
$aAttachments = array();
|
||||
foreach($this->m_aAttachments as $aAttach)
|
||||
{
|
||||
$sAttachmentHeader = "Content-Type: {$aAttach['mimeType']};\r\n Name=\"{$aAttach['filename']}\"\r\n";
|
||||
$sAttachmentHeader .= "Content-Transfer-Encoding: base64\r\nContent-Disposition: attachment;\r\n filename=\"{$aAttach['filename']}\"\r\n";
|
||||
$sAttachmentHeader .= "\r\n";
|
||||
$sAttachment = chunk_split(base64_encode($aAttach['data']));
|
||||
$aAttachments[] = $sAttachmentHeader.$sAttachment."\r\n";
|
||||
}
|
||||
$this->m_sBody = "This is a multi-part message in MIME format.\r\n--".$sDelimiter."\r\n".$sContentHeader."\r\n".$this->m_sBody."\r\n--".$sDelimiter."\r\n";
|
||||
$this->m_sBody .= implode("--".$sDelimiter."\r\n", $aAttachments);
|
||||
$this->m_sBody .= "--".$sDelimiter."--";
|
||||
}
|
||||
|
||||
/**
|
||||
* MIME encode the content of a header field according to RFC2047
|
||||
* @param string $sFieldContent the content of the header to encode
|
||||
* @return string The encoded string
|
||||
*/
|
||||
protected function EncodeHeaderField($sFieldContent)
|
||||
{
|
||||
$sTemp = str_replace(array("\n", "\r"), ' ', $sFieldContent);
|
||||
$sTemp = iconv_mime_encode('Tagada', $sTemp, array('scheme' => 'Q', 'input-charset' => 'UTF-8', 'output-charset' => 'UTF-8'));
|
||||
return preg_replace('/^Tagada: /', '', $sTemp);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -103,7 +103,7 @@ class Event extends DBObject implements iDisplay
|
||||
$this->DisplayBareProperties($oPage, $bEditMode);
|
||||
}
|
||||
|
||||
function DisplayBareProperties(WebPage $oPage, $bEditMode = false, $aExtraParams = array())
|
||||
function DisplayBareProperties(WebPage $oPage, $bEditMode = false, $sPrefix = '', $aExtraParams = array())
|
||||
{
|
||||
if ($bEditMode) return; // Not editable
|
||||
|
||||
|
||||
@@ -36,11 +36,16 @@ abstract class Expression
|
||||
// recursive rendering (aArgs used as input by default, or used as output if bRetrofitParams set to True
|
||||
abstract public function Render(&$aArgs = null, $bRetrofitParams = false);
|
||||
|
||||
abstract public function ApplyParameters($aArgs);
|
||||
|
||||
// recursively builds an array of class => fieldname
|
||||
abstract public function ListRequiredFields();
|
||||
|
||||
abstract public function IsTrue();
|
||||
|
||||
|
||||
// recursively builds an array of [classAlias][fieldName] => value
|
||||
abstract public function ListConstantFields();
|
||||
|
||||
public function RequiresField($sClass, $sFieldName)
|
||||
{
|
||||
// #@# todo - optimize : this is called quite often when building a single query !
|
||||
@@ -108,6 +113,10 @@ class SQLExpression extends Expression
|
||||
return $this->m_sSQL;
|
||||
}
|
||||
|
||||
public function ApplyParameters($aArgs)
|
||||
{
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
}
|
||||
@@ -122,6 +131,11 @@ class SQLExpression extends Expression
|
||||
return array();
|
||||
}
|
||||
|
||||
public function ListConstantFields()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function RenameParam($sOldName, $sNewName)
|
||||
{
|
||||
// Do nothing, since there is nothing to rename
|
||||
@@ -164,11 +178,11 @@ class BinaryExpression extends Expression
|
||||
// return true if we are certain that it will be true
|
||||
if ($this->m_sOperator == 'AND')
|
||||
{
|
||||
if ($this->m_oLeftExpr->IsTrue() && $this->m_oLeftExpr->IsTrue()) return true;
|
||||
if ($this->m_oLeftExpr->IsTrue() && $this->m_oRightExpr->IsTrue()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public function GetLeftExpr()
|
||||
{
|
||||
return $this->m_oLeftExpr;
|
||||
@@ -192,7 +206,27 @@ class BinaryExpression extends Expression
|
||||
$sRight = $this->GetRightExpr()->Render($aArgs, $bRetrofitParams);
|
||||
return "($sLeft $sOperator $sRight)";
|
||||
}
|
||||
|
||||
|
||||
public function ApplyParameters($aArgs)
|
||||
{
|
||||
if ($this->m_oLeftExpr instanceof VariableExpression)
|
||||
{
|
||||
$this->m_oLeftExpr = $this->m_oLeftExpr->GetAsScalar($aArgs);
|
||||
}
|
||||
else //if ($this->m_oLeftExpr instanceof Expression)
|
||||
{
|
||||
$this->m_oLeftExpr->ApplyParameters($aArgs);
|
||||
}
|
||||
if ($this->m_oRightExpr instanceof VariableExpression)
|
||||
{
|
||||
$this->m_oRightExpr = $this->m_oRightExpr->GetAsScalar($aArgs);
|
||||
}
|
||||
else //if ($this->m_oRightExpr instanceof Expression)
|
||||
{
|
||||
$this->m_oRightExpr->ApplyParameters($aArgs);
|
||||
}
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
$this->GetLeftExpr()->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
@@ -213,6 +247,44 @@ class BinaryExpression extends Expression
|
||||
return array_merge($aLeft, $aRight);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* List all constant expression of the form <field> = <scalar> or <field> = :<variable>
|
||||
* Could be extended to support <field> = <function><constant_expression>
|
||||
*/
|
||||
public function ListConstantFields()
|
||||
{
|
||||
$aResult = array();
|
||||
if ($this->m_sOperator == '=')
|
||||
{
|
||||
if (($this->m_oLeftExpr instanceof FieldExpression) && ($this->m_oRightExpr instanceof ScalarExpression))
|
||||
{
|
||||
$aResult[$this->m_oLeftExpr->GetParent()][$this->m_oLeftExpr->GetName()] = $this->m_oRightExpr;
|
||||
}
|
||||
else if (($this->m_oRightExpr instanceof FieldExpression) && ($this->m_oLeftExpr instanceof ScalarExpression))
|
||||
{
|
||||
$aResult[$this->m_oRightExpr->GetParent()][$this->m_oRightExpr->GetName()] = $this->m_oLeftExpr;
|
||||
}
|
||||
else if (($this->m_oLeftExpr instanceof FieldExpression) && ($this->m_oRightExpr instanceof VariableExpression))
|
||||
{
|
||||
$aResult[$this->m_oLeftExpr->GetParent()][$this->m_oLeftExpr->GetName()] = $this->m_oRightExpr;
|
||||
}
|
||||
else if (($this->m_oRightExpr instanceof FieldExpression) && ($this->m_oLeftExpr instanceof VariableExpression))
|
||||
{
|
||||
$aResult[$this->m_oRightExpr->GetParent()][$this->m_oRightExpr->GetName()] = $this->m_oLeftExpr;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aResult = array_merge($this->m_oRightExpr->ListConstantFields(), $this->m_oLeftExpr->ListConstantFields()) ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$aResult = array_merge($this->m_oRightExpr->ListConstantFields(), $this->m_oLeftExpr->ListConstantFields()) ;
|
||||
}
|
||||
return $aResult;
|
||||
}
|
||||
|
||||
public function RenameParam($sOldName, $sNewName)
|
||||
{
|
||||
$this->GetLeftExpr()->RenameParam($sOldName, $sNewName);
|
||||
@@ -244,18 +316,13 @@ class UnaryExpression extends Expression
|
||||
// recursive rendering
|
||||
public function Render(&$aArgs = null, $bRetrofitParams = false)
|
||||
{
|
||||
if ($bRetrofitParams)
|
||||
{
|
||||
$iParamIndex = count($aArgs) + 1; // 1-based indexation
|
||||
$aArgs['param'.$iParamIndex] = $this->m_value;
|
||||
return ':param'.$iParamIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
return CMDBSource::Quote($this->m_value);
|
||||
}
|
||||
return CMDBSource::Quote($this->m_value);
|
||||
}
|
||||
|
||||
public function ApplyParameters($aArgs)
|
||||
{
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
}
|
||||
@@ -269,6 +336,11 @@ class UnaryExpression extends Expression
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function ListConstantFields()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function RenameParam($sOldName, $sNewName)
|
||||
{
|
||||
@@ -440,7 +512,7 @@ class VariableExpression extends UnaryExpression
|
||||
}
|
||||
elseif ($bRetrofitParams)
|
||||
{
|
||||
//$aArgs[$this->m_sName] = null;
|
||||
$aArgs[$this->m_sName] = null;
|
||||
return ':'.$this->m_sName;
|
||||
}
|
||||
else
|
||||
@@ -456,6 +528,20 @@ class VariableExpression extends UnaryExpression
|
||||
$this->m_sName = $sNewName;
|
||||
}
|
||||
}
|
||||
|
||||
public function GetAsScalar($aArgs)
|
||||
{
|
||||
$value = '';
|
||||
if (array_key_exists($this->m_sName, $aArgs))
|
||||
{
|
||||
$value = $aArgs[$this->m_sName];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new MissingQueryArgument('Missing query argument', array('expecting'=>$this->m_sName, 'available'=>array_keys($aArgs)));
|
||||
}
|
||||
return new ScalarExpression($value);
|
||||
}
|
||||
}
|
||||
|
||||
// Temporary, until we implement functions and expression casting!
|
||||
@@ -501,6 +587,22 @@ class ListExpression extends Expression
|
||||
return '('.implode(', ', $aRes).')';
|
||||
}
|
||||
|
||||
public function ApplyParameters($aArgs)
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aExpressions as $idx => $oExpr)
|
||||
{
|
||||
if ($oExpr instanceof VariableExpression)
|
||||
{
|
||||
$this->m_aExpressions[$idx] = $oExpr->GetAsScalar();
|
||||
}
|
||||
else
|
||||
{
|
||||
$oExpr->ApplyParameters($aArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
@@ -529,6 +631,16 @@ class ListExpression extends Expression
|
||||
return $aRes;
|
||||
}
|
||||
|
||||
public function ListConstantFields()
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
{
|
||||
$aRes = array_merge($aRes, $oExpr->ListConstantFields());
|
||||
}
|
||||
return $aRes;
|
||||
}
|
||||
|
||||
public function RenameParam($sOldName, $sNewName)
|
||||
{
|
||||
$aRes = array();
|
||||
@@ -578,6 +690,22 @@ class FunctionExpression extends Expression
|
||||
return $this->m_sVerb.'('.implode(', ', $aRes).')';
|
||||
}
|
||||
|
||||
public function ApplyParameters($aArgs)
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aArgs as $idx => $oExpr)
|
||||
{
|
||||
if ($oExpr instanceof VariableExpression)
|
||||
{
|
||||
$this->m_aArgs[$idx] = $oExpr->GetAsScalar($aArgs);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oExpr->ApplyParameters($aArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
foreach ($this->m_aArgs as $oExpr)
|
||||
@@ -606,6 +734,16 @@ class FunctionExpression extends Expression
|
||||
return $aRes;
|
||||
}
|
||||
|
||||
public function ListConstantFields()
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aArgs as $oExpr)
|
||||
{
|
||||
$aRes = array_merge($aRes, $oExpr->ListConstantFields());
|
||||
}
|
||||
return $aRes;
|
||||
}
|
||||
|
||||
public function RenameParam($sOldName, $sNewName)
|
||||
{
|
||||
foreach ($this->m_aArgs as $key => $oExpr)
|
||||
@@ -648,6 +786,18 @@ class IntervalExpression extends Expression
|
||||
return 'INTERVAL '.$this->m_oValue->Render($aArgs, $bRetrofitParams).' '.$this->m_sUnit;
|
||||
}
|
||||
|
||||
public function ApplyParameters($aArgs)
|
||||
{
|
||||
if ($this->m_oValue instanceof VariableExpression)
|
||||
{
|
||||
$this->m_oValue = $this->m_oValue->GetAsScalar($aArgs);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->m_oValue->ApplyParameters($aArgs);
|
||||
}
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
$this->m_oValue->GetUnresolvedFields($sAlias, $aUnresolved);
|
||||
@@ -662,6 +812,11 @@ class IntervalExpression extends Expression
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function ListConstantFields()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function RenameParam($sOldName, $sNewName)
|
||||
{
|
||||
@@ -702,6 +857,22 @@ class CharConcatExpression extends Expression
|
||||
return "CAST(CONCAT(".implode(', ', $aRes).") AS CHAR)";
|
||||
}
|
||||
|
||||
public function ApplyParameters($aArgs)
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aExpressions as $idx => $oExpr)
|
||||
{
|
||||
if ($oExpr instanceof VariableExpression)
|
||||
{
|
||||
$this->m_aExpressions[$idx] = $oExpr->GetAsScalar();
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->m_aExpressions->ApplyParameters($aArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function GetUnresolvedFields($sAlias, &$aUnresolved)
|
||||
{
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
@@ -730,6 +901,16 @@ class CharConcatExpression extends Expression
|
||||
return $aRes;
|
||||
}
|
||||
|
||||
public function ListConstantFields()
|
||||
{
|
||||
$aRes = array();
|
||||
foreach ($this->m_aExpressions as $oExpr)
|
||||
{
|
||||
$aRes = array_merge($aRes, $oExpr->ListConstantFields());
|
||||
}
|
||||
return $aRes;
|
||||
}
|
||||
|
||||
public function RenameParam($sOldName, $sNewName)
|
||||
{
|
||||
foreach ($this->m_aExpressions as $key => $oExpr)
|
||||
|
||||
@@ -191,6 +191,16 @@ class ExecutionKPI
|
||||
return $output[1] * 1024;
|
||||
}
|
||||
}
|
||||
|
||||
static public function memory_get_peak_usage($bRealUsage = false)
|
||||
{
|
||||
if (function_exists('memory_get_peak_usage'))
|
||||
{
|
||||
return memory_get_peak_usage($bRealUsage);
|
||||
}
|
||||
// PHP > 5.2.1 - this verb depends on a compilation option
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
class ApplicationStartupKPI extends ExecutionKPI
|
||||
|
||||
@@ -676,10 +676,38 @@ abstract class MetaModel
|
||||
if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass])) return false;
|
||||
return (self::$m_aAttribDefs[$sClass][$sAttCode]->IsExternalKey());
|
||||
}
|
||||
final static public function IsValidAttCode($sClass, $sAttCode)
|
||||
final static public function IsValidAttCode($sClass, $sAttCode, $bExtended = false)
|
||||
{
|
||||
if (!array_key_exists($sClass, self::$m_aAttribDefs)) return false;
|
||||
return (array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]));
|
||||
|
||||
if ($bExtended)
|
||||
{
|
||||
if (($iPos = strpos($sAttCode, '->')) === false)
|
||||
{
|
||||
$bRes = array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sExtKeyAttCode = substr($sAttCode, 0, $iPos);
|
||||
$sRemoteAttCode = substr($sAttCode, $iPos + 2);
|
||||
if (MetaModel::IsValidAttCode($sClass, $sExtKeyAttCode))
|
||||
{
|
||||
$oKeyAttDef = MetaModel::GetAttributeDef($sClass, $sExtKeyAttCode);
|
||||
$sRemoteClass = $oKeyAttDef->GetTargetClass();
|
||||
$bRes = MetaModel::IsValidAttCode($sRemoteClass, $sRemoteAttCode, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$bRes = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$bRes = array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]);
|
||||
}
|
||||
|
||||
return $bRes;
|
||||
}
|
||||
final static public function IsAttributeOrigin($sClass, $sAttCode)
|
||||
{
|
||||
@@ -1971,7 +1999,10 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
|
||||
$aOrderSpec = array();
|
||||
foreach ($aOrderBy as $sFieldAlias => $bAscending)
|
||||
{
|
||||
MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sFieldAlias, self::GetAttributesList($oFilter->GetFirstJoinedClass()));
|
||||
if ($sFieldAlias != 'id')
|
||||
{
|
||||
MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sFieldAlias, self::GetAttributesList($oFilter->GetFirstJoinedClass()));
|
||||
}
|
||||
if (!is_bool($bAscending))
|
||||
{
|
||||
throw new CoreException("Wrong direction in ORDER BY spec, found '$bAscending' and expecting a boolean value");
|
||||
@@ -3044,7 +3075,36 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check unicity of the SQL columns
|
||||
//
|
||||
if (self::HasTable($sClass))
|
||||
{
|
||||
$aTableColumns = array(); // array of column => attcode (the column is used by this attribute)
|
||||
$aTableColumns[self::DBGetKey($sClass)] = 'id';
|
||||
|
||||
// Check that SQL columns are declared only once
|
||||
//
|
||||
foreach(self::ListAttributeDefs($sClass) as $sAttCode=>$oAttDef)
|
||||
{
|
||||
// Skip this attribute if not originaly defined in this class
|
||||
if (self::$m_aAttribOrigins[$sClass][$sAttCode] != $sClass) continue;
|
||||
|
||||
foreach($oAttDef->GetSQLColumns() as $sField => $sDBFieldType)
|
||||
{
|
||||
if (array_key_exists($sField, $aTableColumns))
|
||||
{
|
||||
$aErrors[$sClass][] = "Column '$sField' declared for attribute $sAttCode, but already used for attribute ".$aTableColumns[$sField];
|
||||
$aSugFix[$sClass][] = "Please find another name for the SQL column";
|
||||
}
|
||||
else
|
||||
{
|
||||
$aTableColumns[$sField] = $sAttCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // foreach class
|
||||
|
||||
if (count($aErrors) > 0)
|
||||
{
|
||||
@@ -4569,6 +4629,9 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass]))
|
||||
*/
|
||||
static public function ApplyParams($aInput, $aParams)
|
||||
{
|
||||
$aParams['APP_URL'] = utils::GetAbsoluteUrlAppRoot();
|
||||
$aParams['MODULES_URL'] = utils::GetAbsoluteUrlModulesRoot();
|
||||
|
||||
$aSearches = array();
|
||||
$aReplacements = array();
|
||||
foreach($aParams as $sSearch => $replace)
|
||||
|
||||
@@ -153,16 +153,25 @@ class ormCaseLog {
|
||||
* Add a new entry to the log and updates the internal index
|
||||
* @param $sText string The text of the new entry
|
||||
*/
|
||||
public function AddLogEntry($sText)
|
||||
public function AddLogEntry($sText, $sOnBehalfOf = '')
|
||||
{
|
||||
$sDate = date(Dict::S('UI:CaseLog:DateFormat'));
|
||||
$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, UserRights::GetUserFriendlyName(), UserRights::GetUserId());
|
||||
if ($sOnBehalfOf == '')
|
||||
{
|
||||
$sOnBehalfOf = UserRights::GetUserFriendlyName();
|
||||
$iUserId = UserRights::GetUserId();
|
||||
}
|
||||
else
|
||||
{
|
||||
$iUserId = null;
|
||||
}
|
||||
$sSeparator = sprintf(CASELOG_SEPARATOR, $sDate, $sOnBehalfOf, $iUserId);
|
||||
$iSepLength = strlen($sSeparator);
|
||||
$iTextlength = strlen($sText);
|
||||
$this->m_sLog = $sSeparator.$sText.$this->m_sLog; // Latest entry printed first
|
||||
$this->m_aIndex[] = array(
|
||||
'user_name' => UserRights::GetUserFriendlyName(),
|
||||
'user_id' => UserRights::GetUserId(),
|
||||
'user_name' => $sOnBehalfOf,
|
||||
'user_id' => $iUserId,
|
||||
'date' => time(),
|
||||
'text_length' => $iTextlength,
|
||||
'separator_length' => $iSepLength,
|
||||
|
||||
177
core/templatestring.class.inc.php
Normal file
177
core/templatestring.class.inc.php
Normal file
@@ -0,0 +1,177 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Simple helper class to interpret and transform a template string
|
||||
*
|
||||
* Usage:
|
||||
* $oString = new TemplateString("Blah $this->friendlyname$ is in location $this->location_id->name$ ('$this->location_id->org_id->name$)");
|
||||
* echo $oString->Render(array('this' => $oContact));
|
||||
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
/**
|
||||
* Helper class
|
||||
*/
|
||||
class TemplateStringPlaceholder
|
||||
{
|
||||
public $sToken;
|
||||
public $sAttCode;
|
||||
public $sFunction;
|
||||
public $sParamName;
|
||||
public $bIsValid;
|
||||
|
||||
public function __construct($sToken)
|
||||
{
|
||||
$this->sToken = $sToken;
|
||||
$this->sAttcode = '';
|
||||
$this->sFunction = '';
|
||||
$this->sParamName = '';
|
||||
$this->bIsValid = false; // Validity may be false in general, but it can work anyway (thanks to specialization) when rendering
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class TemplateString
|
||||
*/
|
||||
class TemplateString
|
||||
{
|
||||
protected $m_sRaw;
|
||||
protected $m_aPlaceholders;
|
||||
|
||||
public function __construct($sRaw)
|
||||
{
|
||||
$this->m_sRaw = $sRaw;
|
||||
$this->m_aPlaceholders = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Split the string into placholders
|
||||
* @param Hash $aParamTypes Class of the expected parameters: hash array of '<param_id>' => '<class_name>'
|
||||
* @return void
|
||||
*/
|
||||
protected function Analyze($aParamTypes = array())
|
||||
{
|
||||
if (!is_null($this->m_aPlaceholders)) return;
|
||||
|
||||
$this->m_aPlaceholders = array();
|
||||
if (preg_match_all('/\\$([a-z0-9_]+(->[a-z0-9_]+)*)\\$/', $this->m_sRaw, $aMatches))
|
||||
{
|
||||
foreach($aMatches[1] as $sPlaceholder)
|
||||
{
|
||||
$oPlaceholder = new TemplateStringPlaceholder($sPlaceholder);
|
||||
$oPlaceholder->bIsValid = false;
|
||||
foreach ($aParamTypes as $sParamName => $sClass)
|
||||
{
|
||||
$sParamPrefix = $sParamName.'->';
|
||||
if (substr($sPlaceholder, 0, strlen($sParamPrefix)) == $sParamPrefix)
|
||||
{
|
||||
// Todo - detect functions (label...)
|
||||
$oPlaceholder->sFunction = '';
|
||||
|
||||
$oPlaceholder->sParamName = $sParamName;
|
||||
$sAttcode = substr($sPlaceholder, strlen($sParamPrefix));
|
||||
$oPlaceholder->sAttcode = $sAttcode;
|
||||
$oPlaceholder->bIsValid = MetaModel::IsValidAttCode($sClass, $sAttcode, true /* extended */);
|
||||
}
|
||||
}
|
||||
|
||||
$this->m_aPlaceholders[] = $oPlaceholder;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the placeholders (for reporting purposes)
|
||||
* @return void
|
||||
*/
|
||||
public function GetPlaceholders()
|
||||
{
|
||||
return $this->m_aPlaceholders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the format when possible
|
||||
* @param Hash $aParamTypes Class of the expected parameters: hash array of '<param_id>' => '<class_name>'
|
||||
* @return void
|
||||
*/
|
||||
public function IsValid($aParamTypes = array())
|
||||
{
|
||||
$this->Analyze($aParamTypes);
|
||||
|
||||
foreach($this->m_aPlaceholders as $oPlaceholder)
|
||||
{
|
||||
if (!$oPlaceholder->bIsValid)
|
||||
{
|
||||
if (count($aParamTypes) == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (array_key_exists($oPlaceholder->sParamName, $aParamTypes))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply the given parameters to replace the placeholders
|
||||
* @param Hash $aParamValues Value of the expected parameters: hash array of '<param_id>' => '<value>'
|
||||
* @return void
|
||||
*/
|
||||
public function Render($aParamValues = array())
|
||||
{
|
||||
$aParamTypes = array();
|
||||
foreach($aParamValues as $sParamName => $value)
|
||||
{
|
||||
$aParamTypes[$sParamName] = get_class($value);
|
||||
}
|
||||
$this->Analyze($aParamTypes);
|
||||
|
||||
$aSearch = array();
|
||||
$aReplace = array();
|
||||
foreach($this->m_aPlaceholders as $oPlaceholder)
|
||||
{
|
||||
if (array_key_exists($oPlaceholder->sParamName, $aParamValues))
|
||||
{
|
||||
$oRef = $aParamValues[$oPlaceholder->sParamName];
|
||||
try
|
||||
{
|
||||
$value = $oRef->Get($oPlaceholder->sAttcode);
|
||||
$aSearch[] = '$'.$oPlaceholder->sToken.'$';
|
||||
$aReplace[] = $value;
|
||||
$oPlaceholder->bIsValid = true;
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$oPlaceholder->bIsValid = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$oPlaceholder->bIsValid = false;
|
||||
}
|
||||
}
|
||||
return str_replace($aSearch, $aReplace, $this->m_sRaw);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -41,7 +41,7 @@ abstract class Trigger extends cmdbAbstractObject
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('description'),
|
||||
"db_table" => "priv_trigger",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "realclass",
|
||||
@@ -87,7 +87,7 @@ abstract class TriggerOnObject extends Trigger
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('description'),
|
||||
"db_table" => "priv_trigger_onobject",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -118,7 +118,7 @@ class TriggerOnPortalUpdate extends TriggerOnObject
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('description'),
|
||||
"db_table" => "priv_trigger_onportalupdate",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -144,7 +144,7 @@ abstract class TriggerOnStateChange extends TriggerOnObject
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('description'),
|
||||
"db_table" => "priv_trigger_onstatechange",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -173,7 +173,7 @@ class TriggerOnStateEnter extends TriggerOnStateChange
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('description'),
|
||||
"db_table" => "priv_trigger_onstateenter",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -201,7 +201,7 @@ class TriggerOnStateLeave extends TriggerOnStateChange
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('description'),
|
||||
"db_table" => "priv_trigger_onstateleave",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -229,7 +229,7 @@ class TriggerOnObjectCreate extends TriggerOnObject
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "description",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array('description'),
|
||||
"db_table" => "priv_trigger_onobjcreate",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -257,7 +257,7 @@ class lnkTriggerAction extends cmdbAbstractObject
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(""),
|
||||
"reconc_keys" => array('action_id', 'trigger_id'),
|
||||
"db_table" => "priv_link_action_trigger",
|
||||
"db_key_field" => "link_id",
|
||||
"db_finalclass_field" => "",
|
||||
|
||||
@@ -295,6 +295,35 @@ abstract class UserInternal extends User
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Self register extension
|
||||
*
|
||||
* @package iTopORM
|
||||
*/
|
||||
interface iSelfRegister
|
||||
{
|
||||
/**
|
||||
* Called when no user is found in iTop for the corresponding 'name'. This method
|
||||
* can create/synchronize the User in iTop with an external source (such as AD/LDAP) on the fly
|
||||
* @param string $sName The typed-in user name
|
||||
* @param string $sPassword The typed-in password
|
||||
* @param string $sLoginMode The login method used (cas|form|basic|url)
|
||||
* @param string $sAuthentication The authentication method used (any|internal|external)
|
||||
* @return bool true if the user is a valid one, false otherwise
|
||||
*/
|
||||
public static function CheckCredentialsAndCreateUser($sName, $sPassword, $sLoginMode, $sAuthentication);
|
||||
|
||||
/**
|
||||
* Called after the user has been authenticated and found in iTop. This method can
|
||||
* Update the user's definition on the fly (profiles...) to keep it in sync with an external source
|
||||
* @param User $oUser The user to update/synchronize
|
||||
* @param string $sLoginMode The login mode used (cas|form|basic|url)
|
||||
* @param string $sAuthentication The authentication method used
|
||||
* @return void
|
||||
*/
|
||||
public static function UpdateUser(User $oUser, $sLoginMode, $sAuthentication);
|
||||
}
|
||||
|
||||
/**
|
||||
* User management core API
|
||||
*
|
||||
@@ -305,6 +334,7 @@ class UserRights
|
||||
protected static $m_oAddOn;
|
||||
protected static $m_oUser;
|
||||
protected static $m_oRealUser;
|
||||
protected static $m_sSelfRegisterAddOn = null;
|
||||
|
||||
public static function SelectModule($sModuleName)
|
||||
{
|
||||
@@ -324,6 +354,15 @@ class UserRights
|
||||
self::$m_oRealUser = null;
|
||||
}
|
||||
|
||||
public static function SelectSelfRegister($sModuleName)
|
||||
{
|
||||
if (!class_exists($sModuleName))
|
||||
{
|
||||
throw new CoreException("Could not select the class, '$sModuleName' for self register, is not a valid class name");
|
||||
}
|
||||
self::$m_sSelfRegisterAddOn = $sModuleName;
|
||||
}
|
||||
|
||||
public static function GetModuleInstance()
|
||||
{
|
||||
return self::$m_oAddOn;
|
||||
@@ -361,21 +400,38 @@ class UserRights
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function CheckCredentials($sName, $sPassword, $sAuthentication = 'any')
|
||||
public static function CheckCredentials($sName, $sPassword, $sLoginMode = 'form', $sAuthentication = 'any')
|
||||
{
|
||||
$oUser = self::FindUser($sName, $sAuthentication);
|
||||
if (is_null($oUser))
|
||||
{
|
||||
return false;
|
||||
return self::CheckCredentialsAndCreateUser($sName, $sPassword, $sLoginMode, $sAuthentication);
|
||||
}
|
||||
|
||||
if (!$oUser->CheckCredentials($sPassword))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
self::UpdateUser($oUser, $sLoginMode, $sAuthentication);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function CheckCredentialsAndCreateUser($sName, $sPassword, $sLoginMode, $sAuthentication)
|
||||
{
|
||||
if (self::$m_sSelfRegisterAddOn != null)
|
||||
{
|
||||
return call_user_func(array(self::$m_sSelfRegisterAddOn, 'CheckCredentialsAndCreateUser'), $sName, $sPassword, $sLoginMode, $sAuthentication);
|
||||
}
|
||||
}
|
||||
|
||||
public static function UpdateUser($oUser, $sLoginMode, $sAuthentication)
|
||||
{
|
||||
if (self::$m_sSelfRegisterAddOn != null)
|
||||
{
|
||||
call_user_func(array(self::$m_sSelfRegisterAddOn, 'UpdateUser'), $oUser, $sLoginMode, $sAuthentication);
|
||||
}
|
||||
}
|
||||
|
||||
public static function TrustWebServerContext()
|
||||
{
|
||||
if (!is_null(self::$m_oUser))
|
||||
@@ -625,10 +681,6 @@ class UserRights
|
||||
|
||||
if (MetaModel::HasCategory($sClass, 'bizmodel'))
|
||||
{
|
||||
// #@# Temporary?????
|
||||
// The read access is controlled in MetaModel::MakeSelectQuery()
|
||||
if ($iActionCode == UR_ACTION_READ) return true;
|
||||
|
||||
if (is_null($oUser))
|
||||
{
|
||||
$oUser = self::$m_oUser;
|
||||
@@ -969,4 +1021,270 @@ class StimulusChecker extends ActionChecker
|
||||
return $this->iState;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Self-register extension to allow the automatic creation & update of CAS users
|
||||
*
|
||||
* @package iTopORM
|
||||
*
|
||||
*/
|
||||
class CAS_SelfRegister implements iSelfRegister
|
||||
{
|
||||
/**
|
||||
* Called when no user is found in iTop for the corresponding 'name'. This method
|
||||
* can create/synchronize the User in iTop with an external source (such as AD/LDAP) on the fly
|
||||
* @param string $sName The CAS authenticated user name
|
||||
* @param string $sPassword Ignored
|
||||
* @param string $sLoginMode The login mode used (cas|form|basic|url)
|
||||
* @param string $sAuthentication The authentication method used
|
||||
* @return bool true if the user is a valid one, false otherwise
|
||||
*/
|
||||
public static function CheckCredentialsAndCreateUser($sName, $sPassword, $sLoginMode, $sAuthentication)
|
||||
{
|
||||
if ($sLoginMode != 'cas') return false; // Must be authenticated via CAS
|
||||
|
||||
$sCASMemberships = MetaModel::GetConfig()->Get('cas_memberof');
|
||||
$bFound = false;
|
||||
if (!empty($sCASMemberships))
|
||||
{
|
||||
if (phpCAS::hasAttribute('memberOf'))
|
||||
{
|
||||
// A list of groups is specified, the user must a be member of (at least) one of them to pass
|
||||
$aCASMemberships = array();
|
||||
$aTmp = explode(';', $sCASMemberships);
|
||||
setlocale(LC_ALL, "en_US.utf8"); // !!! WARNING: this is needed to have the iconv //TRANSLIT working fine below !!!
|
||||
foreach($aTmp as $sGroupName)
|
||||
{
|
||||
$aCASMemberships[] = trim(iconv('UTF-8', 'ASCII//TRANSLIT', $sGroupName)); // Just in case remove accents and spaces...
|
||||
}
|
||||
|
||||
$aMemberOf = phpCAS::getAttribute('memberOf');
|
||||
if (!is_array($aMemberOf)) $aMemberOf = array($aMemberOf); // Just one entry, turn it into an array
|
||||
$aFilteredGroupNames = array();
|
||||
foreach($aMemberOf as $sGroupName)
|
||||
{
|
||||
phpCAS::log("Info: user if a member of the group: ".$sGroupName);
|
||||
$sGroupName = trim(iconv('UTF-8', 'ASCII//TRANSLIT', $sGroupName)); // Remove accents and spaces as well
|
||||
$aFilteredGroupNames[] = $sGroupName;
|
||||
if (in_array($sGroupName, $aCASMemberships))
|
||||
{
|
||||
$bCASUserSynchro = MetaModel::GetConfig()->Get('cas_user_synchro');
|
||||
if ($bCASUserSynchro)
|
||||
{
|
||||
// If needed create a new user for this email/profile
|
||||
phpCAS::log('Info: cas_user_synchro is ON');
|
||||
$bFound = self::CreateCASUser(phpCAS::getUser(), $aMemberOf);
|
||||
}
|
||||
else
|
||||
{
|
||||
phpCAS::log('Info: cas_user_synchro is OFF');
|
||||
}
|
||||
$bFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!$bFound)
|
||||
{
|
||||
phpCAS::log("User ".phpCAS::getUser().", none of his/her groups (".implode('; ', $aFilteredGroupNames).") match any of the required groups: ".implode('; ', $aCASMemberships));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Too bad, the user is not part of any of the group => not allowed
|
||||
phpCAS::log("No 'memberOf' attribute found for user ".phpCAS::getUser().". Are you using the SAML protocol (S1) ?");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// No membership required, anybody will pass
|
||||
$bFound = true;
|
||||
}
|
||||
|
||||
if (!$bFound)
|
||||
{
|
||||
// The user is not part of the allowed groups, => log out
|
||||
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php';
|
||||
$sCASLogoutUrl = MetaModel::GetConfig()->Get('cas_logout_redirect_service');
|
||||
if (empty($sCASLogoutUrl))
|
||||
{
|
||||
$sCASLogoutUrl = $sUrl;
|
||||
}
|
||||
phpCAS::logoutWithRedirectService($sCASLogoutUrl); // Redirects to the CAS logout page
|
||||
// Will never return !
|
||||
}
|
||||
return $bFound;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after the user has been authenticated and found in iTop. This method can
|
||||
* Update the user's definition (profiles...) on the fly to keep it in sync with an external source
|
||||
* @param User $oUser The user to update/synchronize
|
||||
* @param string $sLoginMode The login mode used (cas|form|basic|url)
|
||||
* @param string $sAuthentication The authentication method used
|
||||
* @return void
|
||||
*/
|
||||
public static function UpdateUser(User $oUser, $sLoginMode, $sAuthentication)
|
||||
{
|
||||
if (($sLoginMode == 'cas') && (phpCAS::hasAttribute('memberOf')))
|
||||
{
|
||||
$aMemberOf = phpCAS::getAttribute('memberOf');
|
||||
if (!is_array($aMemberOf)) $aMemberOf = array($aMemberOf); // Just one entry, turn it into an array
|
||||
|
||||
return self::SetProfilesFromCAS($oUser, $aMemberOf);
|
||||
}
|
||||
// No groups defined in CAS or not CAS at all: do nothing...
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to create a CAS based user
|
||||
* @param string $sEmail
|
||||
* @param array $aGroups
|
||||
* @return bool true on success, false otherwise
|
||||
*/
|
||||
protected static function CreateCASUser($sEmail, $aGroups)
|
||||
{
|
||||
if (!MetaModel::IsValidClass('URP_Profiles'))
|
||||
{
|
||||
phpCAS::log("URP_Profiles is not a valid class. Automatic creation of Users is not supported in this context, sorry.");
|
||||
return false;
|
||||
}
|
||||
|
||||
$oUser = MetaModel::GetObjectByName('UserExternal', $sEmail, false);
|
||||
if ($oUser == null)
|
||||
{
|
||||
// Create the user, link it to a contact
|
||||
phpCAS::log("Info: the user '$sEmail' does not exist. A new UserExternal will be created.");
|
||||
$oSearch = new DBObjectSearch('Person');
|
||||
$oSearch->AddCondition('email', $sEmail);
|
||||
$oSet = new DBObjectSet($oSearch);
|
||||
$iContactId = 0;
|
||||
switch($oSet->Count())
|
||||
{
|
||||
case 0:
|
||||
phpCAS::log("Error: found no contact with the email: '$sEmail'. Cannot create the user in iTop.");
|
||||
return;
|
||||
|
||||
case 1:
|
||||
$oContact = $oSet->Fetch();
|
||||
$iContactId = $oContact->GetKey();
|
||||
phpCAS::log("Info: Found 1 contact '".$oContact->GetName()."' (id=$iContactId) corresponding to the email '$sEmail'.");
|
||||
break;
|
||||
|
||||
default:
|
||||
phpCAS::log("Error: ".$oSet->Count()." contacts have the same email: '$sEmail'. Cannot create a user for this email.");
|
||||
return;
|
||||
}
|
||||
|
||||
$oUser = new UserExternal();
|
||||
$oUser->Set('login', $sEmail);
|
||||
$oUser->Set('contactid', $iContactId);
|
||||
$oUser->Set('language', MetaModel::GetConfig()->GetDefaultLanguage());
|
||||
}
|
||||
else
|
||||
{
|
||||
phpCAS::log("Info: the user '$sEmail' already exists (id=".$oUser->GetKey().").");
|
||||
}
|
||||
|
||||
// Now synchronize the profiles
|
||||
if (!self::SetProfilesFromCAS($oUser, $aGroups))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($oUser->IsNew() || $oUser->IsModified())
|
||||
{
|
||||
$oMyChange = MetaModel::NewObject("CMDBChange");
|
||||
$oMyChange->Set("date", time());
|
||||
$oMyChange->Set("userinfo", 'CAS/LDAP Synchro');
|
||||
$oMyChange->DBInsert();
|
||||
if ($oUser->IsNew())
|
||||
{
|
||||
$oUser->DBInsertTracked($oMyChange);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oUser->DBUpdateTracked($oMyChange);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
protected static function SetProfilesFromCAS($oUser, $aGroups)
|
||||
{
|
||||
if (!MetaModel::IsValidClass('URP_Profiles'))
|
||||
{
|
||||
phpCAS::log("URP_Profiles is not a valid class. Automatic creation of Users is not supported in this context, sorry.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// read all the existing profiles
|
||||
$oProfilesSearch = new DBObjectSearch('URP_Profiles');
|
||||
$oProfilesSet = new DBObjectSet($oProfilesSearch);
|
||||
$aAllProfiles = array();
|
||||
while($oProfile = $oProfilesSet->Fetch())
|
||||
{
|
||||
$aAllProfiles[strtolower($oProfile->GetName())] = $oProfile->GetKey();
|
||||
}
|
||||
|
||||
// Translate the CAS/LDAP group names into iTop profile names
|
||||
$aProfiles = array();
|
||||
$sPattern = MetaModel::GetConfig()->Get('cas_profile_pattern');
|
||||
foreach($aGroups as $sGroupName)
|
||||
{
|
||||
if (preg_match($sPattern, $sGroupName, $aMatches))
|
||||
{
|
||||
if (array_key_exists(strtolower($aMatches[1]), $aAllProfiles))
|
||||
{
|
||||
$aProfiles[] = $aAllProfiles[strtolower($aMatches[1])];
|
||||
}
|
||||
else
|
||||
{
|
||||
phpCAS::log("Warning: {$aMatches[1]} is not a valid iTop profile (extracted from group name: '$sGroupName'). Ignored.");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (count($aProfiles) == 0)
|
||||
{
|
||||
phpCAS::log("Error: no group name matches the pattern: '$sPattern'. The user '$sEmail' has no profiles in iTop, and therefore cannot be created.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Now synchronize the profiles
|
||||
$oProfilesSet = DBObjectSet::FromScratch('URP_UserProfile');
|
||||
foreach($aProfiles as $iProfileId)
|
||||
{
|
||||
$oLink = new URP_UserProfile();
|
||||
$oLink->Set('profileid', $iProfileId);
|
||||
$oLink->Set('reason', 'CAS/LDAP Synchro');
|
||||
$oProfilesSet->AddObject($oLink);
|
||||
}
|
||||
$oUser->Set('profile_list', $oProfilesSet);
|
||||
phpCAS::log("Info: the user $sEmail (id=".$oUser->GetKey().") now has the following profiles: '".implode("', '", $aProfiles)."'.");
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Helper function to check if the supplied string is a litteral string or a regular expression pattern
|
||||
* @param string $sCASPattern
|
||||
* @return bool True if it's a regular expression pattern, false otherwise
|
||||
*/
|
||||
protected static function IsPattern($sCASPattern)
|
||||
{
|
||||
if ((substr($sCASPattern, 0, 1) == '/') && (substr($sCASPattern, -1) == '/'))
|
||||
{
|
||||
// the string is enclosed by slashes, let's assume it's a pattern
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// By default enable the 'CAS_SelfRegister' defined above
|
||||
UserRights::SelectSelfRegister('CAS_SelfRegister');
|
||||
?>
|
||||
|
||||
@@ -176,6 +176,10 @@ legend {
|
||||
-webkit-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.ui-widget-content td legend a, .ui-widget-content td legend a:hover, .ui-widget-content td legend a:visited {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.ui-widget-content td a, p a, p a:visited, td a, td a:visited {
|
||||
text-decoration:none;
|
||||
color: #1C94C4;
|
||||
@@ -1104,4 +1108,7 @@ div.actions_button a, .actions_button a:hover, .actions_button a:visited {
|
||||
height:17px;
|
||||
line-height: 17px;
|
||||
display: block;
|
||||
}
|
||||
select#org_id {
|
||||
max-width: 90%;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -140,6 +140,12 @@ Operators:<br/>
|
||||
|
||||
'Core:AttributePropertySet' => 'Properties',
|
||||
'Core:AttributePropertySet+' => 'List of untyped properties (name and value)',
|
||||
|
||||
'Core:AttributeFriendlyName' => 'Friendly name',
|
||||
'Core:AttributeFriendlyName+' => 'Attribute created automatically ; the friendly name is computed after several attributes',
|
||||
|
||||
'Core:FriendlyName-Label' => 'Name',
|
||||
'Core:FriendlyName-Description' => 'Friendly name',
|
||||
));
|
||||
|
||||
|
||||
@@ -587,7 +593,7 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Core:Synchro:History' => 'Synchronization History',
|
||||
'Core:Synchro:NeverRun' => 'This synchro was never run. No log yet.',
|
||||
'Core:Synchro:SynchroEndedOn_Date' => 'The latest synchronization ended on %1$s.',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'The synchronization started on $1$s is still running...',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'The synchronization started on %1$s is still running...',
|
||||
'Menu:DataSources' => 'Synchronization Data Sources',
|
||||
'Menu:DataSources+' => 'All Synchronization Data Sources',
|
||||
'Core:Synchro:label_repl_ignored' => 'Ignored (%1$s)',
|
||||
@@ -639,7 +645,9 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Core:SyncDataSourceObsolete' => 'The data source is marked as obsolete. Operation cancelled.',
|
||||
'Core:SyncDataSourceAccessRestriction' => 'Only adminstrators or the user specified in the data source can execute this operation. Operation cancelled.',
|
||||
'Core:SyncTooManyMissingReplicas' => 'All records have been untouched for some time (all of the objects could be deleted). Please check that the process that writes into the synchronization table is still running. Operation cancelled.',
|
||||
|
||||
'Core:SyncSplitModeCLIOnly' => 'The synchronization can be executed in chunks only if run in mode CLI',
|
||||
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s error(s), %3$s warning(s).',
|
||||
'Core:SynchroReplica:TargetObject' => 'Synchronized Object: %1$s',
|
||||
'Class:AsyncSendEmail' => 'Email (asynchronous)',
|
||||
'Class:AsyncSendEmail/Attribute:to' => 'To',
|
||||
'Class:AsyncSendEmail/Attribute:subject' => 'Subject',
|
||||
@@ -717,7 +725,7 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:SynchroReplica/Attribute:sync_source_id' => 'Synchro Data Source',
|
||||
'Class:SynchroReplica/Attribute:dest_id' => 'Destination object (ID)',
|
||||
'Class:SynchroReplica/Attribute:dest_class' => 'Destination type',
|
||||
'Class:SynchroReplica/Attribute:status_last_seen' => 'Lat seen',
|
||||
'Class:SynchroReplica/Attribute:status_last_seen' => 'Last seen',
|
||||
'Class:SynchroReplica/Attribute:status' => 'Status',
|
||||
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modified',
|
||||
'Class:SynchroReplica/Attribute:status/Value:new' => 'New',
|
||||
@@ -726,11 +734,14 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Synchronized',
|
||||
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Object Created ?',
|
||||
'Class:SynchroReplica/Attribute:status_last_error' => 'Last Error',
|
||||
'Class:SynchroReplica/Attribute:status_last_warning' => 'Warnings',
|
||||
'Class:SynchroReplica/Attribute:info_creation_date' => 'Creation Date',
|
||||
'Class:SynchroReplica/Attribute:info_last_modified' => 'Last Modified Date',
|
||||
'Class:appUserPreferences' => 'User Preferences',
|
||||
'Class:appUserPreferences/Attribute:userid' => 'User',
|
||||
'Class:appUserPreferences/Attribute:preferences' => 'Prefs',
|
||||
'Core:ExecProcess:Code1' => 'Wrong command or command finished with errors (e.g. wrong script name)',
|
||||
'Core:ExecProcess:Code255' => 'PHP Error (parsing, or runtime)',
|
||||
));
|
||||
|
||||
//
|
||||
|
||||
@@ -76,6 +76,26 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:AuditRule/Attribute:category_name+' => 'Name of the category for this rule',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: QueryOQL
|
||||
//
|
||||
|
||||
Dict::Add('EN US', 'English', 'English', array(
|
||||
'Class:Query' => 'Query',
|
||||
'Class:Query+' => 'A query is a data set defined in a dynamic way',
|
||||
'Class:Query/Attribute:name' => 'Name',
|
||||
'Class:Query/Attribute:name+' => 'Identifies the query',
|
||||
'Class:Query/Attribute:description' => 'Description',
|
||||
'Class:Query/Attribute:description+' => 'Long description for the query (purpose, usage, etc.)',
|
||||
'Class:Query/Attribute:fields' => 'Fields',
|
||||
'Class:Query/Attribute:fields+' => 'Coma separated list of attributes (or alias.attribute) to export',
|
||||
|
||||
'Class:QueryOQL' => 'OQL Query',
|
||||
'Class:QueryOQL+' => 'A query based on the Object Query Language',
|
||||
'Class:QueryOQL/Attribute:oql' => 'Expression',
|
||||
'Class:QueryOQL/Attribute:oql+' => 'OQL Expression',
|
||||
));
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Classes in 'addon/userrights'
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -429,6 +449,8 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:UndefinedObject' => 'undefined',
|
||||
'UI:Document:OpenInNewWindow:Download' => 'Open in new window: %1$s, Download: %2$s',
|
||||
'UI:SelectAllToggle+' => 'Select / Deselect All',
|
||||
'UI:SplitDateTime-Date' => 'date',
|
||||
'UI:SplitDateTime-Time' => 'time',
|
||||
'UI:TruncatedResults' => '%1$d objects displayed out of %2$d',
|
||||
'UI:DisplayAll' => 'Display All',
|
||||
'UI:CollapseList' => 'Collapse',
|
||||
@@ -448,6 +470,7 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:Login:IdentifyYourself' => 'Identify yourself before continuing',
|
||||
'UI:Login:UserNamePrompt' => 'User Name',
|
||||
'UI:Login:PasswordPrompt' => 'Password',
|
||||
'UI:Login:About' => '',
|
||||
'UI:Login:ChangeYourPassword' => 'Change Your Password',
|
||||
'UI:Login:OldPasswordPrompt' => 'Old password',
|
||||
'UI:Login:NewPasswordPrompt' => 'New password',
|
||||
@@ -532,7 +555,9 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:Audit:HeaderNbObjects' => '# Objects',
|
||||
'UI:Audit:HeaderNbErrors' => '# Errors',
|
||||
'UI:Audit:PercentageOk' => '% Ok',
|
||||
|
||||
'UI:Audit:ErrorIn_Rule_Reason' => 'OQL Error in the Rule %1$s: %2$s.',
|
||||
'UI:Audit:ErrorIn_Category_Reason' => 'OQL Error in the Category %1$s: %2$s.',
|
||||
|
||||
'UI:RunQuery:Title' => 'iTop - OQL Query Evaluation',
|
||||
'UI:RunQuery:QueryExamples' => 'Query Examples',
|
||||
'UI:RunQuery:HeaderPurpose' => 'Purpose',
|
||||
@@ -544,7 +569,7 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:RunQuery:DevelopedQuery' => 'Redevelopped query expression: ',
|
||||
'UI:RunQuery:SerializedFilter' => 'Serialized filter: ',
|
||||
'UI:RunQuery:Error' => 'An error occured while running the query: %1$s',
|
||||
|
||||
'UI:Query:UrlForExcel' => 'URL to use for MS-Excel web queries',
|
||||
'UI:Schema:Title' => 'iTop objects schema',
|
||||
'UI:Schema:CategoryMenuItem' => 'Category <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relationships',
|
||||
@@ -604,8 +629,8 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:Schema:LifeCycleAttributeMustChange' => 'Must change',
|
||||
'UI:Schema:LifeCycleAttributeMustPrompt' => 'User will be prompted to change the value',
|
||||
'UI:Schema:LifeCycleEmptyList' => 'empty list',
|
||||
|
||||
'UI:LinksWidget:Autocomplete+' => 'Type the first 3 characters...',
|
||||
'UI:Edit:TestQuery' => 'Test query',
|
||||
'UI:Combo:SelectValue' => '--- select a value ---',
|
||||
'UI:Label:SelectedObjects' => 'Selected objects: ',
|
||||
'UI:Label:AvailableObjects' => 'Available objects: ',
|
||||
@@ -618,7 +643,6 @@ Dict::Add('EN US', 'English', 'English', array(
|
||||
'UI:RemoveLinkedObjectsOf_Class' => 'Remove selected objects',
|
||||
'UI:Message:EmptyList:UseAdd' => 'The list is empty, use the "Add..." button to add elements.',
|
||||
'UI:Message:EmptyList:UseSearchForm' => 'Use the search form above to search for objects to be added.',
|
||||
|
||||
'UI:Wizard:FinalStepTitle' => 'Final step: confirmation',
|
||||
'UI:Title:DeletionOf_Object' => 'Deletion of %1$s',
|
||||
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Bulk deletion of %1$d objects of class %2$s',
|
||||
@@ -821,6 +845,9 @@ When associated with a trigger, each action is given an "order" number, specifyi
|
||||
'Menu:RunQueriesMenu' => 'Run Queries',
|
||||
'Menu:RunQueriesMenu+' => 'Run any query',
|
||||
|
||||
'Menu:QueryMenu' => 'Query phrasebook',
|
||||
'Menu:QueryMenu+' => 'Query phrasebook',
|
||||
|
||||
'Menu:DataAdministration' => 'Data administration',
|
||||
'Menu:DataAdministration+' => 'Data administration',
|
||||
|
||||
@@ -862,6 +889,7 @@ When associated with a trigger, each action is given an "order" number, specifyi
|
||||
'UI:RelationshipGraph' => 'Graphical view',
|
||||
'UI:RelationshipList' => 'List',
|
||||
'UI:OperationCancelled' => 'Operation Cancelled',
|
||||
'UI:ElementsDisplayed' => 'Filtering',
|
||||
|
||||
'Portal:Title' => 'iTop user portal',
|
||||
'Portal:Refresh' => 'Refresh',
|
||||
|
||||
@@ -386,6 +386,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:SynchroReplica/Attribute:status_dest_creator+' => '',
|
||||
'Class:SynchroReplica/Attribute:status_last_error' => 'Dernière erreur',
|
||||
'Class:SynchroReplica/Attribute:status_last_error+' => '',
|
||||
'Class:SynchroReplica/Attribute:status_last_warning' => 'Avertissements',
|
||||
'Class:SynchroReplica/Attribute:status_last_warning+' => '',
|
||||
'Class:SynchroReplica/Attribute:info_creation_date' => 'Date de création',
|
||||
'Class:SynchroReplica/Attribute:info_creation_date+' => '',
|
||||
'Class:SynchroReplica/Attribute:info_last_modified' => 'Date de dernière modification',
|
||||
@@ -483,6 +485,13 @@ Opérateurs :<br/>
|
||||
'Core:AttributeTable+' => 'Tableau à deux dimensions',
|
||||
'Core:AttributePropertySet' => 'Propriétés',
|
||||
'Core:AttributePropertySet+' => 'Liste de propriétés (nom et valeur) non typées',
|
||||
|
||||
'Core:AttributeFriendlyName' => 'Nom usuel (convivial)',
|
||||
'Core:AttributeFriendlyName+' => 'Attribut créé automatiquement ; sa valeur est calculée d\'après d\'autres attributs',
|
||||
|
||||
'Core:FriendlyName-Label' => 'Nom',
|
||||
'Core:FriendlyName-Description' => 'Nom usuel',
|
||||
|
||||
'Change:ObjectCreated' => 'Elément créé',
|
||||
'Change:ObjectDeleted' => 'Elément effacé',
|
||||
'Change:ObjectModified' => 'Elément modifié',
|
||||
@@ -554,7 +563,7 @@ Opérateurs :<br/>
|
||||
'Core:Synchro:History' => 'Historique de synchronisation',
|
||||
'Core:Synchro:NeverRun' => 'Aucun historique, la synchronisation n\'a pas encore fonctionné',
|
||||
'Core:Synchro:SynchroEndedOn_Date' => 'La dernière synchronisation s\'est terminée à: %1$s.',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Synchronisation en cours (début à $1$s)',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Synchronisation en cours (début à %1$s)',
|
||||
'Menu:DataSources' => 'Synchronisation',
|
||||
'Menu:DataSources+' => '',
|
||||
'Core:Synchro:label_repl_ignored' => 'Ignorés (%1$s)',
|
||||
@@ -605,6 +614,8 @@ Opérateurs :<br/>
|
||||
'Core:SyncDataSourceObsolete' => 'Cette source de données est obsolète. Opération annulée.',
|
||||
'Core:SyncDataSourceAccessRestriction' => 'Seuls les administrateurs et l\'utilisateur spécifié dans la source de données peuvent exécuter cette synchronisation. Opération annulée.',
|
||||
'Core:SyncTooManyMissingReplicas' => 'Tous les réplicas sont absents de l\'import. L\'import a-t-il réellement tourné. Opération annulée.',
|
||||
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s erreur(s), %3$s avertissement(s).',
|
||||
'Core:SynchroReplica:TargetObject' => 'Objet Synchronisé : %1$s',
|
||||
'Core:Duration_Seconds' => '%1$ds',
|
||||
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
|
||||
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds',
|
||||
|
||||
@@ -50,6 +50,18 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:AuditCategory/Attribute:definition_set+' => 'Expression OQL qui défini le périmètre d\'application de l\'audit',
|
||||
'Class:AuditCategory/Attribute:rules_list' => 'Règles d\'audit',
|
||||
'Class:AuditCategory/Attribute:rules_list+' => 'Règles d\'audit pour cette catégorie',
|
||||
'Class:Query' => 'Requête',
|
||||
'Class:Query+' => 'Une requête définit un ensemble d\'information de manière dynamique',
|
||||
'Class:Query/Attribute:name' => 'Nom',
|
||||
'Class:Query/Attribute:name+' => 'Identification de la requête',
|
||||
'Class:Query/Attribute:description' => 'Description',
|
||||
'Class:Query/Attribute:description+' => 'Description complète (finalité, utilisations, public)',
|
||||
'Class:Query/Attribute:fields' => 'Champs',
|
||||
'Class:Query/Attribute:fields+' => 'Liste CSV des attributs (ou alias.attribut) à exporter',
|
||||
'Class:QueryOQL' => 'Requête OQL',
|
||||
'Class:QueryOQL+' => 'Une requête écrite dans le langage "Object Query Language"',
|
||||
'Class:QueryOQL/Attribute:oql' => 'Expression',
|
||||
'Class:QueryOQL/Attribute:oql+' => 'Expression OQL',
|
||||
'Class:URP_Profiles' => 'Profil',
|
||||
'Class:URP_Profiles+' => 'Profil utilisateur',
|
||||
'Class:URP_Profiles/Attribute:name' => 'Nom',
|
||||
@@ -71,7 +83,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'Class:URP_UserProfile/Attribute:reason' => 'Raison',
|
||||
'Class:URP_UserProfile/Attribute:reason+' => 'Justifie le rôle affecté à cet utilisateur',
|
||||
'Class:URP_UserOrg' => 'Utilisateur/Organisation',
|
||||
'Class:URP_UserOrg+' => 'Organizations permises pour l\'utilisateur',
|
||||
'Class:URP_UserOrg+' => 'Organisations permises pour l\'utilisateur',
|
||||
'Class:URP_UserOrg/Attribute:userid' => 'Utilisateur',
|
||||
'Class:URP_UserOrg/Attribute:userid+' => '',
|
||||
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
|
||||
@@ -215,7 +227,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:WelcomeMenu:OpenIncidents' => 'Incidents en cours: %1$d',
|
||||
'UI:WelcomeMenu:AllConfigItems' => 'Actifs: %1$d',
|
||||
'UI:WelcomeMenu:MyIncidents' => 'Mes Incidents',
|
||||
'UI:AllOrganizations' => ' Toutes les Organizations ',
|
||||
'UI:AllOrganizations' => ' Toutes les Organisations ',
|
||||
'UI:YourSearch' => 'Votre recherche',
|
||||
'UI:LoggedAsMessage' => 'Connecté comme: %1$s',
|
||||
'UI:LoggedAsMessage+Admin' => 'Connecté comme: %1$s (Administrateur)',
|
||||
@@ -316,6 +328,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Document:OpenInNewWindow:Download' => 'Ouvrir dans un nouvelle fenêtre: %1$s, Télécharger: %2$s',
|
||||
'UI:SelectAllToggle+' => 'Tout sélectionner / Tout déselectionner',
|
||||
'UI:TruncatedResults' => '%1$d objets affichés sur %2$d',
|
||||
'UI:SplitDateTime-Date' => 'date',
|
||||
'UI:SplitDateTime-Time' => 'heure',
|
||||
'UI:DisplayAll' => 'Tout afficher',
|
||||
'UI:CollapseList' => 'Refermer',
|
||||
'UI:CountOfResults' => '%1$d objet(s)',
|
||||
@@ -416,6 +430,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Audit:HeaderNbObjects' => 'Nb d\'Objets',
|
||||
'UI:Audit:HeaderNbErrors' => 'Nb d\'Erreurs',
|
||||
'UI:Audit:PercentageOk' => '% Ok',
|
||||
'UI:Audit:ErrorIn_Rule_Reason' => 'Erreur OQL dans la règle %1$s: %2$s.',
|
||||
'UI:Audit:ErrorIn_Category_Reason' => 'Erreur OQL dans la catégorie %1$s: %2$s.',
|
||||
'UI:RunQuery:Title' => 'iTop - Evaluation de requêtes OQL',
|
||||
'UI:RunQuery:QueryExamples' => 'Exemples de requêtes',
|
||||
'UI:RunQuery:HeaderPurpose' => 'Objectif',
|
||||
@@ -427,6 +443,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:RunQuery:DevelopedQuery' => 'Requête OQL décompilée : ',
|
||||
'UI:RunQuery:SerializedFilter' => 'Version sérialisée : ',
|
||||
'UI:RunQuery:Error' => 'Une erreur s\'est produite durant l\'exécution de la requête : %1$s',
|
||||
'UI:Query:UrlForExcel' => 'Lien à copier-coller dans Excel, pour déclarer une source de données à partir du web',
|
||||
'UI:Schema:Title' => 'Modèle de données iTop',
|
||||
'UI:Schema:CategoryMenuItem' => 'Catégorie <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relations',
|
||||
@@ -486,6 +503,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
||||
'UI:Schema:LifeCycleAttributeMustPrompt' => 'L\'utilisateur se verra proposer de changer la valeur',
|
||||
'UI:Schema:LifeCycleEmptyList' => 'liste vide',
|
||||
'UI:LinksWidget:Autocomplete+' => 'Tapez les 3 premiers caractères...',
|
||||
'UI:Edit:TestQuery' => 'Tester le requête',
|
||||
'UI:Combo:SelectValue' => '--- choisissez une valeur ---',
|
||||
'UI:Label:SelectedObjects' => 'Objets sélectionnés: ',
|
||||
'UI:Label:AvailableObjects' => 'Objets disponibles: ',
|
||||
@@ -680,6 +698,8 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
|
||||
'Menu:Notifications:Title' => 'Catégories d\'audit',
|
||||
'Menu:RunQueriesMenu' => 'Requêtes OQL',
|
||||
'Menu:RunQueriesMenu+' => 'Executer une requête OQL',
|
||||
'Menu:QueryMenu' => 'Livre des requêtes',
|
||||
'Menu:QueryMenu+' => 'Livre des requêtes',
|
||||
'Menu:DataAdministration' => 'Administration des données',
|
||||
'Menu:DataAdministration+' => 'Administration des données',
|
||||
'Menu:UniversalSearchMenu' => 'Recherche Universelle',
|
||||
@@ -712,6 +732,7 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
|
||||
'UI:DisplayThisMessageAtStartup' => 'Afficher ce message au démarrage',
|
||||
'UI:RelationshipGraph' => 'Vue graphique',
|
||||
'UI:RelationshipList' => 'Liste',
|
||||
'UI:ElementsDisplayed' => 'Filtrage',
|
||||
'UI:OperationCancelled' => 'Opération Annulée',
|
||||
'Portal:Title' => 'Portail utilisateur iTop',
|
||||
'Portal:Refresh' => 'Rafraîchir',
|
||||
|
||||
@@ -422,7 +422,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
|
||||
'Core:Synchro:History' => 'Szinkronizáció történet',
|
||||
'Core:Synchro:NeverRun' => 'Ez a szinkronizáció még soha nem futott. Nincs még napló bejegyzés.',
|
||||
'Core:Synchro:SynchroEndedOn_Date' => 'Az utolsó szinkronizáció lefutásának időpontja: %1$s.',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Az szinkronizáció elindut $1$s, de még fut.',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Az szinkronizáció elindut %1$s, de még fut.',
|
||||
'Menu:DataSources' => 'Szinkronizált adatforrások',
|
||||
'Menu:DataSources+' => '',
|
||||
'Core:Synchro:label_repl_ignored' => 'Figyelmen kívül hagyott (%1$s)',
|
||||
|
||||
@@ -1,485 +1,485 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('IT IT', 'Italian', 'Italiano', array(
|
||||
'Class:ActionEmail' => 'E-mail di notifica',
|
||||
'Class:ActionEmail+' => '',
|
||||
'Class:ActionEmail/Attribute:test_recipient' => 'Test destinatario',
|
||||
'Class:ActionEmail/Attribute:test_recipient+' => '',
|
||||
'Class:ActionEmail/Attribute:from' => 'Da',
|
||||
'Class:ActionEmail/Attribute:from+' => '',
|
||||
'Class:ActionEmail/Attribute:reply_to' => 'Rispondi A',
|
||||
'Class:ActionEmail/Attribute:reply_to+' => '',
|
||||
'Class:ActionEmail/Attribute:to' => 'A',
|
||||
'Class:ActionEmail/Attribute:to+' => '',
|
||||
'Class:ActionEmail/Attribute:cc' => 'Cc',
|
||||
'Class:ActionEmail/Attribute:cc+' => '',
|
||||
'Class:ActionEmail/Attribute:bcc' => 'BCC',
|
||||
'Class:ActionEmail/Attribute:bcc+' => '',
|
||||
'Class:ActionEmail/Attribute:subject' => 'Oggetto',
|
||||
'Class:ActionEmail/Attribute:subject+' => '',
|
||||
'Class:ActionEmail/Attribute:body' => 'corpo',
|
||||
'Class:ActionEmail/Attribute:body+' => '',
|
||||
'Class:ActionEmail/Attribute:importance' => 'priorità',
|
||||
'Class:ActionEmail/Attribute:importance+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high' => 'alta',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low' => 'bassa',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normake',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal+' => '',
|
||||
'Class:TriggerOnStateEnter' => 'Trigger (sull\'entrare in uno stato)',
|
||||
'Class:TriggerOnStateEnter+' => '',
|
||||
'Class:TriggerOnStateLeave' => 'Trigger (sul lasciare uno stato)~~',
|
||||
'Class:TriggerOnStateLeave+' => '',
|
||||
'Class:TriggerOnObjectCreate' => 'Trigger (sulla creazione di un oggetto)~~',
|
||||
'Class:TriggerOnObjectCreate+' => '',
|
||||
'Class:lnkTriggerAction' => 'Azione/Trigger~~',
|
||||
'Class:lnkTriggerAction+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_id' => 'Azione',
|
||||
'Class:lnkTriggerAction/Attribute:action_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:order' => 'Ordine',
|
||||
'Class:lnkTriggerAction/Attribute:order+' => '',
|
||||
'Class:AsyncSendEmail' => 'Email (asincrona)',
|
||||
'Class:AsyncSendEmail/Attribute:to' => 'A',
|
||||
'Class:AsyncSendEmail/Attribute:subject' => 'Oggetto',
|
||||
'Class:AsyncSendEmail/Attribute:body' => 'Corpo',
|
||||
'Class:AsyncSendEmail/Attribute:header' => 'Intestazione',
|
||||
'Class:CMDBChange' => 'Cambio',
|
||||
'Class:CMDBChange+' => '',
|
||||
'Class:CMDBChange/Attribute:date' => 'data',
|
||||
'Class:CMDBChange/Attribute:date+' => '',
|
||||
'Class:CMDBChange/Attribute:userinfo' => 'info varie',
|
||||
'Class:CMDBChange/Attribute:userinfo+' => '',
|
||||
'Class:CMDBChangeOp' => 'Operazione di Cambio',
|
||||
'Class:CMDBChangeOp+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:change' => 'cambio',
|
||||
'Class:CMDBChangeOp/Attribute:change+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:objclass' => 'oggetto della classe',
|
||||
'Class:CMDBChangeOp/Attribute:objclass+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:objkey' => 'oggetto id',
|
||||
'Class:CMDBChangeOp/Attribute:objkey+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
|
||||
'Class:CMDBChangeOpCreate' => 'creazione dell\'oggetto',
|
||||
'Class:CMDBChangeOpCreate+' => '',
|
||||
'Class:CMDBChangeOpDelete' => 'cancellazione dell\'oggetto',
|
||||
'Class:CMDBChangeOpDelete+' => '',
|
||||
'Class:CMDBChangeOpSetAttribute' => 'cambio dell\'oggetto',
|
||||
'Class:CMDBChangeOpSetAttribute+' => '',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Attributo',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar' => 'cambio della proprietà',
|
||||
'Class:CMDBChangeOpSetAttributeScalar+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valore precedente',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Valore Nuovo',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeBlob' => 'modifica i dati',
|
||||
'Class:CMDBChangeOpSetAttributeBlob+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dati precedenti',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Password criptata',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Valore Precedente',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field~~',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Valore Precedente',
|
||||
'Class:CMDBChangeOpSetAttributeText' => 'modifica testo',
|
||||
'Class:CMDBChangeOpSetAttributeText+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dati precendenti',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Log dei casi',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Ultima entrata',
|
||||
'Class:Event' => 'Log dell\'evento',
|
||||
'Class:Event+' => '',
|
||||
'Class:Event/Attribute:message' => 'Messaggio',
|
||||
'Class:Event/Attribute:message+' => '',
|
||||
'Class:Event/Attribute:date' => 'Data',
|
||||
'Class:Event/Attribute:date+' => '',
|
||||
'Class:Event/Attribute:userinfo' => 'Info Utente',
|
||||
'Class:Event/Attribute:userinfo+' => '',
|
||||
'Class:Event/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Event/Attribute:finalclass+' => '',
|
||||
'Class:EventNotification' => 'Notifica dell\'evento',
|
||||
'Class:EventNotification+' => '',
|
||||
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:EventNotification/Attribute:trigger_id+' => '',
|
||||
'Class:EventNotification/Attribute:action_id' => 'utente',
|
||||
'Class:EventNotification/Attribute:action_id+' => '',
|
||||
'Class:EventNotification/Attribute:object_id' => 'Oggetto id',
|
||||
'Class:EventNotification/Attribute:object_id+' => '',
|
||||
'Class:EventNotificationEmail' => 'Email caso di emissione',
|
||||
'Class:EventNotificationEmail+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:to' => 'A',
|
||||
'Class:EventNotificationEmail/Attribute:to+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
|
||||
'Class:EventNotificationEmail/Attribute:cc+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
|
||||
'Class:EventNotificationEmail/Attribute:bcc+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:from' => 'Da',
|
||||
'Class:EventNotificationEmail/Attribute:from+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:subject' => 'Oggeto',
|
||||
'Class:EventNotificationEmail/Attribute:subject+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
|
||||
'Class:EventNotificationEmail/Attribute:body+' => '',
|
||||
'Class:EventIssue' => 'Evento Problema',
|
||||
'Class:EventIssue+' => '',
|
||||
'Class:EventIssue/Attribute:issue' => 'Problema',
|
||||
'Class:EventIssue/Attribute:issue+' => '',
|
||||
'Class:EventIssue/Attribute:impact' => 'Impatto',
|
||||
'Class:EventIssue/Attribute:impact+' => '',
|
||||
'Class:EventIssue/Attribute:page' => 'Pagina',
|
||||
'Class:EventIssue/Attribute:page+' => '',
|
||||
'Class:EventIssue/Attribute:arguments_post' => 'Argomenti inviati',
|
||||
'Class:EventIssue/Attribute:arguments_post+' => '',
|
||||
'Class:EventIssue/Attribute:arguments_get' => 'Argomenti URL',
|
||||
'Class:EventIssue/Attribute:arguments_get+' => '',
|
||||
'Class:EventIssue/Attribute:callstack' => 'Callstack',
|
||||
'Class:EventIssue/Attribute:callstack+' => '',
|
||||
'Class:EventIssue/Attribute:data' => 'Dati',
|
||||
'Class:EventIssue/Attribute:data+' => '',
|
||||
'Class:EventWebService' => 'Evento Servizio Web',
|
||||
'Class:EventWebService+' => '',
|
||||
'Class:EventWebService/Attribute:verb' => 'Verbo',
|
||||
'Class:EventWebService/Attribute:verb+' => '',
|
||||
'Class:EventWebService/Attribute:result' => 'Resulto',
|
||||
'Class:EventWebService/Attribute:result+' => '',
|
||||
'Class:EventWebService/Attribute:log_info' => 'Log delle info',
|
||||
'Class:EventWebService/Attribute:log_info+' => '',
|
||||
'Class:EventWebService/Attribute:log_warning' => 'Log dei warning',
|
||||
'Class:EventWebService/Attribute:log_warning+' => '',
|
||||
'Class:EventWebService/Attribute:log_error' => 'Log degli errori',
|
||||
'Class:EventWebService/Attribute:log_error+' => '',
|
||||
'Class:EventWebService/Attribute:data' => 'Dati',
|
||||
'Class:EventWebService/Attribute:data+' => '',
|
||||
'Class:EventLoginUsage' => 'Login di utilizzo',
|
||||
'Class:EventLoginUsage+' => '',
|
||||
'Class:EventLoginUsage/Attribute:user_id' => 'Login',
|
||||
'Class:EventLoginUsage/Attribute:user_id+' => '',
|
||||
'Class:SynchroDataSource' => 'Sorgente di sincronizzazione dei dati',
|
||||
'Class:SynchroDataSource/Attribute:name' => 'Nome',
|
||||
'Class:SynchroDataSource/Attribute:name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:description' => 'Descrizione',
|
||||
'Class:SynchroDataSource/Attribute:status' => 'Stato',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementazione',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsoleto',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Produzione',
|
||||
'Class:SynchroDataSource/Attribute:user_id' => 'Utente',
|
||||
'Class:SynchroDataSource/Attribute:scope_class' => 'Classe Target',
|
||||
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Campo di applicazione restrizione',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Intervallo a pieno carico',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Policy di riconciliazione',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Usa gli attributi',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Usa il campo chiave primaria',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Azione su zero~~',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Crea',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Errore',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one' => 'Azione su uno',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Aggiorna',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Azione su molti',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Crea',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Errore',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Considera il primo (random?)',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy' => 'Policy di cancellazioen',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Cancella',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignora',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Aggiorna',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Aggiorna e poi Cancella',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Regole per l\'aggiornamento',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Durata di conservazione',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
|
||||
'Class:SynchroDataSource/Attribute:attribute_list' => 'Lista degli attributi',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'utenti autorizzati',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Solo Amministratore',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Tutti sono autorizzati a cancellare questi oggetti',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nessuno',
|
||||
'Class:SynchroDataSource/Attribute:url_icon' => 'Icona di collegamento ipertestuale',
|
||||
'Class:SynchroDataSource/Attribute:url_icon+' => '',
|
||||
'Class:SynchroDataSource/Attribute:url_application' => 'Collegamento ipertestuale all\'applicazione',
|
||||
'Class:SynchroDataSource/Attribute:url_application+' => '',
|
||||
'Class:SynchroAttribute' => 'Attributo di sincronizzazione',
|
||||
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Sorgente sincronizzazione dati',
|
||||
'Class:SynchroAttribute/Attribute:attcode' => 'Codice attributo',
|
||||
'Class:SynchroAttribute/Attribute:update' => 'Aggiorna',
|
||||
'Class:SynchroAttribute/Attribute:reconcile' => 'Rincocilia',
|
||||
'Class:SynchroAttribute/Attribute:update_policy' => 'Policy di aggiornamento',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Bloccato',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Sbloccato',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Inizializza se vuoto',
|
||||
'Class:SynchroAttribute/Attribute:finalclass' => 'Classe',
|
||||
'Class:SynchroAttExtKey' => 'Attributo di sincronizzazione (ExtKey)',
|
||||
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Attributo di riconciliazione',
|
||||
'Class:SynchroAttLinkSet' => 'Attributo di sincronizzazione (Linkset)',
|
||||
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Separatore di righe',
|
||||
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Separatore di attributi',
|
||||
'Class:SynchroLog' => 'Log di sincronizzazione',
|
||||
'Class:SynchroLog/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
|
||||
'Class:SynchroLog/Attribute:start_date' => 'Data di inizio',
|
||||
'Class:SynchroLog/Attribute:end_date' => 'Data di fine',
|
||||
'Class:SynchroLog/Attribute:status' => 'Stato',
|
||||
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completo',
|
||||
'Class:SynchroLog/Attribute:status/Value:error' => 'Errore',
|
||||
'Class:SynchroLog/Attribute:status/Value:running' => 'Ancora in esecuzione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica viste',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica totale',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb oggetti cancellati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb di errore durante la cancellazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb oggetti obsoleti',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb di errori mentre obsoleta',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb oggetti creati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb di errori durante la creazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb oggetti aggiornati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb di errori durante l\'aggiornamento',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb di errori durante la riconcilazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb repliche scomparse',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb oggetti aggiornati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb oggetti non modificati',
|
||||
'Class:SynchroLog/Attribute:last_error' => 'Untimo errore',
|
||||
'Class:SynchroLog/Attribute:traces' => 'Tracce',
|
||||
'Class:SynchroReplica' => 'Replica sincronizzazione',
|
||||
'Class:SynchroReplica/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
|
||||
'Class:SynchroReplica/Attribute:dest_id' => 'Oggetto di destinazione (ID)~~',
|
||||
'Class:SynchroReplica/Attribute:dest_class' => 'Tipo di destinazione',
|
||||
'Class:SynchroReplica/Attribute:status_last_seen' => 'Ultimo visto',
|
||||
'Class:SynchroReplica/Attribute:status' => 'Stato',
|
||||
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modificato',
|
||||
'Class:SynchroReplica/Attribute:status/Value:new' => 'Nuovo',
|
||||
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsoleto',
|
||||
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orfano',
|
||||
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Sincronizzato',
|
||||
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Oggetto Creato ?',
|
||||
'Class:SynchroReplica/Attribute:status_last_error' => 'Ultimo Errore',
|
||||
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data di creazione',
|
||||
'Class:SynchroReplica/Attribute:info_last_modified' => 'Data ultima modifica',
|
||||
'Class:appUserPreferences' => 'Preferenze utente',
|
||||
'Class:appUserPreferences/Attribute:userid' => 'Utente',
|
||||
'Class:appUserPreferences/Attribute:preferences' => 'Preferenze',
|
||||
'Core:AttributeLinkedSet' => 'Array di oggetti',
|
||||
'Core:AttributeLinkedSet+' => '',
|
||||
'Core:AttributeLinkedSetIndirect' => 'Array di oggetti (N-N)',
|
||||
'Core:AttributeLinkedSetIndirect+' => '',
|
||||
'Core:AttributeInteger' => 'Integero',
|
||||
'Core:AttributeInteger+' => '',
|
||||
'Core:AttributeDecimal' => 'Decimale',
|
||||
'Core:AttributeDecimal+' => '',
|
||||
'Core:AttributeBoolean' => 'Booleano',
|
||||
'Core:AttributeBoolean+' => '',
|
||||
'Core:AttributeString' => 'Stringa',
|
||||
'Core:AttributeString+' => '',
|
||||
'Core:AttributeClass' => 'Classe',
|
||||
'Core:AttributeClass+' => '',
|
||||
'Core:AttributeApplicationLanguage' => 'Linguaggio Utente',
|
||||
'Core:AttributeApplicationLanguage+' => '',
|
||||
'Core:AttributeFinalClass' => 'Classe (auto)',
|
||||
'Core:AttributeFinalClass+' => '',
|
||||
'Core:AttributePassword' => 'Password',
|
||||
'Core:AttributePassword+' => '',
|
||||
'Core:AttributeEncryptedString' => 'Stringa criptata',
|
||||
'Core:AttributeEncryptedString+' => '',
|
||||
'Core:AttributeText' => 'Testo',
|
||||
'Core:AttributeText+' => '',
|
||||
'Core:AttributeHTML' => 'HTML',
|
||||
'Core:AttributeHTML+' => '',
|
||||
'Core:AttributeEmailAddress' => 'Indirizzo Email',
|
||||
'Core:AttributeEmailAddress+' => '',
|
||||
'Core:AttributeIPAddress' => 'Indirizzo IP',
|
||||
'Core:AttributeIPAddress+' => '',
|
||||
'Core:AttributeOQL' => 'OQL',
|
||||
'Core:AttributeOQL+' => '',
|
||||
'Core:AttributeEnum' => 'Enum',
|
||||
'Core:AttributeEnum+' => '',
|
||||
'Core:AttributeTemplateString' => 'Stringa Template',
|
||||
'Core:AttributeTemplateString+' => '',
|
||||
'Core:AttributeTemplateText' => 'Testo Template',
|
||||
'Core:AttributeTemplateText+' => '',
|
||||
'Core:AttributeTemplateHTML' => 'HTML Template',
|
||||
'Core:AttributeTemplateHTML+' => '',
|
||||
'Core:AttributeDateTime' => 'Data/ora',
|
||||
'Core:AttributeDateTime+' => '',
|
||||
'Core:AttributeDate' => 'Data',
|
||||
'Core:AttributeDate+' => '',
|
||||
'Core:AttributeDeadline' => 'Scadenza',
|
||||
'Core:AttributeDeadline+' => '',
|
||||
'Core:AttributeExternalKey' => 'Chiave esterna',
|
||||
'Core:AttributeExternalKey+' => '',
|
||||
'Core:AttributeExternalField' => 'Campo esterno',
|
||||
'Core:AttributeExternalField+' => '',
|
||||
'Core:AttributeURL' => 'URL',
|
||||
'Core:AttributeURL+' => '',
|
||||
'Core:AttributeBlob' => 'Blob',
|
||||
'Core:AttributeBlob+' => '',
|
||||
'Core:AttributeOneWayPassword' => 'Password unidierzionale',
|
||||
'Core:AttributeOneWayPassword+' => '',
|
||||
'Core:AttributeTable' => 'Tabella',
|
||||
'Core:AttributeTable+' => '',
|
||||
'Core:AttributePropertySet' => 'Proprietà',
|
||||
'Core:AttributePropertySet+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:date' => 'data',
|
||||
'Class:CMDBChangeOp/Attribute:date+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo' => 'utente',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo+' => '',
|
||||
'Change:ObjectCreated' => 'Oggetto creato',
|
||||
'Change:ObjectDeleted' => 'Oggetto cancellato',
|
||||
'Change:ObjectModified' => 'Object modificato',
|
||||
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s imposatato a %2$s (valore precendente: %3$s)',
|
||||
'Change:AttName_SetTo' => '%1$s impostato a %2$s~~',
|
||||
'Change:Text_AppendedTo_AttName' => '%1$s allegato a %2$s~~',
|
||||
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s moficato, valore precendente: %2$s',
|
||||
'Change:AttName_Changed' => '%1$s modificato',
|
||||
'Change:AttName_EntryAdded' => '%1$s modificato, nuova entrata aggiunta.',
|
||||
'Class:EventLoginUsage/Attribute:contact_name' => 'Nome Utente',
|
||||
'Class:EventLoginUsage/Attribute:contact_name+' => '',
|
||||
'Class:EventLoginUsage/Attribute:contact_email' => 'Email Utente',
|
||||
'Class:EventLoginUsage/Attribute:contact_email+' => '',
|
||||
'Class:Action' => 'Azione personalizzata',
|
||||
'Class:Action+' => '',
|
||||
'Class:Action/Attribute:name' => 'Nome',
|
||||
'Class:Action/Attribute:name+' => '',
|
||||
'Class:Action/Attribute:description' => 'Descrizione',
|
||||
'Class:Action/Attribute:description+' => '',
|
||||
'Class:Action/Attribute:status' => 'Stato',
|
||||
'Class:Action/Attribute:status+' => '',
|
||||
'Class:Action/Attribute:status/Value:test' => 'In fase di test',
|
||||
'Class:Action/Attribute:status/Value:test+' => '',
|
||||
'Class:Action/Attribute:status/Value:enabled' => 'In produzione',
|
||||
'Class:Action/Attribute:status/Value:enabled+' => '',
|
||||
'Class:Action/Attribute:status/Value:disabled' => 'Inattivo',
|
||||
'Class:Action/Attribute:status/Value:disabled+' => '',
|
||||
'Class:Action/Attribute:trigger_list' => 'Trigger Correlati',
|
||||
'Class:Action/Attribute:trigger_list+' => '',
|
||||
'Class:Action/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Action/Attribute:finalclass+' => '',
|
||||
'Class:ActionNotification' => 'Notifica',
|
||||
'Class:ActionNotification+' => '',
|
||||
'Class:Trigger' => 'Trigger',
|
||||
'Class:Trigger+' => '',
|
||||
'Class:Trigger/Attribute:description' => 'Descrizione',
|
||||
'Class:Trigger/Attribute:description+' => '',
|
||||
'Class:Trigger/Attribute:action_list' => 'Azioni Triggerate',
|
||||
'Class:Trigger/Attribute:action_list+' => '',
|
||||
'Class:Trigger/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Trigger/Attribute:finalclass+' => '',
|
||||
'Class:TriggerOnObject' => 'Trigger (classe dipendente)',
|
||||
'Class:TriggerOnObject+' => '',
|
||||
'Class:TriggerOnObject/Attribute:target_class' => 'Classe Target',
|
||||
'Class:TriggerOnObject/Attribute:target_class+' => '',
|
||||
'Class:TriggerOnStateChange' => 'Trigger (sul cambio di stato)',
|
||||
'Class:TriggerOnStateChange+' => '',
|
||||
'Class:TriggerOnStateChange/Attribute:state' => 'Stato',
|
||||
'Class:TriggerOnStateChange/Attribute:state+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_name' => 'Azione',
|
||||
'Class:lnkTriggerAction/Attribute:action_name+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nessuno',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Solo Amministratore',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tutti gli utenti autorizzati',
|
||||
'SynchroDataSource:Description' => 'Descrizione',
|
||||
'SynchroDataSource:Reconciliation' => 'Ricerca & riconciliazione',
|
||||
'SynchroDataSource:Deletion' => 'Regole di cancellazione',
|
||||
'SynchroDataSource:Status' => 'Stato',
|
||||
'SynchroDataSource:Information' => 'Informazione',
|
||||
'SynchroDataSource:Definition' => 'Definizione',
|
||||
'Core:SynchroAttributes' => 'Attributi',
|
||||
'Core:SynchroStatus' => 'Stato',
|
||||
'Core:Synchro:ErrorsLabel' => 'Errori',
|
||||
'Core:Synchro:CreatedLabel' => 'Creato',
|
||||
'Core:Synchro:ModifiedLabel' => 'Modificato',
|
||||
'Core:Synchro:UnchangedLabel' => 'Non modificato',
|
||||
'Core:Synchro:ReconciledErrorsLabel' => 'Errori',
|
||||
'Core:Synchro:ReconciledLabel' => 'Reconciliato',
|
||||
'Core:Synchro:ReconciledNewLabel' => 'Creato',
|
||||
'Core:SynchroReconcile:Yes' => 'Si',
|
||||
'Core:SynchroReconcile:No' => 'No',
|
||||
'Core:SynchroUpdate:Yes' => 'Si',
|
||||
'Core:SynchroUpdate:No' => 'No',
|
||||
'Core:Synchro:LastestStatus' => 'Ultimo stato',
|
||||
'Core:Synchro:History' => 'Storia della sincronizzazione',
|
||||
'Core:Synchro:NeverRun' => 'Questa sincronizzazione non è mai stata eseguita. Nessun Log ancora...',
|
||||
'Core:Synchro:SynchroEndedOn_Date' => 'L\'ultima sincronizzazione si è conclusa il %1$s.~~',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'La sincronizzazione è iniziata il $1$s è ancora in esecuzione...~~',
|
||||
'Menu:DataSources' => 'Sorgente di sincronizzazione dei dati',
|
||||
'Menu:DataSources+' => '',
|
||||
'Core:Synchro:label_repl_ignored' => 'Ignorato(%1$s)',
|
||||
'Core:Synchro:label_repl_disappeared' => 'Scomparso (%1$s)',
|
||||
'Core:Synchro:label_repl_existing' => 'Esistente (%1$s)',
|
||||
'Core:Synchro:label_repl_new' => 'Nuovo (%1$s)~~',
|
||||
'Core:Synchro:label_obj_deleted' => 'Cancellato (%1$s)',
|
||||
'Core:Synchro:label_obj_obsoleted' => 'Obsoleto (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_errors' => 'Errori (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_no_action' => 'Nessuna Azione (%1$s)',
|
||||
'Core:Synchro:label_obj_unchanged' => 'Non modificato(%1$s)',
|
||||
'Core:Synchro:label_obj_updated' => 'Aggiornato (%1$s)',
|
||||
'Core:Synchro:label_obj_updated_errors' => 'Errori (%1$s)',
|
||||
'Core:Synchro:label_obj_new_unchanged' => 'Non modificato (%1$s)',
|
||||
'Core:Synchro:label_obj_new_updated' => 'Aggiornato (%1$s)',
|
||||
'Core:Synchro:label_obj_created' => 'Creato (%1$s)',
|
||||
'Core:Synchro:label_obj_new_errors' => 'Errori (%1$s)',
|
||||
'Core:SynchroLogTitle' => '%1$s - %2$s~~',
|
||||
'Core:Synchro:Nb_Replica' => 'Replica processata: %1$s',
|
||||
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
|
||||
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Almeno una chiave riconciliazione deve essere specificata, o la policy di conciliazione deve essere quella di utilizzare la chiave primaria',
|
||||
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Deve essere specificato un periodo di conservazione di cancellazione , dato che gli oggetti devono essere eliminati dopo essere contrassegnati come obsoleti ',
|
||||
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Oggetti obsoleti devono essere aggiornati, ma nessun aggiornamento è specificato',
|
||||
'Core:SynchroReplica:PublicData' => 'Dati Pubblici',
|
||||
'Core:SynchroReplica:PrivateDetails' => 'Dettagli Privati',
|
||||
'Core:SynchroReplica:BackToDataSource' => 'Torna indietro alla sorgente di sincronizzazione dei dati: %1$s~~',
|
||||
'Core:SynchroReplica:ListOfReplicas' => 'Lista della Replica',
|
||||
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Chiave Primaria)',
|
||||
'Core:SynchroAtt:attcode' => 'Attributo',
|
||||
'Core:SynchroAtt:attcode+' => '',
|
||||
'Core:SynchroAtt:reconciliation' => 'Riconciliazione ?~~',
|
||||
'Core:SynchroAtt:reconciliation+' => '',
|
||||
'Core:SynchroAtt:update' => 'Aggiornamento ?~~',
|
||||
'Core:SynchroAtt:update+' => '',
|
||||
'Core:SynchroAtt:update_policy' => 'Policy di aggiornamento',
|
||||
'Core:SynchroAtt:update_policy+' => '',
|
||||
'Core:SynchroAtt:reconciliation_attcode' => 'Chiave di riconciliazione',
|
||||
'Core:SynchroAtt:reconciliation_attcode+' => '',
|
||||
'Core:SyncDataExchangeComment' => '(Scambio dati)',
|
||||
'Core:Synchro:ListOfDataSources' => 'Lista delle sorgenti di dati:',
|
||||
'Core:Synchro:LastSynchro' => 'Ultima sincronizzazione:',
|
||||
'Core:Synchro:ThisObjectIsSynchronized' => 'Questo oggetto è sincronizzato con una sorgente esterna di dati',
|
||||
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'L\'oggetti è stato <b>creato</b> da una sorgente esterna di dati %1$s~~',
|
||||
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'L\'oggetti <b>può essere cancellato</b> da una sorgente esterna di dati %1$s~~',
|
||||
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Tu <b>non puoi cancellare l\'oggetto</b> perché è di proprietà della sorgente dati esterna %1$s~~',
|
||||
'TitleSynchroExecution' => 'Esecuzione della sincronizzazione',
|
||||
'Class:SynchroDataSource:DataTable' => 'Tabella del database: %1$s',
|
||||
'Core:SyncDataSourceObsolete' => 'La fonte dei dati è contrassegnata come obsoleta. Operazione annullata',
|
||||
'Core:SyncDataSourceAccessRestriction' => 'Solo amministratori o l\'utente specificato nella fonte dei dati può eseguire questa operazione. Operazione annullata',
|
||||
'Core:SyncTooManyMissingReplicas' => 'Tutte le repliche sono mancanti dall\'importazione. Hai eseguito realmente l\'importazione? Operazione annullata',
|
||||
'Core:Duration_Seconds' => '%1$ds',
|
||||
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
|
||||
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$sec~~',
|
||||
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sg %2$dh %3$dmin %4$ds~~',
|
||||
));
|
||||
?>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('IT IT', 'Italian', 'Italiano', array(
|
||||
'Class:ActionEmail' => 'E-mail di notifica',
|
||||
'Class:ActionEmail+' => '',
|
||||
'Class:ActionEmail/Attribute:test_recipient' => 'Test destinatario',
|
||||
'Class:ActionEmail/Attribute:test_recipient+' => '',
|
||||
'Class:ActionEmail/Attribute:from' => 'Da',
|
||||
'Class:ActionEmail/Attribute:from+' => '',
|
||||
'Class:ActionEmail/Attribute:reply_to' => 'Rispondi A',
|
||||
'Class:ActionEmail/Attribute:reply_to+' => '',
|
||||
'Class:ActionEmail/Attribute:to' => 'A',
|
||||
'Class:ActionEmail/Attribute:to+' => '',
|
||||
'Class:ActionEmail/Attribute:cc' => 'Cc',
|
||||
'Class:ActionEmail/Attribute:cc+' => '',
|
||||
'Class:ActionEmail/Attribute:bcc' => 'BCC',
|
||||
'Class:ActionEmail/Attribute:bcc+' => '',
|
||||
'Class:ActionEmail/Attribute:subject' => 'Oggetto',
|
||||
'Class:ActionEmail/Attribute:subject+' => '',
|
||||
'Class:ActionEmail/Attribute:body' => 'corpo',
|
||||
'Class:ActionEmail/Attribute:body+' => '',
|
||||
'Class:ActionEmail/Attribute:importance' => 'priorità',
|
||||
'Class:ActionEmail/Attribute:importance+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high' => 'alta',
|
||||
'Class:ActionEmail/Attribute:importance/Value:high+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low' => 'bassa',
|
||||
'Class:ActionEmail/Attribute:importance/Value:low+' => '',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normake',
|
||||
'Class:ActionEmail/Attribute:importance/Value:normal+' => '',
|
||||
'Class:TriggerOnStateEnter' => 'Trigger (sull\'entrare in uno stato)',
|
||||
'Class:TriggerOnStateEnter+' => '',
|
||||
'Class:TriggerOnStateLeave' => 'Trigger (sul lasciare uno stato)~~',
|
||||
'Class:TriggerOnStateLeave+' => '',
|
||||
'Class:TriggerOnObjectCreate' => 'Trigger (sulla creazione di un oggetto)~~',
|
||||
'Class:TriggerOnObjectCreate+' => '',
|
||||
'Class:lnkTriggerAction' => 'Azione/Trigger~~',
|
||||
'Class:lnkTriggerAction+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_id' => 'Azione',
|
||||
'Class:lnkTriggerAction/Attribute:action_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:order' => 'Ordine',
|
||||
'Class:lnkTriggerAction/Attribute:order+' => '',
|
||||
'Class:AsyncSendEmail' => 'Email (asincrona)',
|
||||
'Class:AsyncSendEmail/Attribute:to' => 'A',
|
||||
'Class:AsyncSendEmail/Attribute:subject' => 'Oggetto',
|
||||
'Class:AsyncSendEmail/Attribute:body' => 'Corpo',
|
||||
'Class:AsyncSendEmail/Attribute:header' => 'Intestazione',
|
||||
'Class:CMDBChange' => 'Cambio',
|
||||
'Class:CMDBChange+' => '',
|
||||
'Class:CMDBChange/Attribute:date' => 'data',
|
||||
'Class:CMDBChange/Attribute:date+' => '',
|
||||
'Class:CMDBChange/Attribute:userinfo' => 'info varie',
|
||||
'Class:CMDBChange/Attribute:userinfo+' => '',
|
||||
'Class:CMDBChangeOp' => 'Operazione di Cambio',
|
||||
'Class:CMDBChangeOp+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:change' => 'cambio',
|
||||
'Class:CMDBChangeOp/Attribute:change+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:objclass' => 'oggetto della classe',
|
||||
'Class:CMDBChangeOp/Attribute:objclass+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:objkey' => 'oggetto id',
|
||||
'Class:CMDBChangeOp/Attribute:objkey+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
|
||||
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
|
||||
'Class:CMDBChangeOpCreate' => 'creazione dell\'oggetto',
|
||||
'Class:CMDBChangeOpCreate+' => '',
|
||||
'Class:CMDBChangeOpDelete' => 'cancellazione dell\'oggetto',
|
||||
'Class:CMDBChangeOpDelete+' => '',
|
||||
'Class:CMDBChangeOpSetAttribute' => 'cambio dell\'oggetto',
|
||||
'Class:CMDBChangeOpSetAttribute+' => '',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Attributo',
|
||||
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar' => 'cambio della proprietà',
|
||||
'Class:CMDBChangeOpSetAttributeScalar+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valore precedente',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Valore Nuovo',
|
||||
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeBlob' => 'modifica i dati',
|
||||
'Class:CMDBChangeOpSetAttributeBlob+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dati precedenti',
|
||||
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Password criptata',
|
||||
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Valore Precedente',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field~~',
|
||||
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Valore Precedente',
|
||||
'Class:CMDBChangeOpSetAttributeText' => 'modifica testo',
|
||||
'Class:CMDBChangeOpSetAttributeText+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dati precendenti',
|
||||
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => '',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Log dei casi',
|
||||
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Ultima entrata',
|
||||
'Class:Event' => 'Log dell\'evento',
|
||||
'Class:Event+' => '',
|
||||
'Class:Event/Attribute:message' => 'Messaggio',
|
||||
'Class:Event/Attribute:message+' => '',
|
||||
'Class:Event/Attribute:date' => 'Data',
|
||||
'Class:Event/Attribute:date+' => '',
|
||||
'Class:Event/Attribute:userinfo' => 'Info Utente',
|
||||
'Class:Event/Attribute:userinfo+' => '',
|
||||
'Class:Event/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Event/Attribute:finalclass+' => '',
|
||||
'Class:EventNotification' => 'Notifica dell\'evento',
|
||||
'Class:EventNotification+' => '',
|
||||
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
|
||||
'Class:EventNotification/Attribute:trigger_id+' => '',
|
||||
'Class:EventNotification/Attribute:action_id' => 'utente',
|
||||
'Class:EventNotification/Attribute:action_id+' => '',
|
||||
'Class:EventNotification/Attribute:object_id' => 'Oggetto id',
|
||||
'Class:EventNotification/Attribute:object_id+' => '',
|
||||
'Class:EventNotificationEmail' => 'Email caso di emissione',
|
||||
'Class:EventNotificationEmail+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:to' => 'A',
|
||||
'Class:EventNotificationEmail/Attribute:to+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
|
||||
'Class:EventNotificationEmail/Attribute:cc+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
|
||||
'Class:EventNotificationEmail/Attribute:bcc+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:from' => 'Da',
|
||||
'Class:EventNotificationEmail/Attribute:from+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:subject' => 'Oggeto',
|
||||
'Class:EventNotificationEmail/Attribute:subject+' => '',
|
||||
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
|
||||
'Class:EventNotificationEmail/Attribute:body+' => '',
|
||||
'Class:EventIssue' => 'Evento Problema',
|
||||
'Class:EventIssue+' => '',
|
||||
'Class:EventIssue/Attribute:issue' => 'Problema',
|
||||
'Class:EventIssue/Attribute:issue+' => '',
|
||||
'Class:EventIssue/Attribute:impact' => 'Impatto',
|
||||
'Class:EventIssue/Attribute:impact+' => '',
|
||||
'Class:EventIssue/Attribute:page' => 'Pagina',
|
||||
'Class:EventIssue/Attribute:page+' => '',
|
||||
'Class:EventIssue/Attribute:arguments_post' => 'Argomenti inviati',
|
||||
'Class:EventIssue/Attribute:arguments_post+' => '',
|
||||
'Class:EventIssue/Attribute:arguments_get' => 'Argomenti URL',
|
||||
'Class:EventIssue/Attribute:arguments_get+' => '',
|
||||
'Class:EventIssue/Attribute:callstack' => 'Callstack',
|
||||
'Class:EventIssue/Attribute:callstack+' => '',
|
||||
'Class:EventIssue/Attribute:data' => 'Dati',
|
||||
'Class:EventIssue/Attribute:data+' => '',
|
||||
'Class:EventWebService' => 'Evento Servizio Web',
|
||||
'Class:EventWebService+' => '',
|
||||
'Class:EventWebService/Attribute:verb' => 'Verbo',
|
||||
'Class:EventWebService/Attribute:verb+' => '',
|
||||
'Class:EventWebService/Attribute:result' => 'Resulto',
|
||||
'Class:EventWebService/Attribute:result+' => '',
|
||||
'Class:EventWebService/Attribute:log_info' => 'Log delle info',
|
||||
'Class:EventWebService/Attribute:log_info+' => '',
|
||||
'Class:EventWebService/Attribute:log_warning' => 'Log dei warning',
|
||||
'Class:EventWebService/Attribute:log_warning+' => '',
|
||||
'Class:EventWebService/Attribute:log_error' => 'Log degli errori',
|
||||
'Class:EventWebService/Attribute:log_error+' => '',
|
||||
'Class:EventWebService/Attribute:data' => 'Dati',
|
||||
'Class:EventWebService/Attribute:data+' => '',
|
||||
'Class:EventLoginUsage' => 'Login di utilizzo',
|
||||
'Class:EventLoginUsage+' => '',
|
||||
'Class:EventLoginUsage/Attribute:user_id' => 'Login',
|
||||
'Class:EventLoginUsage/Attribute:user_id+' => '',
|
||||
'Class:SynchroDataSource' => 'Sorgente di sincronizzazione dei dati',
|
||||
'Class:SynchroDataSource/Attribute:name' => 'Nome',
|
||||
'Class:SynchroDataSource/Attribute:name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:description' => 'Descrizione',
|
||||
'Class:SynchroDataSource/Attribute:status' => 'Stato',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementazione',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsoleto',
|
||||
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Produzione',
|
||||
'Class:SynchroDataSource/Attribute:user_id' => 'Utente',
|
||||
'Class:SynchroDataSource/Attribute:scope_class' => 'Classe Target',
|
||||
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Campo di applicazione restrizione',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Intervallo a pieno carico',
|
||||
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => '',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Policy di riconciliazione',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Usa gli attributi',
|
||||
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Usa il campo chiave primaria',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Azione su zero~~',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Crea',
|
||||
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Errore',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one' => 'Azione su uno',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error',
|
||||
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Aggiorna',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Azione su molti',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Crea',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Errore',
|
||||
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Considera il primo (random?)',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy' => 'Policy di cancellazioen',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Cancella',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignora',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Aggiorna',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Aggiorna e poi Cancella',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Regole per l\'aggiornamento',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_update+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Durata di conservazione',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => '',
|
||||
'Class:SynchroDataSource/Attribute:attribute_list' => 'Lista degli attributi',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'utenti autorizzati',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy+' => '',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Solo Amministratore',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Tutti sono autorizzati a cancellare questi oggetti',
|
||||
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nessuno',
|
||||
'Class:SynchroDataSource/Attribute:url_icon' => 'Icona di collegamento ipertestuale',
|
||||
'Class:SynchroDataSource/Attribute:url_icon+' => '',
|
||||
'Class:SynchroDataSource/Attribute:url_application' => 'Collegamento ipertestuale all\'applicazione',
|
||||
'Class:SynchroDataSource/Attribute:url_application+' => '',
|
||||
'Class:SynchroAttribute' => 'Attributo di sincronizzazione',
|
||||
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Sorgente sincronizzazione dati',
|
||||
'Class:SynchroAttribute/Attribute:attcode' => 'Codice attributo',
|
||||
'Class:SynchroAttribute/Attribute:update' => 'Aggiorna',
|
||||
'Class:SynchroAttribute/Attribute:reconcile' => 'Rincocilia',
|
||||
'Class:SynchroAttribute/Attribute:update_policy' => 'Policy di aggiornamento',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Bloccato',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Sbloccato',
|
||||
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Inizializza se vuoto',
|
||||
'Class:SynchroAttribute/Attribute:finalclass' => 'Classe',
|
||||
'Class:SynchroAttExtKey' => 'Attributo di sincronizzazione (ExtKey)',
|
||||
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Attributo di riconciliazione',
|
||||
'Class:SynchroAttLinkSet' => 'Attributo di sincronizzazione (Linkset)',
|
||||
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Separatore di righe',
|
||||
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Separatore di attributi',
|
||||
'Class:SynchroLog' => 'Log di sincronizzazione',
|
||||
'Class:SynchroLog/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
|
||||
'Class:SynchroLog/Attribute:start_date' => 'Data di inizio',
|
||||
'Class:SynchroLog/Attribute:end_date' => 'Data di fine',
|
||||
'Class:SynchroLog/Attribute:status' => 'Stato',
|
||||
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completo',
|
||||
'Class:SynchroLog/Attribute:status/Value:error' => 'Errore',
|
||||
'Class:SynchroLog/Attribute:status/Value:running' => 'Ancora in esecuzione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica viste',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica totale',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb oggetti cancellati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb di errore durante la cancellazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb oggetti obsoleti',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb di errori mentre obsoleta',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb oggetti creati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb di errori durante la creazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb oggetti aggiornati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb di errori durante l\'aggiornamento',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb di errori durante la riconcilazione',
|
||||
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb repliche scomparse',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb oggetti aggiornati',
|
||||
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb oggetti non modificati',
|
||||
'Class:SynchroLog/Attribute:last_error' => 'Untimo errore',
|
||||
'Class:SynchroLog/Attribute:traces' => 'Tracce',
|
||||
'Class:SynchroReplica' => 'Replica sincronizzazione',
|
||||
'Class:SynchroReplica/Attribute:sync_source_id' => 'Sorgente di sincronizzazione dati',
|
||||
'Class:SynchroReplica/Attribute:dest_id' => 'Oggetto di destinazione (ID)~~',
|
||||
'Class:SynchroReplica/Attribute:dest_class' => 'Tipo di destinazione',
|
||||
'Class:SynchroReplica/Attribute:status_last_seen' => 'Ultimo visto',
|
||||
'Class:SynchroReplica/Attribute:status' => 'Stato',
|
||||
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modificato',
|
||||
'Class:SynchroReplica/Attribute:status/Value:new' => 'Nuovo',
|
||||
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsoleto',
|
||||
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orfano',
|
||||
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Sincronizzato',
|
||||
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Oggetto Creato ?',
|
||||
'Class:SynchroReplica/Attribute:status_last_error' => 'Ultimo Errore',
|
||||
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data di creazione',
|
||||
'Class:SynchroReplica/Attribute:info_last_modified' => 'Data ultima modifica',
|
||||
'Class:appUserPreferences' => 'Preferenze utente',
|
||||
'Class:appUserPreferences/Attribute:userid' => 'Utente',
|
||||
'Class:appUserPreferences/Attribute:preferences' => 'Preferenze',
|
||||
'Core:AttributeLinkedSet' => 'Array di oggetti',
|
||||
'Core:AttributeLinkedSet+' => '',
|
||||
'Core:AttributeLinkedSetIndirect' => 'Array di oggetti (N-N)',
|
||||
'Core:AttributeLinkedSetIndirect+' => '',
|
||||
'Core:AttributeInteger' => 'Integero',
|
||||
'Core:AttributeInteger+' => '',
|
||||
'Core:AttributeDecimal' => 'Decimale',
|
||||
'Core:AttributeDecimal+' => '',
|
||||
'Core:AttributeBoolean' => 'Booleano',
|
||||
'Core:AttributeBoolean+' => '',
|
||||
'Core:AttributeString' => 'Stringa',
|
||||
'Core:AttributeString+' => '',
|
||||
'Core:AttributeClass' => 'Classe',
|
||||
'Core:AttributeClass+' => '',
|
||||
'Core:AttributeApplicationLanguage' => 'Linguaggio Utente',
|
||||
'Core:AttributeApplicationLanguage+' => '',
|
||||
'Core:AttributeFinalClass' => 'Classe (auto)',
|
||||
'Core:AttributeFinalClass+' => '',
|
||||
'Core:AttributePassword' => 'Password',
|
||||
'Core:AttributePassword+' => '',
|
||||
'Core:AttributeEncryptedString' => 'Stringa criptata',
|
||||
'Core:AttributeEncryptedString+' => '',
|
||||
'Core:AttributeText' => 'Testo',
|
||||
'Core:AttributeText+' => '',
|
||||
'Core:AttributeHTML' => 'HTML',
|
||||
'Core:AttributeHTML+' => '',
|
||||
'Core:AttributeEmailAddress' => 'Indirizzo Email',
|
||||
'Core:AttributeEmailAddress+' => '',
|
||||
'Core:AttributeIPAddress' => 'Indirizzo IP',
|
||||
'Core:AttributeIPAddress+' => '',
|
||||
'Core:AttributeOQL' => 'OQL',
|
||||
'Core:AttributeOQL+' => '',
|
||||
'Core:AttributeEnum' => 'Enum',
|
||||
'Core:AttributeEnum+' => '',
|
||||
'Core:AttributeTemplateString' => 'Stringa Template',
|
||||
'Core:AttributeTemplateString+' => '',
|
||||
'Core:AttributeTemplateText' => 'Testo Template',
|
||||
'Core:AttributeTemplateText+' => '',
|
||||
'Core:AttributeTemplateHTML' => 'HTML Template',
|
||||
'Core:AttributeTemplateHTML+' => '',
|
||||
'Core:AttributeDateTime' => 'Data/ora',
|
||||
'Core:AttributeDateTime+' => '',
|
||||
'Core:AttributeDate' => 'Data',
|
||||
'Core:AttributeDate+' => '',
|
||||
'Core:AttributeDeadline' => 'Scadenza',
|
||||
'Core:AttributeDeadline+' => '',
|
||||
'Core:AttributeExternalKey' => 'Chiave esterna',
|
||||
'Core:AttributeExternalKey+' => '',
|
||||
'Core:AttributeExternalField' => 'Campo esterno',
|
||||
'Core:AttributeExternalField+' => '',
|
||||
'Core:AttributeURL' => 'URL',
|
||||
'Core:AttributeURL+' => '',
|
||||
'Core:AttributeBlob' => 'Blob',
|
||||
'Core:AttributeBlob+' => '',
|
||||
'Core:AttributeOneWayPassword' => 'Password unidierzionale',
|
||||
'Core:AttributeOneWayPassword+' => '',
|
||||
'Core:AttributeTable' => 'Tabella',
|
||||
'Core:AttributeTable+' => '',
|
||||
'Core:AttributePropertySet' => 'Proprietà',
|
||||
'Core:AttributePropertySet+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:date' => 'data',
|
||||
'Class:CMDBChangeOp/Attribute:date+' => '',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo' => 'utente',
|
||||
'Class:CMDBChangeOp/Attribute:userinfo+' => '',
|
||||
'Change:ObjectCreated' => 'Oggetto creato',
|
||||
'Change:ObjectDeleted' => 'Oggetto cancellato',
|
||||
'Change:ObjectModified' => 'Object modificato',
|
||||
'Change:AttName_SetTo_NewValue_PreviousValue_OldValue' => '%1$s imposatato a %2$s (valore precendente: %3$s)',
|
||||
'Change:AttName_SetTo' => '%1$s impostato a %2$s~~',
|
||||
'Change:Text_AppendedTo_AttName' => '%1$s allegato a %2$s~~',
|
||||
'Change:AttName_Changed_PreviousValue_OldValue' => '%1$s moficato, valore precendente: %2$s',
|
||||
'Change:AttName_Changed' => '%1$s modificato',
|
||||
'Change:AttName_EntryAdded' => '%1$s modificato, nuova entrata aggiunta.',
|
||||
'Class:EventLoginUsage/Attribute:contact_name' => 'Nome Utente',
|
||||
'Class:EventLoginUsage/Attribute:contact_name+' => '',
|
||||
'Class:EventLoginUsage/Attribute:contact_email' => 'Email Utente',
|
||||
'Class:EventLoginUsage/Attribute:contact_email+' => '',
|
||||
'Class:Action' => 'Azione personalizzata',
|
||||
'Class:Action+' => '',
|
||||
'Class:Action/Attribute:name' => 'Nome',
|
||||
'Class:Action/Attribute:name+' => '',
|
||||
'Class:Action/Attribute:description' => 'Descrizione',
|
||||
'Class:Action/Attribute:description+' => '',
|
||||
'Class:Action/Attribute:status' => 'Stato',
|
||||
'Class:Action/Attribute:status+' => '',
|
||||
'Class:Action/Attribute:status/Value:test' => 'In fase di test',
|
||||
'Class:Action/Attribute:status/Value:test+' => '',
|
||||
'Class:Action/Attribute:status/Value:enabled' => 'In produzione',
|
||||
'Class:Action/Attribute:status/Value:enabled+' => '',
|
||||
'Class:Action/Attribute:status/Value:disabled' => 'Inattivo',
|
||||
'Class:Action/Attribute:status/Value:disabled+' => '',
|
||||
'Class:Action/Attribute:trigger_list' => 'Trigger Correlati',
|
||||
'Class:Action/Attribute:trigger_list+' => '',
|
||||
'Class:Action/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Action/Attribute:finalclass+' => '',
|
||||
'Class:ActionNotification' => 'Notifica',
|
||||
'Class:ActionNotification+' => '',
|
||||
'Class:Trigger' => 'Trigger',
|
||||
'Class:Trigger+' => '',
|
||||
'Class:Trigger/Attribute:description' => 'Descrizione',
|
||||
'Class:Trigger/Attribute:description+' => '',
|
||||
'Class:Trigger/Attribute:action_list' => 'Azioni Triggerate',
|
||||
'Class:Trigger/Attribute:action_list+' => '',
|
||||
'Class:Trigger/Attribute:finalclass' => 'Tipo',
|
||||
'Class:Trigger/Attribute:finalclass+' => '',
|
||||
'Class:TriggerOnObject' => 'Trigger (classe dipendente)',
|
||||
'Class:TriggerOnObject+' => '',
|
||||
'Class:TriggerOnObject/Attribute:target_class' => 'Classe Target',
|
||||
'Class:TriggerOnObject/Attribute:target_class+' => '',
|
||||
'Class:TriggerOnStateChange' => 'Trigger (sul cambio di stato)',
|
||||
'Class:TriggerOnStateChange+' => '',
|
||||
'Class:TriggerOnStateChange/Attribute:state' => 'Stato',
|
||||
'Class:TriggerOnStateChange/Attribute:state+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:action_name' => 'Azione',
|
||||
'Class:lnkTriggerAction/Attribute:action_name+' => '',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
|
||||
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nessuno',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Solo Amministratore',
|
||||
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tutti gli utenti autorizzati',
|
||||
'SynchroDataSource:Description' => 'Descrizione',
|
||||
'SynchroDataSource:Reconciliation' => 'Ricerca & riconciliazione',
|
||||
'SynchroDataSource:Deletion' => 'Regole di cancellazione',
|
||||
'SynchroDataSource:Status' => 'Stato',
|
||||
'SynchroDataSource:Information' => 'Informazione',
|
||||
'SynchroDataSource:Definition' => 'Definizione',
|
||||
'Core:SynchroAttributes' => 'Attributi',
|
||||
'Core:SynchroStatus' => 'Stato',
|
||||
'Core:Synchro:ErrorsLabel' => 'Errori',
|
||||
'Core:Synchro:CreatedLabel' => 'Creato',
|
||||
'Core:Synchro:ModifiedLabel' => 'Modificato',
|
||||
'Core:Synchro:UnchangedLabel' => 'Non modificato',
|
||||
'Core:Synchro:ReconciledErrorsLabel' => 'Errori',
|
||||
'Core:Synchro:ReconciledLabel' => 'Reconciliato',
|
||||
'Core:Synchro:ReconciledNewLabel' => 'Creato',
|
||||
'Core:SynchroReconcile:Yes' => 'Si',
|
||||
'Core:SynchroReconcile:No' => 'No',
|
||||
'Core:SynchroUpdate:Yes' => 'Si',
|
||||
'Core:SynchroUpdate:No' => 'No',
|
||||
'Core:Synchro:LastestStatus' => 'Ultimo stato',
|
||||
'Core:Synchro:History' => 'Storia della sincronizzazione',
|
||||
'Core:Synchro:NeverRun' => 'Questa sincronizzazione non è mai stata eseguita. Nessun Log ancora...',
|
||||
'Core:Synchro:SynchroEndedOn_Date' => 'L\'ultima sincronizzazione si è conclusa il %1$s.~~',
|
||||
'Core:Synchro:SynchroRunningStartedOn_Date' => 'La sincronizzazione è iniziata il %1$s è ancora in esecuzione...~~',
|
||||
'Menu:DataSources' => 'Sorgente di sincronizzazione dei dati',
|
||||
'Menu:DataSources+' => '',
|
||||
'Core:Synchro:label_repl_ignored' => 'Ignorato(%1$s)',
|
||||
'Core:Synchro:label_repl_disappeared' => 'Scomparso (%1$s)',
|
||||
'Core:Synchro:label_repl_existing' => 'Esistente (%1$s)',
|
||||
'Core:Synchro:label_repl_new' => 'Nuovo (%1$s)~~',
|
||||
'Core:Synchro:label_obj_deleted' => 'Cancellato (%1$s)',
|
||||
'Core:Synchro:label_obj_obsoleted' => 'Obsoleto (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_errors' => 'Errori (%1$s)',
|
||||
'Core:Synchro:label_obj_disappeared_no_action' => 'Nessuna Azione (%1$s)',
|
||||
'Core:Synchro:label_obj_unchanged' => 'Non modificato(%1$s)',
|
||||
'Core:Synchro:label_obj_updated' => 'Aggiornato (%1$s)',
|
||||
'Core:Synchro:label_obj_updated_errors' => 'Errori (%1$s)',
|
||||
'Core:Synchro:label_obj_new_unchanged' => 'Non modificato (%1$s)',
|
||||
'Core:Synchro:label_obj_new_updated' => 'Aggiornato (%1$s)',
|
||||
'Core:Synchro:label_obj_created' => 'Creato (%1$s)',
|
||||
'Core:Synchro:label_obj_new_errors' => 'Errori (%1$s)',
|
||||
'Core:SynchroLogTitle' => '%1$s - %2$s~~',
|
||||
'Core:Synchro:Nb_Replica' => 'Replica processata: %1$s',
|
||||
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
|
||||
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Almeno una chiave riconciliazione deve essere specificata, o la policy di conciliazione deve essere quella di utilizzare la chiave primaria',
|
||||
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Deve essere specificato un periodo di conservazione di cancellazione , dato che gli oggetti devono essere eliminati dopo essere contrassegnati come obsoleti ',
|
||||
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Oggetti obsoleti devono essere aggiornati, ma nessun aggiornamento è specificato',
|
||||
'Core:SynchroReplica:PublicData' => 'Dati Pubblici',
|
||||
'Core:SynchroReplica:PrivateDetails' => 'Dettagli Privati',
|
||||
'Core:SynchroReplica:BackToDataSource' => 'Torna indietro alla sorgente di sincronizzazione dei dati: %1$s~~',
|
||||
'Core:SynchroReplica:ListOfReplicas' => 'Lista della Replica',
|
||||
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Chiave Primaria)',
|
||||
'Core:SynchroAtt:attcode' => 'Attributo',
|
||||
'Core:SynchroAtt:attcode+' => '',
|
||||
'Core:SynchroAtt:reconciliation' => 'Riconciliazione ?~~',
|
||||
'Core:SynchroAtt:reconciliation+' => '',
|
||||
'Core:SynchroAtt:update' => 'Aggiornamento ?~~',
|
||||
'Core:SynchroAtt:update+' => '',
|
||||
'Core:SynchroAtt:update_policy' => 'Policy di aggiornamento',
|
||||
'Core:SynchroAtt:update_policy+' => '',
|
||||
'Core:SynchroAtt:reconciliation_attcode' => 'Chiave di riconciliazione',
|
||||
'Core:SynchroAtt:reconciliation_attcode+' => '',
|
||||
'Core:SyncDataExchangeComment' => '(Scambio dati)',
|
||||
'Core:Synchro:ListOfDataSources' => 'Lista delle sorgenti di dati:',
|
||||
'Core:Synchro:LastSynchro' => 'Ultima sincronizzazione:',
|
||||
'Core:Synchro:ThisObjectIsSynchronized' => 'Questo oggetto è sincronizzato con una sorgente esterna di dati',
|
||||
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'L\'oggetti è stato <b>creato</b> da una sorgente esterna di dati %1$s~~',
|
||||
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'L\'oggetti <b>può essere cancellato</b> da una sorgente esterna di dati %1$s~~',
|
||||
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Tu <b>non puoi cancellare l\'oggetto</b> perché è di proprietà della sorgente dati esterna %1$s~~',
|
||||
'TitleSynchroExecution' => 'Esecuzione della sincronizzazione',
|
||||
'Class:SynchroDataSource:DataTable' => 'Tabella del database: %1$s',
|
||||
'Core:SyncDataSourceObsolete' => 'La fonte dei dati è contrassegnata come obsoleta. Operazione annullata',
|
||||
'Core:SyncDataSourceAccessRestriction' => 'Solo amministratori o l\'utente specificato nella fonte dei dati può eseguire questa operazione. Operazione annullata',
|
||||
'Core:SyncTooManyMissingReplicas' => 'Tutte le repliche sono mancanti dall\'importazione. Hai eseguito realmente l\'importazione? Operazione annullata',
|
||||
'Core:Duration_Seconds' => '%1$ds',
|
||||
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
|
||||
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$sec~~',
|
||||
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sg %2$dh %3$dmin %4$ds~~',
|
||||
));
|
||||
?>
|
||||
|
||||
@@ -588,7 +588,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
|
||||
'UI:Schema:Triggers' => 'トリガ', //'Triggers',
|
||||
'UI:Schema:Relation_Code_Description' => 'リレーション <em>%1$s</em> (%2$s)', //'Relation <em>%1$s</em> (%2$s)',
|
||||
'UI:Schema:RelationDown_Description' => '下へ: %1$s', //'Down: %1$s',
|
||||
'UI:Schema:RelationUp_Description' => '上へ: $1$s', //'Up: %1$s',
|
||||
'UI:Schema:RelationUp_Description' => '上へ: %1$s', //'Up: %1$s',
|
||||
'UI:Schema:RelationPropagates' => '%1$s: %2$d レベルへ伝播、クエリ:%3$s', //'%1$s: propagate to %2$d levels, query: %3$s',
|
||||
'UI:Schema:RelationDoesNotPropagate' => '%1$s: 伝播しない (%2$d レベル), クエリ: %3$s', //'%1$s: does not propagates (%2$d levels), query: %3$s',
|
||||
'UI:Schema:Class_ReferencingClasses_From_By' => '%1$s は%2$s クラスから %3$s フィールドにより参照されている', //'%1$s is referenced by the class %2$s via the field %3$s',
|
||||
@@ -613,7 +613,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
|
||||
'UI:Link_Class_Attributes' => '%1$s 属性', //'%1$s attributes',
|
||||
'UI:SelectAllToggle+' => '全部を選択 / 全部を非選択', //'Select All / Deselect All',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => '%2$s にリンクされた%1$sオブジェクトを追加:%3$s', //'Add %1$s objects linked with %2$s: %3$s',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class' => '$1$s オブジェクトを%2$sとのリンクに追加', //'Add %1$s objects to link with the %2$s',
|
||||
'UI:AddObjectsOf_Class_LinkedWith_Class' => '%1$s オブジェクトを%2$sとのリンクに追加', //'Add %1$s objects to link with the %2$s',
|
||||
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => '%2$s とりんくされた%1$sオブジェクトを管理する: %3$s', //'Manage %1$s objects linked with %2$s: %3$s',
|
||||
'UI:AddLinkedObjectsOf_Class' => '%1$s を追加...', //'Add %1$ss...',
|
||||
'UI:RemoveLinkedObjectsOf_Class' => '選択したオブジェクトを除外', //'Remove selected objects',
|
||||
@@ -860,8 +860,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
|
||||
'UI:iTopVersion:Long' => 'iTopバージョン%1$s-%2$s, %3$sビルド', // 'iTop version %1$s-%2$s built on %3$s',
|
||||
'UI:PropertiesTab' => 'プロパティ', // 'Properties',
|
||||
|
||||
'UI:OpenDocumentInNewWindow_' => '新規ウィンドウで本ドキュメント: $1$sを開く', // 'Open this document in a new window: %1$s',
|
||||
'UI:DownloadDocument_' => '本ドキュメント: $1$sをダウンロードする', // 'Download this document: %1$s',
|
||||
'UI:OpenDocumentInNewWindow_' => '新規ウィンドウで本ドキュメント: %1$sを開く', // 'Open this document in a new window: %1$s',
|
||||
'UI:DownloadDocument_' => '本ドキュメント: %1$sをダウンロードする', // 'Download this document: %1$s',
|
||||
'UI:Document:NoPreview' => 'このタイプのドキュメントはプレビューできません。', // 'No preview is available for this type of document',
|
||||
|
||||
'UI:DeadlineMissedBy_duration' => '%1$s によって消去されました。', // 'Missed by %1$s',
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -13,12 +13,13 @@
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper)
|
||||
function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper, sAttCode)
|
||||
{
|
||||
this.id = id;
|
||||
this.sTargetClass = sTargetClass;
|
||||
this.sFilter = sFilter;
|
||||
this.sTitle = sTitle;
|
||||
this.sAttCode = sAttCode;
|
||||
this.emptyHtml = ''; // content to be displayed when the search results are empty (when opening the dialog)
|
||||
this.emptyOnClose = true; // Workaround for the JQuery dialog being very slow when opening and closing if the content contains many INPUT tags
|
||||
this.oWizardHelper = oWizHelper;
|
||||
@@ -61,10 +62,22 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
|
||||
var theMap = { sAttCode: me.sAttCode,
|
||||
iInputId: me.id,
|
||||
sTitle: me.sTitle,
|
||||
sAttCode: me.sAttCode,
|
||||
sTargetClass: me.sTargetClass,
|
||||
operation: 'objectSearchForm'
|
||||
}
|
||||
|
||||
if (me.oWizardHelper == null)
|
||||
{
|
||||
theMap['json'] = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not inside a "search form", updating a real object
|
||||
me.oWizardHelper.UpdateWizard();
|
||||
theMap['json'] = me.oWizardHelper.ToJSON();
|
||||
}
|
||||
|
||||
// Make sure that we cancel any pending request before issuing another
|
||||
// since responses may arrive in arbitrary order
|
||||
me.StopPendingRequest();
|
||||
@@ -152,6 +165,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
|
||||
|
||||
theMap['sRemoteClass'] = theMap['class']; // swap 'class' (defined in the form) and 'remoteClass'
|
||||
theMap.operation = 'searchObjectsToSelect'; // Override what is defined in the form itself
|
||||
theMap.sAttCode = me.sAttCode,
|
||||
|
||||
sSearchAreaId = '#dr_'+me.id;
|
||||
//$(sSearchAreaId).html('<div style="text-align:center;width:100%;height:24px;vertical-align:middle;"><img src="../images/indicator.gif" /></div>');
|
||||
@@ -200,6 +214,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
|
||||
var theMap = { sTargetClass: me.sTargetClass,
|
||||
iInputId: me.id,
|
||||
iObjectId: iObjectId,
|
||||
sAttCode: me.sAttCode,
|
||||
operation: 'getObjectName'
|
||||
}
|
||||
|
||||
@@ -262,6 +277,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
|
||||
me.oWizardHelper.UpdateWizard();
|
||||
var theMap = { sTargetClass: me.sTargetClass,
|
||||
iInputId: me.id,
|
||||
sAttCode: me.sAttCode,
|
||||
'json': me.oWizardHelper.ToJSON(),
|
||||
operation: 'objectCreationForm'
|
||||
}
|
||||
@@ -323,6 +339,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
|
||||
$('#'+sFormId).block();
|
||||
var theMap = { sTargetClass: me.sTargetClass,
|
||||
iInputId: me.id,
|
||||
sAttCode: me.sAttCode,
|
||||
'json': me.oWizardHelper.ToJSON()
|
||||
}
|
||||
|
||||
@@ -403,6 +420,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
|
||||
var theMap = { sTargetClass: me.sTargetClass,
|
||||
sInputId: me.id,
|
||||
sFilter: me.sFilter,
|
||||
sAttCode: me.sAttCode,
|
||||
value: $('#'+me.id).val()
|
||||
};
|
||||
|
||||
@@ -484,6 +502,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
|
||||
var theMap = { sTargetClass: me.sTargetClass,
|
||||
iInputId: me.id,
|
||||
iObjectId: iObjectId,
|
||||
sAttCode: me.sAttCode,
|
||||
operation: 'getObjectName'
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// JavaScript Document
|
||||
function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
|
||||
function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates, oWizHelper)
|
||||
{
|
||||
this.id = id;
|
||||
this.iInputId = iInputId;
|
||||
@@ -7,6 +7,7 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
|
||||
this.sAttCode = sAttCode;
|
||||
this.sSuffix = sSuffix;
|
||||
this.bDuplicates = bDuplicates;
|
||||
this.oWizardHelper = oWizHelper;
|
||||
var me = this;
|
||||
this.Init = function()
|
||||
{
|
||||
@@ -63,9 +64,28 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
|
||||
|
||||
this.AddObjects = function()
|
||||
{
|
||||
$('#dlg_'+me.id).dialog('open');
|
||||
this.UpdateSizes(null, null);
|
||||
this.SearchObjectsToAdd();
|
||||
var me = this;
|
||||
$('#'+me.id+'_indicatorAdd').html(' <img src="../images/indicator.gif"/>');
|
||||
me.oWizardHelper.UpdateWizard();
|
||||
var theMap = { sAttCode: me.sAttCode,
|
||||
iInputId: me.iInputId,
|
||||
sSuffix: me.sSuffix,
|
||||
bDuplicates: me.bDuplicates,
|
||||
'class' : me.sClass,
|
||||
operation: 'addObjects',
|
||||
json: me.oWizardHelper.ToJSON()
|
||||
};
|
||||
$.post( GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', theMap,
|
||||
function(data)
|
||||
{
|
||||
$('#dlg_'+me.id).html(data);
|
||||
$('#dlg_'+me.id).dialog('open');
|
||||
me.UpdateSizes(null, null);
|
||||
me.SearchObjectsToAdd();
|
||||
$('#'+me.id+'_indicatorAdd').html('');
|
||||
},
|
||||
'html'
|
||||
);
|
||||
}
|
||||
|
||||
this.SearchObjectsToAdd = function()
|
||||
@@ -202,6 +222,16 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
|
||||
// }
|
||||
|
||||
theMap['operation'] = 'doAddObjects';
|
||||
if (me.oWizardHelper == null)
|
||||
{
|
||||
theMap['json'] = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not inside a "search form", updating a real object
|
||||
me.oWizardHelper.UpdateWizard();
|
||||
theMap['json'] = me.oWizardHelper.ToJSON();
|
||||
}
|
||||
$('#busy_'+me.iInputId).html(' <img src="../images/indicator.gif"/>');
|
||||
// Run the query and display the results
|
||||
$.post( GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', theMap,
|
||||
|
||||
14
js/utils.js
14
js/utils.js
@@ -119,8 +119,18 @@ function ReloadSearchForm(divId, sClassName, sBaseClass, sContext)
|
||||
}
|
||||
sAction = $('#ds_'+divId+' form').attr('action');
|
||||
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php?'+sContext,
|
||||
{ operation: 'search_form', className: sClassName, baseClass: sBaseClass, currentId: divId, action: sAction },
|
||||
// Save the current values in the form
|
||||
var oMap = {};
|
||||
$('#ds_'+divId+" form :input[name!='']").each(function() {
|
||||
oMap[this.name] = this.value;
|
||||
});
|
||||
oMap.operation = 'search_form';
|
||||
oMap.className = sClassName;
|
||||
oMap.baseClass = sBaseClass;
|
||||
oMap.currentId = divId;
|
||||
oMap.action = sAction;
|
||||
|
||||
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php?'+sContext, oMap,
|
||||
function(data) {
|
||||
oDiv.empty();
|
||||
oDiv.append(data);
|
||||
|
||||
@@ -1,50 +1,32 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: UserLocal
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:UserLocal' => 'iTop-Benutzer',
|
||||
'Class:UserLocal+' => 'Benutzer von iTop authentifiziert',
|
||||
'Class:UserLocal/Attribute:password' => 'Passwort',
|
||||
'Class:UserLocal/Attribute:password+' => 'Benutzerpasswort',
|
||||
));
|
||||
|
||||
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:UserLocal' => 'iTop-Benutzer',
|
||||
'Class:UserLocal+' => 'Benutzer, der von iTop authentifiziert wird',
|
||||
'Class:UserLocal/Attribute:password' => 'Passwort',
|
||||
'Class:UserLocal/Attribute:password+' => 'Benutzerpasswort',
|
||||
));
|
||||
?>
|
||||
|
||||
@@ -389,6 +389,7 @@ EOF
|
||||
{
|
||||
$('#attachment_'+att_id).attr('name', 'removed_attachments[]');
|
||||
$('#display_attachment_'+att_id).hide();
|
||||
$('#attachment_plugin').trigger('remove_attachment', [att_id]);
|
||||
return false; // Do not submit the form !
|
||||
}
|
||||
function ajaxFileUpload()
|
||||
@@ -433,6 +434,8 @@ EOF
|
||||
{
|
||||
$('#display_attachment_'+data.att_id).hover( function() { $(this).children(':button').toggleClass('btn_hidden'); } );
|
||||
}
|
||||
$('#attachment_plugin').trigger('add_attachment', [data.att_id, data.msg]);
|
||||
|
||||
//alert(data.msg);
|
||||
}
|
||||
}
|
||||
@@ -465,6 +468,7 @@ EOF
|
||||
$oPage->p(Dict::S('Attachments:AddAttachment').'<input type="file" name="file" id="file" onChange="ajaxFileUpload();"><span style="display:none;" id="attachment_loading"> <img src="../images/indicator.gif"></span> '.$sMaxUpload);
|
||||
//$oPage->p('<input type="button" onClick="ajaxFileUpload();" value=" Upload !">');
|
||||
$oPage->p('<span style="display:none;" id="attachment_loading">Loading, please wait...</span>');
|
||||
$oPage->p('<input type="hidden" id="attachment_plugin"/>');
|
||||
$oPage->add('</fieldset>');
|
||||
if ($this->m_bDeleteEnabled)
|
||||
{
|
||||
|
||||
@@ -1,348 +1,304 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Menu:ChangeManagement' => 'Change Management',
|
||||
'Menu:Change:Overview' => 'Übersicht',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:NewChange' => 'Neuer Change',
|
||||
'Menu:NewChange+' => 'Ein neues Change Ticket erstellen',
|
||||
'Menu:SearchChanges' => 'Nach Changes suchen',
|
||||
'Menu:SearchChanges+' => 'Nach Change Tickets suchen',
|
||||
'Menu:Change:Shortcuts' => 'Shortcuts',
|
||||
'Menu:Change:Shortcuts+' => '',
|
||||
'Menu:WaitingAcceptance' => 'Changes, die auf Bestätigung warten',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => 'Changes, die auf Genehmigung warten',
|
||||
'Menu:WaitingApproval+' => '',
|
||||
'Menu:Changes' => 'Offene Changes',
|
||||
'Menu:Changes+' => 'Alle Offene Changes',
|
||||
'Menu:MyChanges' => 'An mich zugewiesene Changes',
|
||||
'Menu:MyChanges+' => 'An mich zugewiesene Changes (als Bearbeiter)',
|
||||
));
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
|
||||
//
|
||||
// Class: Change
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:Change' => 'Change',
|
||||
'Class:Change+' => '',
|
||||
'Class:Change/Attribute:start_date' => 'Geplanter Start',
|
||||
'Class:Change/Attribute:start_date+' => '',
|
||||
'Class:Change/Attribute:status' => 'Status',
|
||||
'Class:Change/Attribute:status+' => '',
|
||||
'Class:Change/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:Change/Attribute:status/Value:new+' => '',
|
||||
'Class:Change/Attribute:status/Value:validated' => 'Validiert',
|
||||
'Class:Change/Attribute:status/Value:validated+' => '',
|
||||
'Class:Change/Attribute:status/Value:rejected' => 'Abgelehnt',
|
||||
'Class:Change/Attribute:status/Value:rejected+' => '',
|
||||
'Class:Change/Attribute:status/Value:assigned' => 'Zugewiesen',
|
||||
'Class:Change/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:Change/Attribute:status/Value:approved' => 'Genehmigt',
|
||||
'Class:Change/Attribute:status/Value:approved+' => '',
|
||||
'Class:Change/Attribute:status/Value:notapproved' => 'Nicht genehmigt',
|
||||
'Class:Change/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:Change/Attribute:status/Value:implemented' => 'Implementiert',
|
||||
'Class:Change/Attribute:status/Value:implemented+' => '',
|
||||
'Class:Change/Attribute:status/Value:monitored' => 'Überwacht',
|
||||
'Class:Change/Attribute:status/Value:monitored+' => '',
|
||||
'Class:Change/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:Change/Attribute:status/Value:closed+' => '',
|
||||
'Class:Change/Attribute:reason' => 'Ursache',
|
||||
'Class:Change/Attribute:reason+' => '',
|
||||
'Class:Change/Attribute:requestor_id' => 'Antragsteller',
|
||||
'Class:Change/Attribute:requestor_id+' => '',
|
||||
'Class:Change/Attribute:requestor_email' => 'Antragsteller',
|
||||
'Class:Change/Attribute:requestor_email+' => '',
|
||||
'Class:Change/Attribute:org_id' => 'Kunde',
|
||||
'Class:Change/Attribute:org_id+' => '',
|
||||
'Class:Change/Attribute:org_name' => 'Kunde',
|
||||
'Class:Change/Attribute:org_name+' => '',
|
||||
'Class:Change/Attribute:workgroup_id' => 'Arbeitsgruppe',
|
||||
'Class:Change/Attribute:workgroup_id+' => '',
|
||||
'Class:Change/Attribute:workgroup_name' => 'Arbeitsgruppe',
|
||||
'Class:Change/Attribute:workgroup_name+' => '',
|
||||
'Class:Change/Attribute:creation_date' => 'Erstellt',
|
||||
'Class:Change/Attribute:creation_date+' => '',
|
||||
'Class:Change/Attribute:last_update' => 'Letzte Aktualisierung',
|
||||
'Class:Change/Attribute:last_update+' => '',
|
||||
'Class:Change/Attribute:end_date' => 'Enddatum',
|
||||
'Class:Change/Attribute:end_date+' => '',
|
||||
'Class:Change/Attribute:close_date' => 'Geschlossen',
|
||||
'Class:Change/Attribute:close_date+' => '',
|
||||
'Class:Change/Attribute:impact' => 'Auswirkung',
|
||||
'Class:Change/Attribute:impact+' => '',
|
||||
'Class:Change/Attribute:agent_id' => 'Bearbeiter',
|
||||
'Class:Change/Attribute:agent_id+' => '',
|
||||
'Class:Change/Attribute:agent_name' => 'Bearbeiter',
|
||||
'Class:Change/Attribute:agent_name+' => '',
|
||||
'Class:Change/Attribute:agent_email' => 'Bearbeiter',
|
||||
'Class:Change/Attribute:agent_email+' => '',
|
||||
'Class:Change/Attribute:supervisor_group_id' => 'Aufsichts-Team',
|
||||
'Class:Change/Attribute:supervisor_group_id+' => '',
|
||||
'Class:Change/Attribute:supervisor_group_name' => 'Aufsichts-Team',
|
||||
'Class:Change/Attribute:supervisor_group_name+' => '',
|
||||
'Class:Change/Attribute:supervisor_id' => 'Aufsicht',
|
||||
'Class:Change/Attribute:supervisor_id+' => '',
|
||||
'Class:Change/Attribute:supervisor_email' => 'Aufsicht',
|
||||
'Class:Change/Attribute:supervisor_email+' => '',
|
||||
'Class:Change/Attribute:manager_group_id' => 'Manager-Team',
|
||||
'Class:Change/Attribute:manager_group_id+' => '',
|
||||
'Class:Change/Attribute:manager_group_name' => 'Manager-Team',
|
||||
'Class:Change/Attribute:manager_group_name+' => '',
|
||||
'Class:Change/Attribute:manager_id' => 'Manager',
|
||||
'Class:Change/Attribute:manager_id+' => '',
|
||||
'Class:Change/Attribute:manager_email' => 'Manager',
|
||||
'Class:Change/Attribute:manager_email+' => '',
|
||||
'Class:Change/Attribute:outage' => 'Ausfall',
|
||||
'Class:Change/Attribute:outage+' => '',
|
||||
'Class:Change/Attribute:outage/Value:yes' => 'Ja',
|
||||
'Class:Change/Attribute:outage/Value:yes+' => '',
|
||||
'Class:Change/Attribute:outage/Value:no' => 'Nein',
|
||||
'Class:Change/Attribute:outage/Value:no+' => '',
|
||||
'Class:Change/Attribute:change_request' => 'Anfrage',
|
||||
'Class:Change/Attribute:change_request+' => '',
|
||||
'Class:Change/Attribute:fallback' => 'Fallback-Plan',
|
||||
'Class:Change/Attribute:fallback+' => '',
|
||||
'Class:Change/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:Change/Stimulus:ev_validate+' => '',
|
||||
'Class:Change/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:Change/Stimulus:ev_reject+' => '',
|
||||
'Class:Change/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:Change/Stimulus:ev_assign+' => '',
|
||||
'Class:Change/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:Change/Stimulus:ev_reopen+' => '',
|
||||
'Class:Change/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:Change/Stimulus:ev_plan+' => '',
|
||||
'Class:Change/Stimulus:ev_approve' => 'Bestätigen',
|
||||
'Class:Change/Stimulus:ev_approve+' => '',
|
||||
'Class:Change/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:Change/Stimulus:ev_replan+' => '',
|
||||
'Class:Change/Stimulus:ev_notapprove' => 'Ablehnen',
|
||||
'Class:Change/Stimulus:ev_notapprove+' => '',
|
||||
'Class:Change/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:Change/Stimulus:ev_implement+' => '',
|
||||
'Class:Change/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:Change/Stimulus:ev_monitor+' => '',
|
||||
'Class:Change/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:Change/Stimulus:ev_finish+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: RoutineChange
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:RoutineChange' => 'Routine Change',
|
||||
'Class:RoutineChange+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:RoutineChange/Attribute:status/Value:new+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:assigned' => 'Zugewiesen',
|
||||
'Class:RoutineChange/Attribute:status/Value:assigned+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
|
||||
'Class:RoutineChange/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:approved' => 'Bestätigt',
|
||||
'Class:RoutineChange/Attribute:status/Value:approved+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:implemented' => 'Implementiert',
|
||||
'Class:RoutineChange/Attribute:status/Value:implemented+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:monitored' => 'Überwachen',
|
||||
'Class:RoutineChange/Attribute:status/Value:monitored+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:RoutineChange/Attribute:status/Value:closed+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:RoutineChange/Stimulus:ev_validate+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:RoutineChange/Stimulus:ev_assign+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:RoutineChange/Stimulus:ev_plan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:RoutineChange/Stimulus:ev_replan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:RoutineChange/Stimulus:ev_implement+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:RoutineChange/Stimulus:ev_finish+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: ApprovedChange
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:ApprovedChange' => 'Bewilligte Changes',
|
||||
'Class:ApprovedChange+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_date' => 'Datum der Bewilligung',
|
||||
'Class:ApprovedChange/Attribute:approval_date+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_comment' => 'Kommentar zur Bewilligung',
|
||||
'Class:ApprovedChange/Attribute:approval_comment+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_approve' => 'Bestätigen',
|
||||
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
|
||||
));
|
||||
//
|
||||
// Class: NormalChange
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:NormalChange' => 'Normaler Change',
|
||||
'Class:NormalChange+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:NormalChange/Attribute:status/Value:new+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:validated' => 'Validiert',
|
||||
'Class:NormalChange/Attribute:status/Value:validated+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:rejected' => 'Abgelehnt',
|
||||
'Class:NormalChange/Attribute:status/Value:rejected+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:assigned' => 'Zugewiesen',
|
||||
'Class:NormalChange/Attribute:status/Value:assigned+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
|
||||
'Class:NormalChange/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:approved' => 'Bestätigt',
|
||||
'Class:NormalChange/Attribute:status/Value:approved+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:notapproved' => 'Nicht bestätigt',
|
||||
'Class:NormalChange/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:implemented' => 'Implementiert',
|
||||
'Class:NormalChange/Attribute:status/Value:implemented+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:monitored' => 'Überwachen',
|
||||
'Class:NormalChange/Attribute:status/Value:monitored+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:NormalChange/Attribute:status/Value:closed+' => '',
|
||||
'Class:NormalChange/Attribute:acceptance_date' => 'Datum der Bewilligung',
|
||||
'Class:NormalChange/Attribute:acceptance_date+' => '',
|
||||
'Class:NormalChange/Attribute:acceptance_comment' => 'Kommentar zur Bewilligung',
|
||||
'Class:NormalChange/Attribute:acceptance_comment+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:NormalChange/Stimulus:ev_validate+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:NormalChange/Stimulus:ev_reject+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:NormalChange/Stimulus:ev_assign+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:NormalChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:NormalChange/Stimulus:ev_plan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_approve' => 'Bestätigen',
|
||||
'Class:NormalChange/Stimulus:ev_approve+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:NormalChange/Stimulus:ev_replan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:NormalChange/Stimulus:ev_implement+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:NormalChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:NormalChange/Stimulus:ev_finish+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: EmergencyChange
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:EmergencyChange' => 'Emergency Change',
|
||||
'Class:EmergencyChange+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:EmergencyChange/Attribute:status/Value:new+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:validated' => 'Validiert',
|
||||
'Class:EmergencyChange/Attribute:status/Value:validated+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:rejected' => 'Abgelehnt',
|
||||
'Class:EmergencyChange/Attribute:status/Value:rejected+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:assigned' => 'Zugewiesen',
|
||||
'Class:EmergencyChange/Attribute:status/Value:assigned+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
|
||||
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:approved' => 'Bestätigt',
|
||||
'Class:EmergencyChange/Attribute:status/Value:approved+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:notapproved' => 'Nicht bestätigt',
|
||||
'Class:EmergencyChange/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:implemented' => 'Implementiert',
|
||||
'Class:EmergencyChange/Attribute:status/Value:implemented+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:monitored' => 'Überwachen',
|
||||
'Class:EmergencyChange/Attribute:status/Value:monitored+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:EmergencyChange/Attribute:status/Value:closed+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_approve' => 'Bestätigen',
|
||||
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
|
||||
));
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:RoutineChange' => 'Routine Change',
|
||||
'Class:RoutineChange+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:RoutineChange/Stimulus:ev_validate+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:RoutineChange/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:RoutineChange/Stimulus:ev_assign+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:RoutineChange/Stimulus:ev_plan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_approve' => 'Genehmigen',
|
||||
'Class:RoutineChange/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:RoutineChange/Stimulus:ev_replan+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_notapprove' => 'Nicht genehmigen',
|
||||
'Class:RoutineChange/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:RoutineChange/Stimulus:ev_implement+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:RoutineChange/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:RoutineChange/Stimulus:ev_finish+' => '',
|
||||
'Class:NormalChange' => 'Normaler Change',
|
||||
'Class:NormalChange+' => '',
|
||||
'Class:NormalChange/Attribute:acceptance_date' => 'Datum der Bewilligung',
|
||||
'Class:NormalChange/Attribute:acceptance_date+' => '',
|
||||
'Class:NormalChange/Attribute:acceptance_comment' => 'Kommentar zur Bewilligung',
|
||||
'Class:NormalChange/Attribute:acceptance_comment+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:NormalChange/Stimulus:ev_validate+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:NormalChange/Stimulus:ev_reject+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:NormalChange/Stimulus:ev_assign+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:NormalChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:NormalChange/Stimulus:ev_plan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_approve' => 'Bestätigen',
|
||||
'Class:NormalChange/Stimulus:ev_approve+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:NormalChange/Stimulus:ev_replan+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
|
||||
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:NormalChange/Stimulus:ev_implement+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:NormalChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:NormalChange/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:NormalChange/Stimulus:ev_finish+' => '',
|
||||
'Class:EmergencyChange' => 'Emergency Change',
|
||||
'Class:EmergencyChange+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_approve' => 'Bestätigen',
|
||||
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
|
||||
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:EmergencyChange/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
|
||||
'Menu:ChangeManagement' => 'Change Management',
|
||||
'Menu:Change:Overview' => 'Übersicht',
|
||||
'Menu:Change:Overview+' => '',
|
||||
'Menu:NewChange' => 'Neuer Change',
|
||||
'Menu:NewChange+' => 'Ein neues Change Ticket erstellen',
|
||||
'Menu:SearchChanges' => 'Nach Changes suchen',
|
||||
'Menu:SearchChanges+' => 'Nach Change Tickets suchen',
|
||||
'Menu:Change:Shortcuts' => 'Shortcuts',
|
||||
'Menu:Change:Shortcuts+' => '',
|
||||
'Menu:WaitingAcceptance' => 'Changes, die auf Bestätigung warten',
|
||||
'Menu:WaitingAcceptance+' => '',
|
||||
'Menu:WaitingApproval' => 'Changes, die auf Genehmigung warten',
|
||||
'Menu:WaitingApproval+' => '',
|
||||
'Menu:Changes' => 'Offene Changes',
|
||||
'Menu:Changes+' => 'Alle Offene Changes',
|
||||
'Menu:MyChanges' => 'An mich zugewiesene Changes',
|
||||
'Menu:MyChanges+' => 'An mich zugewiesene Changes (als Bearbeiter)',
|
||||
'Class:Change' => 'Change',
|
||||
'Class:Change+' => '',
|
||||
'Class:Change/Attribute:start_date' => 'Geplanter Start',
|
||||
'Class:Change/Attribute:start_date+' => '',
|
||||
'Class:Change/Attribute:status' => 'Status',
|
||||
'Class:Change/Attribute:status+' => '',
|
||||
'Class:Change/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:Change/Attribute:status/Value:new+' => '',
|
||||
'Class:Change/Attribute:status/Value:validated' => 'Validiert',
|
||||
'Class:Change/Attribute:status/Value:validated+' => '',
|
||||
'Class:Change/Attribute:status/Value:rejected' => 'Abgelehnt',
|
||||
'Class:Change/Attribute:status/Value:rejected+' => '',
|
||||
'Class:Change/Attribute:status/Value:assigned' => 'Zugewiesen',
|
||||
'Class:Change/Attribute:status/Value:assigned+' => '',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
|
||||
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:Change/Attribute:status/Value:approved' => 'Genehmigt',
|
||||
'Class:Change/Attribute:status/Value:approved+' => '',
|
||||
'Class:Change/Attribute:status/Value:notapproved' => 'Nicht genehmigt',
|
||||
'Class:Change/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:Change/Attribute:status/Value:implemented' => 'Implementiert',
|
||||
'Class:Change/Attribute:status/Value:implemented+' => '',
|
||||
'Class:Change/Attribute:status/Value:monitored' => 'Überwacht',
|
||||
'Class:Change/Attribute:status/Value:monitored+' => '',
|
||||
'Class:Change/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:Change/Attribute:status/Value:closed+' => '',
|
||||
'Class:Change/Attribute:reason' => 'Ursache',
|
||||
'Class:Change/Attribute:reason+' => '',
|
||||
'Class:Change/Attribute:requestor_id' => 'Antragsteller',
|
||||
'Class:Change/Attribute:requestor_id+' => '',
|
||||
'Class:Change/Attribute:requestor_email' => 'Antragsteller',
|
||||
'Class:Change/Attribute:requestor_email+' => '',
|
||||
'Class:Change/Attribute:org_id' => 'Kunde',
|
||||
'Class:Change/Attribute:org_id+' => '',
|
||||
'Class:Change/Attribute:org_name' => 'Kunde',
|
||||
'Class:Change/Attribute:org_name+' => '',
|
||||
'Class:Change/Attribute:workgroup_id' => 'Arbeitsgruppe',
|
||||
'Class:Change/Attribute:workgroup_id+' => '',
|
||||
'Class:Change/Attribute:workgroup_name' => 'Arbeitsgruppe',
|
||||
'Class:Change/Attribute:workgroup_name+' => '',
|
||||
'Class:Change/Attribute:creation_date' => 'Erstellt',
|
||||
'Class:Change/Attribute:creation_date+' => '',
|
||||
'Class:Change/Attribute:last_update' => 'Letzte Aktualisierung',
|
||||
'Class:Change/Attribute:last_update+' => '',
|
||||
'Class:Change/Attribute:end_date' => 'Enddatum',
|
||||
'Class:Change/Attribute:end_date+' => '',
|
||||
'Class:Change/Attribute:close_date' => 'Geschlossen',
|
||||
'Class:Change/Attribute:close_date+' => '',
|
||||
'Class:Change/Attribute:impact' => 'Auswirkung',
|
||||
'Class:Change/Attribute:impact+' => '',
|
||||
'Class:Change/Attribute:agent_id' => 'Bearbeiter',
|
||||
'Class:Change/Attribute:agent_id+' => '',
|
||||
'Class:Change/Attribute:agent_name' => 'Bearbeiter',
|
||||
'Class:Change/Attribute:agent_name+' => '',
|
||||
'Class:Change/Attribute:agent_email' => 'Bearbeiter',
|
||||
'Class:Change/Attribute:agent_email+' => '',
|
||||
'Class:Change/Attribute:supervisor_group_id' => 'Aufsichts-Team',
|
||||
'Class:Change/Attribute:supervisor_group_id+' => '',
|
||||
'Class:Change/Attribute:supervisor_group_name' => 'Aufsichts-Team',
|
||||
'Class:Change/Attribute:supervisor_group_name+' => '',
|
||||
'Class:Change/Attribute:supervisor_id' => 'Aufsicht',
|
||||
'Class:Change/Attribute:supervisor_id+' => '',
|
||||
'Class:Change/Attribute:supervisor_email' => 'Aufsicht',
|
||||
'Class:Change/Attribute:supervisor_email+' => '',
|
||||
'Class:Change/Attribute:manager_group_id' => 'Manager-Team',
|
||||
'Class:Change/Attribute:manager_group_id+' => '',
|
||||
'Class:Change/Attribute:manager_group_name' => 'Manager-Team',
|
||||
'Class:Change/Attribute:manager_group_name+' => '',
|
||||
'Class:Change/Attribute:manager_id' => 'Manager',
|
||||
'Class:Change/Attribute:manager_id+' => '',
|
||||
'Class:Change/Attribute:manager_email' => 'Manager',
|
||||
'Class:Change/Attribute:manager_email+' => '',
|
||||
'Class:Change/Attribute:outage' => 'Ausfall',
|
||||
'Class:Change/Attribute:outage+' => '',
|
||||
'Class:Change/Attribute:outage/Value:yes' => 'Ja',
|
||||
'Class:Change/Attribute:outage/Value:yes+' => '',
|
||||
'Class:Change/Attribute:outage/Value:no' => 'Nein',
|
||||
'Class:Change/Attribute:outage/Value:no+' => '',
|
||||
'Class:Change/Attribute:change_request' => 'Anfrage',
|
||||
'Class:Change/Attribute:change_request+' => '',
|
||||
'Class:Change/Attribute:fallback' => 'Fallback-Plan',
|
||||
'Class:Change/Attribute:fallback+' => '',
|
||||
'Class:Change/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:Change/Stimulus:ev_validate+' => '',
|
||||
'Class:Change/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:Change/Stimulus:ev_reject+' => '',
|
||||
'Class:Change/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:Change/Stimulus:ev_assign+' => '',
|
||||
'Class:Change/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:Change/Stimulus:ev_reopen+' => '',
|
||||
'Class:Change/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:Change/Stimulus:ev_plan+' => '',
|
||||
'Class:Change/Stimulus:ev_approve' => 'Bestätigen',
|
||||
'Class:Change/Stimulus:ev_approve+' => '',
|
||||
'Class:Change/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:Change/Stimulus:ev_replan+' => '',
|
||||
'Class:Change/Stimulus:ev_notapprove' => 'Ablehnen',
|
||||
'Class:Change/Stimulus:ev_notapprove+' => '',
|
||||
'Class:Change/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:Change/Stimulus:ev_implement+' => '',
|
||||
'Class:Change/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:Change/Stimulus:ev_monitor+' => '',
|
||||
'Class:Change/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:Change/Stimulus:ev_finish+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:RoutineChange/Attribute:status/Value:new+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:assigned' => 'Zugewiesen',
|
||||
'Class:RoutineChange/Attribute:status/Value:assigned+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
|
||||
'Class:RoutineChange/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:approved' => 'Bestätigt',
|
||||
'Class:RoutineChange/Attribute:status/Value:approved+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:implemented' => 'Implementiert',
|
||||
'Class:RoutineChange/Attribute:status/Value:implemented+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:monitored' => 'Überwachen',
|
||||
'Class:RoutineChange/Attribute:status/Value:monitored+' => '',
|
||||
'Class:RoutineChange/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:RoutineChange/Attribute:status/Value:closed+' => '',
|
||||
'Class:ApprovedChange' => 'Bewilligte Changes',
|
||||
'Class:ApprovedChange+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_date' => 'Datum der Bewilligung',
|
||||
'Class:ApprovedChange/Attribute:approval_date+' => '',
|
||||
'Class:ApprovedChange/Attribute:approval_comment' => 'Kommentar zur Bewilligung',
|
||||
'Class:ApprovedChange/Attribute:approval_comment+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate' => 'Validieren',
|
||||
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_reject' => 'Ablehnen',
|
||||
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_reopen' => 'Wiedereröffnen',
|
||||
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_plan' => 'Planen',
|
||||
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_approve' => 'Bestätigen',
|
||||
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan' => 'Umplanen',
|
||||
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Bestätigen zurücknehmen',
|
||||
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement' => 'Implementieren',
|
||||
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_monitor' => 'Überwachen',
|
||||
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
|
||||
'Class:ApprovedChange/Stimulus:ev_finish' => 'Abschließen',
|
||||
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:NormalChange/Attribute:status/Value:new+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:validated' => 'Validiert',
|
||||
'Class:NormalChange/Attribute:status/Value:validated+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:rejected' => 'Abgelehnt',
|
||||
'Class:NormalChange/Attribute:status/Value:rejected+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:assigned' => 'Zugewiesen',
|
||||
'Class:NormalChange/Attribute:status/Value:assigned+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
|
||||
'Class:NormalChange/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:approved' => 'Bestätigt',
|
||||
'Class:NormalChange/Attribute:status/Value:approved+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:notapproved' => 'Nicht bestätigt',
|
||||
'Class:NormalChange/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:implemented' => 'Implementiert',
|
||||
'Class:NormalChange/Attribute:status/Value:implemented+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:monitored' => 'Überwachen',
|
||||
'Class:NormalChange/Attribute:status/Value:monitored+' => '',
|
||||
'Class:NormalChange/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:NormalChange/Attribute:status/Value:closed+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:EmergencyChange/Attribute:status/Value:new+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:validated' => 'Validiert',
|
||||
'Class:EmergencyChange/Attribute:status/Value:validated+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:rejected' => 'Abgelehnt',
|
||||
'Class:EmergencyChange/Attribute:status/Value:rejected+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:assigned' => 'Zugewiesen',
|
||||
'Class:EmergencyChange/Attribute:status/Value:assigned+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled' => 'Geplant und angesetzt',
|
||||
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:approved' => 'Bestätigt',
|
||||
'Class:EmergencyChange/Attribute:status/Value:approved+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:notapproved' => 'Nicht bestätigt',
|
||||
'Class:EmergencyChange/Attribute:status/Value:notapproved+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:implemented' => 'Implementiert',
|
||||
'Class:EmergencyChange/Attribute:status/Value:implemented+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:monitored' => 'Überwachen',
|
||||
'Class:EmergencyChange/Attribute:status/Value:monitored+' => '',
|
||||
'Class:EmergencyChange/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:EmergencyChange/Attribute:status/Value:closed+' => '',
|
||||
));
|
||||
?>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -257,7 +257,7 @@ abstract class Document extends cmdbAbstractObject
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalField("org_name", array("allowed_values"=>null, "extkey_attcode"=>"org_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeText("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("type", array("allowed_values"=>new ValueSetEnum('contract,networkmap,presentation,training,whitePaper,workinginstructions'), "sql"=>"type", "default_value"=>"presentation", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("status", array("allowed_values"=>new ValueSetEnum('draft,published,obsolete'), "sql"=>"status", "default_value"=>"draft", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeEnum("status", array("allowed_values"=>new ValueSetEnum('draft,published,obsolete'), "sql"=>"status", "default_value"=>"draft", "is_null_allowed"=>false, "depends_on"=>array('org_id'))));
|
||||
MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("contract_list", array("linked_class"=>"lnkContractToDoc", "ext_key_to_me"=>"document_id", "ext_key_to_remote"=>"contract_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("service_list", array("linked_class"=>"lnkServiceToDoc", "ext_key_to_me"=>"document_id", "ext_key_to_remote"=>"service_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("ticket_list", array("linked_class"=>"lnkTicketToDoc", "ext_key_to_me"=>"document_id", "ext_key_to_remote"=>"ticket_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
|
||||
@@ -365,7 +365,7 @@ class FileDoc extends Document
|
||||
$oPage->add($this->DisplayDocumentInline($oPage, 'contents'));
|
||||
$oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
|
||||
}
|
||||
parent::DisplayBareProperties($oPage, $bEditMode, $sPrefix);
|
||||
parent::DisplayBareProperties($oPage, $bEditMode, $sPrefix, $aExtraParams);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,8 +38,8 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:Organization/Attribute:status/Value:inactive+' => 'Inativo',
|
||||
'Class:Organization/Attribute:parent_id' => 'Matriz',
|
||||
'Class:Organization/Attribute:parent_id+' => 'Organização matriz',
|
||||
'Class:Location' => 'Localizacao',
|
||||
'Class:Location+' => 'Qualquer tipo localizacao: Região, Pais, Cidade, Site, Construção, Piso, Sala, Rack,...',
|
||||
'Class:Location' => 'Localização',
|
||||
'Class:Location+' => 'Qualquer tipo localização: Região, Pais, Cidade, Site, Construção, Piso, Sala, Rack,...',
|
||||
'Class:Location/Attribute:name' => 'Nome',
|
||||
'Class:Location/Attribute:name+' => '',
|
||||
'Class:Location/Attribute:status' => 'Status',
|
||||
@@ -416,17 +416,17 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
||||
'Class:Contact/Attribute:status/Value:active+' => 'Ativo',
|
||||
'Class:Contact/Attribute:status/Value:inactive' => 'Inativo',
|
||||
'Class:Contact/Attribute:status/Value:inactive+' => 'Inativo',
|
||||
'Class:Contact/Attribute:org_id' => 'Organizacao',
|
||||
'Class:Contact/Attribute:org_id' => 'Organização',
|
||||
'Class:Contact/Attribute:org_id+' => '',
|
||||
'Class:Contact/Attribute:org_name' => 'Organizacao',
|
||||
'Class:Contact/Attribute:org_name' => 'Organização',
|
||||
'Class:Contact/Attribute:org_name+' => '',
|
||||
'Class:Contact/Attribute:email' => 'Email',
|
||||
'Class:Contact/Attribute:email+' => '',
|
||||
'Class:Contact/Attribute:phone' => 'Telefone',
|
||||
'Class:Contact/Attribute:phone+' => '',
|
||||
'Class:Contact/Attribute:location_id' => 'Localizacao',
|
||||
'Class:Contact/Attribute:location_id' => 'Localização',
|
||||
'Class:Contact/Attribute:location_id+' => '',
|
||||
'Class:Contact/Attribute:location_name' => 'Localizacao',
|
||||
'Class:Contact/Attribute:location_name' => 'Localização',
|
||||
'Class:Contact/Attribute:location_name+' => '',
|
||||
'Class:Contact/Attribute:ci_list' => 'CIs',
|
||||
'Class:Contact/Attribute:ci_list+' => 'CIs relacionados para o contato',
|
||||
|
||||
@@ -1,75 +1,59 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Menu:IncidentManagement' => 'Incident Management',
|
||||
'Menu:IncidentManagement+' => 'Incident Management',
|
||||
'Menu:Incident:Overview' => 'Übersicht',
|
||||
'Menu:Incident:Overview+' => 'Übersicht',
|
||||
'Menu:NewIncident' => 'Neuer Incident',
|
||||
'Menu:NewIncident+' => 'Ein neues Incident-Ticket erstellen',
|
||||
'Menu:SearchIncidents' => 'Nach Incidents suchen',
|
||||
'Menu:SearchIncidents+' => 'Nach Incidents suchen',
|
||||
'Menu:Incident:Shortcuts' => 'Shortcuts',
|
||||
'Menu:Incident:Shortcuts+' => '',
|
||||
'Menu:Incident:MyIncidents' => 'Incidents, die mich betreffen',
|
||||
'Menu:Incident:MyIncidents+' => 'Incidents, die mich betreffen (als Bearbeiter)',
|
||||
'Menu:Incident:EscalatedIncidents' => 'Eskalierte Incidents',
|
||||
'Menu:Incident:EscalatedIncidents+' => 'Eskalierte Incidents',
|
||||
'Menu:Incident:OpenIncidents' => 'Alle offenen Incidents',
|
||||
'Menu:Incident:OpenIncidents+' => 'Alle offenen Incidents',
|
||||
|
||||
));
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
//
|
||||
// Class: Incident
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:Incident' => 'Incident',
|
||||
'Class:Incident+' => '',
|
||||
'Class:Incident/Stimulus:ev_assign' => '"Zuweisen"',
|
||||
'Class:Incident/Stimulus:ev_assign+' => '',
|
||||
'Class:Incident/Stimulus:ev_reassign' => 'Neu zuweisen',
|
||||
'Class:Incident/Stimulus:ev_reassign+' => '',
|
||||
'Class:Incident/Stimulus:ev_timeout' => 'ev-Timeout',
|
||||
'Class:Incident/Stimulus:ev_timeout+' => '',
|
||||
'Class:Incident/Stimulus:ev_resolve' => 'Als gelöst markieren',
|
||||
'Class:Incident/Stimulus:ev_resolve+' => '',
|
||||
'Class:Incident/Stimulus:ev_close' => 'Schließen',
|
||||
'Class:Incident/Stimulus:ev_close+' => '',
|
||||
));
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:Incident' => 'Incident',
|
||||
'Class:Incident+' => '',
|
||||
'Class:Incident/Stimulus:ev_assign' => '"Zuweisen"',
|
||||
'Class:Incident/Stimulus:ev_assign+' => '',
|
||||
'Class:Incident/Stimulus:ev_reassign' => 'Neu zuweisen',
|
||||
'Class:Incident/Stimulus:ev_reassign+' => '',
|
||||
'Class:Incident/Stimulus:ev_timeout' => 'ev-Timeout',
|
||||
'Class:Incident/Stimulus:ev_timeout+' => '',
|
||||
'Class:Incident/Stimulus:ev_resolve' => 'Als gelöst markieren',
|
||||
'Class:Incident/Stimulus:ev_resolve+' => '',
|
||||
'Class:Incident/Stimulus:ev_close' => 'Schließen',
|
||||
'Class:Incident/Stimulus:ev_close+' => '',
|
||||
'Class:lnkTicketToIncident' => 'Ticket zu Incident',
|
||||
'Class:lnkTicketToIncident/Attribute:ticket_id' => 'Ticket',
|
||||
'Class:lnkTicketToIncident/Attribute:incident_id' => 'Incident',
|
||||
'Class:lnkTicketToIncident/Attribute:reason' => 'Grund',
|
||||
'Menu:IncidentManagement' => 'Incident Management',
|
||||
'Menu:IncidentManagement+' => 'Incident Management',
|
||||
'Menu:Incident:Overview' => 'Übersicht',
|
||||
'Menu:Incident:Overview+' => 'Übersicht',
|
||||
'Menu:NewIncident' => 'Neuer Incident',
|
||||
'Menu:NewIncident+' => 'Ein neues Incident-Ticket erstellen',
|
||||
'Menu:SearchIncidents' => 'Nach Incidents suchen',
|
||||
'Menu:SearchIncidents+' => 'Nach Incidents suchen',
|
||||
'Menu:Incident:Shortcuts' => 'Shortcuts',
|
||||
'Menu:Incident:Shortcuts+' => '',
|
||||
'Menu:Incident:MyIncidents' => 'Incidents, die mich betreffen',
|
||||
'Menu:Incident:MyIncidents+' => 'Incidents, die mich betreffen (als Bearbeiter)',
|
||||
'Menu:Incident:EscalatedIncidents' => 'Eskalierte Incidents',
|
||||
'Menu:Incident:EscalatedIncidents+' => 'Eskalierte Incidents',
|
||||
'Menu:Incident:OpenIncidents' => 'Alle offenen Incidents',
|
||||
'Menu:Incident:OpenIncidents+' => 'Alle offenen Incidents',
|
||||
));
|
||||
?>
|
||||
|
||||
@@ -188,7 +188,7 @@ class Incident extends ResponseTicket
|
||||
$sIcon = '';
|
||||
if ($sIconName != '')
|
||||
{
|
||||
$sPath = '../modules/itop-incident-mgmt-1.0.0/images/'.$sIconName;
|
||||
$sPath = utils::GetAbsoluteUrlModulesRoot().'itop-incident-mgmt-1.0.0/images/'.$sIconName;
|
||||
if ($bImgTag)
|
||||
{
|
||||
$sIcon = "<img src=\"$sPath\" style=\"vertical-align:middle;\"/>";
|
||||
|
||||
@@ -1,456 +1,315 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Menu:ServiceManagement' => 'Service Management',
|
||||
'Menu:ServiceManagement+' => 'Service Management-Übersicht',
|
||||
'Menu:Service:Overview' => 'Übersicht',
|
||||
'Menu:Service:Overview+' => '',
|
||||
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Verträge nach Service Level',
|
||||
'UI-ServiceManagementMenu-ContractsByStatus' => 'Verträge nach Status',
|
||||
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Verträge, die in weniger als 30 Tagen enden',
|
||||
|
||||
'Menu:ServiceType' => 'Service Typen',
|
||||
'Menu:ServiceType+' => 'Service Typen',
|
||||
'Menu:ProviderContract' => 'Provider-Verträge',
|
||||
'Menu:ProviderContract+' => 'Provider-Verträge',
|
||||
'Menu:CustomerContract' => 'Kundenverträge',
|
||||
'Menu:CustomerContract+' => 'Kundenverträge',
|
||||
'Menu:ServiceSubcategory' => 'Service-Unterkategorien',
|
||||
'Menu:ServiceSubcategory+' => 'Service-Unterkategorien',
|
||||
'Menu:Service' => 'Services',
|
||||
'Menu:Service+' => 'Services',
|
||||
'Menu:SLA' => 'SLAs',
|
||||
'Menu:SLA+' => 'Service Level Agreements',
|
||||
'Menu:SLT' => 'SLTs',
|
||||
'Menu:SLT+' => 'Service Level Targets',
|
||||
|
||||
));
|
||||
|
||||
|
||||
/*
|
||||
'UI:ServiceManagementMenu' => 'Gestion des Services',
|
||||
'UI:ServiceManagementMenu+' => 'Gestion des Services',
|
||||
'UI:ServiceManagementMenu:Title' => 'Résumé des services & contrats',
|
||||
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contrats par niveau de service',
|
||||
'UI-ServiceManagementMenu-ContractsByStatus' => 'Contrats par état',
|
||||
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contrats se terminant dans moins de 30 jours',
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// Class: Contract
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:Contract' => 'Vertrag',
|
||||
'Class:Contract+' => '',
|
||||
'Class:Contract/Attribute:name' => 'Name',
|
||||
'Class:Contract/Attribute:name+' => '',
|
||||
'Class:Contract/Attribute:description' => 'Beschreibung',
|
||||
'Class:Contract/Attribute:description+' => '',
|
||||
'Class:Contract/Attribute:start_date' => 'Anfangsdatum',
|
||||
'Class:Contract/Attribute:start_date+' => '',
|
||||
'Class:Contract/Attribute:end_date' => 'Ablaufdatum',
|
||||
'Class:Contract/Attribute:end_date+' => '',
|
||||
'Class:Contract/Attribute:cost' => 'Kosten',
|
||||
'Class:Contract/Attribute:cost+' => '',
|
||||
'Class:Contract/Attribute:cost_currency' => 'Währung',
|
||||
'Class:Contract/Attribute:cost_currency+' => '',
|
||||
'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dollar',
|
||||
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
|
||||
'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro',
|
||||
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
|
||||
'Class:Contract/Attribute:cost_unit' => 'Kosteneinheit',
|
||||
'Class:Contract/Attribute:cost_unit+' => '',
|
||||
'Class:Contract/Attribute:billing_frequency' => 'Abrechnungshäufigkeit',
|
||||
'Class:Contract/Attribute:billing_frequency+' => '',
|
||||
'Class:Contract/Attribute:contact_list' => 'Kontakte',
|
||||
'Class:Contract/Attribute:contact_list+' => 'Kontakte zu diesem Vertrag',
|
||||
'Class:Contract/Attribute:document_list' => 'Dokumente',
|
||||
'Class:Contract/Attribute:document_list+' => 'Dokumente zu diesem Vertrag',
|
||||
'Class:Contract/Attribute:ci_list' => 'CIs',
|
||||
'Class:Contract/Attribute:ci_list+' => 'CI, die von dem Vertrag unterstützt werden',
|
||||
'Class:Contract/Attribute:finalclass' => 'Typ',
|
||||
'Class:Contract/Attribute:finalclass+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: ProviderContract
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:ProviderContract' => 'Provider-Vertrag',
|
||||
'Class:ProviderContract+' => '',
|
||||
'Class:ProviderContract/Attribute:provider_id' => 'Anbieter',
|
||||
'Class:ProviderContract/Attribute:provider_id+' => '',
|
||||
'Class:ProviderContract/Attribute:provider_name' => 'Providername',
|
||||
'Class:ProviderContract/Attribute:provider_name+' => '',
|
||||
'Class:ProviderContract/Attribute:sla' => 'SLA',
|
||||
'Class:ProviderContract/Attribute:sla+' => 'Service Level Agreement',
|
||||
'Class:ProviderContract/Attribute:coverage' => 'Abdeckung',
|
||||
'Class:ProviderContract/Attribute:coverage+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: CustomerContract
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:CustomerContract' => 'Kundenvertrag',
|
||||
'Class:CustomerContract+' => '',
|
||||
'Class:CustomerContract/Attribute:org_id' => 'Kunde',
|
||||
'Class:CustomerContract/Attribute:org_id+' => '',
|
||||
'Class:CustomerContract/Attribute:org_name' => 'Kundenname',
|
||||
'Class:CustomerContract/Attribute:org_name+' => '',
|
||||
'Class:CustomerContract/Attribute:provider_id' => 'Anbieter',
|
||||
'Class:CustomerContract/Attribute:provider_id+' => '',
|
||||
'Class:CustomerContract/Attribute:provider_name' => 'Providername',
|
||||
'Class:CustomerContract/Attribute:provider_name+' => '',
|
||||
'Class:CustomerContract/Attribute:support_team_id' => 'Support-Team',
|
||||
'Class:CustomerContract/Attribute:support_team_id+' => '',
|
||||
'Class:CustomerContract/Attribute:support_team_name' => 'Support-Team',
|
||||
'Class:CustomerContract/Attribute:support_team_name+' => '',
|
||||
'Class:CustomerContract/Attribute:provider_list' => 'Anbieter',
|
||||
'Class:CustomerContract/Attribute:provider_list+' => '',
|
||||
'Class:CustomerContract/Attribute:sla_list' => 'SLAs',
|
||||
'Class:CustomerContract/Attribute:sla_list+' => 'Liste der SLAs zu dem Vertrag',
|
||||
'Class:CustomerContract/Attribute:provider_list' => 'Zugrunde liegende Verträge',
|
||||
'Class:CustomerContract/Attribute:sla_list+' => '',
|
||||
));
|
||||
|
||||
// Class: lnkCustomerContractToProviderContract
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkCustomerContractToProviderContract' => 'Verbindung Kundenvertratg zu Provider-Vertrag',
|
||||
'Class:lnkCustomerContractToProviderContract+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'Kundenvertrag',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name' => 'Name',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id' => 'Provider Contract',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name' => 'Name',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla' => 'Provider-SLA',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla+' => 'Service Level Agreement',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage' => 'Service-Stunden',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
|
||||
));
|
||||
|
||||
|
||||
//
|
||||
// Class: lnkContractToSLA
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkContractToSLA' => 'Contract/SLA',
|
||||
'Class:lnkContractToSLA+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:contract_id' => 'Vertrag',
|
||||
'Class:lnkContractToSLA/Attribute:contract_id+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:contract_name' => 'Vertrag',
|
||||
'Class:lnkContractToSLA/Attribute:contract_name+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:sla_id' => 'SLA',
|
||||
'Class:lnkContractToSLA/Attribute:sla_id+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:sla_name' => 'SLA',
|
||||
'Class:lnkContractToSLA/Attribute:sla_name+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:coverage' => 'Abdeckung',
|
||||
'Class:lnkContractToSLA/Attribute:coverage+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkContractToDoc
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkContractToDoc' => 'Vertrag/Dokument',
|
||||
'Class:lnkContractToDoc+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:contract_id' => 'Vertrag',
|
||||
'Class:lnkContractToDoc/Attribute:contract_id+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:contract_name' => 'Vertrag',
|
||||
'Class:lnkContractToDoc/Attribute:contract_name+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:document_id' => 'Dokument',
|
||||
'Class:lnkContractToDoc/Attribute:document_id+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:document_name' => 'Dokument',
|
||||
'Class:lnkContractToDoc/Attribute:document_name+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:document_type' => 'Dokumententyp',
|
||||
'Class:lnkContractToDoc/Attribute:document_type+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:document_status' => 'Dokumentenstatus',
|
||||
'Class:lnkContractToDoc/Attribute:document_status+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkContractToContact
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkContractToContact' => 'Vertrag/Kontakt',
|
||||
'Class:lnkContractToContact+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contract_id' => 'Vertrag',
|
||||
'Class:lnkContractToContact/Attribute:contract_id+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contract_name' => 'Vertrag',
|
||||
'Class:lnkContractToContact/Attribute:contract_name+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contact_id' => 'Kontakt',
|
||||
'Class:lnkContractToContact/Attribute:contact_id+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contact_name' => 'Kontakt',
|
||||
'Class:lnkContractToContact/Attribute:contact_name+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contact_email' => 'Kontaktemail',
|
||||
'Class:lnkContractToContact/Attribute:contact_email+' => '',
|
||||
'Class:lnkContractToContact/Attribute:role' => 'Rolle',
|
||||
'Class:lnkContractToContact/Attribute:role+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkContractToCI
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkContractToCI' => 'Vertrag/CI',
|
||||
'Class:lnkContractToCI+' => '',
|
||||
'Class:lnkContractToCI/Attribute:contract_id' => 'Vertrag',
|
||||
'Class:lnkContractToCI/Attribute:contract_id+' => '',
|
||||
'Class:lnkContractToCI/Attribute:contract_name' => 'Vertrag',
|
||||
'Class:lnkContractToCI/Attribute:contract_name+' => '',
|
||||
'Class:lnkContractToCI/Attribute:ci_id' => 'CI',
|
||||
'Class:lnkContractToCI/Attribute:ci_id+' => '',
|
||||
'Class:lnkContractToCI/Attribute:ci_name' => 'CI',
|
||||
'Class:lnkContractToCI/Attribute:ci_name+' => '',
|
||||
'Class:lnkContractToCI/Attribute:ci_status' => 'CI-Status',
|
||||
'Class:lnkContractToCI/Attribute:ci_status+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: Service
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:Service' => 'Service',
|
||||
'Class:Service+' => '',
|
||||
'Class:Service/Attribute:org_id' => 'Anbieter',
|
||||
'Class:Service/Attribute:org_id+' => '',
|
||||
'Class:Service/Attribute:provider_name' => 'Anbieter',
|
||||
'Class:Service/Attribute:provider_name+' => '',
|
||||
'Class:Service/Attribute:name' => 'Name',
|
||||
'Class:Service/Attribute:name+' => '',
|
||||
'Class:Service/Attribute:description' => 'Beschreibung',
|
||||
'Class:Service/Attribute:description+' => '',
|
||||
'Class:Service/Attribute:type' => 'Typ',
|
||||
'Class:Service/Attribute:type+' => '',
|
||||
'Class:Service/Attribute:type/Value:IncidentManagement' => 'Incident Management',
|
||||
'Class:Service/Attribute:type/Value:IncidentManagement+' => 'Incident Management',
|
||||
'Class:Service/Attribute:type/Value:RequestManagement' => 'Request Management',
|
||||
'Class:Service/Attribute:type/Value:RequestManagement+' => 'Request Management',
|
||||
'Class:Service/Attribute:status' => 'Status',
|
||||
'Class:Service/Attribute:status+' => '',
|
||||
'Class:Service/Attribute:status/Value:design' => 'Design',
|
||||
'Class:Service/Attribute:status/Value:design+' => '',
|
||||
'Class:Service/Attribute:status/Value:obsolete' => 'Veraltet',
|
||||
'Class:Service/Attribute:status/Value:obsolete+' => '',
|
||||
'Class:Service/Attribute:status/Value:production' => 'Produktion',
|
||||
'Class:Service/Attribute:status/Value:production+' => '',
|
||||
'Class:Service/Attribute:subcategory_list' => 'Service-Unterkategorien',
|
||||
'Class:Service/Attribute:subcategory_list+' => '',
|
||||
'Class:Service/Attribute:sla_list' => 'SLAs',
|
||||
'Class:Service/Attribute:sla_list+' => '',
|
||||
'Class:Service/Attribute:document_list' => 'Dokumente',
|
||||
'Class:Service/Attribute:document_list+' => 'Dokumente beigefügt zu dem Service',
|
||||
'Class:Service/Attribute:contact_list' => 'Kontakte',
|
||||
'Class:Service/Attribute:contact_list+' => 'Kontakte, die für diesen Service eine Rolle wahrnehmen',
|
||||
'Class:Service/Tab:Related_Contracts' => 'Zugehörige Verträge',
|
||||
'Class:Service/Tab:Related_Contracts+' => 'Verträge, die für diesen Vertrag unterschrieben wurden',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: ServiceSubcategory
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:ServiceSubcategory' => 'Service-Unterkategorien',
|
||||
'Class:ServiceSubcategory+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:name' => 'Name',
|
||||
'Class:ServiceSubcategory/Attribute:name+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:description' => 'Beschreibung',
|
||||
'Class:ServiceSubcategory/Attribute:description+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:service_id' => 'Service',
|
||||
'Class:ServiceSubcategory/Attribute:service_id+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:service_name' => 'Service',
|
||||
'Class:ServiceSubcategory/Attribute:service_name+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: SLA
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:SLA' => 'SLA',
|
||||
'Class:SLA+' => '',
|
||||
'Class:SLA/Attribute:name' => 'Name',
|
||||
'Class:SLA/Attribute:name+' => '',
|
||||
'Class:SLA/Attribute:service_id' => 'Service',
|
||||
'Class:SLA/Attribute:service_id+' => '',
|
||||
'Class:SLA/Attribute:service_name' => 'Service',
|
||||
'Class:SLA/Attribute:service_name+' => '',
|
||||
'Class:SLA/Attribute:slt_list' => 'SLTs',
|
||||
'Class:SLA/Attribute:slt_list+' => 'Auflistung der Service Level-Grenzbereiche',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: SLT
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:SLT' => 'SLT',
|
||||
'Class:SLT+' => '',
|
||||
'Class:SLT/Attribute:name' => 'Name',
|
||||
'Class:SLT/Attribute:name+' => '',
|
||||
'Class:SLT/Attribute:metric' => 'Metrisch',
|
||||
'Class:SLT/Attribute:metric+' => '',
|
||||
'Class:SLT/Attribute:metric/Value:TTO' => 'TTO',
|
||||
'Class:SLT/Attribute:metric/Value:TTO+' => 'TTO',
|
||||
'Class:SLT/Attribute:metric/Value:TTR' => 'TTR',
|
||||
'Class:SLT/Attribute:metric/Value:TTR+' => 'TTR',
|
||||
'Class:SLT/Attribute:ticket_priority' => 'Ticketpriorität',
|
||||
'Class:SLT/Attribute:ticket_priority+' => '',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:1' => '1',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:1+' => '1',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:2' => '2',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:2+' => '2',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:3' => '3',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:3+' => '3',
|
||||
'Class:SLT/Attribute:value' => 'Wert',
|
||||
'Class:SLT/Attribute:value+' => '',
|
||||
'Class:SLT/Attribute:value_unit' => 'Einheit',
|
||||
'Class:SLT/Attribute:value_unit+' => '',
|
||||
'Class:SLT/Attribute:value_unit/Value:days' => 'Tage',
|
||||
'Class:SLT/Attribute:value_unit/Value:days+' => 'Tage',
|
||||
'Class:SLT/Attribute:value_unit/Value:hours' => 'Stunden',
|
||||
'Class:SLT/Attribute:value_unit/Value:hours+' => 'Stunden',
|
||||
'Class:SLT/Attribute:value_unit/Value:minutes' => 'Minuten',
|
||||
'Class:SLT/Attribute:value_unit/Value:minutes+' => 'Minuten',
|
||||
'Class:SLT/Attribute:sla_list' => 'SLAs',
|
||||
'Class:SLT/Attribute:sla_list+' => 'SLAs, die den SLT nutzen',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkSLTToSLA
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkSLTToSLA' => 'SLT/SLA',
|
||||
'Class:lnkSLTToSLA+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:sla_id' => 'SLA',
|
||||
'Class:lnkSLTToSLA/Attribute:sla_id+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:sla_name' => 'SLA',
|
||||
'Class:lnkSLTToSLA/Attribute:sla_name+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_id' => 'SLT',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_id+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_name' => 'SLT',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_name+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_metric' => 'Metrisch',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_metric+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority' => 'Ticketpriorität',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_value' => 'Wert',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_value+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_value_unit' => 'Einheit',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_value_unit+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkServiceToDoc
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkServiceToDoc' => 'Service/Dokument',
|
||||
'Class:lnkServiceToDoc+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:service_id' => 'Service',
|
||||
'Class:lnkServiceToDoc/Attribute:service_id+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:service_name' => 'Service',
|
||||
'Class:lnkServiceToDoc/Attribute:service_name+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:document_id' => 'Dokument',
|
||||
'Class:lnkServiceToDoc/Attribute:document_id+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:document_name' => 'Dokument',
|
||||
'Class:lnkServiceToDoc/Attribute:document_name+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:document_type' => 'Dokumententyp',
|
||||
'Class:lnkServiceToDoc/Attribute:document_type+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:document_status' => 'Dokumentenstatus',
|
||||
'Class:lnkServiceToDoc/Attribute:document_status+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkServiceToContact
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkServiceToContact' => 'Service/Kontakt',
|
||||
'Class:lnkServiceToContact+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:service_id' => 'Service',
|
||||
'Class:lnkServiceToContact/Attribute:service_id+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:service_name' => 'Service',
|
||||
'Class:lnkServiceToContact/Attribute:service_name+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:contact_id' => 'Kontakt',
|
||||
'Class:lnkServiceToContact/Attribute:contact_id+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:contact_name' => 'Kontakt',
|
||||
'Class:lnkServiceToContact/Attribute:contact_name+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:contact_email' => 'Kontaktemail',
|
||||
'Class:lnkServiceToContact/Attribute:contact_email+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:role' => 'Rolle',
|
||||
'Class:lnkServiceToContact/Attribute:role+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkServiceToCI
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkServiceToCI' => 'Service/CI',
|
||||
'Class:lnkServiceToCI+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:service_id' => 'Service',
|
||||
'Class:lnkServiceToCI/Attribute:service_id+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:service_name' => 'Service',
|
||||
'Class:lnkServiceToCI/Attribute:service_name+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:ci_id' => 'CI',
|
||||
'Class:lnkServiceToCI/Attribute:ci_id+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:ci_name' => 'CI',
|
||||
'Class:lnkServiceToCI/Attribute:ci_name+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:ci_status' => 'CI-Status',
|
||||
'Class:lnkServiceToCI/Attribute:ci_status+' => '',
|
||||
));
|
||||
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:ProviderContract' => 'Provider-Vertrag',
|
||||
'Class:ProviderContract+' => '',
|
||||
'Class:ProviderContract/Attribute:provider_id' => 'Anbieter',
|
||||
'Class:ProviderContract/Attribute:provider_id+' => '',
|
||||
'Class:ProviderContract/Attribute:sla' => 'SLA',
|
||||
'Class:ProviderContract/Attribute:sla+' => 'Service Level Agreement',
|
||||
'Class:ProviderContract/Attribute:coverage' => 'Abdeckung',
|
||||
'Class:ProviderContract/Attribute:coverage+' => '',
|
||||
'Class:CustomerContract' => 'Kundenvertrag',
|
||||
'Class:CustomerContract+' => '',
|
||||
'Class:CustomerContract/Attribute:org_id' => 'Kunde',
|
||||
'Class:CustomerContract/Attribute:org_id+' => '',
|
||||
'Class:CustomerContract/Attribute:provider_id' => 'Anbieter',
|
||||
'Class:CustomerContract/Attribute:provider_id+' => '',
|
||||
'Class:CustomerContract/Attribute:support_team_id' => 'Support-Team',
|
||||
'Class:CustomerContract/Attribute:support_team_id+' => '',
|
||||
'Class:CustomerContract/Attribute:sla_list' => 'SLAs',
|
||||
'Class:CustomerContract/Attribute:sla_list+' => '',
|
||||
'Class:CustomerContract/Attribute:provider_list' => 'Zugrunde liegende Verträge',
|
||||
'Class:CustomerContract/Attribute:provider_list+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract' => 'Verbindung Kundenvertratg zu Provider-Vertrag',
|
||||
'Class:lnkCustomerContractToProviderContract+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'Kundenvertrag',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id' => 'Provider Contract',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id+' => '',
|
||||
'Class:lnkContractToSLA' => 'Contract/SLA',
|
||||
'Class:lnkContractToSLA+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:contract_id' => 'Vertrag',
|
||||
'Class:lnkContractToSLA/Attribute:contract_id+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:sla_id' => 'SLA',
|
||||
'Class:lnkContractToSLA/Attribute:sla_id+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:coverage' => 'Abdeckung',
|
||||
'Class:lnkContractToSLA/Attribute:coverage+' => '',
|
||||
'Class:lnkContractToDoc' => 'Vertrag/Dokument',
|
||||
'Class:lnkContractToDoc+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:contract_id' => 'Vertrag',
|
||||
'Class:lnkContractToDoc/Attribute:contract_id+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:document_id' => 'Dokument',
|
||||
'Class:lnkContractToDoc/Attribute:document_id+' => '',
|
||||
'Class:lnkContractToContact' => 'Vertrag/Kontakt',
|
||||
'Class:lnkContractToContact+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contract_id' => 'Vertrag',
|
||||
'Class:lnkContractToContact/Attribute:contract_id+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contact_id' => 'Kontakt',
|
||||
'Class:lnkContractToContact/Attribute:contact_id+' => '',
|
||||
'Class:lnkContractToContact/Attribute:role' => 'Rolle',
|
||||
'Class:lnkContractToContact/Attribute:role+' => '',
|
||||
'Class:lnkContractToCI' => 'Vertrag/CI',
|
||||
'Class:lnkContractToCI+' => '',
|
||||
'Class:lnkContractToCI/Attribute:contract_id' => 'Vertrag',
|
||||
'Class:lnkContractToCI/Attribute:contract_id+' => '',
|
||||
'Class:lnkContractToCI/Attribute:ci_id' => 'CI',
|
||||
'Class:lnkContractToCI/Attribute:ci_id+' => '',
|
||||
'Class:Service' => 'Service',
|
||||
'Class:Service+' => '',
|
||||
'Class:Service/Attribute:org_id' => 'Anbieter',
|
||||
'Class:Service/Attribute:org_id+' => '',
|
||||
'Class:Service/Attribute:name' => 'Name',
|
||||
'Class:Service/Attribute:name+' => '',
|
||||
'Class:Service/Attribute:description' => 'Beschreibung',
|
||||
'Class:Service/Attribute:description+' => '',
|
||||
'Class:Service/Attribute:type' => 'Typ',
|
||||
'Class:Service/Attribute:type+' => '',
|
||||
'Class:Service/Attribute:type/Value:IncidentManagement' => 'Incident Management',
|
||||
'Class:Service/Attribute:type/Value:IncidentManagement+' => 'Incident Management',
|
||||
'Class:Service/Attribute:type/Value:RequestManagement' => 'Request Management',
|
||||
'Class:Service/Attribute:type/Value:RequestManagement+' => 'Request Management',
|
||||
'Class:Service/Attribute:status' => 'Status',
|
||||
'Class:Service/Attribute:status+' => '',
|
||||
'Class:Service/Attribute:status/Value:design' => 'Design',
|
||||
'Class:Service/Attribute:status/Value:design+' => '',
|
||||
'Class:Service/Attribute:status/Value:obsolete' => 'Veraltet',
|
||||
'Class:Service/Attribute:status/Value:obsolete+' => '',
|
||||
'Class:Service/Attribute:status/Value:production' => 'Produktion',
|
||||
'Class:Service/Attribute:status/Value:production+' => '',
|
||||
'Class:Service/Attribute:subcategory_list' => 'Service-Unterkategorien',
|
||||
'Class:Service/Attribute:subcategory_list+' => '',
|
||||
'Class:Service/Attribute:sla_list' => 'SLAs',
|
||||
'Class:Service/Attribute:sla_list+' => '',
|
||||
'Class:Service/Attribute:document_list' => 'Dokumente',
|
||||
'Class:Service/Attribute:document_list+' => 'Dokumente beigefügt zu dem Service',
|
||||
'Class:Service/Attribute:contact_list' => 'Kontakte',
|
||||
'Class:Service/Attribute:contact_list+' => 'Kontakte, die für diesen Service eine Rolle wahrnehmen',
|
||||
'Class:ServiceSubcategory' => 'Service-Unterkategorien',
|
||||
'Class:ServiceSubcategory+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:name' => 'Name',
|
||||
'Class:ServiceSubcategory/Attribute:name+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:description' => 'Beschreibung',
|
||||
'Class:ServiceSubcategory/Attribute:description+' => '',
|
||||
'Class:ServiceSubcategory/Attribute:service_id' => 'Service',
|
||||
'Class:ServiceSubcategory/Attribute:service_id+' => '',
|
||||
'Class:SLA' => 'SLA',
|
||||
'Class:SLA+' => '',
|
||||
'Class:SLA/Attribute:name' => 'Name',
|
||||
'Class:SLA/Attribute:name+' => '',
|
||||
'Class:SLA/Attribute:service_id' => 'Service',
|
||||
'Class:SLA/Attribute:service_id+' => '',
|
||||
'Class:SLA/Attribute:slt_list' => 'SLTs',
|
||||
'Class:SLA/Attribute:slt_list+' => 'Auflistung der Service Level-Grenzbereiche',
|
||||
'Class:SLT' => 'SLT',
|
||||
'Class:SLT+' => '',
|
||||
'Class:SLT/Attribute:name' => 'Name',
|
||||
'Class:SLT/Attribute:name+' => '',
|
||||
'Class:SLT/Attribute:metric' => 'Metrisch',
|
||||
'Class:SLT/Attribute:metric+' => '',
|
||||
'Class:SLT/Attribute:metric/Value:TTO' => 'TTO',
|
||||
'Class:SLT/Attribute:metric/Value:TTO+' => 'TTO',
|
||||
'Class:SLT/Attribute:metric/Value:TTR' => 'TTR',
|
||||
'Class:SLT/Attribute:metric/Value:TTR+' => 'TTR',
|
||||
'Class:SLT/Attribute:ticket_priority' => 'Ticketpriorität',
|
||||
'Class:SLT/Attribute:ticket_priority+' => '',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:1' => '1',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:1+' => '1',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:2' => '2',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:2+' => '2',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:3' => '3',
|
||||
'Class:SLT/Attribute:ticket_priority/Value:3+' => '3',
|
||||
'Class:SLT/Attribute:value' => 'Wert',
|
||||
'Class:SLT/Attribute:value+' => '',
|
||||
'Class:SLT/Attribute:value_unit' => 'Einheit',
|
||||
'Class:SLT/Attribute:value_unit+' => '',
|
||||
'Class:SLT/Attribute:value_unit/Value:days' => 'Tage',
|
||||
'Class:SLT/Attribute:value_unit/Value:days+' => 'Tage',
|
||||
'Class:SLT/Attribute:value_unit/Value:hours' => 'Stunden',
|
||||
'Class:SLT/Attribute:value_unit/Value:hours+' => 'Stunden',
|
||||
'Class:SLT/Attribute:value_unit/Value:minutes' => 'Minuten',
|
||||
'Class:SLT/Attribute:value_unit/Value:minutes+' => 'Minuten',
|
||||
'Class:SLT/Attribute:sla_list' => 'SLAs',
|
||||
'Class:SLT/Attribute:sla_list+' => 'SLAs, die den SLT nutzen',
|
||||
'Class:lnkSLTToSLA' => 'SLT/SLA',
|
||||
'Class:lnkSLTToSLA+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:sla_id' => 'SLA',
|
||||
'Class:lnkSLTToSLA/Attribute:sla_id+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_id' => 'SLT',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_id+' => '',
|
||||
'Class:lnkServiceToDoc' => 'Service/Dokument',
|
||||
'Class:lnkServiceToDoc+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:service_id' => 'Service',
|
||||
'Class:lnkServiceToDoc/Attribute:service_id+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:document_id' => 'Dokument',
|
||||
'Class:lnkServiceToDoc/Attribute:document_id+' => '',
|
||||
'Class:lnkServiceToContact' => 'Service/Kontakt',
|
||||
'Class:lnkServiceToContact+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:service_id' => 'Service',
|
||||
'Class:lnkServiceToContact/Attribute:service_id+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:contact_id' => 'Kontakt',
|
||||
'Class:lnkServiceToContact/Attribute:contact_id+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:role' => 'Rolle',
|
||||
'Class:lnkServiceToContact/Attribute:role+' => '',
|
||||
'Class:lnkServiceToCI' => 'Service/CI',
|
||||
'Class:lnkServiceToCI+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:service_id' => 'Service',
|
||||
'Class:lnkServiceToCI/Attribute:service_id+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:ci_id' => 'CI',
|
||||
'Class:lnkServiceToCI/Attribute:ci_id+' => '',
|
||||
'Menu:ServiceManagement' => 'Service Management',
|
||||
'Menu:ServiceManagement+' => 'Service Management-Übersicht',
|
||||
'Menu:Service:Overview' => 'Übersicht',
|
||||
'Menu:Service:Overview+' => '',
|
||||
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Verträge nach Service Level',
|
||||
'UI-ServiceManagementMenu-ContractsByStatus' => 'Verträge nach Status',
|
||||
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Verträge, die in weniger als 30 Tagen enden',
|
||||
'Menu:ServiceType' => 'Service Typen',
|
||||
'Menu:ServiceType+' => 'Service Typen',
|
||||
'Menu:ProviderContract' => 'Provider-Verträge',
|
||||
'Menu:ProviderContract+' => 'Provider-Verträge',
|
||||
'Menu:CustomerContract' => 'Kundenverträge',
|
||||
'Menu:CustomerContract+' => 'Kundenverträge',
|
||||
'Menu:ServiceSubcategory' => 'Service-Unterkategorien',
|
||||
'Menu:ServiceSubcategory+' => 'Service-Unterkategorien',
|
||||
'Menu:Service' => 'Services',
|
||||
'Menu:Service+' => 'Services',
|
||||
'Menu:SLA' => 'SLAs',
|
||||
'Menu:SLA+' => 'Service Level Agreements',
|
||||
'Menu:SLT' => 'SLTs',
|
||||
'Menu:SLT+' => 'Service Level Targets',
|
||||
'Class:Contract' => 'Vertrag',
|
||||
'Class:Contract+' => '',
|
||||
'Class:Contract/Attribute:name' => 'Name',
|
||||
'Class:Contract/Attribute:name+' => '',
|
||||
'Class:Contract/Attribute:description' => 'Beschreibung',
|
||||
'Class:Contract/Attribute:description+' => '',
|
||||
'Class:Contract/Attribute:start_date' => 'Anfangsdatum',
|
||||
'Class:Contract/Attribute:start_date+' => '',
|
||||
'Class:Contract/Attribute:end_date' => 'Ablaufdatum',
|
||||
'Class:Contract/Attribute:end_date+' => '',
|
||||
'Class:Contract/Attribute:cost' => 'Kosten',
|
||||
'Class:Contract/Attribute:cost+' => '',
|
||||
'Class:Contract/Attribute:cost_currency' => 'Währung',
|
||||
'Class:Contract/Attribute:cost_currency+' => '',
|
||||
'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dollar',
|
||||
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
|
||||
'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro',
|
||||
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
|
||||
'Class:Contract/Attribute:cost_unit' => 'Kosteneinheit',
|
||||
'Class:Contract/Attribute:cost_unit+' => '',
|
||||
'Class:Contract/Attribute:billing_frequency' => 'Abrechnungshäufigkeit',
|
||||
'Class:Contract/Attribute:billing_frequency+' => '',
|
||||
'Class:Contract/Attribute:contact_list' => 'Kontakte',
|
||||
'Class:Contract/Attribute:contact_list+' => 'Kontakte zu diesem Vertrag',
|
||||
'Class:Contract/Attribute:document_list' => 'Dokumente',
|
||||
'Class:Contract/Attribute:document_list+' => 'Dokumente zu diesem Vertrag',
|
||||
'Class:Contract/Attribute:ci_list' => 'CIs',
|
||||
'Class:Contract/Attribute:ci_list+' => 'CI, die von dem Vertrag unterstützt werden',
|
||||
'Class:Contract/Attribute:finalclass' => 'Typ',
|
||||
'Class:Contract/Attribute:finalclass+' => '',
|
||||
'Class:ProviderContract/Attribute:provider_name' => 'Providername',
|
||||
'Class:ProviderContract/Attribute:provider_name+' => '',
|
||||
'Class:CustomerContract/Attribute:org_name' => 'Kundenname',
|
||||
'Class:CustomerContract/Attribute:org_name+' => '',
|
||||
'Class:CustomerContract/Attribute:provider_name' => 'Providername',
|
||||
'Class:CustomerContract/Attribute:provider_name+' => '',
|
||||
'Class:CustomerContract/Attribute:support_team_name' => 'Support-Team',
|
||||
'Class:CustomerContract/Attribute:support_team_name+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name' => 'Name',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name' => 'Name',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name+' => '',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla' => 'Provider-SLA',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla+' => 'Service Level Agreement',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage' => 'Service-Stunden',
|
||||
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:contract_name' => 'Vertrag',
|
||||
'Class:lnkContractToSLA/Attribute:contract_name+' => '',
|
||||
'Class:lnkContractToSLA/Attribute:sla_name' => 'SLA',
|
||||
'Class:lnkContractToSLA/Attribute:sla_name+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:contract_name' => 'Vertrag',
|
||||
'Class:lnkContractToDoc/Attribute:contract_name+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:document_name' => 'Dokument',
|
||||
'Class:lnkContractToDoc/Attribute:document_name+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:document_type' => 'Dokumententyp',
|
||||
'Class:lnkContractToDoc/Attribute:document_type+' => '',
|
||||
'Class:lnkContractToDoc/Attribute:document_status' => 'Dokumentenstatus',
|
||||
'Class:lnkContractToDoc/Attribute:document_status+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contract_name' => 'Vertrag',
|
||||
'Class:lnkContractToContact/Attribute:contract_name+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contact_name' => 'Kontakt',
|
||||
'Class:lnkContractToContact/Attribute:contact_name+' => '',
|
||||
'Class:lnkContractToContact/Attribute:contact_email' => 'Kontaktemail',
|
||||
'Class:lnkContractToContact/Attribute:contact_email+' => '',
|
||||
'Class:lnkContractToCI/Attribute:contract_name' => 'Vertrag',
|
||||
'Class:lnkContractToCI/Attribute:contract_name+' => '',
|
||||
'Class:lnkContractToCI/Attribute:ci_name' => 'CI',
|
||||
'Class:lnkContractToCI/Attribute:ci_name+' => '',
|
||||
'Class:lnkContractToCI/Attribute:ci_status' => 'CI-Status',
|
||||
'Class:lnkContractToCI/Attribute:ci_status+' => '',
|
||||
'Class:Service/Attribute:provider_name' => 'Anbieter',
|
||||
'Class:Service/Attribute:provider_name+' => '',
|
||||
'Class:Service/Tab:Related_Contracts' => 'Zugehörige Verträge',
|
||||
'Class:Service/Tab:Related_Contracts+' => 'Verträge, die für diesen Service unterschrieben wurden',
|
||||
'Class:ServiceSubcategory/Attribute:service_name' => 'Service',
|
||||
'Class:ServiceSubcategory/Attribute:service_name+' => '',
|
||||
'Class:SLA/Attribute:service_name' => 'Service',
|
||||
'Class:SLA/Attribute:service_name+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:sla_name' => 'SLA',
|
||||
'Class:lnkSLTToSLA/Attribute:sla_name+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_name' => 'SLT',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_name+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_metric' => 'Metrik',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_metric+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority' => 'Ticketpriorität',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_value' => 'Wert',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_value+' => '',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_value_unit' => 'Einheit',
|
||||
'Class:lnkSLTToSLA/Attribute:slt_value_unit+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:service_name' => 'Service',
|
||||
'Class:lnkServiceToDoc/Attribute:service_name+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:document_name' => 'Dokument',
|
||||
'Class:lnkServiceToDoc/Attribute:document_name+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:document_type' => 'Dokumententyp',
|
||||
'Class:lnkServiceToDoc/Attribute:document_type+' => '',
|
||||
'Class:lnkServiceToDoc/Attribute:document_status' => 'Dokumentenstatus',
|
||||
'Class:lnkServiceToDoc/Attribute:document_status+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:service_name' => 'Service',
|
||||
'Class:lnkServiceToContact/Attribute:service_name+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:contact_name' => 'Kontakt',
|
||||
'Class:lnkServiceToContact/Attribute:contact_name+' => '',
|
||||
'Class:lnkServiceToContact/Attribute:contact_email' => 'Kontaktemail',
|
||||
'Class:lnkServiceToContact/Attribute:contact_email+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:service_name' => 'Service',
|
||||
'Class:lnkServiceToCI/Attribute:service_name+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:ci_name' => 'CI',
|
||||
'Class:lnkServiceToCI/Attribute:ci_name+' => '',
|
||||
'Class:lnkServiceToCI/Attribute:ci_status' => 'CI-Status',
|
||||
'Class:lnkServiceToCI/Attribute:ci_status+' => '',
|
||||
));
|
||||
?>
|
||||
|
||||
@@ -1,274 +1,220 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Localized data
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
// Dictionnay conventions
|
||||
// Class:<class_name>
|
||||
// Class:<class_name>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>
|
||||
// Class:<class_name>/Attribute:<attribute_code>+
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
|
||||
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>
|
||||
// Class:<class_name>/Stimulus:<stimulus_code>+
|
||||
|
||||
|
||||
//
|
||||
// Class: Ticket
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:Ticket' => 'Ticket',
|
||||
'Class:Ticket+' => '',
|
||||
'Class:Ticket/Attribute:ref' => 'Referenz',
|
||||
'Class:Ticket/Attribute:ref+' => '',
|
||||
'Class:Ticket/Attribute:title' => 'Titel',
|
||||
'Class:Ticket/Attribute:title+' => '',
|
||||
'Class:Ticket/Attribute:description' => 'Beschreibung',
|
||||
'Class:Ticket/Attribute:description+' => '',
|
||||
'Class:Ticket/Attribute:ticket_log' => 'Protokoll',
|
||||
'Class:Ticket/Attribute:ticket_log+' => '',
|
||||
'Class:Ticket/Attribute:start_date' => 'Gestartet',
|
||||
'Class:Ticket/Attribute:start_date+' => '',
|
||||
'Class:Ticket/Attribute:document_list' => 'Dokumente',
|
||||
'Class:Ticket/Attribute:document_list+' => 'Dokumente zu diesem Ticket',
|
||||
'Class:Ticket/Attribute:ci_list' => 'CIs',
|
||||
'Class:Ticket/Attribute:ci_list+' => 'CIs, die diesen Incident betreffen',
|
||||
'Class:Ticket/Attribute:contact_list' => 'Kontakte',
|
||||
'Class:Ticket/Attribute:contact_list+' => 'Beteiligtes Team und beteiligte Personen',
|
||||
'Class:Ticket/Attribute:incident_list' => 'Dazugehörige Incidents',
|
||||
'Class:Ticket/Attribute:incident_list+' => '',
|
||||
'Class:Ticket/Attribute:finalclass' => 'Typ',
|
||||
'Class:Ticket/Attribute:finalclass+' => '',
|
||||
));
|
||||
|
||||
// Fieldset translation
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
|
||||
'Ticket:baseinfo' => 'Allgemeine Informationen',
|
||||
'Ticket:date' => 'Daten',
|
||||
'Ticket:contact' => 'Kontakte',
|
||||
'Ticket:moreinfo' => 'weitergehende Informationen',
|
||||
'Ticket:relation' => 'Beziehungen',
|
||||
'Ticket:log' => 'Kommunikation',
|
||||
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkTicketToDoc
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkTicketToDoc' => 'Ticket/Document',
|
||||
'Class:lnkTicketToDoc+' => '',
|
||||
'Class:lnkTicketToDoc/Attribute:ticket_id' => 'Ticket',
|
||||
'Class:lnkTicketToDoc/Attribute:ticket_id+' => '',
|
||||
'Class:lnkTicketToDoc/Attribute:ticket_ref' => 'Ticket #',
|
||||
'Class:lnkTicketToDoc/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkTicketToDoc/Attribute:document_id' => 'Dokument',
|
||||
'Class:lnkTicketToDoc/Attribute:document_id+' => '',
|
||||
'Class:lnkTicketToDoc/Attribute:document_name' => 'Dokument',
|
||||
'Class:lnkTicketToDoc/Attribute:document_name+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkTicketToContact
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkTicketToContact' => 'Ticket/Kontakt',
|
||||
'Class:lnkTicketToContact+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:ticket_id' => 'Ticket',
|
||||
'Class:lnkTicketToContact/Attribute:ticket_id+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:ticket_ref' => 'Ticket #',
|
||||
'Class:lnkTicketToContact/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:contact_id' => 'Kontakt',
|
||||
'Class:lnkTicketToContact/Attribute:contact_id+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:contact_name' => 'Kontakt',
|
||||
'Class:lnkTicketToContact/Attribute:contact_name+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:contact_email' => 'Email',
|
||||
'Class:lnkTicketToContact/Attribute:contact_email+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:role' => 'Rolle',
|
||||
'Class:lnkTicketToContact/Attribute:role+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: lnkTicketToCI
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkTicketToCI' => 'Ticket/CI',
|
||||
'Class:lnkTicketToCI+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ticket_id' => 'Ticket',
|
||||
'Class:lnkTicketToCI/Attribute:ticket_id+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ticket_ref' => 'Ticket #',
|
||||
'Class:lnkTicketToCI/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ci_id' => 'CI',
|
||||
'Class:lnkTicketToCI/Attribute:ci_id+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ci_name' => 'CI',
|
||||
'Class:lnkTicketToCI/Attribute:ci_name+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ci_status' => 'CI-Status',
|
||||
'Class:lnkTicketToCI/Attribute:ci_status+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:impact' => 'Auswirkung',
|
||||
'Class:lnkTicketToCI/Attribute:impact+' => '',
|
||||
));
|
||||
|
||||
//
|
||||
// Class: ResponseTicket
|
||||
//
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:ResponseTicket' => 'Antwortticket',
|
||||
'Class:ResponseTicket+' => '',
|
||||
'Class:ResponseTicket/Attribute:status' => 'Status',
|
||||
'Class:ResponseTicket/Attribute:status+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:ResponseTicket/Attribute:status/Value:new+' => 'Neu eröffnet',
|
||||
'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Unerledigt',
|
||||
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'Eskalation/TTO',
|
||||
'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:assigned' => 'Zugeteilt',
|
||||
'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'Eskalation/TTR',
|
||||
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Anstehend',
|
||||
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:resolved' => 'Gelöst',
|
||||
'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
|
||||
'Class:ResponseTicket/Attribute:caller_id' => 'Melder',
|
||||
'Class:ResponseTicket/Attribute:caller_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:caller_email' => 'Email',
|
||||
'Class:ResponseTicket/Attribute:caller_email+' => '',
|
||||
'Class:ResponseTicket/Attribute:org_id' => 'Kunde',
|
||||
'Class:ResponseTicket/Attribute:org_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:org_name' => 'Kunde',
|
||||
'Class:ResponseTicket/Attribute:org_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:service_id' => 'Service',
|
||||
'Class:ResponseTicket/Attribute:service_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:service_name' => 'Name',
|
||||
'Class:ResponseTicket/Attribute:service_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'Service-Element',
|
||||
'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:servicesubcategory_name' => 'Name',
|
||||
'Class:ResponseTicket/Attribute:servicesubcategory_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:product' => 'Produkt',
|
||||
'Class:ResponseTicket/Attribute:product+' => '',
|
||||
'Class:ResponseTicket/Attribute:impact' => 'Auswirkung',
|
||||
'Class:ResponseTicket/Attribute:impact+' => '',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:1' => 'Eine Person',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:2' => 'Ein Service',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:3' => 'Eine Abteilung',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
|
||||
'Class:ResponseTicket/Attribute:urgency' => 'Dringlichkeit',
|
||||
'Class:ResponseTicket/Attribute:urgency+' => '',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:1' => 'Niedrig',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:2' => 'Medium',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:3' => 'Hoch',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
|
||||
'Class:ResponseTicket/Attribute:priority' => 'Priorität',
|
||||
'Class:ResponseTicket/Attribute:priority+' => '',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:1' => 'Niedrig',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:2' => 'Medium',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:3' => 'Hoch',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
|
||||
'Class:ResponseTicket/Attribute:workgroup_id' => 'Arbeitsgruppe',
|
||||
'Class:ResponseTicket/Attribute:workgroup_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:workgroup_name' => 'Arbeitsgruppe',
|
||||
'Class:ResponseTicket/Attribute:workgroup_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:agent_id' => 'Bearbeiter',
|
||||
'Class:ResponseTicket/Attribute:agent_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:agent_name' => 'Bearbeiter',
|
||||
'Class:ResponseTicket/Attribute:agent_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:agent_email' => 'Bearbeiter schreiben (Email)',
|
||||
'Class:ResponseTicket/Attribute:agent_email+' => '',
|
||||
'Class:ResponseTicket/Attribute:related_problem_id' => 'Dazugehöriges Problem',
|
||||
'Class:ResponseTicket/Attribute:related_problem_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:related_problem_ref' => 'Referenz',
|
||||
'Class:ResponseTicket/Attribute:related_problem_ref+' => '',
|
||||
'Class:ResponseTicket/Attribute:related_change_id' => 'Verbundene Änderungen',
|
||||
'Class:ResponseTicket/Attribute:related_change_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:related_change_ref' => 'Verbundene Änderungen',
|
||||
'Class:ResponseTicket/Attribute:related_change_ref+' => '',
|
||||
'Class:ResponseTicket/Attribute:close_date' => 'Geschlossen',
|
||||
'Class:ResponseTicket/Attribute:close_date+' => '',
|
||||
'Class:ResponseTicket/Attribute:last_update' => 'Letzte Aktualisierung',
|
||||
'Class:ResponseTicket/Attribute:last_update+' => '',
|
||||
'Class:ResponseTicket/Attribute:assignment_date' => 'Zugeteilt',
|
||||
'Class:ResponseTicket/Attribute:assignment_date+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_date' => 'Lösungsdatum',
|
||||
'Class:ResponseTicket/Attribute:resolution_date+' => '',
|
||||
'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTO Eskaltionsfrist',
|
||||
'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '',
|
||||
'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTR Eskaltionsfrist',
|
||||
'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '',
|
||||
'Class:ResponseTicket/Attribute:closure_deadline' => 'Abschlussfrist',
|
||||
'Class:ResponseTicket/Attribute:closure_deadline+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code' => 'Code für Lösung',
|
||||
'Class:ResponseTicket/Attribute:resolution_code+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => 'Konnte nicht reproduziert werden',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'Duplikat eines bestehenden Tickets',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => 'Repariert',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => 'Irrelevant',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
|
||||
'Class:ResponseTicket/Attribute:solution' => 'Lösung',
|
||||
'Class:ResponseTicket/Attribute:solution+' => '',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction' => 'Benutzerzufriedenheit',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction+' => '',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => '1',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => '1',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => '2',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => '2',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => '3',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => '3',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => '4',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => '4',
|
||||
'Class:ResponseTicket/Attribute:user_commment' => 'Benutzerkommentar',
|
||||
'Class:ResponseTicket/Attribute:user_commment+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:ResponseTicket/Stimulus:ev_assign+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_reassign' => 'Neu zuweisen',
|
||||
'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_timeout' => 'ev-Timeout',
|
||||
'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_resolve' => 'Als gelöst markieren',
|
||||
'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_close' => 'Schließen',
|
||||
'Class:ResponseTicket/Stimulus:ev_close+' => '',
|
||||
));
|
||||
|
||||
|
||||
?>
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @author Stephan Rosenke <stephan.rosenke@itomig.de>
|
||||
|
||||
* @licence http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
Dict::Add('DE DE', 'German', 'Deutsch', array(
|
||||
'Class:lnkTicketToDoc' => 'Ticket/Document',
|
||||
'Class:lnkTicketToDoc+' => '',
|
||||
'Class:lnkTicketToDoc/Attribute:ticket_id' => 'Ticket',
|
||||
'Class:lnkTicketToDoc/Attribute:ticket_id+' => '',
|
||||
'Class:lnkTicketToDoc/Attribute:document_id' => 'Dokument',
|
||||
'Class:lnkTicketToDoc/Attribute:document_id+' => '',
|
||||
'Class:lnkTicketToContact' => 'Ticket/Kontakt',
|
||||
'Class:lnkTicketToContact+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:ticket_id' => 'Ticket',
|
||||
'Class:lnkTicketToContact/Attribute:ticket_id+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:contact_id' => 'Kontakt',
|
||||
'Class:lnkTicketToContact/Attribute:contact_id+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:role' => 'Rolle',
|
||||
'Class:lnkTicketToContact/Attribute:role+' => '',
|
||||
'Class:lnkTicketToCI' => 'Ticket/CI',
|
||||
'Class:lnkTicketToCI+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ticket_id' => 'Ticket',
|
||||
'Class:lnkTicketToCI/Attribute:ticket_id+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ci_id' => 'CI',
|
||||
'Class:lnkTicketToCI/Attribute:ci_id+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:impact' => 'Auswirkung',
|
||||
'Class:lnkTicketToCI/Attribute:impact+' => '',
|
||||
'Class:Ticket' => 'Ticket',
|
||||
'Class:Ticket+' => '',
|
||||
'Class:Ticket/Attribute:ref' => 'Referenz',
|
||||
'Class:Ticket/Attribute:ref+' => '',
|
||||
'Class:Ticket/Attribute:title' => 'Titel',
|
||||
'Class:Ticket/Attribute:title+' => '',
|
||||
'Class:Ticket/Attribute:description' => 'Beschreibung',
|
||||
'Class:Ticket/Attribute:description+' => '',
|
||||
'Class:Ticket/Attribute:ticket_log' => 'Protokoll',
|
||||
'Class:Ticket/Attribute:ticket_log+' => '',
|
||||
'Class:Ticket/Attribute:start_date' => 'Gestartet',
|
||||
'Class:Ticket/Attribute:start_date+' => '',
|
||||
'Class:Ticket/Attribute:document_list' => 'Dokumente',
|
||||
'Class:Ticket/Attribute:document_list+' => 'Dokumente zu diesem Ticket',
|
||||
'Class:Ticket/Attribute:ci_list' => 'CIs',
|
||||
'Class:Ticket/Attribute:ci_list+' => 'CIs, die diesen Incident betreffen',
|
||||
'Class:Ticket/Attribute:contact_list' => 'Kontakte',
|
||||
'Class:Ticket/Attribute:contact_list+' => 'Beteiligtes Team und beteiligte Personen',
|
||||
'Class:Ticket/Attribute:incident_list' => 'Dazugehörige Incidents',
|
||||
'Class:Ticket/Attribute:incident_list+' => '',
|
||||
'Class:Ticket/Attribute:finalclass' => 'Typ',
|
||||
'Class:Ticket/Attribute:finalclass+' => '',
|
||||
'Ticket:baseinfo' => 'Allgemeine Informationen',
|
||||
'Ticket:date' => 'Daten',
|
||||
'Ticket:contact' => 'Kontakte',
|
||||
'Ticket:moreinfo' => 'weitergehende Informationen',
|
||||
'Ticket:relation' => 'Beziehungen',
|
||||
'Ticket:log' => 'Kommunikation',
|
||||
'Class:lnkTicketToDoc/Attribute:ticket_ref' => 'Ticket #',
|
||||
'Class:lnkTicketToDoc/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkTicketToDoc/Attribute:document_name' => 'Dokument',
|
||||
'Class:lnkTicketToDoc/Attribute:document_name+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:ticket_ref' => 'Ticket #',
|
||||
'Class:lnkTicketToContact/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:contact_name' => 'Kontakt',
|
||||
'Class:lnkTicketToContact/Attribute:contact_name+' => '',
|
||||
'Class:lnkTicketToContact/Attribute:contact_email' => 'Email',
|
||||
'Class:lnkTicketToContact/Attribute:contact_email+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ticket_ref' => 'Ticket #',
|
||||
'Class:lnkTicketToCI/Attribute:ticket_ref+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ci_name' => 'CI',
|
||||
'Class:lnkTicketToCI/Attribute:ci_name+' => '',
|
||||
'Class:lnkTicketToCI/Attribute:ci_status' => 'CI-Status',
|
||||
'Class:lnkTicketToCI/Attribute:ci_status+' => '',
|
||||
'Class:ResponseTicket' => 'Antwortticket',
|
||||
'Class:ResponseTicket+' => '',
|
||||
'Class:ResponseTicket/Attribute:status' => 'Status',
|
||||
'Class:ResponseTicket/Attribute:status+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:new' => 'Neu',
|
||||
'Class:ResponseTicket/Attribute:status/Value:new+' => 'Neu eröffnet',
|
||||
'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'Eskalation/TTO',
|
||||
'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:assigned' => 'Zugeteilt',
|
||||
'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'Eskalation/TTR',
|
||||
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Anstehend',
|
||||
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:resolved' => 'Gelöst',
|
||||
'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
|
||||
'Class:ResponseTicket/Attribute:status/Value:closed' => 'Geschlossen',
|
||||
'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
|
||||
'Class:ResponseTicket/Attribute:caller_id' => 'Melder',
|
||||
'Class:ResponseTicket/Attribute:caller_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:caller_email' => 'Email',
|
||||
'Class:ResponseTicket/Attribute:caller_email+' => '',
|
||||
'Class:ResponseTicket/Attribute:org_id' => 'Kunde',
|
||||
'Class:ResponseTicket/Attribute:org_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:org_name' => 'Kunde',
|
||||
'Class:ResponseTicket/Attribute:org_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:service_id' => 'Service',
|
||||
'Class:ResponseTicket/Attribute:service_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:service_name' => 'Name',
|
||||
'Class:ResponseTicket/Attribute:service_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'Service-Element',
|
||||
'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:servicesubcategory_name' => 'Name',
|
||||
'Class:ResponseTicket/Attribute:servicesubcategory_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:product' => 'Produkt',
|
||||
'Class:ResponseTicket/Attribute:product+' => '',
|
||||
'Class:ResponseTicket/Attribute:impact' => 'Auswirkung',
|
||||
'Class:ResponseTicket/Attribute:impact+' => '',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:1' => 'Eine Person',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:2' => 'Ein Service',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:3' => 'Eine Abteilung',
|
||||
'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
|
||||
'Class:ResponseTicket/Attribute:urgency' => 'Dringlichkeit',
|
||||
'Class:ResponseTicket/Attribute:urgency+' => '',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:1' => 'Niedrig',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:2' => 'Medium',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:3' => 'Hoch',
|
||||
'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
|
||||
'Class:ResponseTicket/Attribute:priority' => 'Priorität',
|
||||
'Class:ResponseTicket/Attribute:priority+' => '',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:1' => 'Niedrig',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:2' => 'Medium',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:3' => 'Hoch',
|
||||
'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
|
||||
'Class:ResponseTicket/Attribute:workgroup_id' => 'Arbeitsgruppe',
|
||||
'Class:ResponseTicket/Attribute:workgroup_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:workgroup_name' => 'Arbeitsgruppe',
|
||||
'Class:ResponseTicket/Attribute:workgroup_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:agent_id' => 'Bearbeiter',
|
||||
'Class:ResponseTicket/Attribute:agent_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:agent_name' => 'Bearbeiter',
|
||||
'Class:ResponseTicket/Attribute:agent_name+' => '',
|
||||
'Class:ResponseTicket/Attribute:agent_email' => 'Bearbeiter schreiben (Email)',
|
||||
'Class:ResponseTicket/Attribute:agent_email+' => '',
|
||||
'Class:ResponseTicket/Attribute:related_problem_id' => 'Dazugehöriges Problem',
|
||||
'Class:ResponseTicket/Attribute:related_problem_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:related_problem_ref' => 'Referenz',
|
||||
'Class:ResponseTicket/Attribute:related_problem_ref+' => '',
|
||||
'Class:ResponseTicket/Attribute:related_change_id' => 'Verbundene Changes',
|
||||
'Class:ResponseTicket/Attribute:related_change_id+' => '',
|
||||
'Class:ResponseTicket/Attribute:related_change_ref' => 'Verbundene Changes',
|
||||
'Class:ResponseTicket/Attribute:related_change_ref+' => '',
|
||||
'Class:ResponseTicket/Attribute:close_date' => 'Geschlossen',
|
||||
'Class:ResponseTicket/Attribute:close_date+' => '',
|
||||
'Class:ResponseTicket/Attribute:last_update' => 'Letzte Aktualisierung',
|
||||
'Class:ResponseTicket/Attribute:last_update+' => '',
|
||||
'Class:ResponseTicket/Attribute:assignment_date' => 'Zugeteilt',
|
||||
'Class:ResponseTicket/Attribute:assignment_date+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_date' => 'Lösungsdatum',
|
||||
'Class:ResponseTicket/Attribute:resolution_date+' => '',
|
||||
'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTO Eskaltionsfrist',
|
||||
'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '',
|
||||
'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTR Eskaltionsfrist',
|
||||
'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '',
|
||||
'Class:ResponseTicket/Attribute:closure_deadline' => 'Abschlussfrist',
|
||||
'Class:ResponseTicket/Attribute:closure_deadline+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code' => 'Code für Lösung',
|
||||
'Class:ResponseTicket/Attribute:resolution_code+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => 'Konnte nicht reproduziert werden',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'Duplikat eines bestehenden Tickets',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => 'Repariert',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => 'Irrelevant',
|
||||
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
|
||||
'Class:ResponseTicket/Attribute:solution' => 'Lösung',
|
||||
'Class:ResponseTicket/Attribute:solution+' => '',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction' => 'Benutzerzufriedenheit',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction+' => '',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => '1',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => '1',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => '2',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => '2',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => '3',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => '3',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => '4',
|
||||
'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => '4',
|
||||
'Class:ResponseTicket/Attribute:user_commment' => 'Benutzerkommentar',
|
||||
'Class:ResponseTicket/Attribute:user_commment+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_assign' => 'Zuweisen',
|
||||
'Class:ResponseTicket/Stimulus:ev_assign+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_reassign' => 'Neu zuweisen',
|
||||
'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_timeout' => 'ev-Timeout',
|
||||
'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_resolve' => 'Als gelöst markieren',
|
||||
'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
|
||||
'Class:ResponseTicket/Stimulus:ev_close' => 'Schließen',
|
||||
'Class:ResponseTicket/Stimulus:ev_close+' => '',
|
||||
));
|
||||
?>
|
||||
|
||||
@@ -51,11 +51,12 @@ class ItopWelcome extends ModuleHandlerAPI
|
||||
if (UserRights::IsAdministrator())
|
||||
{
|
||||
$oAdminMenu = new MenuGroup('AdminTools', 80 /* fRank */);
|
||||
new OQLMenuNode('UserAccountsMenu', 'SELECT User', $oAdminMenu->GetIndex(), 1 /* fRank */);
|
||||
new OQLMenuNode('UserAccountsMenu', 'SELECT User', $oAdminMenu->GetIndex(), 1 /* fRank */, true /* bSearch */);
|
||||
new OQLMenuNode('ProfilesMenu', 'SELECT URP_Profiles', $oAdminMenu->GetIndex(), 2 /* fRank */);
|
||||
new TemplateMenuNode('NotificationsMenu', APPROOT.'application/templates/notifications_menu.html', $oAdminMenu->GetIndex(), 3 /* fRank */);
|
||||
new OQLMenuNode('AuditCategories', 'SELECT AuditCategory', $oAdminMenu->GetIndex(), 4 /* fRank */);
|
||||
new WebPageMenuNode('RunQueriesMenu', utils::GetAbsoluteUrlAppRoot().'pages/run_query.php', $oAdminMenu->GetIndex(), 8 /* fRank */);
|
||||
new OQLMenuNode('QueryMenu', 'SELECT Query', $oAdminMenu->GetIndex(), 8.5 /* fRank */);
|
||||
new WebPageMenuNode('ExportMenu', utils::GetAbsoluteUrlAppRoot().'webservices/export.php', $oAdminMenu->GetIndex(), 9 /* fRank */);
|
||||
new WebPageMenuNode('DataModelMenu', utils::GetAbsoluteUrlAppRoot().'pages/schema.php', $oAdminMenu->GetIndex(), 10 /* fRank */);
|
||||
new WebPageMenuNode('UniversalSearchMenu', utils::GetAbsoluteUrlAppRoot().'pages/UniversalSearch.php', $oAdminMenu->GetIndex(), 11 /* fRank */);
|
||||
@@ -63,24 +64,4 @@ class ItopWelcome extends ModuleHandlerAPI
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Direct end-users to the standard Portal application
|
||||
*/
|
||||
class MyPortalURLMaker implements iDBObjectURLMaker
|
||||
{
|
||||
public static function MakeObjectURL($sClass, $iId)
|
||||
{
|
||||
switch($sClass)
|
||||
{
|
||||
case 'UserRequest':
|
||||
$sAbsoluteUrl = utils::GetAbsoluteUrlAppRoot();
|
||||
$sUrl = "{$sAbsoluteUrl}portal/index.php?operation=details&class=$sClass&id=$iId";
|
||||
return $sUrl;
|
||||
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
import fl.controls.Slider;
|
||||
import fl.events.SliderEvent;
|
||||
import fl.controls.Label;
|
||||
// For callbacks from Javascript
|
||||
import flash.external.ExternalInterface;
|
||||
|
||||
// The main canvas
|
||||
public class Navigator extends MovieClip
|
||||
@@ -26,6 +28,7 @@
|
||||
protected var m_sRelation:String;
|
||||
protected var m_sObjClass:String;
|
||||
protected var m_sObjId:String;
|
||||
protected var m_sExclude:String;
|
||||
|
||||
// Constants
|
||||
protected var m_RADIUS = 150;
|
||||
@@ -43,14 +46,60 @@
|
||||
{
|
||||
m_aLinks = new Array();
|
||||
m_aNodes = new Array();
|
||||
m_sExclude = '';
|
||||
m_fZoom = 1;
|
||||
initParameters();
|
||||
doLoadData();
|
||||
var success = true;
|
||||
if (ExternalInterface.available)
|
||||
{
|
||||
//Security.allowDomain(loader.contentLoaderInfo.url);
|
||||
//the addCallback registers a function to be called from javascript, and this is what you wanted to do:
|
||||
try
|
||||
{
|
||||
ExternalInterface.addCallback("Filter", DoFilter);
|
||||
}
|
||||
catch(err)
|
||||
{
|
||||
m_sTitle.text = 'E: '+err.description;
|
||||
success = false
|
||||
}
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
//m_sTitle.text = 'Ok...';
|
||||
doLoadData();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_sTitle.text = 'Failed to addCallback';
|
||||
}
|
||||
|
||||
addEventListener(Event.ENTER_FRAME, initGraphics);
|
||||
//Stop scaling the flash content
|
||||
stage.scaleMode = StageScaleMode.NO_SCALE;
|
||||
}
|
||||
|
||||
function Reset()
|
||||
{
|
||||
m_aLinks = new Array();
|
||||
for (var i:String in m_aNodes)
|
||||
{
|
||||
m_oCanvas.removeChild(m_aNodes[i]);
|
||||
}
|
||||
m_aNodes = new Array();
|
||||
removeEventListener(Event.ENTER_FRAME, drawLines);
|
||||
stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown)
|
||||
stage.removeEventListener(MouseEvent.MOUSE_UP, mouseReleased);
|
||||
}
|
||||
|
||||
function DoFilter(sExcludeList:String):void
|
||||
{
|
||||
//do something
|
||||
m_sExclude = sExcludeList;
|
||||
doLoadData();
|
||||
}
|
||||
|
||||
protected function initParameters():void
|
||||
{
|
||||
|
||||
@@ -70,6 +119,8 @@
|
||||
m_oCanvas.scaleY = m_fZoom;
|
||||
// Handle listeners...
|
||||
removeEventListener(Event.ENTER_FRAME,initGraphics);
|
||||
m_oZoomSlider.value = 100;
|
||||
m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange);
|
||||
}
|
||||
function mouseDown(event:MouseEvent):void
|
||||
{
|
||||
@@ -99,19 +150,22 @@
|
||||
m_oCanvas.scaleX = m_fZoom;
|
||||
m_oCanvas.scaleY = m_fZoom;
|
||||
}
|
||||
function GetZommLevel()
|
||||
function GetZoomLevel()
|
||||
{
|
||||
return m_fZoom;
|
||||
}
|
||||
|
||||
function doLoadData()
|
||||
{
|
||||
m_sTitle.text = "Loading...";
|
||||
m_oPreloader.visible = true;
|
||||
m_oZoomSlider.enabled = true;
|
||||
var sSeparator:String = '?';
|
||||
if (m_sDataUrl.indexOf(sSeparator) != -1)
|
||||
{
|
||||
sSeparator = '&';
|
||||
}
|
||||
var myString:String = m_sDataUrl+sSeparator+'relation='+m_sRelation+'&class='+m_sObjClass+'&id='+m_sObjId;
|
||||
var myString:String = m_sDataUrl+sSeparator+'relation='+m_sRelation+'&class='+m_sObjClass+'&id='+m_sObjId+'&exclude='+m_sExclude;
|
||||
trace("Requesting:"+myString);
|
||||
var myXMLURL:URLRequest = new URLRequest(myString);
|
||||
m_oLoader = new URLLoader();
|
||||
@@ -125,6 +179,7 @@
|
||||
{
|
||||
try
|
||||
{
|
||||
Reset();
|
||||
var myXML:XML = XML(m_oLoader.data);
|
||||
//trace("Data loaded." + myXML);
|
||||
//trace("===========================");
|
||||
@@ -132,8 +187,6 @@
|
||||
m_sTitle.text = decodeEntities(myXML.attribute("title").toString());
|
||||
m_oZoomSlider.enabled = true;
|
||||
addEventListener(Event.ENTER_FRAME, drawLines);
|
||||
m_oZoomSlider.value = 100;
|
||||
m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange);
|
||||
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown)
|
||||
stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
|
||||
//trace('======= Initial Posistions =========');
|
||||
@@ -155,8 +208,7 @@
|
||||
{
|
||||
if (m_oPreloader != null)
|
||||
{
|
||||
removeChild(m_oPreloader);
|
||||
m_oPreloader = null;
|
||||
m_oPreloader.visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -165,8 +217,7 @@
|
||||
{
|
||||
if (m_oPreloader != null)
|
||||
{
|
||||
removeChild(m_oPreloader);
|
||||
m_oPreloader = null;
|
||||
m_oPreloader.visible = false;
|
||||
}
|
||||
m_sTitle.text = "I/O Error: unable to load the graph data ("+event+")";
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
100
pages/UI.php
100
pages/UI.php
@@ -393,6 +393,7 @@ function ApplyNextAction(Webpage $oP, CMDBObject $oObj, $sNextAction, $oMyChange
|
||||
}
|
||||
$oObj->DBUpdateTracked($oMyChange);
|
||||
}
|
||||
$oObj->Reload();
|
||||
$oObj->DisplayDetails($oP);
|
||||
}
|
||||
else
|
||||
@@ -842,7 +843,7 @@ try
|
||||
$currValue = $oObj->Get($sAttCode);
|
||||
if ($oAttDef instanceof AttributeCaseLog)
|
||||
{
|
||||
$currValue = '';
|
||||
$currValue = ' '; // Don't put an empty string, in case the field would be considered as mandatory...
|
||||
}
|
||||
if (is_object($currValue)) continue; // Skip non scalar values...
|
||||
if(!array_key_exists($currValue, $aValues[$sAttCode]))
|
||||
@@ -935,6 +936,7 @@ try
|
||||
}
|
||||
}
|
||||
$sTip .= "</ul></p>";
|
||||
$sTip = addslashes($sTip);
|
||||
$sReadyScript .= "$('#multi_values_$sAttCode').qtip( { content: '$sTip', show: 'mouseover', hide: 'mouseout', style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );";
|
||||
|
||||
$oDummyObj->Set($sAttCode, null);
|
||||
@@ -1578,12 +1580,7 @@ EOF
|
||||
{
|
||||
$sDisplayValue = empty($aVal['display']) ? '<i>'.Dict::S('Enum:Undefined').'</i>' : str_replace(array("\n", "\r"), " ", $aVal['display']);
|
||||
$sTip .= "<li>".Dict::Format('UI:BulkModify:Value_Exists_N_Times', $sDisplayValue, $aVal['count'])."</li>";
|
||||
$index++;
|
||||
if ($iMaxCount == $index)
|
||||
{
|
||||
$sTip .= "<li>".(count($aMultiValues) - $iMaxCount)." more different values...</li>";
|
||||
break;
|
||||
}
|
||||
$index++;
|
||||
if ($iMaxCount == $index)
|
||||
{
|
||||
$sTip .= "<li>".Dict::Format('UI:BulkModify:N_MoreValues', count($aValues[$sAttCode]) - $iMaxCount)."</li>";
|
||||
@@ -1591,6 +1588,7 @@ EOF
|
||||
}
|
||||
}
|
||||
$sTip .= "</ul></p>";
|
||||
$sTip = addslashes($sTip);
|
||||
$sReadyScript .= "$('#multi_values_$sAttCode').qtip( { content: '$sTip', show: 'mouseover', hide: 'mouseout', style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );\n";
|
||||
$sComments .= '<div class="multi_values" id="multi_values_'.$sAttCode.'">'.count($aValues[$sAttCode]).'</div>';
|
||||
}
|
||||
@@ -2011,6 +2009,7 @@ EOF
|
||||
$oP->p(implode('</p><p>', $aErrors));
|
||||
}
|
||||
}
|
||||
$oObj->Reload();
|
||||
$oObj->DisplayDetails($oP);
|
||||
}
|
||||
else
|
||||
@@ -2030,25 +2029,100 @@ EOF
|
||||
$oP->AddTabContainer('Navigator');
|
||||
$oP->SetCurrentTabContainer('Navigator');
|
||||
$oP->SetCurrentTab(Dict::S('UI:RelationshipGraph'));
|
||||
|
||||
$oP->add("<div id=\"ds_flash\" class=\"SearchDrawer\">\n");
|
||||
$oP->add_ready_script(
|
||||
<<<EOF
|
||||
$("#dh_flash").click( function() {
|
||||
$("#ds_flash").slideToggle('normal', function() { $("#ds_flash").parent().resize(); } );
|
||||
$("#dh_flash").toggleClass('open');
|
||||
});
|
||||
EOF
|
||||
);
|
||||
$aResults = array();
|
||||
$aSortedElements = array();
|
||||
$oObj = MetaModel::GetObject($sClass, $id);
|
||||
$oObj->GetRelatedObjects($sRelation, 20 /* iMaxDepth */, $aResults);
|
||||
foreach($aResults as $sClassIdx => $aObjects)
|
||||
{
|
||||
foreach($aObjects as $oCurrObj)
|
||||
{
|
||||
$sSubClass = get_class($oCurrObj);
|
||||
$aSortedElements[$sSubClass] = MetaModel::GetName($sSubClass);
|
||||
}
|
||||
}
|
||||
|
||||
asort($aSortedElements);
|
||||
$idx = 0;
|
||||
foreach($aSortedElements as $sSubClass => $sClassName)
|
||||
{
|
||||
$oP->add("<span style=\"padding-right:2em; white-space:nowrap;\"><input type=\"checkbox\" id=\"exclude_$idx\" name=\"excluded[]\" value=\"$sSubClass\" checked onChange=\"DoReload()\"><label for=\"exclude_$idx\"> ".MetaModel::GetClassIcon($sSubClass)." $sClassName</label></span> ");
|
||||
$idx++;
|
||||
}
|
||||
$oP->add("</div>\n");
|
||||
$oP->add("<div class=\"HRDrawer\"></div>\n");
|
||||
$oP->add("<div id=\"dh_flash\" class=\"DrawerHandle\">".Dict::S('UI:ElementsDisplayed')."</div>\n");
|
||||
|
||||
$width = 1000;
|
||||
$height = 700;
|
||||
$sDrillUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=details&'.$oAppContext->GetForLink();
|
||||
$sParams = "pWidth=$width&pHeight=$height&drillUrl=".urlencode($sDrillUrl)."&displayController=false&xmlUrl=".urlencode("./xml.navigator.php")."&obj_class=$sClass&obj_id=$id&relation=$sRelation";
|
||||
|
||||
$oP->add("<div style=\"z-index:1;background:white\"><object style=\"z-index:2\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0\" width=\"$width\" height=\"$height\" id=\"navigator\" align=\"middle\">
|
||||
<param name=\"allowScriptAccess\" value=\"sameDomain\" />
|
||||
$oP->add("<div style=\"z-index:1;background:white;width:100%;height:{$height}px\"><object style=\"z-index:2\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0\" width=\"100%\" height=\"$height\" id=\"navigator\" align=\"middle\">
|
||||
<param name=\"allowScriptAccess\" value=\"always\" />
|
||||
<param name=\"allowFullScreen\" value=\"false\" />
|
||||
<param name=\"FlashVars\" value=\"$sParams\" />
|
||||
<param name=\"wmode\" value=\"transparent\">
|
||||
<param name=\"movie\" value=\"../navigator/navigator.swf\" /><param name=\"quality\" value=\"high\" /><param name=\"bgcolor\" value=\"#ffffff\" />
|
||||
<embed src=\"../navigator/navigator.swf\" wmode=\"transparent\" flashVars=\"$sParams\" quality=\"high\" bgcolor=\"#ffffff\" width=\"$width\" height=\"$height\" name=\"navigator\" align=\"middle\" allowScriptAccess=\"sameDomain\" allowFullScreen=\"false\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.adobe.com/go/getflashplayer\" />
|
||||
<embed src=\"../navigator/navigator.swf\" wmode=\"transparent\" flashVars=\"$sParams\" quality=\"high\" bgcolor=\"#ffffff\" width=\"100%\" height=\"$height\" name=\"navigator\" align=\"middle\" swliveconnect=\"true\" allowScriptAccess=\"always\" allowFullScreen=\"false\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.adobe.com/go/getflashplayer\" />
|
||||
</object></div>\n");
|
||||
$oP->SetCurrentTab(Dict::S('UI:RelationshipList'));
|
||||
$oP->add("<div id=\"impacted_objects\" style=\"width:100%;background-color:#fff;padding:10px;\"><p style=\"height:150px;\"> </p></div>");
|
||||
$oP->add_script(
|
||||
<<<EOF
|
||||
function getFlashMovieObject(movieName)
|
||||
{
|
||||
if (window.document[movieName])
|
||||
{
|
||||
return window.document[movieName];
|
||||
}
|
||||
if (navigator.appName.indexOf("Microsoft Internet")==-1)
|
||||
{
|
||||
if (document.embeds && document.embeds[movieName])
|
||||
return document.embeds[movieName];
|
||||
}
|
||||
else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
|
||||
{
|
||||
return document.getElementById(movieName);
|
||||
}
|
||||
}
|
||||
|
||||
function DoReload()
|
||||
{
|
||||
var oMovie = getFlashMovieObject('navigator');
|
||||
try
|
||||
{
|
||||
var aExcluded = [];
|
||||
$('input[name^=excluded]').each( function() {
|
||||
if (!$(this).attr('checked'))
|
||||
{
|
||||
aExcluded.push($(this).val());
|
||||
}
|
||||
} );
|
||||
oMovie.Filter(aExcluded.join(','));
|
||||
//oMovie.SetVariable("/:message", "foo");
|
||||
}
|
||||
catch(err)
|
||||
{
|
||||
alert(err);
|
||||
}
|
||||
}
|
||||
EOF
|
||||
);
|
||||
$oP->add_ready_script(
|
||||
<<<EOF
|
||||
var ajax_request = null;
|
||||
|
||||
|
||||
function UpdateImpactedObjects(sClass, iId, sRelation)
|
||||
{
|
||||
var class_name = sClass; //$('select[name=class_name]').val();
|
||||
@@ -2070,8 +2144,6 @@ EOF
|
||||
$('#impacted_objects').empty();
|
||||
$('#impacted_objects').append(data);
|
||||
$('#impacted_objects').unblock();
|
||||
$('#impacted_objects .listResults').tablesorter( { widgets: ['myZebra', 'truncatedList']} ); // sortable and zebra tables
|
||||
$('#impacted_objects table.listResults').tableHover(); // hover tables
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -2188,4 +2260,4 @@ catch(Exception $e)
|
||||
IssueLog::Error($e->getMessage());
|
||||
}
|
||||
}
|
||||
?>
|
||||
?>
|
||||
@@ -347,6 +347,7 @@ try
|
||||
$aMoreReconciliationKeys = array(); // Store: key => void to automatically remove duplicates
|
||||
foreach($aReconciliationKeys as $sAttCode)
|
||||
{
|
||||
if (!MetaModel::IsValidAttCode($sClassName, $sAttCode)) continue;
|
||||
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
|
||||
if ($oAttDef->IsExternalKey())
|
||||
{
|
||||
@@ -403,7 +404,7 @@ EOF
|
||||
}
|
||||
else
|
||||
{
|
||||
$oPage = new ajax_page("");
|
||||
$oPage = new ajax_page("Class $sClassName is not a valid class !");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -73,7 +73,6 @@ try
|
||||
$sSelectMode = utils::ReadParam('select_mode', '');
|
||||
$bDisplayKey = utils::ReadParam('display_key', 'true') == 'true';
|
||||
$aList = utils::ReadParam('display_list', array());
|
||||
|
||||
$sClassName = $oFilter->GetClass();
|
||||
//$aList = cmdbAbstractObject::FlattenZList(MetaModel::GetZListItems($sClassName, 'list'));
|
||||
|
||||
@@ -169,6 +168,28 @@ try
|
||||
}
|
||||
break;
|
||||
|
||||
// ui.linkswidget
|
||||
case 'addObjects':
|
||||
$oPage->SetContentType('text/html');
|
||||
$sAttCode = utils::ReadParam('sAttCode', '');
|
||||
$iInputId = utils::ReadParam('iInputId', '');
|
||||
$sSuffix = utils::ReadParam('sSuffix', '');
|
||||
$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
|
||||
$sJson = utils::ReadParam('json', '', false, 'raw_data');
|
||||
if (!empty($sJson))
|
||||
{
|
||||
$oWizardHelper = WizardHelper::FromJSON($sJson);
|
||||
$oObj = $oWizardHelper->GetTargetObject();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Search form: no current object
|
||||
$oObj = null;
|
||||
}
|
||||
$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
|
||||
$oWidget->GetObjectPickerDialog($oPage, $oObj);
|
||||
break;
|
||||
|
||||
// ui.linkswidget
|
||||
case 'searchObjectsToAdd':
|
||||
$oPage->SetContentType('text/html');
|
||||
@@ -192,6 +213,7 @@ try
|
||||
$sRemoteClass = utils::ReadParam('sRemoteClass', '', false, 'class');
|
||||
$sFilter = utils::ReadParam('sFilter', '', false, 'raw_data');
|
||||
$sJson = utils::ReadParam('json', '', false, 'raw_data');
|
||||
$sAttCode = utils::ReadParam('sAttCode', '');
|
||||
if (!empty($sJson))
|
||||
{
|
||||
$oWizardHelper = WizardHelper::FromJSON($sJson);
|
||||
@@ -202,7 +224,7 @@ try
|
||||
// Search form: no current object
|
||||
$oObj = null;
|
||||
}
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
|
||||
$oWidget->SearchObjectsToSelect($oPage, $sFilter, $sRemoteClass, $oObj);
|
||||
break;
|
||||
|
||||
@@ -233,16 +255,40 @@ try
|
||||
$sTargetClass = utils::ReadParam('sTargetClass', '', false, 'class');
|
||||
$iInputId = utils::ReadParam('iInputId', '');
|
||||
$sTitle = utils::ReadParam('sTitle', '', false, 'raw_data');
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
|
||||
$oWidget->GetSearchDialog($oPage, $sTitle);
|
||||
$sAttCode = utils::ReadParam('sAttCode', '');
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
|
||||
$sJson = utils::ReadParam('json', '', false, 'raw_data');
|
||||
if (!empty($sJson))
|
||||
{
|
||||
$oWizardHelper = WizardHelper::FromJSON($sJson);
|
||||
$oObj = $oWizardHelper->GetTargetObject();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Search form: no current object
|
||||
$oObj = null;
|
||||
}
|
||||
$oWidget->GetSearchDialog($oPage, $sTitle, $oObj);
|
||||
break;
|
||||
|
||||
// ui.extkeywidget
|
||||
case 'objectCreationForm':
|
||||
$sTargetClass = utils::ReadParam('sTargetClass', '', false, 'class');
|
||||
$iInputId = utils::ReadParam('iInputId', '');
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
|
||||
$oWidget->GetObjectCreationForm($oPage);
|
||||
$sAttCode = utils::ReadParam('sAttCode', '');
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
|
||||
$sJson = utils::ReadParam('json', '', false, 'raw_data');
|
||||
if (!empty($sJson))
|
||||
{
|
||||
$oWizardHelper = WizardHelper::FromJSON($sJson);
|
||||
$oObj = $oWizardHelper->GetTargetObject();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Search form: no current object
|
||||
$oObj = null;
|
||||
}
|
||||
$oWidget->GetObjectCreationForm($oPage, $oObj);
|
||||
break;
|
||||
|
||||
// ui.extkeywidget
|
||||
@@ -250,7 +296,8 @@ try
|
||||
$sTargetClass = utils::ReadParam('sTargetClass', '', false, 'class');
|
||||
$iInputId = utils::ReadParam('iInputId', '');
|
||||
$sFormPrefix = utils::ReadParam('sFormPrefix', '');
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId);
|
||||
$sAttCode = utils::ReadParam('sAttCode', '');
|
||||
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode);
|
||||
$aResult = $oWidget->DoCreateObject($oPage);
|
||||
echo json_encode($aResult);
|
||||
break;
|
||||
@@ -297,6 +344,9 @@ try
|
||||
$sSuffix = utils::ReadParam('sSuffix', '');
|
||||
$sRemoteClass = utils::ReadParam('sRemoteClass', $sClass, false, 'class');
|
||||
$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
|
||||
$sJson = utils::ReadParam('json', '', false, 'raw_data');
|
||||
$oWizardHelper = WizardHelper::FromJSON($sJson);
|
||||
$oObj = $oWizardHelper->GetTargetObject();
|
||||
$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
|
||||
if ($sFilter != '')
|
||||
{
|
||||
@@ -306,7 +356,7 @@ try
|
||||
{
|
||||
$oFullSetFilter = new DBObjectSearch($sRemoteClass);
|
||||
}
|
||||
$oWidget->DoAddObjects($oPage, $oFullSetFilter);
|
||||
$oWidget->DoAddObjects($oPage, $oFullSetFilter, $oObj);
|
||||
break;
|
||||
|
||||
case 'wizard_helper_preview':
|
||||
@@ -392,6 +442,18 @@ try
|
||||
{
|
||||
$aExtraParams = json_decode(str_replace("'", '"', $sExtraParams), true /* associative array */);
|
||||
}
|
||||
// Restore the app context from the ExtraParams
|
||||
$oAppContext = new ApplicationContext(false); // false => don't read the context yet !
|
||||
$aContext = array();
|
||||
foreach($oAppContext->GetNames() as $sName)
|
||||
{
|
||||
$sParamName = 'c['.$sName.']';
|
||||
if (isset($aExtraParams[$sParamName]))
|
||||
{
|
||||
$aContext[$sName] = $aExtraParams[$sParamName];
|
||||
}
|
||||
}
|
||||
$_REQUEST['c'] = $aContext;
|
||||
if ($sEncoding == 'oql')
|
||||
{
|
||||
$oFilter = CMDBSearchFilter::FromOQL($sFilter);
|
||||
|
||||
142
pages/audit.php
142
pages/audit.php
@@ -83,7 +83,7 @@ function FilterByContext(DBObjectSearch &$oFilter, ApplicationContext $oAppConte
|
||||
}
|
||||
}
|
||||
|
||||
function GetRuleResultSet($iRuleId, $oDefinitionFilter, $oAppContext)
|
||||
function GetRuleResultFilter($iRuleId, $oDefinitionFilter, $oAppContext)
|
||||
{
|
||||
$oRule = MetaModel::GetObject('AuditRule', $iRuleId);
|
||||
$sOql = $oRule->Get('query');
|
||||
@@ -95,23 +95,36 @@ function GetRuleResultSet($iRuleId, $oDefinitionFilter, $oAppContext)
|
||||
// The query returns directly the invalid elements
|
||||
$oFilter = $oRuleFilter;
|
||||
$oFilter->MergeWith($oDefinitionFilter);
|
||||
$oErrorObjectSet = new CMDBObjectSet($oFilter);
|
||||
}
|
||||
else
|
||||
{
|
||||
// The query returns only the valid elements, all the others are invalid
|
||||
$oFilter = $oRuleFilter;
|
||||
$oErrorObjectSet = new CMDBObjectSet($oFilter);
|
||||
$aValidIds = array(0); // Make sure that we have at least one value in the list
|
||||
while($oObj = $oErrorObjectSet->Fetch())
|
||||
$aValidRows = $oRuleFilter->ToDataArray(array('id'));
|
||||
$aValidIds = array();
|
||||
foreach($aValidRows as $aRow)
|
||||
{
|
||||
$aValidIds[] = $oObj->GetKey();
|
||||
$aValidIds[] = $aRow['id'];
|
||||
}
|
||||
$oFilter = clone $oDefinitionFilter;
|
||||
$oFilter->AddCondition('id', $aValidIds, 'NOTIN');
|
||||
$oErrorObjectSet = new CMDBObjectSet($oFilter);
|
||||
if (count($aValidIds) > 0)
|
||||
{
|
||||
$aInDefSet = array();
|
||||
foreach($oDefinitionFilter->ToDataArray(array('id')) as $aRow)
|
||||
{
|
||||
$aInDefSet[] = $aRow['id'];
|
||||
}
|
||||
$aInvalids = array_diff($aInDefSet, $aValidIds);
|
||||
if (count($aInvalids) > 0)
|
||||
{
|
||||
$oFilter->AddCondition('id', $aInvalids, 'IN');
|
||||
}
|
||||
else
|
||||
{
|
||||
$oFilter->AddCondition('id', 0, '=');
|
||||
}
|
||||
}
|
||||
}
|
||||
return $oErrorObjectSet;
|
||||
return $oFilter;
|
||||
}
|
||||
|
||||
function GetReportColor($iTotal, $iErrors)
|
||||
@@ -153,7 +166,8 @@ try
|
||||
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
|
||||
FilterByContext($oDefinitionFilter, $oAppContext);
|
||||
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
|
||||
$oErrorObjectSet = GetRuleResultSet($iRuleIndex, $oDefinitionFilter, $oAppContext);
|
||||
$oFilter = GetRuleResultFilter($iRuleIndex, $oDefinitionFilter, $oAppContext);
|
||||
$oErrorObjectSet = new CMDBObjectSet($oFilter);
|
||||
$oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex);
|
||||
$oP->add('<div class="page_header"><h1>Audit Errors: <span class="hilite">'.$oAuditRule->Get('description').'</span></h1><img style="margin-top: -20px; margin-right: 10px; float: right;" src="../images/stop.png"/></div>');
|
||||
$oP->p('<a href="./audit.php?'.$oAppContext->GetForLink().'">[Back to audit results]</a>');
|
||||
@@ -177,52 +191,77 @@ try
|
||||
$oP->add("</tr>\n");
|
||||
while($oAuditCategory = $oCategoriesSet->fetch())
|
||||
{
|
||||
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
|
||||
FilterByContext($oDefinitionFilter, $oAppContext);
|
||||
|
||||
$aObjectsWithErrors = array();
|
||||
if (!empty($currentOrganization))
|
||||
try
|
||||
{
|
||||
if (MetaModel::IsValidFilterCode($oDefinitionFilter->GetClass(), 'org_id'))
|
||||
$oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
|
||||
FilterByContext($oDefinitionFilter, $oAppContext);
|
||||
|
||||
$aObjectsWithErrors = array();
|
||||
if (!empty($currentOrganization))
|
||||
{
|
||||
$oDefinitionFilter->AddCondition('org_id', $currentOrganization, '=');
|
||||
if (MetaModel::IsValidFilterCode($oDefinitionFilter->GetClass(), 'org_id'))
|
||||
{
|
||||
$oDefinitionFilter->AddCondition('org_id', $currentOrganization, '=');
|
||||
}
|
||||
}
|
||||
$aResults = array();
|
||||
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
|
||||
$iCount = $oDefinitionSet->Count();
|
||||
$oRulesFilter = new CMDBSearchFilter('AuditRule');
|
||||
$oRulesFilter->AddCondition('category_id', $oAuditCategory->GetKey(), '=');
|
||||
$oRulesSet = new DBObjectSet($oRulesFilter);
|
||||
while($oAuditRule = $oRulesSet->fetch() )
|
||||
{
|
||||
$aRow = array();
|
||||
$aRow['description'] = $oAuditRule->GetName();
|
||||
if ($iCount == 0)
|
||||
{
|
||||
// nothing to check, really !
|
||||
$aRow['nb_errors'] = "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."\">0</a>";
|
||||
$aRow['percent_ok'] = '100.00';
|
||||
$aRow['class'] = GetReportColor($iCount, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
$oFilter = GetRuleResultFilter($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext);
|
||||
$aErrors = $oFilter->ToDataArray(array('id'));
|
||||
$iErrorsCount = count($aErrors);
|
||||
foreach($aErrors as $aErrorRow)
|
||||
{
|
||||
$aObjectsWithErrors[$aErrorRow['id']] = true;
|
||||
}
|
||||
$aRow['nb_errors'] = ($iErrorsCount == 0) ? '0' : "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">$iErrorsCount</a>";
|
||||
$aRow['percent_ok'] = sprintf('%.2f', 100.0 * (($iCount - $iErrorsCount) / $iCount));
|
||||
$aRow['class'] = GetReportColor($iCount, $iErrorsCount);
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$aRow['nb_errors'] = "OQL Error";
|
||||
$aRow['percent_ok'] = 'n/a';
|
||||
$aRow['class'] = 'red';
|
||||
$sMessage = Dict::Format('UI:Audit:ErrorIn_Rule_Reason', $oAuditRule->GetHyperlink(), $e->getMessage());
|
||||
$oP->p("<img style=\"vertical-align:middle\" src=\"../images/stop-mid.png\"/> ".$sMessage);
|
||||
}
|
||||
}
|
||||
$aResults[] = $aRow;
|
||||
$iTotalErrors = count($aObjectsWithErrors);
|
||||
$sOverallPercentOk = ($iCount == 0) ? '100.00' : sprintf('%.2f', 100.0 * (($iCount - $iTotalErrors) / $iCount));
|
||||
$sClass = GetReportColor($iCount, $iTotalErrors);
|
||||
|
||||
}
|
||||
}
|
||||
$aResults = array();
|
||||
$oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
|
||||
$iCount = $oDefinitionSet->Count();
|
||||
$oRulesFilter = new CMDBSearchFilter('AuditRule');
|
||||
$oRulesFilter->AddCondition('category_id', $oAuditCategory->GetKey(), '=');
|
||||
$oRulesSet = new DBObjectSet($oRulesFilter);
|
||||
while($oAuditRule = $oRulesSet->fetch() )
|
||||
catch(Exception $e)
|
||||
{
|
||||
$aRow = array();
|
||||
$aRow['description'] = $oAuditRule->GetName();
|
||||
if ($iCount == 0)
|
||||
{
|
||||
// nothing to check, really !
|
||||
$aRow['nb_errors'] = "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."\">0</a>";
|
||||
$aRow['percent_ok'] = '100.00';
|
||||
$aRow['class'] = GetReportColor($iCount, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oRuleFilter = DBObjectSearch::FromOQL($oAuditRule->Get('query'));
|
||||
$oErrorObjectSet = GetRuleResultSet($oAuditRule->GetKey(), $oDefinitionFilter, $oAppContext);
|
||||
$iErrorsCount = $oErrorObjectSet->Count();
|
||||
while($oObj = $oErrorObjectSet->Fetch())
|
||||
{
|
||||
$aObjectsWithErrors[$oObj->GetKey()] = true;
|
||||
}
|
||||
$aRow['nb_errors'] = ($iErrorsCount == 0) ? '0' : "<a href=\"?operation=errors&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey()."&".$oAppContext->GetForLink()."\">$iErrorsCount</a>";
|
||||
$aRow['percent_ok'] = sprintf('%.2f', 100.0 * (($iCount - $iErrorsCount) / $iCount));
|
||||
$aRow['class'] = GetReportColor($iCount, $iErrorsCount);
|
||||
}
|
||||
$aResults[] = $aRow;
|
||||
$iTotalErrors = count($aObjectsWithErrors);
|
||||
$sOverallPercentOk = ($iCount == 0) ? '100.00' : sprintf('%.2f', 100.0 * (($iCount - $iTotalErrors) / $iCount));
|
||||
$sClass = GetReportColor($iCount, $iTotalErrors);
|
||||
|
||||
$aRow['description'] = "OQL error";
|
||||
$aRow['nb_errors'] = "n/a";
|
||||
$aRow['percent_ok'] = '';
|
||||
$aRow['class'] = 'red';
|
||||
$sMessage = Dict::Format('UI:Audit:ErrorIn_Category_Reason', $oAuditCategory->GetHyperlink(), $e->getMessage());
|
||||
$oP->p("<img style=\"vertical-align:middle\" src=\"../images/stop-mid.png\"/> ".$sMessage);
|
||||
$aResults[] = $aRow;
|
||||
}
|
||||
$oP->add("<tr>\n");
|
||||
$oP->add("<th><img src=\"../images/minus.gif\"></th><th class=\"alignLeft\">".$oAuditCategory->GetName()."</th><th class=\"alignRight\">$iCount</th><th class=\"alignRight\">$iTotalErrors</th><th class=\"alignRight $sClass\">$sOverallPercentOk %</th>\n");
|
||||
@@ -238,7 +277,6 @@ try
|
||||
$oP->add("</td></tr>\n");
|
||||
$oP->add("</table>\n");
|
||||
}
|
||||
|
||||
$oP->output();
|
||||
}
|
||||
catch(CoreException $e)
|
||||
|
||||
@@ -120,34 +120,80 @@ try
|
||||
// leave $sExpression as is
|
||||
}
|
||||
|
||||
$oFilter = null;
|
||||
$aArgs = array();
|
||||
$sSyntaxError = null;
|
||||
|
||||
if (!empty($sExpression))
|
||||
{
|
||||
try
|
||||
{
|
||||
$oFilter = DBObjectSearch::FromOQL($sExpression);
|
||||
}
|
||||
catch(OqlException $e)
|
||||
{
|
||||
$sSyntaxError = $e->getHtmlDesc();
|
||||
}
|
||||
|
||||
if ($oFilter)
|
||||
{
|
||||
$aArgs = array();
|
||||
foreach($oFilter->GetQueryParams() as $sParam => $foo)
|
||||
{
|
||||
$value = utils::ReadParam('arg_'.$sParam, null, true, 'raw_data');
|
||||
if (!is_null($value))
|
||||
{
|
||||
$aArgs[$sParam] = $value;
|
||||
}
|
||||
else
|
||||
{
|
||||
$aArgs[$sParam] = '';
|
||||
}
|
||||
}
|
||||
$oFilter->SetInternalParams($aArgs);
|
||||
}
|
||||
elseif ($sSyntaxError)
|
||||
{
|
||||
// Query arguments taken from the page args
|
||||
}
|
||||
}
|
||||
|
||||
$oP->add("<form method=\"get\">\n");
|
||||
$oP->add(Dict::S('UI:RunQuery:ExpressionToEvaluate')."<br/>\n");
|
||||
$oP->add("<textarea cols=\"120\" rows=\"8\" name=\"expression\">$sExpression</textarea>\n");
|
||||
|
||||
if (count($aArgs) > 0)
|
||||
{
|
||||
$oP->add("<div class=\"wizContainer\">\n");
|
||||
$oP->add("<h3>Query arguments</h3>\n");
|
||||
foreach($aArgs as $sParam => $sValue)
|
||||
{
|
||||
$oP->p("$sParam: <input type=\"string\" name=\"arg_$sParam\" value=\"$sValue\">\n");
|
||||
}
|
||||
$oP->add("</div>\n");
|
||||
}
|
||||
|
||||
$oP->add("<input type=\"submit\" value=\"".Dict::S('UI:Button:Evaluate')."\">\n");
|
||||
$oP->add($oAppContext->GetForForm());
|
||||
$oP->add("</form>\n");
|
||||
|
||||
if (!empty($sExpression))
|
||||
if ($oFilter)
|
||||
{
|
||||
$oFilter = DBObjectSearch::FromOQL($sExpression);
|
||||
if ($oFilter)
|
||||
{
|
||||
$oP->add("<h3>Query results</h3>\n");
|
||||
|
||||
$oResultBlock = new DisplayBlock($oFilter, 'list', false);
|
||||
$oResultBlock->Display($oP, 'runquery');
|
||||
$oP->add("<h3>Query results</h3>\n");
|
||||
|
||||
$oResultBlock = new DisplayBlock($oFilter, 'list', false);
|
||||
$oResultBlock->Display($oP, 'runquery');
|
||||
|
||||
$oP->p('');
|
||||
$oP->StartCollapsibleSection(Dict::S('UI:RunQuery:MoreInfo'), false);
|
||||
$oP->p(Dict::S('UI:RunQuery:DevelopedQuery').$oFilter->ToOQL());
|
||||
$oP->p(Dict::S('UI:RunQuery:SerializedFilter').$oFilter->serialize());
|
||||
$oP->EndCollapsibleSection();
|
||||
}
|
||||
$oP->p('');
|
||||
$oP->StartCollapsibleSection(Dict::S('UI:RunQuery:MoreInfo'), false);
|
||||
$oP->p(Dict::S('UI:RunQuery:DevelopedQuery').$oFilter->ToOQL());
|
||||
$oP->p(Dict::S('UI:RunQuery:SerializedFilter').$oFilter->serialize());
|
||||
$oP->EndCollapsibleSection();
|
||||
}
|
||||
elseif ($sSyntaxError)
|
||||
{
|
||||
$oP->p('<b>'.Dict::Format('UI:RunQuery:Error', $e->getHtmlDesc()).'</b>');
|
||||
}
|
||||
}
|
||||
catch(CoreException $e)
|
||||
{
|
||||
$oP->p('<b>'.Dict::Format('UI:RunQuery:Error', $e->getHtmlDesc()).'</b>');
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
|
||||
@@ -59,9 +59,10 @@ function AddNodeDetails(&$oNode, $oObj)
|
||||
* @param DBObject $oObj The current object
|
||||
* @param string $sRelation The name of the relation to search with
|
||||
*/
|
||||
function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, &$oXmlNode, $iDepth = 0)
|
||||
function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, &$oXmlNode, $iDepth = 0, $aExcludedClasses)
|
||||
{
|
||||
$aResults = array();
|
||||
$bAddLinks = false;
|
||||
$oObj->GetRelatedObjects($sRelationName, 1 /* iMaxDepth */, $aResults);
|
||||
if ($iDepth > MAX_RECURSION_DEPTH) return;
|
||||
|
||||
@@ -71,25 +72,33 @@ function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXml
|
||||
{
|
||||
if (is_object($oTargetObj))
|
||||
{
|
||||
$oLinkingNode = $oXmlDoc->CreateElement('link');
|
||||
$oLinkingNode->SetAttribute('relation', $sRelationName);
|
||||
$oLinkingNode->SetAttribute('arrow', 1); // Such relations have a direction, display an arrow
|
||||
$oLinkedNode = $oXmlDoc->CreateElement('node');
|
||||
$oLinkedNode->SetAttribute('id', $oTargetObj->GetKey());
|
||||
$oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj));
|
||||
$oLinkedNode->SetAttribute('obj_class_name', htmlspecialchars(MetaModel::GetName(get_class($oTargetObj))));
|
||||
$oLinkedNode->SetAttribute('name', htmlspecialchars($oTargetObj->GetRawName())); // htmlentities is too much for XML
|
||||
$oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon(false /* No IMG tag */)));
|
||||
AddNodeDetails($oLinkedNode, $oTargetObj);
|
||||
$oSubLinks = $oXmlDoc->CreateElement('links');
|
||||
// Recurse
|
||||
GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oSubLinks, $oXmlDoc, $oLinkedNode, $iDepth++);
|
||||
$oLinkingNode->AppendChild($oLinkedNode);
|
||||
$oLinks->AppendChild($oLinkingNode);
|
||||
if (in_array(get_class($oTargetObj), $aExcludedClasses))
|
||||
{
|
||||
GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oLinks, $oXmlDoc, $oXmlNode, $iDepth++, $aExcludedClasses);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oLinkingNode = $oXmlDoc->CreateElement('link');
|
||||
$oLinkingNode->SetAttribute('relation', $sRelationName);
|
||||
$oLinkingNode->SetAttribute('arrow', 1); // Such relations have a direction, display an arrow
|
||||
$oLinkedNode = $oXmlDoc->CreateElement('node');
|
||||
$oLinkedNode->SetAttribute('id', $oTargetObj->GetKey());
|
||||
$oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj));
|
||||
$oLinkedNode->SetAttribute('obj_class_name', htmlspecialchars(MetaModel::GetName(get_class($oTargetObj))));
|
||||
$oLinkedNode->SetAttribute('name', htmlspecialchars($oTargetObj->GetRawName())); // htmlentities is too much for XML
|
||||
$oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon(false /* No IMG tag */)));
|
||||
AddNodeDetails($oLinkedNode, $oTargetObj);
|
||||
$oSubLinks = $oXmlDoc->CreateElement('links');
|
||||
// Recurse
|
||||
GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oSubLinks, $oXmlDoc, $oLinkedNode, $iDepth++, $aExcludedClasses);
|
||||
$oLinkingNode->AppendChild($oLinkedNode);
|
||||
$oLinks->AppendChild($oLinkingNode);
|
||||
$bAddLinks = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (count($aResults) > 0)
|
||||
if ($bAddLinks)
|
||||
{
|
||||
$oXmlNode->AppendChild($oLinks);
|
||||
}
|
||||
@@ -117,6 +126,9 @@ $id = utils::ReadParam('id', 1);
|
||||
$sRelation = utils::ReadParam('relation', 'impacts');
|
||||
$aValidRelations = MetaModel::EnumRelations();
|
||||
$sFormat = utils::ReadParam('format', 'xml');
|
||||
$sExcludedClasses = utils::ReadParam('exclude', '', false, 'raw_data');
|
||||
$aExcludedClasses = explode(',', $sExcludedClasses);
|
||||
|
||||
|
||||
if (!in_array($sRelation, $aValidRelations))
|
||||
{
|
||||
@@ -167,7 +179,7 @@ try
|
||||
|
||||
$oXmlRoot->SetAttribute('position', 'left');
|
||||
$oXmlRoot->SetAttribute('title', MetaModel::GetRelationDescription($sRelation).' '. htmlspecialchars($oObj->GetRawName()));
|
||||
GetRelatedObjectsAsXml($oObj, $sRelation, $oLinks, $oXmlDoc, $oXmlNode);
|
||||
GetRelatedObjectsAsXml($oObj, $sRelation, $oLinks, $oXmlDoc, $oXmlNode, 0, $aExcludedClasses);
|
||||
|
||||
$oXmlRoot->AppendChild($oXmlNode);
|
||||
$oXmlDoc->AppendChild($oXmlRoot);
|
||||
|
||||
1120
portal/index.php
1120
portal/index.php
File diff suppressed because it is too large
Load Diff
@@ -7,98 +7,72 @@ html, body {
|
||||
height: 100%;
|
||||
}
|
||||
#content {
|
||||
margin: auto;
|
||||
margin: 10px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
text-align: center;
|
||||
overflow-y: auto;
|
||||
no.max-width: 90%;
|
||||
min-width: 960px;
|
||||
position: relative;
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
div#portal #welcome {
|
||||
display: none;
|
||||
background: url("./images/dockbar_bg.png") repeat-x scroll 0 0 #97A1AE;
|
||||
border-bottom: 1px solid #636364;
|
||||
font-size: 13px;
|
||||
padding: 1px 5px;
|
||||
position: relative;
|
||||
z-index: 300;
|
||||
text-align:right;
|
||||
color: #2C2F34;
|
||||
font-weight: bold;
|
||||
text-shadow: 1px 1px #FFFFFF;
|
||||
}
|
||||
div#portal #banner {
|
||||
background-color: #F6F6F1;
|
||||
display: block;
|
||||
height: 60px;
|
||||
vertical-align: middle;
|
||||
width: 100%;
|
||||
}
|
||||
div#portal #logo {
|
||||
background: url("../images/itop-logo.png") no-repeat scroll 0 0 transparent;
|
||||
border: 0 none;
|
||||
display: inline-block;
|
||||
height: 116px;
|
||||
line-height: 48px;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
padding-right: 50px;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
width: 240px;
|
||||
height: 60px;
|
||||
display: block;
|
||||
vertical-align:middle;
|
||||
background-color: #f6f6f1;
|
||||
}
|
||||
|
||||
div#portal #logo {
|
||||
width: 126px;
|
||||
background: url(../images/itop-logo.png) 0 0 no-repeat;
|
||||
margin-left:20px;
|
||||
margin-right:20px;
|
||||
height: 60px;
|
||||
border: 0;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
line-height: 48px;
|
||||
padding-right:50px;
|
||||
}
|
||||
div#menu {
|
||||
display: block;
|
||||
height: 48px;
|
||||
left: 200px;
|
||||
line-height: 48px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
width: auto;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 200px;
|
||||
right: 0px;
|
||||
line-height: 48px;
|
||||
height: 48px;
|
||||
}
|
||||
|
||||
#portal_menu {
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
#change_pwd {
|
||||
background: url("../images/password.png") no-repeat scroll 0 0 transparent;
|
||||
display: block;
|
||||
float: right;
|
||||
}
|
||||
|
||||
#logoff {
|
||||
background: url("../images/logoff.png") no-repeat scroll 0 0 transparent;
|
||||
display: block;
|
||||
float: right;
|
||||
}
|
||||
#logoff span {
|
||||
}
|
||||
|
||||
div.button {
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
a.button, a.button:visited {
|
||||
color: #1C94C4;
|
||||
margin-left:20px;
|
||||
margin-right:20px;
|
||||
height: 60px;
|
||||
border: 0;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
height: 48px;
|
||||
line-height: 48px;
|
||||
}
|
||||
|
||||
a.button , a.button:visited {
|
||||
color: #1C94C4;
|
||||
text-decoration: none;
|
||||
vertical-align: middle;
|
||||
height: 48px;
|
||||
line-height: 48px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
a.button span {
|
||||
margin-left: 50px;
|
||||
vertical-align:middle;
|
||||
margin-right: 20px;
|
||||
vertical-align: middle;
|
||||
margin-left: 50px;
|
||||
}
|
||||
|
||||
#close_form_table {
|
||||
@@ -106,117 +80,66 @@ a.button span {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
#request_details td {
|
||||
text-align:left;
|
||||
#logoff {
|
||||
display: block;
|
||||
float: right;
|
||||
background: url(../images/logoff.png) right center no-repeat;
|
||||
}
|
||||
|
||||
#request_details td fieldset{
|
||||
xxxheight:100%;
|
||||
#logoff span {
|
||||
margin-right: 50px;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
#cancel {
|
||||
background: url(../images/stop-mid.png) 0 0 no-repeat;
|
||||
}
|
||||
|
||||
#create {
|
||||
background: url(../modules/itop-request-mgmt-1.0.0/images/user-request.png) 0 0 no-repeat;
|
||||
}
|
||||
#user_info {
|
||||
background: url(../images/clean-mid.png) 0 0 no-repeat;
|
||||
}
|
||||
|
||||
#change_pwd {
|
||||
background: url(../images/password.png) 0 0 no-repeat;
|
||||
}
|
||||
#back {
|
||||
background: url(../images/back.png) 0 0 no-repeat;
|
||||
}
|
||||
#back span {
|
||||
margin-left: 54px;
|
||||
}
|
||||
#refresh {
|
||||
background: url(../images/refresh.png) 0 0 no-repeat;
|
||||
margin-right: 40px;
|
||||
}
|
||||
#refresh span {
|
||||
margin-left: 54px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
#request_details {
|
||||
display: inline-block;
|
||||
width:800px;
|
||||
text-align: left;
|
||||
}
|
||||
#form_close_request {
|
||||
display: inline-block;
|
||||
width:800px;
|
||||
text-align: left;
|
||||
}
|
||||
#request_details_log {
|
||||
width:774px;
|
||||
}
|
||||
#request_details table {
|
||||
border: #f1f1f6 2px solid;
|
||||
text-align: left;
|
||||
}
|
||||
#form_details {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.wizContainer table {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#user_request_comment {
|
||||
width: 30em;
|
||||
height: 20em;
|
||||
}
|
||||
|
||||
#buttons {
|
||||
margin-top: 1em;
|
||||
}
|
||||
div#buttons #btn_cancel {
|
||||
margin-right: 50px;
|
||||
}
|
||||
|
||||
div#buttons #btn_back {
|
||||
margin-left: 50px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
div#buttons #btn_next {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
div#buttons #btn_finish {
|
||||
margin-left: 5px;
|
||||
}
|
||||
table.listContainer {
|
||||
clear: both;
|
||||
width: 100%;
|
||||
}
|
||||
h1 {
|
||||
font-weight: bold;
|
||||
font-weight: bold;
|
||||
padding: 5px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
div.DrawerHandle {
|
||||
display:none;
|
||||
}
|
||||
div.HRDrawer {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
height: 0.5em;
|
||||
}
|
||||
|
||||
.SearchDrawer {
|
||||
background-color: #F9EDBF;
|
||||
border: 0;
|
||||
-moz-border-radius: 4px 4px 4px 4px;
|
||||
}
|
||||
.SearchDrawer label {
|
||||
background: transparent;
|
||||
}
|
||||
#open_incidents, #open_requests, #open_changes, #request_details {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
legend {
|
||||
background: url("./images/header_bg.png") repeat-x scroll 0 0 #D4D4D4;
|
||||
border-color: #C8C9CA #9E9E9E #9E9E9E #C8C9CA;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
color: #222222;
|
||||
font-weight: bold;
|
||||
text-shadow: 1px 1px #FFFFFF;
|
||||
padding: 5px;
|
||||
-moz-border-radius: 4px 4px 4px 4px;
|
||||
margin-top:0;
|
||||
}
|
||||
table.details > tbody > tr > td {
|
||||
padding-bottom: 5px;
|
||||
padding-top: 3px;
|
||||
padding-right: 5px;
|
||||
border: 0;
|
||||
}
|
||||
.label {
|
||||
font-weight: bold;
|
||||
}
|
||||
.caselog {
|
||||
display:block;
|
||||
width: 100%;
|
||||
}
|
||||
.caselog textarea {
|
||||
resize: none;
|
||||
}
|
||||
.edit_item {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
div.edit_item span div table {
|
||||
width: 100%;
|
||||
}
|
||||
div.edit_item span div table tbody tr td textarea{
|
||||
width: 99%;
|
||||
}
|
||||
div#ticket_shortcuts form {
|
||||
display: inline-block;
|
||||
}
|
||||
237
readme.txt
237
readme.txt
@@ -1,4 +1,4 @@
|
||||
iTop - version 1.2.0 - 14-Sep-2011
|
||||
iTop - version 1.2.1 - 01-Feb-2012
|
||||
Readme file
|
||||
|
||||
1. ABOUT THIS RELEASE
|
||||
@@ -7,14 +7,14 @@ Readme file
|
||||
2.2. Install procedure
|
||||
2.3. Migration from previous version
|
||||
3. FEATURES
|
||||
3.1. Changes since 1.1
|
||||
3.1. Changes since 1.2
|
||||
3.2. Known limitations
|
||||
3.3. Known issues
|
||||
|
||||
1. ABOUT THIS RELEASE
|
||||
==================
|
||||
Thank you for downloading the tenth packaged release of iTop.
|
||||
This version comes with a few new features and bug fixes.
|
||||
Thank you for downloading the eleventh packaged release of iTop.
|
||||
This version is mostly a maintenance release that fixes a few bugs of iTop 1.2.
|
||||
|
||||
A wiki is available: https://sourceforge.net/apps/mediawiki/itop/index.php?title=ITop_Documentation
|
||||
Additional documentation can be downloaded from there:
|
||||
@@ -30,21 +30,32 @@ The source code of iTop can be found on SourceForge: http://itop.sourceforge.net
|
||||
|
||||
1.1 What's new?
|
||||
---------------------------
|
||||
- Japanese localization is now part of iTop
|
||||
- Paginated display: when a list contains lots of data it is displayed page per page
|
||||
- Quite a few performance improvements to make iTop behave properly with huge data sets
|
||||
- Hierarchical keys: parent/child relationships can now be described using a special type of key,
|
||||
and then queried efficiently in the database (Used by Organization, Location and Group)
|
||||
- CAS authentication: iTop now supports single-sign-on with JA-SIG CAS
|
||||
This version mostly consists in bug fixes for iTop 1.2, however there are a few new features:
|
||||
|
||||
1.2 Should I upgrade to 1.2.0?
|
||||
- Better display of the impact analysis view: Allows to filter the classes of objects displayed in the
|
||||
graphical view. The view now resizes to fit the window of your browser.
|
||||
|
||||
- Query phrase book: create, test and store your OQL queries in the "Query Phrasebook" for an easy export
|
||||
via the "Export" menu, without the limitation of the URL length in Excel web queries ! A new export format
|
||||
"spreadsheet" has been added, specifically for running as Excel web queries (dates are split between date and time)
|
||||
|
||||
- Enhanced data synchronization:
|
||||
- For performing huge synchronizations with little memory (despite PHP's memory leaks), the execution of the data
|
||||
synchronization (in CLI mode only) can be run by chunk of x elements by specifying --max_chunk_size=x on the
|
||||
command line to synchro_import.php or synchro_exec.php. Try to set this value to 1000 to run with 128 MB of memory.
|
||||
As of now, there is no easy mean to check wether the execution has been split or not, and to evaluate the real benefit of this feature.
|
||||
To do this, you will have to look into the database, in table priv_sync_log. The column memory_usage_peak gives you the maximum amount of memory used throughout the whole execution.
|
||||
- When an (optional) external key cannot be reconciled, log a warning on the replica. the replicas containing a
|
||||
warning are then processed everytime in case the ext key changes.
|
||||
- Also improved the search/display of replicas for an easier troubleshooting of the synchronization.
|
||||
|
||||
|
||||
1.2 Should I upgrade to 1.2.1?
|
||||
---------------------------
|
||||
- If you are manipulating big sets of data (several thousands of objects in one go)
|
||||
- If you care about organizations or locations hierarchy
|
||||
- If you speak/read Japanese
|
||||
- If you already use JA-SIG CAS (www.jasig.org/cas) for example with a Liferay portal
|
||||
|
||||
then you'll benefit from iTop 1.2 and it's probably worth upgrading.
|
||||
Considering that there more than 30 bug fixes and very few new features, it's probably quite safe to upgrade to
|
||||
this new version. If you are using the data synchronization with big sets of data, you can benefit from the new
|
||||
"chunk" mode by just adding a parameter to the command line !
|
||||
The interactive audit is now faster and uses less memory when processing big numbers of elements.
|
||||
|
||||
|
||||
1.3 Special Thanks To:
|
||||
@@ -56,7 +67,7 @@ Christian Lempereur and Olivier Fouquet for their feedbacks.
|
||||
Everaldo Coelho and the Oxygen Team for their wonderful icons.
|
||||
The JQuery team and the all the jQuery plugins authors for developing such a powerful library.
|
||||
Phil Eddies for the numerous feedbacks provided, and the first implementation of CKEdit
|
||||
Marco Tulio and Bruno Cassaro for the Portuguese (Brazilian) translation
|
||||
Marco Túlio and Bruno Cassaro for the Portuguese (Brazilian) translation
|
||||
Vladimir Shilov for the Russian translation
|
||||
Izzet Sirin for the Turkish translation
|
||||
Deng Lixin for the Chinese translation
|
||||
@@ -67,6 +78,7 @@ Tadashi Kaneda for the Japanese translation
|
||||
Antoine Coetsier for the CAS support and tests
|
||||
Vincenzo Todisco for his contribution to the enhancement of the webservices
|
||||
Tobias Glemser and Sabri Saleh for their consulting about iTop security
|
||||
Claudio Cesar Sanchez Tejeda for his contribution to bug fixes on the export and data synchronization
|
||||
|
||||
2. INSTALLATION
|
||||
============
|
||||
@@ -111,8 +123,8 @@ The following features will require the activation of CRON.PHP:
|
||||
|
||||
More information into the Wiki: https://sourceforge.net/apps/mediawiki/itop/index.php?title=Cron.php
|
||||
|
||||
2.4. Migrating from 1.0, 1.0.1, 1.0.2 or 1.1
|
||||
---------------------------------------
|
||||
2.4. Migrating from 1.0, 1.0.1, 1.0.2, 1.1 or 1.2
|
||||
--------------------------------------------
|
||||
You can simply overwrite the files from the previous version with the new ones but we recommend that you copy the files of the new version to new directory.
|
||||
After installing the files, you MUST run the setup by
|
||||
1) Marking the file config-itop.php as read-write for the web server
|
||||
@@ -140,135 +152,102 @@ Please refer to the migration guide available at http://www.combodo.com/itopdocu
|
||||
3. FEATURES
|
||||
========
|
||||
|
||||
3.1. Changes since 1.1
|
||||
3.1. Changes since 1.2
|
||||
-------------------
|
||||
|
||||
Version 1.2.0 brings a few major changes.
|
||||
Version 1.2.1 brings a few major changes.
|
||||
|
||||
Major changes
|
||||
-------------
|
||||
- Paginated display
|
||||
- Management of hierarchy of objects: implemented for Organizations, Groups and Locations and taken into account by the profiles/user rights.
|
||||
- CAS integration: added support of JA-SIG Central Authentication Service (CAS) with log-off support, using phpCAS API.
|
||||
- Better display of the impact analysis view: Allows to filter the classes of objects displayed in the
|
||||
graphical view. The view now resizes to fit your browser's window.
|
||||
|
||||
- Query phrase book: create, test and store your OQL queries in the "Query Phrasebook" for an easy export
|
||||
via the "Export" menu, without the limitation of the URL length in Excel web queries ! A new export format
|
||||
"spreadsheet" was aded, specifically for running as Excel web queries (dates are split between date and time)
|
||||
|
||||
- Enhanced data synchronization:
|
||||
- For performing huge synchronizations with little memory (despite PHP's memory leaks), the execution of the data
|
||||
synchronization (in CLI mode only) can be run by chunk of x elements by specifying --max_chunk_size=x on the
|
||||
command line to synchro_import.php or synchro_exec.php. Try to set this value to 1000 to run with 128 MB of memory.
|
||||
- When an (optional) external key cannot be reconciled, log a warning on the replica. the replicas containing a
|
||||
warning are then processed everytime in case the ext key changes.
|
||||
- Also improved the search/display of replicas for an easier troubleshooting of the synchronization.
|
||||
|
||||
Localization
|
||||
------------
|
||||
The Japanese translation was added, thanks to Tadashi Kaneda.
|
||||
The German translation was updated by Stephan Rosenke
|
||||
This version contains some enhancements to the German and Brazilian translations thanks to David Gümbel and Marco Túlio
|
||||
|
||||
More information on the localization (completion progress, how to contribute) here:
|
||||
http://www.combodo.com/itop-localization/
|
||||
|
||||
Minor changes
|
||||
-------------
|
||||
Improved import.php and synchro_import.php: added 'date_format' (example: %d/%m/%Y %H:%i:%s)
|
||||
When needed the drop-down list of organizations is replaced by an autocomplete
|
||||
Templates: new type of block = sqlblock, allows for displaying tables/charts based in SQL queries (much quicker for some 'Group By' operations)
|
||||
Added support of 'drill-down' (i.e on_click) on bar and pie charts
|
||||
Added SQL blocks
|
||||
New feature: online help on search inputs (date format and operators) a tooltip appears when the user clicks a date/search field
|
||||
Better handling of object deletion issues during a data synchro...
|
||||
#130: keywords to narrow the scope of the global search (e.g. server:webserver searches "webserver" only in the "server" objects)
|
||||
Added a new web service to create UserRequest tickets (similarly to Incidents tickets). Based on code from Vincenzo Todisco.
|
||||
Bug fix: when changing the currently selected organization, go back to the initial (Welcome) menu instead of trying to stay on the same menu... which caused troubles (e.g. "New Contact" => assertion failed)
|
||||
Improved error handling when loading linkedset as attributes in one go in CSV import
|
||||
Don't make the Ticket's case log hidden in the 'New' state, since it's not hidden in the portal !
|
||||
Better error message if the configuration file exists but is not readable
|
||||
In CLI mode, do not depend on the current directory for synchro/import.php and synchro/synchro.php: the scripts can now be run from anywhere.
|
||||
New module to easily manage attachments in one click instead of creating a separate 'Document' object. If this module is installed, portal users will create attachments instead of linked documents when uploading files with their ticket
|
||||
Added a new type of 'Trigger': TriggerOnPortalUpdate, called when the end-user updates a ticket via the portal.
|
||||
The deadlines display format can be configured.
|
||||
Lists can be displayed either as combo boxes (default and original behavior) or radio buttons, either horizontal or vertical.
|
||||
In the templates or menus, the sort order can be specified.
|
||||
Developers: DisplayBareProperties now called both in read and edition modes.
|
||||
#446: XSS vulnerabilities
|
||||
Security: protected bulk modify against HTTP/Post piracy
|
||||
Added the display of the total count of objects in overviews.
|
||||
Different display for 'Date' fields: shorter field than DateTime since there is no "time" part.
|
||||
A mandatory case log field is now considered as 'filled' if it contains a previous entry
|
||||
#148 Allow overloading attribute/enum labels in the dictionary
|
||||
Warning (popup) message when navigating away from an edition form.
|
||||
#452 Export.php - field list can be specified also for HTML output
|
||||
German localization update, thanks to Stephan Rosenke.
|
||||
Shortcut actions (parameter in the config file)
|
||||
Notifications: case log in plain text (this->case_log) or the latest entry (this->head(case_log))
|
||||
Allow creation of an ticket in a different initial state via the new 'initial_state_path' attribute.
|
||||
Support update of CaseLog fields in bulk_modify mode.
|
||||
Detection of the Suhosin extension during the installation and tell the user if the get_max_value is too small.
|
||||
#284: Improved verification to the PHP file upload settings to avoid troubles later
|
||||
Automatic synchro of CAS/LDAP users: it is possible to have iTop automatically create the user record when an authorized user connects through CAS
|
||||
- Use the default language when creating a new user from CAS
|
||||
- Support patterns for casMemberof
|
||||
|
||||
Audit:
|
||||
Better error handling in case of OQL error in the audit page, now the error is properly trapped and indicates which query is the cause of the error.
|
||||
Optimized memory usage when auditing large volumes of CIs (10'000 items was requiring 200 Mb, it now runs with 32 Mb -including the 30Mb overhead!)
|
||||
|
||||
Added a link to a favicon (icon in the browser's bar and tab)
|
||||
|
||||
Allow a module to restrict the access to a given menu/group by redeclaring the menu with restricted rights.
|
||||
All rights are combined with the AND operator.
|
||||
|
||||
Added the "search form" on top of the list of user accounts, useful to find a user in a huge list !
|
||||
|
||||
Added the ability to display a custom welcome/disclaimer message at the bottom of the login form.
|
||||
Just put a non empty string (can contain HTML tags) in the dictionary entry 'UI:Login:About'
|
||||
|
||||
In the Toolkit: Improved the check on data model consistency: detection of SQL columns used by two attributes
|
||||
|
||||
Ticket's case log can now be bigger than 64 Kilobytes...
|
||||
|
||||
|
||||
Bugs fixed
|
||||
----------
|
||||
The complete list of active tickets can be reviewed at http://sourceforge.net/apps/trac/itop/report/1
|
||||
|
||||
#122 Optimized the load of data set (do not load unused columns, that can cause some tmp tables to get too big for memory)
|
||||
#403 Partial installation not working (error on ticket form)
|
||||
#404: context lost when doing certain actions. What was fixed:
|
||||
- Run Query
|
||||
- Display Data Model Schema
|
||||
- Drill-down in charts (OQL & SQL)
|
||||
- Paginated lists (actually a regression)
|
||||
What remains:
|
||||
- Global search...
|
||||
- Drill-down in Flash "impacts / depends on"
|
||||
#405 Could not install without the module 'User Request Management'
|
||||
#408 Case log not working with PHP < 5.3 - the fix preserves the compatibility with installed version (but the dates are lost)
|
||||
#410 Added translation for ticket status (and other enum fields) when displaying the History tab.
|
||||
#415 Could not limit user on some organization (symptom: wrong queries... org_id does not exist...)
|
||||
#420 Data synchro logs: increased the size of the attribute last_error
|
||||
#422 (detection of magic_quotes_runtime)
|
||||
#423 Fixed issues with application root URL = f(mode CLI, modules, web server techno, etc.)
|
||||
#427 Unable to remove all items from a linkset when editing an object.
|
||||
#424 Error when updating the Data Synchro statistics
|
||||
#429: web browser can crash when a text field contains several times the same URL !!!
|
||||
#433: Database triggers creation was incorrect when iTop was installed with a 'prefix' for the DB tables.
|
||||
Dashboard templates: fixed issue with asynchronous mode (still some cosmetic issues) with itopblock and the table format
|
||||
n:n wizard, context was lost when searching for objects of a derived class to be added.
|
||||
'Apply stimulus multiple" was saying: "Please select at least one object"
|
||||
Make sure that the flash object respects the z-order otherwise the hierarchy/organization picker appears behind the Flash in Chrome and IE.
|
||||
Fixed issues when adding/removing modules during the setup:
|
||||
- When adding modules: the data model was not refreshed in the cache before attempting to load "structure" (or "sample") data
|
||||
- When removing a module: remaining (invalid) triggers were still used.
|
||||
A title was missing for the menu 'All Opened Changes' at the top of the page
|
||||
Fixed the parsing of OQL error messages: should be able to report the line number (usually 1) and the character where the error happened
|
||||
Don't display an error (assertion failed) if the user selects nothing (i.e -- select one --) in the "CSV template" tab.
|
||||
Display/download links on documents that were both doing exactly the same thing
|
||||
Fixed the display of 'Used IP Addresses' (i.e. Network interfaces) in the details of a Subnet object.
|
||||
Fixed the computation of IPs in a subnet that failed (returned negative numbers) on some versions of PHP compiled in 32-bit.
|
||||
Enhanced interface for complex SLA computations...
|
||||
#447: interfaces not showing up on the details of a server when an org is selected: there were collisions in the internal query parameters names ! This is now fixed.
|
||||
The default value for Date fields is different than for DateTime fields: no 'time' part at the end (use the attribute's own format)
|
||||
#458: back button was asking to fill the mandatory fields !
|
||||
Support the selection (via an autocomplete) in a list that contains duplicates
|
||||
#457: crash when deleting two organizations.
|
||||
Accented characters not displayed within autocomplete selection controls
|
||||
Email test: under IIS it was not detecting Windows correctly, and the help message was therefore completely wrong.
|
||||
Dictionary: English was proposed twice in the list of available languages!
|
||||
#465: incorrect logic when resetting the 'ConnectedToInterface'
|
||||
Upgrade: fails to recreate a view when is has become invalid (missing attribute)
|
||||
#363 Charts not displaying with IE8 + IIS + HTTPS
|
||||
#373 Error when deleting two network devices connected to each other
|
||||
#258 Context automatically set when specifying an organization in a search form
|
||||
#444 Sort order not visible / lost on refresh
|
||||
Crashing when displaying the details of a change in the CSV load history
|
||||
|
||||
Productivity Enhancements
|
||||
-------------------------
|
||||
Quicker path to create or modify objects: buttons directly accessible next to the Actions popup menu.
|
||||
Limit the drop down menu to your favorite organizations: use the user preferences menu next to the Logoff button.
|
||||
For tickets, create/modify and apply an action in one step; E.g. Create and assign in one click.
|
||||
Form validation buttons (Ok/Cancel) showed on top and bottom. Can be tuned (top, bottom or both).
|
||||
The paginated presentation allows a quicker navigation for really large data sets.
|
||||
|
||||
|
||||
Performance Enhancements
|
||||
------------------------
|
||||
Do not load the full set of items when it comes to displaying an autocomplete!
|
||||
Displaying 1000 object would take real long if many organizations are loaded into iTop (querying all the orgs for each object)
|
||||
Cache the Count of items in an object set
|
||||
Autocomplete = do not load every object when determining the list of matches
|
||||
#522 issue with non-ASCII characters in notifications subject.
|
||||
#519 Change password bug: it was not possible to for a user to change their own passord, if the (new) password contained non-alphanumeric characters !
|
||||
#518 Properly pass the context (i.e. currently selected org) to the auto-refresh lists
|
||||
#516 and #517 Improved the export (specify fields for multi-column queries) and web queries (default field list)
|
||||
#512 Command line mode (CLI) is now supported for the 'export' page. With either the --auth_user and --auth_pwd parameters or --param_file
|
||||
#494 It seems that PHPSoap does not understand the <wsdl:documentation> tag, let's put them as comments
|
||||
#493 Incorrect display of Users' Grant Matrix
|
||||
#487 Resizable text areas disappeared when located on the second tab !
|
||||
#486 Fixed SQL dashboards limitations
|
||||
#485 Export.php improved for integration into Excel / web queries (bug with IIS/HTTPS, limitation on the size of the OQL)
|
||||
Export for MS Excel web queries: format=spreadsheet Improved the end-user experience with Excel and the web queries (added a phrasebook)
|
||||
+ link to test the OQL attributes (query phrasebook or email actions, etc.) including the handlink of query arguments)
|
||||
+ fixed wrong prototypes for a few implementations of GetBareProperties()
|
||||
#484 Fixed issue with IIS ("Wrong password" at first prompt)
|
||||
#482 OpenSearch (integration with your browser's search bar) was broken.
|
||||
#482 The setting 'min_autocomplete_chars' was not taken into account
|
||||
#481 localized characters in Service / Service Category name and description were not properly displayed.
|
||||
#480 The 'min_autocomplete_chars' settings was not taken into account.
|
||||
#478 Fixed issue in the audit: the results are wrong whenever an organization is selected
|
||||
#477 Could not specify more than one reconciliation key (regression) + took the opportunity to enhance protection against XSS injection (using column names in the data)
|
||||
#473 Could not load NW interfaces (reconciliation issue) - merged from trunk
|
||||
|
||||
Other bugs not listed in Trac:
|
||||
Security issue: the attachments were visible by anybody (by forming URLs manually), whatever the allowed organizations. The change requires the execution of the setup/migration procedure.
|
||||
Apply the AllowedValues constraints(as default values) when selecting elements via the "magnifier" button or creating an new element via the "plus" button.
|
||||
Paginated lists were broken in the Impact Analysis "List" tab
|
||||
Incorrectly appending a parameter ?version= to linked scripts already containing a parameter in their URL, also changed the parameter name to 'itopversion' to avoid collisions
|
||||
Always apply the AllowedValues constraints(as default values) when selecting elements via the "magnifier" button or creating an new element via the "plus" button... also make sure that allowed values is enforced
|
||||
When searching objects to add to the current object (when managing n:n relationships), set the default search params in order to stay in the current silo.
|
||||
Fixed issue: nobody in the list of persons to notify for portal users (security takes precedence)
|
||||
In the setup: increased Suhosin minimum value for get_max_value to 2048 due to a bug seen on some installations
|
||||
Fix to have the proper use of GetEditValue... thanks to C. Naud
|
||||
SQL Block with parameters were always displayed as table, whatever their type...
|
||||
Removed a (useless) hardcoded reference to FunctionalCI that may break inthe display of the Impact Analysis
|
||||
(Tried to) improve the display of the Synchronization Tooltip that "sometimes" does not work on IE 8...
|
||||
Put some default reconciliation keys on Actions and Triggers to ease the use of CSV import
|
||||
Protect against an empty list of reconciliation keys in the interactive CSV Import
|
||||
Export for spreadsheets: transform keys (id of the queried object or external keys) into the corresponding friendly name
|
||||
|
||||
3.2. Known limitations (https://sourceforge.net/apps/trac/itop/report/3)
|
||||
-----------------
|
||||
@@ -277,7 +256,7 @@ Autocomplete = do not load every object when determining the list of matches
|
||||
|
||||
Suhosin can interfere with iTop. More information can be found here: https://sourceforge.net/apps/mediawiki/itop/index.php?title=ITop_and_Suhosin
|
||||
Internet Explorer 6 is not supported (neither IE7 nor IE8 in compatibility mode)
|
||||
Tested with IE8 and IE9. Be aware that there are certain limitations when using IE8 in "security mode" (when running IE on a Windows 2008 Server for example)
|
||||
Tested with IE8 and IE9, Firefox 3.6 up to Firefox 8 and Chrome. Be aware that there are certain limitations when using IE8 in "security mode" (when running IE on a Windows 2008 Server for example)
|
||||
|
||||
|
||||
3.3. Known issues (https://sourceforge.net/apps/trac/itop/report/3)
|
||||
|
||||
@@ -37,7 +37,7 @@ define('FINAL_CONFIG_FILE', APPROOT.'/config-itop.php');
|
||||
define('PHP_MIN_VERSION', '5.2.0');
|
||||
define('MYSQL_MIN_VERSION', '5.0.0');
|
||||
define('MIN_MEMORY_LIMIT', 32*1024*1024);
|
||||
define('SUHOSIN_GET_MAX_VALUE_LENGTH', 1024);
|
||||
define('SUHOSIN_GET_MAX_VALUE_LENGTH', 2048);
|
||||
|
||||
$sOperation = Utils::ReadParam('operation', 'step0');
|
||||
$oP = new SetupWebPage('iTop configuration wizard');
|
||||
|
||||
135
synchro/priv_sync_chunk.php
Normal file
135
synchro/priv_sync_chunk.php
Normal file
@@ -0,0 +1,135 @@
|
||||
<?php
|
||||
// Copyright (C) 2010 Combodo SARL
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
/**
|
||||
* Internal: synchronize part of the records - cannot be invoked separately
|
||||
*
|
||||
* @author Erwan Taloc <erwan.taloc@combodo.com>
|
||||
* @author Romain Quetiez <romain.quetiez@combodo.com>
|
||||
* @author Denis Flaven <denis.flaven@combodo.com>
|
||||
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
|
||||
*/
|
||||
|
||||
if (!defined('__DIR__')) define('__DIR__', dirname(__FILE__));
|
||||
require_once(__DIR__.'/../approot.inc.php');
|
||||
require_once(APPROOT.'/application/application.inc.php');
|
||||
require_once(APPROOT.'/application/webpage.class.inc.php');
|
||||
require_once(APPROOT.'/application/csvpage.class.inc.php');
|
||||
require_once(APPROOT.'/application/clipage.class.inc.php');
|
||||
|
||||
require_once(APPROOT.'/application/startup.inc.php');
|
||||
|
||||
|
||||
function ReadMandatoryParam($oP, $sParam, $sSanitizationFilter = 'parameter')
|
||||
{
|
||||
$sValue = utils::ReadParam($sParam, null, true /* Allow CLI */, $sSanitizationFilter);
|
||||
if (is_null($sValue))
|
||||
{
|
||||
$oP->p("ERROR: Missing argument '$sParam'\n");
|
||||
exit(29);
|
||||
}
|
||||
return trim($sValue);
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
// Main program
|
||||
|
||||
if (!utils::IsModeCLI())
|
||||
{
|
||||
$oP = new WebPage(Dict::S("TitleSynchroExecution"));
|
||||
$oP->p("This page is used internally by iTop");
|
||||
$oP->output();
|
||||
exit -2;
|
||||
}
|
||||
|
||||
$oP = new CLIPage(Dict::S("TitleSynchroExecution"));
|
||||
|
||||
try
|
||||
{
|
||||
utils::UseParamFile();
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$oP->p("Error: ".$e->GetMessage());
|
||||
$oP->output();
|
||||
exit -2;
|
||||
}
|
||||
|
||||
// Next steps:
|
||||
// specific arguments: 'csvfile'
|
||||
//
|
||||
$sAuthUser = ReadMandatoryParam($oP, 'auth_user', 'raw_data');
|
||||
$sAuthPwd = ReadMandatoryParam($oP, 'auth_pwd', 'raw_data');
|
||||
if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd))
|
||||
{
|
||||
UserRights::Login($sAuthUser); // Login & set the user's language
|
||||
}
|
||||
else
|
||||
{
|
||||
$oP->p("Access restricted or wrong credentials ('$sAuthUser')");
|
||||
$oP->output();
|
||||
exit -1;
|
||||
}
|
||||
|
||||
$iStepCount = ReadMandatoryParam($oP, 'step_count');
|
||||
$oP->p('Executing a partial synchro - step '.$iStepCount);
|
||||
|
||||
$iSource = ReadMandatoryParam($oP, 'source');
|
||||
|
||||
$iStatLog = ReadMandatoryParam($oP, 'log');
|
||||
$iChange = ReadMandatoryParam($oP, 'change');
|
||||
$sLastFullLoad = ReadMandatoryParam($oP, 'last_full_load', 'raw_data');
|
||||
$iChunkSize = ReadMandatoryParam($oP, 'chunk');
|
||||
|
||||
$oP->p('Last full load: '.$sLastFullLoad);
|
||||
$oP->p('Chunk size: '.$iChunkSize);
|
||||
$oP->p('Source: '.$iSource);
|
||||
|
||||
try
|
||||
{
|
||||
$oSynchroDataSource = MetaModel::GetObject('SynchroDataSource', $iSource);
|
||||
$oLog = MetaModel::GetObject('SynchroLog', $iStatLog);
|
||||
$oChange = MetaModel::GetObject('CMDBChange', $iChange);
|
||||
|
||||
if (strlen($sLastFullLoad) > 0)
|
||||
{
|
||||
$oLastFullLoad = new DateTime($sLastFullLoad);
|
||||
$oSynchroExec = new SynchroExecution($oSynchroDataSource, $oLastFullLoad);
|
||||
}
|
||||
else
|
||||
{
|
||||
$oSynchroExec = new SynchroExecution($oSynchroDataSource);
|
||||
}
|
||||
if ($oSynchroExec->DoSynchronizeChunk($oLog, $oChange, $iChunkSize))
|
||||
{
|
||||
// The last line MUST follow this convention
|
||||
$oP->p("continue");
|
||||
}
|
||||
else
|
||||
{
|
||||
// The last line MUST follow this convention
|
||||
$oP->p("finished");
|
||||
}
|
||||
$oP->output();
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$oP->p("Error: ".$e->GetMessage());
|
||||
$oP->add($e->getTraceAsString());
|
||||
$oP->output();
|
||||
exit(28);
|
||||
}
|
||||
?>
|
||||
@@ -53,6 +53,9 @@ try
|
||||
{
|
||||
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'oql'));
|
||||
}
|
||||
$oFilter = DBObjectSearch::FromOQL($sOQL);
|
||||
$oBlock1 = new DisplayBlock($oFilter, 'search', false, array('menu'=>false));
|
||||
$oBlock1->Display($oP, 0);
|
||||
$oP->add('<p class="page-header">'.MetaModel::GetClassIcon('SynchroReplica').Dict::S('Core:SynchroReplica:ListOfReplicas').'</p>');
|
||||
$iSourceId = utils::ReadParam('datasource', null);
|
||||
if ($iSourceId != null)
|
||||
@@ -60,7 +63,6 @@ try
|
||||
$oSource = MetaModel::GetObject('SynchroDataSource', $iSourceId);
|
||||
$oP->p(Dict::Format('Core:SynchroReplica:BackToDataSource', $oSource->GetHyperlink()).'</a>');
|
||||
}
|
||||
$oFilter = DBObjectSearch::FromOQL($sOQL);
|
||||
$oBlock = new DisplayBlock($oFilter, 'list', false, array('menu'=>false));
|
||||
$oBlock->Display($oP, 1);
|
||||
break;
|
||||
|
||||
@@ -51,7 +51,7 @@ function UsageAndExit($oP)
|
||||
if ($bModeCLI)
|
||||
{
|
||||
$oP->p("USAGE:\n");
|
||||
$oP->p("php -q synchro_exec.php --auth_user=<login> --auth_pwd=<password> --data_sources=<comma_separated_list_of_data_sources>\n");
|
||||
$oP->p("php -q synchro_exec.php --auth_user=<login> --auth_pwd=<password> --data_sources=<comma_separated_list_of_data_sources> [max_chunk_size=<limit the count of replica loaded in a single pass>]\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -147,7 +147,8 @@ foreach(explode(',', $sDataSourcesList) as $iSDS)
|
||||
}
|
||||
try
|
||||
{
|
||||
$oStatLog = $oSynchroDataSource->Synchronize(null);
|
||||
$oSynchroExec = new SynchroExecution($oSynchroDataSource);
|
||||
$oStatLog = $oSynchroExec->Process();
|
||||
if ($bSimulate)
|
||||
{
|
||||
CMDBSource::Query('ROLLBACK');
|
||||
@@ -166,12 +167,12 @@ foreach(explode(',', $sDataSourcesList) as $iSDS)
|
||||
$oP->p("Objects deletion errors: ".$oStatLog->Get('stats_nb_obj_deleted_errors'));
|
||||
$oP->p("Objects obsoleted: ".$oStatLog->Get('stats_nb_obj_obsoleted'));
|
||||
$oP->p("Objects obsolescence errors: ".$oStatLog->Get('stats_nb_obj_obsoleted_errors'));
|
||||
$oP->p("Objects created: ".$oStatLog->Get('stats_nb_obj_created'));
|
||||
$oP->p("Objects created: ".$oStatLog->Get('stats_nb_obj_created')." (".$oStatLog->Get('stats_nb_obj_created_warnings')." warnings)");
|
||||
$oP->p("Objects creation errors: ".$oStatLog->Get('stats_nb_obj_created_errors'));
|
||||
$oP->p("Objects updated: ".$oStatLog->Get('stats_nb_obj_updated'));
|
||||
$oP->p("Objects updated: ".$oStatLog->Get('stats_nb_obj_updated')." (".$oStatLog->Get('stats_nb_obj_updated_warnings')." warnings)");
|
||||
$oP->p("Objects update errors: ".$oStatLog->Get('stats_nb_obj_updated_errors'));
|
||||
$oP->p("Objects reconciled (updated): ".$oStatLog->Get('stats_nb_obj_new_updated'));
|
||||
$oP->p("Objects reconciled (unchanged): ".$oStatLog->Get('stats_nb_obj_new_unchanged'));
|
||||
$oP->p("Objects reconciled (updated): ".$oStatLog->Get('stats_nb_obj_new_updated')." (".$oStatLog->Get('stats_nb_obj_new_updated_warnings')." warnings)");
|
||||
$oP->p("Objects reconciled (unchanged): ".$oStatLog->Get('stats_nb_obj_new_unchanged')." (".$oStatLog->Get('stats_nb_obj_new_updated_warnings')." warnings)");
|
||||
$oP->p("Objects reconciliation errors: ".$oStatLog->Get('stats_nb_replica_reconciled_errors'));
|
||||
$oP->p("Replica disappeared, no action taken: ".$oStatLog->Get('stats_nb_replica_disappeared_no_action'));
|
||||
}
|
||||
|
||||
@@ -104,7 +104,7 @@ $aPageParams = array
|
||||
'mandatory' => false,
|
||||
'modes' => 'http,cli',
|
||||
'default' => ';',
|
||||
'description' => 'column separator in CSV data',
|
||||
'description' => 'column separator in CSV data (1 char, or \'tab\')',
|
||||
),
|
||||
'qualifier' => array
|
||||
(
|
||||
@@ -120,6 +120,13 @@ $aPageParams = array
|
||||
'default' => 'summary',
|
||||
'description' => '[retcode] to return the count of lines in error, [summary] to return a concise report, [details] to get a detailed report (each line listed)',
|
||||
),
|
||||
'max_chunk_size' => array
|
||||
(
|
||||
'mandatory' => false,
|
||||
'modes' => 'cli',
|
||||
'default' => '0',
|
||||
'description' => 'Limit on the count of records that can be loaded at once while performing the synchronization',
|
||||
),
|
||||
/*
|
||||
'reportlevel' => array
|
||||
(
|
||||
@@ -302,6 +309,11 @@ try
|
||||
$sComment = ReadParam($oP, 'comment', 'raw_data');
|
||||
$sNoStopOnImportError = ReadParam($oP, 'no_stop_on_import_error');
|
||||
|
||||
if (strtolower(trim($sSep)) == 'tab')
|
||||
{
|
||||
$sSep = "\t";
|
||||
}
|
||||
|
||||
$oLoadStartDate = new DateTime(); // Now
|
||||
|
||||
// Note about date formatting: These MySQL settings are read-only... and in fact unused :-(
|
||||
@@ -613,7 +625,8 @@ try
|
||||
//
|
||||
if ($bSynchronize)
|
||||
{
|
||||
$oStatLog = $oDataSource->Synchronize($oLoadStartDate);
|
||||
$oSynchroExec = new SynchroExecution($oDataSource, $oLoadStartDate);
|
||||
$oStatLog = $oSynchroExec->Process();
|
||||
$oP->add_comment('Synchronization---');
|
||||
$oP->add_comment('------------------');
|
||||
if ($sOutput == 'details')
|
||||
@@ -633,12 +646,12 @@ try
|
||||
$oP->add_comment("Objects deletion errors: ".$oStatLog->Get('stats_nb_obj_deleted_errors'));
|
||||
$oP->add_comment("Objects obsoleted: ".$oStatLog->Get('stats_nb_obj_obsoleted'));
|
||||
$oP->add_comment("Objects obsolescence errors: ".$oStatLog->Get('stats_nb_obj_obsoleted_errors'));
|
||||
$oP->add_comment("Objects created: ".$oStatLog->Get('stats_nb_obj_created'));
|
||||
$oP->add_comment("Objects created: ".$oStatLog->Get('stats_nb_obj_created')." (".$oStatLog->Get('stats_nb_obj_created_warnings')." warnings)");
|
||||
$oP->add_comment("Objects creation errors: ".$oStatLog->Get('stats_nb_obj_created_errors'));
|
||||
$oP->add_comment("Objects updated: ".$oStatLog->Get('stats_nb_obj_updated'));
|
||||
$oP->add_comment("Objects updated: ".$oStatLog->Get('stats_nb_obj_updated')." (".$oStatLog->Get('stats_nb_obj_updated_warnings')." warnings)");
|
||||
$oP->add_comment("Objects update errors: ".$oStatLog->Get('stats_nb_obj_updated_errors'));
|
||||
$oP->add_comment("Objects reconciled (updated): ".$oStatLog->Get('stats_nb_obj_new_updated'));
|
||||
$oP->add_comment("Objects reconciled (unchanged): ".$oStatLog->Get('stats_nb_obj_new_unchanged'));
|
||||
$oP->add_comment("Objects reconciled (updated): ".$oStatLog->Get('stats_nb_obj_new_updated')." (".$oStatLog->Get('stats_nb_obj_new_updated_warnings')." warnings)");
|
||||
$oP->add_comment("Objects reconciled (unchanged): ".$oStatLog->Get('stats_nb_obj_new_unchanged')." (".$oStatLog->Get('stats_nb_obj_new_updated_warnings')." warnings)");
|
||||
$oP->add_comment("Objects reconciliation errors: ".$oStatLog->Get('stats_nb_replica_reconciled_errors'));
|
||||
$oP->add_comment("Replica disappeared, no action taken: ".$oStatLog->Get('stats_nb_replica_disappeared_no_action'));
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2270,8 +2270,8 @@ class TestDataExchange extends TestBizModel
|
||||
),
|
||||
),
|
||||
),
|
||||
//);
|
||||
//$aXXXXScenarios = array(
|
||||
// );
|
||||
// $aXXXXScenarios = array(
|
||||
array(
|
||||
'desc' => 'Update then delete with retention (to complete with manual testing) and reconciliation on org/name',
|
||||
'login' => 'admin',
|
||||
|
||||
@@ -29,6 +29,7 @@ require_once(APPROOT.'/application/application.inc.php');
|
||||
require_once(APPROOT.'/application/nicewebpage.class.inc.php');
|
||||
require_once(APPROOT.'/application/csvpage.class.inc.php');
|
||||
require_once(APPROOT.'/application/xmlpage.class.inc.php');
|
||||
require_once(APPROOT.'/application/clipage.class.inc.php');
|
||||
|
||||
require_once(APPROOT.'/application/startup.inc.php');
|
||||
|
||||
@@ -43,11 +44,31 @@ catch(Exception $e)
|
||||
exit -2;
|
||||
}
|
||||
|
||||
require_once(APPROOT.'/application/loginwebpage.class.inc.php');
|
||||
LoginWebPage::DoLogin(); // Check user rights and prompt if needed
|
||||
if (utils::IsModeCLI())
|
||||
{
|
||||
$sAuthUser = utils::ReadParam('auth_user', null, true /* Allow CLI */, 'raw_data');
|
||||
$sAuthPwd = utils::ReadParam('auth_pwd', null, true /* Allow CLI */, 'raw_data');
|
||||
|
||||
if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd))
|
||||
{
|
||||
UserRights::Login($sAuthUser); // Login & set the user's language
|
||||
}
|
||||
else
|
||||
{
|
||||
$oP = new CLIPage("iTop - Export");
|
||||
$oP->p("Access restricted or wrong credentials ('$sAuthUser')");
|
||||
$oP->output();
|
||||
exit -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
require_once(APPROOT.'/application/loginwebpage.class.inc.php');
|
||||
LoginWebPage::DoLogin(); // Check user rights and prompt if needed
|
||||
}
|
||||
ApplicationContext::SetUrlMakerClass('iTopStandardURLMaker');
|
||||
|
||||
|
||||
$sOperation = utils::ReadParam('operation', 'menu');
|
||||
$oAppContext = new ApplicationContext();
|
||||
$iActiveNodeId = utils::ReadParam('menu', -1);
|
||||
@@ -55,9 +76,30 @@ $currentOrganization = utils::ReadParam('org_id', '');
|
||||
|
||||
// Main program
|
||||
$sExpression = utils::ReadParam('expression', '', true /* Allow CLI */, 'raw_data');
|
||||
$sFormat = strtolower(utils::ReadParam('format', 'html'));
|
||||
$sFields = trim(utils::ReadParam('fields', '', true, 'raw_data')); // CSV field list (allows to specify link set attributes, still not taken into account for XML export)
|
||||
|
||||
if (strlen($sExpression) == 0)
|
||||
{
|
||||
$sQueryId = trim(utils::ReadParam('query', '', true /* Allow CLI */, 'raw_data'));
|
||||
if (strlen($sQueryId) > 0)
|
||||
{
|
||||
$oSearch = DBObjectSearch::FromOQL('SELECT QueryOQL WHERE id = :query_id', array('query_id' => $sQueryId));
|
||||
$oQueries = new DBObjectSet($oSearch);
|
||||
if ($oQueries->Count() > 0)
|
||||
{
|
||||
$oQuery = $oQueries->Fetch();
|
||||
$sExpression = $oQuery->Get('oql');
|
||||
if (strlen($sFields) == 0)
|
||||
{
|
||||
$sFields = trim($oQuery->Get('fields'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$sFormat = strtolower(utils::ReadParam('format', 'html', true /* Allow CLI */));
|
||||
|
||||
|
||||
$sFields = utils::ReadParam('fields', '', true, 'raw_data'); // CSV field list (allows to specify link set attributes, still not taken into account for XML export)
|
||||
$aFields = explode(',', $sFields);
|
||||
// Clean the list of columns (empty it if every string is empty)
|
||||
foreach($aFields as $index => $sField)
|
||||
@@ -76,9 +118,45 @@ if (!empty($sExpression))
|
||||
try
|
||||
{
|
||||
$oFilter = DBObjectSearch::FromOQL($sExpression);
|
||||
|
||||
// Check and adjust column names
|
||||
//
|
||||
foreach($aFields as $index => $sField)
|
||||
{
|
||||
if (preg_match('/^(.*)\.(.*)$/', $sField, $aMatches))
|
||||
{
|
||||
$sClassAlias = $aMatches[1];
|
||||
$sAttCode = $aMatches[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
$sClassAlias = $oFilter->GetClassAlias();
|
||||
$sAttCode = $sField;
|
||||
$aFields[$index] = $sClassAlias.'.'.$sAttCode;
|
||||
}
|
||||
$sClass = $oFilter->GetClassName($sClassAlias);
|
||||
if (!MetaModel::IsValidAttCode($sClass, $sAttCode))
|
||||
{
|
||||
throw new CoreException("Invalid field specification $sField: $sAttCode is not a valid attribute for $sClass");
|
||||
}
|
||||
}
|
||||
|
||||
// Read query parameters
|
||||
//
|
||||
$aArgs = array();
|
||||
foreach($oFilter->GetQueryParams() as $sParam => $foo)
|
||||
{
|
||||
$value = utils::ReadParam('arg_'.$sParam, null, true, 'raw_data');
|
||||
if (!is_null($value))
|
||||
{
|
||||
$aArgs[$sParam] = $value;
|
||||
}
|
||||
}
|
||||
$oFilter->SetInternalParams($aArgs);
|
||||
|
||||
if ($oFilter)
|
||||
{
|
||||
$oSet = new CMDBObjectSet($oFilter);
|
||||
$oSet = new CMDBObjectSet($oFilter, array(), $aArgs);
|
||||
switch($sFormat)
|
||||
{
|
||||
case 'html':
|
||||
@@ -126,6 +204,19 @@ if (!empty($sExpression))
|
||||
cmdbAbstractObject::DisplaySetAsCSV($oP, $oSet, array('fields' => $sFields));
|
||||
break;
|
||||
|
||||
case 'spreadsheet':
|
||||
$oP = new WebPage("iTop - Export for spreadsheet");
|
||||
|
||||
// Integration within MS-Excel web queries + HTTPS + IIS:
|
||||
// MS-IIS set these header values with no-cache... while Excel fails to do the job if using HTTPS
|
||||
// Then the fix is to force the reset of header values Pragma and Cache-control
|
||||
header("Pragma:", true);
|
||||
header("Cache-control:", true);
|
||||
|
||||
$sFields = implode(',', $aFields);
|
||||
cmdbAbstractObject::DisplaySetAsHTMLSpreadsheet($oP, $oSet, array('fields' => $sFields));
|
||||
break;
|
||||
|
||||
case 'xml':
|
||||
$oP = new XMLPage("iTop - Export", true /* passthrough */);
|
||||
cmdbAbstractObject::DisplaySetAsXML($oP, $oSet);
|
||||
@@ -133,27 +224,43 @@ if (!empty($sExpression))
|
||||
|
||||
default:
|
||||
$oP = new WebPage("iTop - Export");
|
||||
$oP->add("Unsupported format '$sFormat'. Possible values are: html, csv or xml.");
|
||||
$oP->add("Unsupported format '$sFormat'. Possible values are: html, csv, spreadsheet or xml.");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$oP = new WebPage("iTop - Export");
|
||||
$oP->p("Error the query can not be executed.");
|
||||
$oP->p($e->GetHtmlDesc());
|
||||
$oP->p("Error the query can not be executed.");
|
||||
if ($e instanceof CoreException)
|
||||
{
|
||||
$oP->p($e->GetHtmlDesc());
|
||||
}
|
||||
else
|
||||
{
|
||||
$oP->p($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$oP)
|
||||
{
|
||||
// Display a short message about how to use this page
|
||||
$oP = new WebPage("iTop - Export");
|
||||
$oP->p("<strong>General purpose export page.</strong>");
|
||||
$oP->p("<strong>Parameters:</strong>");
|
||||
$oP->p("<ul><li>expression: an OQL expression (URL encoded if needed)</li>
|
||||
<li>format: (optional, default is html) the desired output format. Can be one of 'html', 'csv' or 'xml'</li>
|
||||
<li>fields: (optional, no effect on XML format) list of fields (attribute codes) separated by a coma</li>
|
||||
</ul>");
|
||||
$bModeCLI = utils::IsModeCLI();
|
||||
if ($bModeCLI)
|
||||
{
|
||||
$oP = new CLIPage("iTop - Export");
|
||||
}
|
||||
else
|
||||
{
|
||||
$oP = new WebPage("iTop - Export");
|
||||
}
|
||||
$oP->p("General purpose export page.");
|
||||
$oP->p("Parameters:");
|
||||
$oP->p(" * expression: an OQL expression (URL encoded if needed)");
|
||||
$oP->p(" * query: (alternative to 'expression') the id of an entry from the query phrasebook");
|
||||
$oP->p(" * arg_xxx: (needed if the query has parameters) the value of the parameter 'xxx'");
|
||||
$oP->p(" * format: (optional, default is html) the desired output format. Can be one of 'html', 'spreadsheet', 'csv' or 'xml'");
|
||||
$oP->p(" * fields: (optional, no effect on XML format) list of fields (attribute codes, or alias.attcode) separated by a coma");
|
||||
}
|
||||
|
||||
$oP->output();
|
||||
|
||||
@@ -102,7 +102,7 @@ $aPageParams = array
|
||||
'mandatory' => false,
|
||||
'modes' => 'http,cli',
|
||||
'default' => ',',
|
||||
'description' => 'column separator in CSV data',
|
||||
'description' => 'column separator in CSV data (1 char, or \'tab\')',
|
||||
),
|
||||
'qualifier' => array
|
||||
(
|
||||
@@ -283,6 +283,11 @@ try
|
||||
$sSimulate = ReadParam($oP, 'simulate');
|
||||
$sComment = ReadParam($oP, 'comment', 'raw_data');
|
||||
|
||||
if (strtolower(trim($sSep)) == 'tab')
|
||||
{
|
||||
$sSep = "\t";
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
//
|
||||
// Check parameters format/consistency
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
<!-- Added the following import tag to pass the Eclipse validation -->
|
||||
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
|
||||
<xsd:complexType name="SearchCondition">
|
||||
<wsdl:documentation>
|
||||
<!--wsdl:documentation>
|
||||
A criteria to restrict a search (strict search is performed)
|
||||
Example: name = 'myserver.combodo.fr'
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<xsd:all>
|
||||
<xsd:element name="attcode" type="xsd:string"/>
|
||||
<xsd:element name="value" type="xsd:string"/> <!-- should be anyType but this one is not well supported by Eclipse -->
|
||||
@@ -25,20 +25,20 @@
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="ExternalKeySearch">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Specifies [how to find] a value for an external key.
|
||||
the class of object to search for will depend on the usage that is being made, therefore the search conditions that may be used will vary depending on the parameter that is concerned.
|
||||
If one criteria is not relevant, then the match will not be attempted and warning will be logged (or an error if the target external key is mandatory)
|
||||
Example: match on customer = 'Demo' and type = 'Router'
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<xsd:all>
|
||||
<xsd:element name="conditions" type="typens:ArrayOfSearchCondition"/>
|
||||
</xsd:all>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="AttributeValue">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Specifies a value to set
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<xsd:all>
|
||||
<xsd:element name="attcode" type="xsd:string"/>
|
||||
<xsd:element name="value" type="xsd:string"/> <!-- should be anyType but this one is not well supported by Eclipse -->
|
||||
@@ -52,9 +52,9 @@
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="LinkCreationSpec">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Specifies [how to match] one item to attach and what values should be set on the newly created link.
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<xsd:all>
|
||||
<xsd:element name="class" type="xsd:string"/>
|
||||
<xsd:element name="conditions" type="typens:ArrayOfSearchCondition"/>
|
||||
@@ -69,9 +69,9 @@
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="LogMessage">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
An event that happened during the execution of the web service
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<xsd:all>
|
||||
<xsd:element name="text" type="xsd:string"/>
|
||||
</xsd:all>
|
||||
@@ -84,9 +84,9 @@
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="ResultLog">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
A Log of events of the same category
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<xsd:all>
|
||||
<xsd:element name="messages" type="typens:ArrayOfLogMessage"/>
|
||||
</xsd:all>
|
||||
@@ -105,10 +105,10 @@
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="ResultMessage">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Output expected, depending on the operation invoked.
|
||||
Example: CreateIncidentTicket will return 'created' => basic information on the created ticket
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<xsd:all>
|
||||
<xsd:element name="label" type="xsd:string"/>
|
||||
<xsd:element name="values" type="typens:ArrayOfResultData"/>
|
||||
@@ -122,12 +122,12 @@
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="Result">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Standard result structure returned by all of the operations, excepted GetVersion (returning a string)
|
||||
result holds returned data if the status is set to true
|
||||
errors, warnings and infos will help in understanding what happened (unknown identifiers, object matching issues/results)
|
||||
This resulting structure is being tracked into the application log as well.
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<xsd:all>
|
||||
<xsd:element name="status" type="xsd:boolean"/>
|
||||
<xsd:element name="result" type="typens:ArrayOfResultMessage"/>
|
||||
@@ -189,31 +189,31 @@
|
||||
</message>
|
||||
<portType name="WebServicePortType">
|
||||
<operation name="GetVersion">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Get the current version of Itop
|
||||
As this service is very simple, it is a test to get trained for more complex operations
|
||||
</wsdl:documentation> -->
|
||||
</wsdl:documentation --> -->
|
||||
<input message="typens:GetVersion"/>
|
||||
<output message="typens:GetVersionResponse"/>
|
||||
</operation>
|
||||
<operation name="CreateRequestTicket">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Create a ticket, return information about reconciliation on external keys and the created ticket
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<input message="typens:CreateRequestTicket"/>
|
||||
<output message="typens:CreateRequestTicketResponse"/>
|
||||
</operation>
|
||||
<operation name="CreateIncidentTicket">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Create a ticket, return information about reconciliation on external keys and the created ticket
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<input message="typens:CreateIncidentTicket"/>
|
||||
<output message="typens:CreateIncidentTicketResponse"/>
|
||||
</operation>
|
||||
<operation name="SearchObjects">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
Create a ticket, return information about reconciliation on external keys and the created ticket
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<input message="typens:SearchObjects"/>
|
||||
<output message="typens:SearchObjectsResponse"/>
|
||||
</operation>
|
||||
@@ -258,9 +258,9 @@
|
||||
</operation>
|
||||
</binding>
|
||||
<service name="ITopService">
|
||||
<wsdl:documentation>
|
||||
<!-- wsdl:documentation>
|
||||
ITop is the central solution for managing your IT infrastructure
|
||||
</wsdl:documentation>
|
||||
</wsdl:documentation -->
|
||||
<port name="WebServicePort" binding="typens:WebServiceBinding">
|
||||
<soap:address location="___SOAP_SERVER_URI___"/>
|
||||
</port>
|
||||
|
||||
Reference in New Issue
Block a user