Compare commits

..

53 Commits
1.0 ... 1.0.1

Author SHA1 Message Date
Romain Quetiez
ccbd818d13 iTop 1.0.1 pushed in source forge, marked as build 57
SVN:1.0.1[941]
2010-11-03 16:13:41 +00:00
Denis Flaven
1a92a7b4f3 Ready for 1.0.1 release
SVN:trunk[940]
2010-11-03 15:33:46 +00:00
Romain Quetiez
4338bce526 Readme draft for 1.0.1
SVN:trunk[939]
2010-11-03 13:06:52 +00:00
Denis Flaven
4572bdbb02 Nicer display of the CSV import results...
SVN:trunk[938]
2010-11-02 16:33:26 +00:00
Denis Flaven
fcd72fed82 Fix for Trac #315: default organization not handled properly when there is just one organization allowed for the user.
SVN:trunk[937]
2010-11-02 16:30:46 +00:00
Romain Quetiez
1800120762 #311 CSV import: Improved the reporting on external keys (and changed a little the behavior)
SVN:trunk[936]
2010-11-02 16:29:41 +00:00
Denis Flaven
e5f0460703 AutoComplete usage: code cleanup
SVN:trunk[935]
2010-11-02 10:16:24 +00:00
Denis Flaven
72dbb9cb8f Fixed Trac #312: initial form validation for the "apply stimulus/change state" wizard.
SVN:trunk[934]
2010-11-02 09:29:55 +00:00
Romain Quetiez
562cfde587 #308 Free IPs: do not show the subnet address (the first one)
SVN:trunk[933]
2010-11-01 08:37:21 +00:00
Denis Flaven
6fe25d8b57 Fixed Trac #309 : Missing php-ofc-library files
SVN:trunk[932]
2010-10-29 11:11:09 +00:00
Romain Quetiez
248cdcea8c #286 Issue with HTTPS - reviewed the fix implemented in [896]
SVN:trunk[931]
2010-10-28 12:55:51 +00:00
Denis Flaven
0b95b3799e Fixed Trac #307: prevent form submission when the value typed into an autocomplete field does not correspond to a valid value.
SVN:trunk[930]
2010-10-26 08:12:31 +00:00
Denis Flaven
05a2443afe The previous fix for Trac #276 broke the auto mapping of external keys... now fixed.
SVN:trunk[929]
2010-10-25 17:05:12 +00:00
Denis Flaven
1860521e74 Fixed Trac #306: corrupted password when user creation fails at first attempt.
SVN:trunk[928]
2010-10-25 15:49:20 +00:00
Denis Flaven
8d39ddded6 Do not create a "mailto" hyperlink for empty email addresses.
SVN:trunk[927]
2010-10-25 14:27:48 +00:00
Denis Flaven
fd3317e99e Fixed the "Relationships" Flash navigator so that it works also on Safari. (tested with Safari 5.0.2 on Windows)
SVN:trunk[926]
2010-10-25 14:14:29 +00:00
Denis Flaven
7651aaed81 - Fixed the search form, and also fixed the search/selection of objects to link (n:n links) that was broken on IE8.
SVN:trunk[925]
2010-10-25 14:12:26 +00:00
Romain Quetiez
a5d2d067ff #284 Do not forget to adjust both upload_max_filesize AND post_max_size
SVN:trunk[924]
2010-10-25 11:33:48 +00:00
Denis Flaven
b27fda4cf5 German localization update. Thanks to ITOMIG.
SVN:trunk[923]
2010-10-25 08:19:50 +00:00
Romain Quetiez
2834c073cd #304 Fixed OQL issue (regression when using time intervals)
SVN:trunk[922]
2010-10-25 08:12:17 +00:00
Denis Flaven
97f36bd7e8 Fix to prevent IE 8 from running in IE7 compatibility mode... to be tested...
SVN:trunk[921]
2010-10-25 08:04:46 +00:00
Romain Quetiez
3d299f015b #246 Implemented the CLI mode for import.php
SVN:trunk[920]
2010-10-22 22:22:13 +00:00
Denis Flaven
8a5ed95c80 - Integrating the Brazilian transalation from Marco Tulio...
SVN:trunk[919]
2010-10-22 16:55:41 +00:00
Denis Flaven
f4b29d152b Special passthrough mode for big XML pages output.
SVN:trunk[918]
2010-10-22 16:46:53 +00:00
Denis Flaven
463bc0873b Allow n:n links to link several times to the same remote object (if "duplicates)=> true in the linkedset definition)
SVN:trunk[917]
2010-10-22 10:45:12 +00:00
Denis Flaven
368ea1cfdb SVN:trunk[916] 2010-10-22 10:42:39 +00:00
Denis Flaven
1b618ff57c (Partial) fix for Trac #285: turn email fields into click-able mailto: hyperlinks.
SVN:trunk[915]
2010-10-22 10:33:53 +00:00
Romain Quetiez
70149af5d6 Fixed a bug in the XML encoding function
SVN:trunk[914]
2010-10-22 07:47:05 +00:00
Denis Flaven
006453678b Fixed Trac#300: each iTop instance now uses its own name for the cookie storing the session ID. Therefore several instances can coexist independently on the same server.
SVN:trunk[913]
2010-10-22 06:09:51 +00:00
Denis Flaven
135353aa76 Fixed Trac #258: cleaner handling of search forms...
SVN:trunk[912]
2010-10-21 15:39:30 +00:00
Romain Quetiez
ddd52554f1 Fixed issues with the search form and context and page args... not finished
SVN:trunk[911]
2010-10-21 14:28:40 +00:00
Denis Flaven
22cf8e4986 Fixed Trac #292: enums can now be null (if allowed) !
SVN:trunk[910]
2010-10-21 09:23:41 +00:00
Denis Flaven
931075687a Fix for Trac #289: setup now checks that the "setup" directory is writeable.
SVN:trunk[909]
2010-10-20 16:20:52 +00:00
Denis Flaven
adaf3a376c Fixed Trac #258: cleanup of application context parameters.
SVN:trunk[908]
2010-10-20 15:55:30 +00:00
Romain Quetiez
1808e5fe65 Fixed #302, Ticket icons were not always displayed (+ error message on some installations)
SVN:trunk[907]
2010-10-20 14:48:45 +00:00
Romain Quetiez
cab0eb7758 #297 Fixed SOAP unit tests and improved the reporting when a reconciliation on an external key has failed
SVN:trunk[906]
2010-10-20 13:11:50 +00:00
Romain Quetiez
7e06dd100a #293 Added IP address in the lists of interfaces
SVN:trunk[905]
2010-10-20 10:35:36 +00:00
Denis Flaven
f145b872de - Implemented some hints to help users find out what are the mandatory fields for a CSV import (Trac #276). Though not 100% bullet-proof.
- Continue to implement support of hierarchical ZLists in modification forms.

SVN:trunk[904]
2010-10-19 15:03:24 +00:00
Denis Flaven
b66e489ec8 - Fixed Trac #298: use the proper content-type for CSV files to prevent the let the browser pick the most appropriate application to open such files.
SVN:trunk[903]
2010-10-19 14:15:25 +00:00
Denis Flaven
63da528882 Fixed Trac #245: Search form now retains the base class that was used when displaying the form. After searching a Person it is possible to select "Contact" and perform another search on Contacts.
SVN:trunk[902]
2010-10-19 14:07:14 +00:00
Denis Flaven
ff80b06ea2 - Fixed Trac #284: do not "consume" a transaction until it really worked.
SVN:trunk[901]
2010-10-19 13:42:54 +00:00
Denis Flaven
e9304bbcfa - new implementation (database independent) of the transaction mechanism, that prevents a user from submitting the same form twice.
SVN:trunk[900]
2010-10-19 13:20:23 +00:00
Romain Quetiez
0c34b47aac Fixed regression on the previous fix (change in the prototype of MakeQuery): this was impacting update/delete on a single object => applied to all objects of the same root class!
SVN:trunk[899]
2010-10-19 13:14:19 +00:00
Denis Flaven
484d4d1679 Fix Trac #296: Incorrect display of Service/Subcategory localized characters in the portal.
SVN:trunk[898]
2010-10-19 12:54:13 +00:00
Denis Flaven
4b5a25ea59 Fixed Trac #278: better detection of all PHP mandatory modules.
SVN:trunk[897]
2010-10-19 12:45:48 +00:00
Denis Flaven
7153162696 Fixed Trac #286: incorrect detection of HTTPS on IIS/ISAPI. Thanks to cprobst for reporting it.
SVN:trunk[896]
2010-10-19 12:34:33 +00:00
Romain Quetiez
fb59939d57 #288 Fixed OQL issues, related to multi-columns usages
SVN:trunk[895]
2010-10-14 16:56:42 +00:00
Romain Quetiez
629a87c99b #282 Fixed bug in OQL interpretation (functions requiring class aliasing)
SVN:trunk[894]
2010-10-13 19:51:36 +00:00
Romain Quetiez
3d4e0da019 Typo in dictionary (contract: start datA)
SVN:trunk[893]
2010-10-13 16:54:08 +00:00
Romain Quetiez
1e1e10aa00 #111 Improved the data loader, and added a REST service to load data from a file
SVN:trunk[892]
2010-10-13 16:36:51 +00:00
Romain Quetiez
0fff433e90 #283 Fixed issue with the default value of Enum attributes
SVN:trunk[891]
2010-10-13 08:23:05 +00:00
Romain Quetiez
05dbcb0a8b Fixed limitation: tickets named automatically even if a name is specified (attribute : ref) ; this is stopper when importing tickets from an existing workflow tool
SVN:trunk[890]
2010-10-12 16:04:09 +00:00
Romain Quetiez
bc6a3ab485 Fixed issues in DB integrity check
SVN:trunk[889]
2010-10-06 15:59:33 +00:00
95 changed files with 6074 additions and 640 deletions

View File

@@ -57,19 +57,52 @@ class ApplicationContext
if (empty(self::$aDefaultValues))
{
self::$aDefaultValues = array();
$aContext = utils::ReadParam('c', array());
foreach($this->aNames as $sName)
{
$sValue = utils::ReadParam($sName, '');
$sValue = isset($aContext[$sName]) ? $aContext[$sName] : '';
// TO DO: check if some of the context parameters are mandatory (or have default values)
if (!empty($sValue))
{
self::$aDefaultValues[$sName] = $sValue;
}
// Hmm, there must be a better (more generic) way to handle the case below:
// When there is only one possible (allowed) organization, the context must be
// fixed to this org
if ($sName == 'org_id')
{
if (MetaModel::IsValidClass('Organization'))
{
$oSearchFilter = new DBObjectSearch('Organization');
$oSet = new CMDBObjectSet($oSearchFilter);
$iCount = $oSet->Count();
if ($iCount == 1)
{
// Only one possible value for org_id, set it in the context
$oOrg = $oSet->Fetch();
self::$aDefaultValues[$sName] = $oOrg->GetKey();
}
}
}
}
}
$this->aValues = self::$aDefaultValues;
}
/**
* Returns the current value for the given parameter
* @param string $sParamName Name of the parameter to read
* @return mixed The value for this parameter
*/
public function GetCurrentValue($sParamName, $defaultValue = '')
{
if (isset($this->aValues[$sParamName]))
{
return $this->aValues[$sParamName];
}
return $defaultValue;
}
/**
* Returns the context as string with the format name1=value1&name2=value2....
* return string The context as a string to be appended to an href property
@@ -79,7 +112,7 @@ class ApplicationContext
$aParams = array();
foreach($this->aValues as $sName => $sValue)
{
$aParams[] = $sName.'='.urlencode($sValue);
$aParams[] = "c[$sName]".'='.urlencode($sValue);
}
return implode("&", $aParams);
}
@@ -93,7 +126,7 @@ class ApplicationContext
$sContext = "";
foreach($this->aValues as $sName => $sValue)
{
$sContext .= "<input type=\"hidden\" name=\"$sName\" value=\"$sValue\" />\n";
$sContext .= "<input type=\"hidden\" name=\"c[$sName]\" value=\"$sValue\" />\n";
}
return $sContext;
}
@@ -104,7 +137,12 @@ class ApplicationContext
*/
public function GetAsHash()
{
return $this->aValues;
$aReturn = array();
foreach($this->aValues as $sName => $sValue)
{
$aReturn["c[$sName]"] = $sValue;
}
return $aReturn;
}
/**

View File

@@ -0,0 +1,83 @@
<?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
/**
* CLI page
* The page adds the content-type text/XML and the encoding into the headers
*
* @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
*/
require_once("../application/webpage.class.inc.php");
class CLIPage
{
function __construct($s_title)
{
}
public function output()
{
}
public function add($sText)
{
echo $sText;
}
public function p($sText)
{
echo $sText."\n";
}
public function add_comment($sText)
{
echo "#".$sText."\n";
}
public function table($aConfig, $aData, $aParams = array())
{
$aCells = array();
foreach($aConfig as $sName=>$aDef)
{
if (strlen($aDef['description']) > 0)
{
$aCells[] = $aDef['label'].' ('.$aDef['description'].')';
}
else
{
$aCells[] = $aDef['label'];
}
}
echo implode(';', $aCells)."\n";
foreach($aData as $aRow)
{
$aCells = array();
foreach($aConfig as $sName=>$aAttribs)
{
$sValue = $aRow["$sName"];
$aCells[] = $sValue;
}
echo implode(';', $aCells)."\n";
}
}
}
?>

View File

@@ -299,24 +299,31 @@ abstract class cmdbAbstractObject extends CMDBObject
$oPage->add('<table style="vertical-align:top"><tr>');
foreach($aCols as $sColIndex => $aFieldsets)
{
$aDetails[$sTab][$sColIndex] = array();
$oPage->add('<td style="vertical-align:top">');
//$aDetails[$sTab][$sColIndex] = array();
foreach($aFieldsets as $sFieldsetName => $aFields)
{
//if ($sFieldsetName == '')
//{
foreach($aFields as $sAttCode)
$aDetails[$sTab][$sColIndex] = array();
if (!empty($sFieldsetName))
{
$oPage->add('<fieldset>');
$oPage->add('<legend>'.Dict::S($sFieldsetName).'</legend>');
}
foreach($aFields as $sAttCode)
{
$val = $this->GetFieldAsHtml($sClass, $sAttCode, $sStateAttCode);
if ($val != null)
{
$val = $this->GetFieldAsHtml($sClass, $sAttCode, $sStateAttCode);
if ($val != null)
{
// The field is visible, add it to the current column
$aDetails[$sTab][$sColIndex][] = $val;
}
}
//}
// The field is visible, add it to the current column
$aDetails[$sTab][$sColIndex][] = $val;
}
}
$oPage->Details($aDetails[$sTab][$sColIndex]);
if (!empty($sFieldsetName))
{
$oPage->add('</fieldset>');
}
}
$oPage->add('<td style="vertical-align:top">');
$oPage->Details($aDetails[$sTab][$sColIndex]);
$oPage->add('</td>');
}
$oPage->add('</tr></table>');
@@ -459,7 +466,7 @@ abstract class cmdbAbstractObject extends CMDBObject
{
if (!$bSingleSelectMode)
{
$aAttribs['form::select'] = array('label' => "<input type=\"checkbox\" onChange=\"var value = this.checked; $('.selectList{$iListId}').each( function() { this.checked = value; } );\"></input>", 'description' => Dict::S('UI:SelectAllToggle+'));
$aAttribs['form::select'] = array('label' => "<input type=\"checkbox\" onClick=\"CheckAll('.selectList{$iListId}', this.checked);\"></input>", 'description' => Dict::S('UI:SelectAllToggle+'));
}
else
{
@@ -743,9 +750,15 @@ EOF
$aHeader[] = 'id';
foreach($aList[$sClassName] as $sAttCode => $oAttDef)
{
$sStar = '';
if ($oAttDef->IsExternalField())
{
$sExtKeyLabel = MetaModel::GetLabel($sClassName, $oAttDef->GetKeyAttCode());
$oExtKeyAttDef = MetaModel::GetAttributeDef($sClassName, $oAttDef->GetKeyAttCode());
if (!$oExtKeyAttDef->IsNullAllowed() && isset($aParams['showMandatoryFields']))
{
$sStar = '*';
}
$sRemoteAttLabel = MetaModel::GetLabel($oAttDef->GetTargetClass(), $oAttDef->GetExtAttCode());
$oTargetAttDef = MetaModel::GetAttributeDef($oAttDef->GetTargetClass(), $oAttDef->GetExtAttCode());
$sSuffix = '';
@@ -754,11 +767,15 @@ EOF
$sSuffix = '->id';
}
$aHeader[] = $sExtKeyLabel.'->'.$sRemoteAttLabel.$sSuffix;
$aHeader[] = $sExtKeyLabel.'->'.$sRemoteAttLabel.$sSuffix.$sStar;
}
else
{
$aHeader[] = MetaModel::GetLabel($sClassName, $sAttCode);
if (!$oAttDef->IsNullAllowed() && isset($aParams['showMandatoryFields']))
{
$sStar = '*';
}
$aHeader[] = MetaModel::GetLabel($sClassName, $sAttCode).$sStar;
}
}
}
@@ -882,14 +899,15 @@ EOF
}
$aOptions[MetaModel::GetName($sClassName)] = "<option selected value=\"$sClassName\">".MetaModel::GetName($sClassName)."</options>\n";
ksort($aOptions);
$sClassesCombo = "<select name=\"class\" onChange=\"ReloadSearchForm('$sSearchFormId', this.value, '$sRootClass')\">\n".implode('', $aOptions)."</select>\n";
$sContext = $oAppContext->GetForLink();
$sClassesCombo = "<select name=\"class\" onChange=\"ReloadSearchForm('$sSearchFormId', this.value, '$sRootClass', '$sContext')\">\n".implode('', $aOptions)."</select>\n";
}
else
{
$sClassesCombo = MetaModel::GetName($sClassName);
}
$oUnlimitedFilter = new DBObjectSearch($sClassName);
$sHtml .= "<form id=\"form{$iSearchFormId}\">\n";
$sHtml .= "<form id=\"form{$iSearchFormId}\" action=\"../pages/UI.php\">\n"; // Don't use $_SERVER['SCRIPT_NAME'] since the form may be called asynchronously (from ajax.php)
$sHtml .= "<h2>".Dict::Format('UI:SearchFor_Class_Objects', $sClassesCombo)."</h2>\n";
$index = 0;
$sHtml .= "<p>\n";
@@ -902,7 +920,7 @@ EOF
$aList = MetaModel::GetZListItems($sClassName, 'standard_search');
foreach($aList as $sFilterCode)
{
$oAppContext->Reset($sFilterCode); // Make sure the same parameter will not be passed twice
//$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, '');
@@ -946,11 +964,13 @@ EOF
}
$sValue .= "</select>\n";
$sHtml .= "<label>".MetaModel::GetFilterLabel($sClassName, $sFilterCode).":</label>&nbsp;$sValue\n";
unset($aExtraParams[$sFilterCode]);
}
else
{
// Any value is possible, display an input box
$sHtml .= "<label>".MetaModel::GetFilterLabel($sClassName, $sFilterCode).":</label>&nbsp;<input class=\"textSearch\" name=\"$sFilterCode\" value=\"$sFilterValue\"/>\n";
unset($aExtraParams[$sFilterCode]);
}
$index++;
$sHtml .= '</span> ';
@@ -970,7 +990,7 @@ EOF
{
$sHtml .= "</div><!-- Simple search form -->\n";
}
/*
// OQL query builder
$sHtml .= "<div id=\"OQLQuery{$iSearchFormId}\" style=\"display:none\" class=\"mini_tab{$iSearchFormId}\">\n";
$sHtml .= "<h1>".Dict::S('UI:OQLQueryBuilderTitle')."</h1>\n";
@@ -997,6 +1017,7 @@ EOF
$sHtml .= $oAppContext->GetForForm();
$sHtml .= "</table></form>\n";
$sHtml .= "</div><!-- OQL query form -->\n";
*/
return $sHtml;
}
@@ -1057,7 +1078,7 @@ EOF
case 'LinkedSet':
$aEventsList[] ='change';
$oWidget = new UILinksWidget($sClass, $sAttCode, $iId, $sNameSuffix);
$oWidget = new UILinksWidget($sClass, $sAttCode, $iId, $sNameSuffix, $oAttDef->DuplicatesAllowed());
$sHTMLValue = $oWidget->Display($oPage, $value);
break;
@@ -1105,9 +1126,9 @@ EOF
$sHTMLValue = "<input count=\"".count($aAllowedValues)."\" type=\"text\" id=\"label_$iId\" size=\"30\" maxlength=\"$iFieldSize\" value=\"$sDisplayValue\"/>&nbsp;{$sValidationField}";
// another hidden input to store & pass the object's Id
$sHTMLValue .= "<input type=\"hidden\" id=\"$iId\" name=\"attr_{$sFieldPrefix}{$sAttCode}{$sNameSuffix}\" value=\"$value\" />\n";
$oPage->add_ready_script("\$('#label_$iId').autocomplete('./ajax.render.php', { scroll:true, minChars:3, onItemSelect:selectItem, onFindValue:findValue, formatItem:formatItem, autoFill:true, keyHolder:'#$iId', extraParams:{operation:'autocomplete', sclass:'$sClass',attCode:'".$sAttCode."'}});");
$oPage->add_ready_script("\$('#label_$iId').autocomplete('./ajax.render.php', { scroll:true, minChars:3, formatItem:formatItem, autoFill:true, keyHolder:'#$iId', extraParams:{operation:'autocomplete', sclass:'$sClass',attCode:'".$sAttCode."'}});");
$oPage->add_ready_script("\$('#label_$iId').blur(function() { $(this).search(); } );");
$oPage->add_ready_script("\$('#label_$iId').result( function(event, data, formatted) { if (data) { $('#{$iId}').val(data[1]); $('#{$iId}').trigger('change'); } else { $('#{$iId}').val(''); $('#{$iId}').trigger('change');} } );");
$oPage->add_ready_script("\$('#label_$iId').result( function(event, data, formatted) { OnAutoComplete('$iId', event, data, formatted); } );");
$aEventsList[] ='change';
}
else
@@ -1115,7 +1136,7 @@ EOF
// Few choices, use a normal 'select'
// In case there are no valid values, the select will be empty, thus blocking the user from validating the form
$sHTMLValue = "<select title=\"$sHelpText\" name=\"attr_{$sFieldPrefix}{$sAttCode}{$sNameSuffix}\" id=\"$iId\">\n";
$sHTMLValue .= "<option value=\"0\">".Dict::S('UI:SelectOne')."</option>\n";
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SelectOne')."</option>\n";
foreach($aAllowedValues as $key => $display_value)
{
if ((count($aAllowedValues) == 1) && $bMandatory )
@@ -1184,69 +1205,107 @@ EOF
$oPage->AddTabContainer(OBJECT_PROPERTIES_TAB);
$oPage->SetCurrentTabContainer(OBJECT_PROPERTIES_TAB);
$oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
$aDetailsList = $this->FLattenZList(MetaModel::GetZListItems($sClass, 'details'));
// $aDetailsList = $this->FLattenZList(MetaModel::GetZListItems($sClass, 'details'));
//$aFullList = MetaModel::ListAttributeDefs($sClass);
$aList = array();
// Compute the list of properties to display, first the attributes in the 'details' list, then
// all the remaining attributes that are not external fields
foreach($aDetailsList as $sAttCode)
{
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if (!$oAttDef->IsExternalField())
{
$aList[] = $sAttCode;
}
}
// foreach($aDetailsList as $sAttCode)
// {
// $oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
// if (!$oAttDef->IsExternalField())
// {
// $aList[] = $sAttCode;
// }
// }
foreach($aList as $sAttCode)
$aDetailsList = MetaModel::GetZListItems($sClass, 'details');
$aDetailsStruct = self::ProcessZlist($aDetailsList, array('UI:PropertiesTab' => array()), 'UI:PropertiesTab', 'col1', '');
$sHtml = '';
$aDetails = array();
foreach($aDetailsStruct as $sTab => $aCols )
{
$iFlags = $this->GetAttributeFlags($sAttCode);
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if ( (!$oAttDef->IsLinkSet()) && (($iFlags & OPT_ATT_HIDDEN) == 0))
$aDetails[$sTab] = array();
ksort($aCols);
$oPage->SetCurrentTab(Dict::S($sTab));
$oPage->add('<table style="vertical-align:top"><tr>');
foreach($aCols as $sColIndex => $aFieldsets)
{
if ($oAttDef->IsWritable())
$oPage->add('<td style="vertical-align:top">');
//$aDetails[$sTab][$sColIndex] = array();
foreach($aFieldsets as $sFieldsetName => $aFields)
{
if ($sStateAttCode == $sAttCode)
$aDetails[$sTab][$sColIndex] = array();
if (!empty($sFieldsetName))
{
// State attribute is always read-only from the UI
$sHTMLValue = $this->GetStateLabel();
$aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $sHTMLValue);
$oPage->add('<fieldset>');
$oPage->add('<legend>'.Dict::S($sFieldsetName).'</legend>');
}
else
foreach($aFields as $sAttCode)
{
$iFlags = $this->GetAttributeFlags($sAttCode);
if ($iFlags & OPT_ATT_HIDDEN)
$aVal = null;
$iFlags = $this->GetAttributeFlags($sAttCode);
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if ( (!$oAttDef->IsLinkSet()) && (($iFlags & OPT_ATT_HIDDEN) == 0))
{
// Attribute is hidden, do nothing
}
else
{
if ($iFlags & OPT_ATT_READONLY)
if ($oAttDef->IsWritable())
{
// Attribute is read-only
$sHTMLValue = $this->GetAsHTML($sAttCode);
if ($sStateAttCode == $sAttCode)
{
// State attribute is always read-only from the UI
$sHTMLValue = $this->GetStateLabel();
$aVal = array('label' => $oAttDef->GetLabel(), 'value' => $sHTMLValue);
}
else
{
$iFlags = $this->GetAttributeFlags($sAttCode);
if ($iFlags & OPT_ATT_HIDDEN)
{
// Attribute is hidden, do nothing
}
else
{
if ($iFlags & OPT_ATT_READONLY)
{
// Attribute is read-only
$sHTMLValue = $this->GetAsHTML($sAttCode);
}
else
{
$sValue = $this->Get($sAttCode);
$sDisplayValue = $this->GetEditValue($sAttCode);
$aArgs = array('this' => $this);
$sInputId = $this->m_iFormId.'_'.$sAttCode;
$sHTMLValue = "<span id=\"field_{$sInputId}\">".self::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $sValue, $sDisplayValue, $sInputId, '', $iFlags, $aArgs).'</span>';
$aFieldsMap[$sAttCode] = $sInputId;
}
$aVal = array('label' => '<span title="'.$oAttDef->GetDescription().'">'.$oAttDef->GetLabel().'</span>', 'value' => $sHTMLValue);
}
}
}
else
{
$sValue = $this->Get($sAttCode);
$sDisplayValue = $this->GetEditValue($sAttCode);
$aArgs = array('this' => $this);
$sInputId = $this->m_iFormId.'_'.$sAttCode;
$sHTMLValue = "<span id=\"field_{$sInputId}\">".self::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $sValue, $sDisplayValue, $sInputId, '', $iFlags, $aArgs).'</span>';
$aFieldsMap[$sAttCode] = $sInputId;
$aVal = array('label' => '<span title="'.$oAttDef->GetDescription().'">'.$oAttDef->GetLabel().'</span>', 'value' => $this->GetAsHTML($sAttCode));
}
$aDetails[] = array('label' => '<span title="'.$oAttDef->GetDescription().'">'.$oAttDef->GetLabel().'</span>', 'value' => $sHTMLValue);
}
if ($aVal != null)
{
// The field is visible, add it to the current column
$aDetails[$sTab][$sColIndex][] = $aVal;
}
}
$oPage->Details($aDetails[$sTab][$sColIndex]);
if (!empty($sFieldsetName))
{
$oPage->add('</fieldset>');
}
}
else
{
$aDetails[] = array('label' => '<span title="'.$oAttDef->GetDescription().'">'.$oAttDef->GetLabel().'</span>', 'value' => $this->GetAsHTML($sAttCode));
}
$oPage->add('</td>');
}
$oPage->add('</tr></table>');
}
$oPage->details($aDetails);
// Now display the relations, one tab per relation
$this->DisplayBareRelations($oPage, true); // Edit mode
@@ -1413,7 +1472,7 @@ EOF
}
else
{
$aResult = array_merge($aResult, $this->FlattenZList($value));
$aResult = array_merge($aResult,self::FlattenZList($value));
}
}
return $aResult;
@@ -1552,5 +1611,22 @@ EOF
}
return $aResult;
}
/**
* Maps the given context parameter name to the appropriate filter/search code for this class
* @param string $sContextParam Name of the context parameter, i.e. 'org_id'
* @return string Filter code, i.e. 'customer_id'
*/
public static function MapContextParam($sContextParam)
{
if ($sContextParam == 'menu')
{
return null;
}
else
{
return $sContextParam;
}
}
}
?>

View File

@@ -320,17 +320,40 @@ class DisplayBlock
}
if ($this->m_sStyle != 'links')
{
$aFilterCodes = array_keys(MetaModel::GetClassFilterDefs($this->m_oFilter->GetClass()));
$oAppContext = new ApplicationContext();
$sClass = $this->m_oFilter->GetClass();
$aFilterCodes = array_keys(MetaModel::GetClassFilterDefs($sClass));
foreach($oAppContext->GetNames() as $sContextParam)
{
eval("\$sParamCode = $sClass::MapContextParam('$sContextParam');"); //Map context parameter to the value/filter code depending on the class
if (!is_null($sParamCode))
{
$sParamValue = $oAppContext->GetCurrentValue($sContextParam, null);
if (!is_null($sParamValue))
{
$aExtraParams[$sParamCode] = $sParamValue;
}
}
}
foreach($aFilterCodes as $sFilterCode)
{
$sExternalFilterValue = utils::ReadParam($sFilterCode, '');
$condition = null;
if (isset($aExtraParams[$sFilterCode]))
{
$this->m_oFilter->AddCondition($sFilterCode, trim($aExtraParams[$sFilterCode])); // Use the default 'loose' operator
$condition = $aExtraParams[$sFilterCode];
}
else if ($bDoSearch && $sExternalFilterValue != "")
// else if ($bDoSearch && $sExternalFilterValue != "")
if ($bDoSearch && $sExternalFilterValue != "")
{
$this->m_oFilter->AddCondition($sFilterCode, trim($sExternalFilterValue)); // Use the default 'loose' operator
// Search takes precedence over context params...
unset($aExtraParams[$sFilterCode]);
$condition = trim($sExternalFilterValue);
}
if (!is_null($condition))
{
$this->m_oFilter->AddCondition($sFilterCode, $condition); // Use the default 'loose' operator
}
}
}
@@ -582,7 +605,7 @@ class DisplayBlock
$aFilterCodes = array_keys(MetaModel::GetClassFilterDefs($this->m_oFilter->GetClass()));
foreach($oAppContext->GetNames() as $sFilterCode)
{
$sContextParamValue = trim(utils::ReadParam($sFilterCode, null));
$sContextParamValue = $oAppContext->GetCurrentValue($sFilterCode, null);
if (!is_null($sContextParamValue) && ! empty($sContextParamValue) && MetaModel::IsValidFilterCode($sClass, $sFilterCode))
{
$this->m_oFilter->AddCondition($sFilterCode, $sContextParamValue); // Use the default 'loose' operator
@@ -596,7 +619,7 @@ class DisplayBlock
$this->m_oSet = new CMDBObjectSet($this->m_oFilter, array(), $aQueryParams);
}
$iCount = $this->m_oSet->Count();
$sHyperlink = '../pages/UI.php?operation=search&filter='.$this->m_oFilter->serialize();
$sHyperlink = '../pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$this->m_oFilter->serialize();
$sHtml .= '<p><a class="actions" href="'.$sHyperlink.'">';
$sHtml .= MetaModel::GetClassIcon($sClass, true, 'float;left;margin-right:10px;');
$sHtml .= MetaModel::GetName($sClass).': '.$iCount.'</a></p>';
@@ -624,7 +647,7 @@ class DisplayBlock
$aFilterCodes = array_keys(MetaModel::GetClassFilterDefs($this->m_oFilter->GetClass()));
foreach($oAppContext->GetNames() as $sFilterCode)
{
$sContextParamValue = trim(utils::ReadParam($sFilterCode, null));
$sContextParamValue = $oAppContext->GetCurrentValue($sFilterCode, null);
if (!is_null($sContextParamValue) && ! empty($sContextParamValue) && MetaModel::IsValidFilterCode($sClass, $sFilterCode))
{
$this->m_oFilter->AddCondition($sFilterCode, $sContextParamValue); // Use the default 'loose' operator
@@ -657,7 +680,7 @@ class DisplayBlock
}
else
{
$sHyperlink = '../pages/UI.php?operation=search&filter='.$oFilter->serialize();
$sHyperlink = '../pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$oFilter->serialize();
$aCounts[$sStateValue] = "<a href=\"$sHyperlink\">{$aCounts[$sStateValue]}</a>";
}
}
@@ -666,7 +689,7 @@ class DisplayBlock
$sHtml .= '<tr><td>'.implode('</td><td>', $aCounts).'</td></tr></table></div>';
// Title & summary
$iCount = $this->m_oSet->Count();
$sHyperlink = '../pages/UI.php?operation=search&filter='.$this->m_oFilter->serialize();
$sHyperlink = '../pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.$this->m_oFilter->serialize();
$sHtml .= '<h1>'.Dict::S(str_replace('_', ':', $sTitle)).'</h1>';
$sHtml .= '<a class="summary" href="'.$sHyperlink.'">'.Dict::Format(str_replace('_', ':', $sLabel), $iCount).'</a>';
break;

View File

@@ -32,12 +32,12 @@ require_once("../application/user.preferences.class.inc.php");
class iTopWebPage extends NiceWebPage
{
private $m_sMenu;
private $m_currentOrganization;
// private $m_currentOrganization;
private $m_aTabs;
private $m_sCurrentTabContainer;
private $m_sCurrentTab;
public function __construct($sTitle, $currentOrganization)
public function __construct($sTitle)
{
parent::__construct($sTitle);
$this->m_sCurrentTabContainer = '';
@@ -46,7 +46,7 @@ class iTopWebPage extends NiceWebPage
$this->m_sMenu = "";
$oAppContext = new ApplicationContext();
$sExtraParams = $oAppContext->GetForLink();
$this->m_currentOrganization = $currentOrganization;
// $this->m_currentOrganization = $currentOrganization;
$this->add_header("Content-type: text/html; charset=utf-8");
$this->add_header("Cache-control: no-cache");
$this->add_linked_stylesheet("../css/jquery.treeview.css");
@@ -359,24 +359,6 @@ EOF
// }
// }
// For automplete
function findValue(li) {
if( li == null ) return alert("No match!");
// if coming from an AJAX call, let's use the CityId as the value
if( !!li.extra ) var sValue = li.extra[0];
// otherwise, let's just display the value in the text box
else var sValue = li.selectValue;
//alert(\"The value you selected was: \" + sValue);
}
function selectItem(li) {
findValue(li);
}
function formatItem(row) {
return row[0];
}
@@ -478,15 +460,17 @@ EOF
break;
default:
$oAppContext = new ApplicationContext();
$iCurrentOrganization = $oAppContext->GetCurrentValue('org_id');
$sHtml = '<div id="SiloSelection">';
$sHtml .= '<form style="display:inline" action="'.$_SERVER['PHP_SELF'].'"><select style="width:150px;font-size:x-small" name="org_id" title="Pick an organization" onChange="this.form.submit();">';
$sSelected = ($this->m_currentOrganization == '') ? ' selected' : '';
$sHtml .= '<form style="display:inline" action="'.$_SERVER['PHP_SELF'].'"><select style="width:150px;font-size:x-small" name="c[org_id]" title="Pick an organization" onChange="this.form.submit();">';
$sSelected = ($iCurrentOrganization == '') ? ' selected' : '';
$sHtml .= '<option value=""'.$sSelected.'>'.Dict::S('UI:AllOrganizations').'</option>';
while($oOrg = $oSet->Fetch())
{
if ($this->m_currentOrganization == $oOrg->GetKey())
if ($iCurrentOrganization == $oOrg->GetKey())
{
$oCurrentOrganization = $oOrg;
// $oCurrentOrganization = $oOrg;
$sSelected = " selected";
}
@@ -498,8 +482,8 @@ EOF
}
$sHtml .= '</select>';
// Add other dimensions/context information to this form
$oAppContext = new ApplicationContext();
$oAppContext->Reset('org_id'); // Org id is handled above and we want to be able to change it here !
// $oAppContext = new ApplicationContext();
$oAppContext->Reset('org_id'); // org_id is handled above and we want to be able to change it here !
$sHtml .= $oAppContext->GetForForm();
$sHtml .= '</form>';
$sHtml .= '</div>';
@@ -511,10 +495,9 @@ EOF
{
// Display the menu
$oAppContext = new ApplicationContext();
$iActiveNodeId = ApplicationMenu::GetActiveNodeId();
$iAccordionIndex = 0;
ApplicationMenu::DisplayMenu($this, $oAppContext->GetAsHash(), $iActiveNodeId);
ApplicationMenu::DisplayMenu($this, $oAppContext->GetAsHash());
}
/**
@@ -542,8 +525,10 @@ EOF
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
echo "<html>\n";
echo "<head>\n";
echo "<title>{$this->s_title}</title>\n";
// Make sure that Internet Explorer renders the page using its latest/highest/greatest standards !
echo "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
echo "<title>{$this->s_title}</title>\n";
echo $this->get_base_tag();
// Stylesheets MUST be loaded before any scripts otherwise
// jQuery scripts may face some spurious problems (like failing on a 'reload')

View File

@@ -201,7 +201,7 @@ EOF
{
$bSecured = false;
if ( !empty($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!= 'off') )
if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off'))
{
$bSecured = true;
}
@@ -339,6 +339,7 @@ EOF
static function DoLogin($bMustBeAdmin = false, $bIsAllowedToPortalUsers = false)
{
$operation = utils::ReadParam('loginop', '');
session_name(utils::GetConfig()->Get('session_name'));
session_start();
if ($operation == 'logoff')

View File

@@ -218,7 +218,8 @@ class ApplicationMenu
*/
static public function GetActiveNodeId()
{
$iMenuIndex = utils::ReadParam('menu', -1);
$oAppContext = new ApplicationContext();
$iMenuIndex = $oAppContext->GetCurrentValue('menu', -1);
if ($iMenuIndex == -1)
{
@@ -319,7 +320,7 @@ abstract class MenuNode
public function GetHyperlink($aExtraParams)
{
$aExtraParams['menu'] = $this->GetIndex();
$aExtraParams['c[menu]'] = $this->GetIndex();
return $this->AddParams('../pages/UI.php', $aExtraParams);
}
@@ -593,7 +594,7 @@ class WebPageMenuNode extends MenuNode
public function GetHyperlink($aExtraParams)
{
$aExtraParams['menu'] = $this->GetIndex();
$aExtraParams['c[menu]'] = $this->GetIndex();
return $this->AddParams( $this->sHyperlink, $aExtraParams);
}
@@ -631,7 +632,7 @@ class NewObjectMenuNode extends MenuNode
public function GetHyperlink($aExtraParams)
{
$sHyperlink = '../pages/UI.php?operation=new&class='.$this->sClass;
$aExtraParams['menu'] = $this->GetIndex();
$aExtraParams['c[menu]'] = $this->GetIndex();
return $this->AddParams($sHyperlink, $aExtraParams);
}

View File

@@ -240,7 +240,7 @@ class DisplayTemplate
</itoptab>
</itoptabs>';
$oPage = new iTopWebPage('Unit Test', 3);
$oPage = new iTopWebPage('Unit Test');
//$oPage->add("Template content: <pre>".htmlentities($sTemplate)."</pre>\n");
$oTemplate = new DisplayTemplate($sTemplate);
$oTemplate->Render($oPage, array('class'=>'Network device','pkey'=> 271, 'name' => 'deliversw01.mecanorama.fr', 'org_id' => 3));

View File

@@ -17,94 +17,81 @@
/**
* This class records the pending "transactions" corresponding to forms that have not been
* submitted yet, in order to prevent double submissions. When created a transaction remains valid
* until it is "used" by calling IsTransactionValid once, or until it
* expires (delay = TRANSACTION_EXPIRATION_DELAY, defaults to 4 hours)
* until the user's session expires
* @package iTop
*/
// How long a "transaction" is considered valid, i.e. when a form is submitted
// if the form dates back from too long a time, it is considered invalid. This is
// because since HTTP is not a connected protocol, we cannot know when a user disconnects
// from the application (maybe just by closing her browser), so we keep track - in the database - of all pending
// forms that have not yet been submitted. To limit this list we consider that after some time
// a "transaction" is no loger valid an gets purged from the table
define ('TRANSACTION_EXPIRATION_DELAY', 3600*4); // default: 4h
require_once('../core/dbobject.class.php');
class privUITransaction extends DBObject
class privUITransaction
{
public static function Init()
{
$aParams = array
(
"category" => "gui",
"key_type" => "autoincrement",
"name_attcode" => "expiration_date",
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_transaction",
"db_key_field" => "id",
"db_finalclass_field" => "",
);
MetaModel::Init_Params($aParams);
MetaModel::Init_AddAttribute(new AttributeDateTime("expiration_date", array("allowed_values"=>null, "sql"=>"expiration_date", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_SetZListItems('details', array('expiration_date')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('expiration_date')); // Attributes to be displayed for a list
}
/**
* Create a new transaction, store it in the database and return its id
* Create a new transaction id, store it in the session and return its id
* @param void
* @return int The identifier of the new transaction
*/
public static function GetNewTransactionId()
{
// First remove all the expired transactions...
self::CleanupExpiredTransactions();
$oTransaction = new privUITransaction();
$sDate = date('Y-m-d H:i:s', time()+TRANSACTION_EXPIRATION_DELAY);
$oTransaction->Set('expiration_date', $sDate); // 4 h delay by default
$oTransaction->DBInsert();
return sprintf("%d", $oTransaction->GetKey());
if (!isset($_SESSION['transactions']))
{
$_SESSION['transactions'] = array();
}
// Strictly speaking, the two lines below should be grouped together
// by a critical section
// sem_acquire($rSemIdentified);
$id = 1 + count($_SESSION['transactions']);
$_SESSION['transactions'][$id] = true;
// sem_release($rSemIdentified);
return sprintf("%d", $id);
}
/**
* Check whether a transaction is valid or not and remove the valid transaction from
* the database so that another call to IsTransactionValid for the same transaction
* Check whether a transaction is valid or not and (optionally) remove the valid transaction from
* the session so that another call to IsTransactionValid for the same transaction id
* will return false
* @param int $id Identifier of the transaction, as returned by GetNewTransactionId
* @param bool $bRemoveTransaction True if the transaction must be removed
* @return bool True if the transaction is valid, false otherwise
*/
public static function IsTransactionValid($id)
public static function IsTransactionValid($id, $bRemoveTransaction = true)
{
// First remove all the expired transactions...
self::CleanupExpiredTransactions();
// TO DO put a critical section around this part to be 100% safe...
// sem_acquire(...)
$bResult = false;
$oTransaction = MetaModel::GetObject('privUITransaction', $id, false /* MustBeFound */);
if ($oTransaction)
$bResult = false;
if (isset($_SESSION['transactions']))
{
$bResult = true;
$oTransaction->DBDelete();
// Strictly speaking, the eight lines below should be grouped together
// inside the same critical section as above
// sem_acquire($rSemIdentified);
if (isset($_SESSION['transactions'][$id]))
{
$bResult = true;
if ($bRemoveTransaction)
{
unset($_SESSION['transactions'][$id]);
}
}
// sem_release($rSemIdentified);
}
// sem_release(...)
return $bResult;
}
/**
* Remove from the database all transactions that have expired
* Removes the transaction specified by its id
* @param int $id The Identifier (as returned by GetNewTranscationId) of the transaction to be removed.
* @return void
*/
protected static function CleanupExpiredTransactions()
public static function RemoveTransaction($id)
{
$sQuery = 'SELECT privUITransaction WHERE expiration_date < NOW()';
$oSearch = DBObjectSearch::FromOQL($sQuery);
$oSet = new DBObjectSet($oSearch);
while($oTransaction = $oSet->Fetch())
if (isset($_SESSION['transactions']))
{
$oTransaction->DBDelete();
}
// Strictly speaking, the three lines below should be grouped together
// inside the same critical section as above
// sem_acquire($rSemIdentified);
if (isset($_SESSION['transactions'][$id]))
{
unset($_SESSION['transactions'][$id]);
}
// sem_release($rSemIdentified);
}
}
}
?>

View File

@@ -36,14 +36,16 @@ class UILinksWidget
protected $m_sExtKeyToRemote;
protected $m_sLinkedClass;
protected $m_sRemoteClass;
protected $m_bDuplicatesAllowed;
protected static $iWidgetIndex = 0;
public function __construct($sClass, $sAttCode, $iInputId, $sNameSuffix = '')
public function __construct($sClass, $sAttCode, $iInputId, $sNameSuffix = '', $bDuplicatesAllowed = false)
{
$this->m_sClass = $sClass;
$this->m_sAttCode = $sAttCode;
$this->m_sNameSuffix = $sNameSuffix;
$this->m_iInputId = $iInputId;
$this->m_bDuplicatesAllowed = $bDuplicatesAllowed;
$this->m_aEditableFields = array();
self::$iWidgetIndex++;
@@ -58,7 +60,7 @@ class UILinksWidget
$this->m_aEditableFields = array();
$this->m_aTableConfig = array();
$this->m_aTableConfig['form::checkbox'] = array( 'label' => "<input class=\"select_all\" type=\"checkbox\" value=\"1\" onChange=\"var value = this.checked; $('#linkedset_{$this->m_sAttCode}{$this->m_sNameSuffix} .selection').each( function() { this.checked = value; } ); oWidget".self::$iWidgetIndex.".OnSelectChange();\">", 'description' => Dict::S('UI:SelectAllToggle+'));
$this->m_aTableConfig['form::checkbox'] = array( 'label' => "<input class=\"select_all\" type=\"checkbox\" value=\"1\" onClick=\"CheckAll('#linkedset_{$this->m_sAttCode}{$this->m_sNameSuffix} .selection', this.checked); oWidget".self::$iWidgetIndex.".OnSelectChange();\">", 'description' => Dict::S('UI:SelectAllToggle+'));
foreach(MetaModel::ListAttributeDefs($this->m_sLinkedClass) as $sAttCode=>$oAttDef)
{
@@ -222,8 +224,9 @@ class UILinksWidget
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs);
}
$sHtmlValue .= $this->DisplayFormTable($oPage, $this->m_aTableConfig, $aForm);
$sDuplicates = ($this->m_bDuplicatesAllowed) ? 'true' : 'false';
$oPage->add_ready_script(<<<EOF
oWidget$iWidgetIndex = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}');
oWidget$iWidgetIndex = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}', $sDuplicates);
oWidget$iWidgetIndex.Init();
EOF
);
@@ -383,7 +386,7 @@ EOF
// No remote class specified use the one defined in the linkedset
$oFilter = new DBObjectSearch($this->m_sRemoteClass);
}
if (count($aAlreadyLinkedIds) > 0)
if (!$this->m_bDuplicatesAllowed && count($aAlreadyLinkedIds) > 0)
{
// Positive IDs correspond to existing link records
// negative IDs correspond to "remote" objects to be linked

View File

@@ -52,10 +52,13 @@ class UIPasswordWidget
{
$sCode = $this->sAttCode.$this->sNameSuffix;
$iWidgetIndex = self::$iWidgetIndex;
$sPasswordValue = utils::ReadPostedParam("attr_$sCode", '*****');
$sConfirmPasswordValue = utils::ReadPostedParam("attr_{$sCode}_confirmed", '*****');
$sChangedValue = (($sPasswordValue != '*****') || ($sConfirmPasswordValue != '*****')) ? 1 : 0;
$sHtmlValue = '';
$sHtmlValue = '<input type="password" maxlength="255" name="attr_'.$sCode.'" id="'.$this->iId.'" value="*****"/>&nbsp;<span id="v_'.$this->iId.'"></span><br/>';
$sHtmlValue .= '<input type="password" maxlength="255" id="'.$this->iId.'_confirm" value="*****"/> '.Dict::S('UI:PasswordConfirm').' <input type="button" value="'.Dict::S('UI:Button:ResetPassword').'" onClick="ResetPwd(\''.$this->iId.'\');">';
$sHtmlValue .= '<input type="hidden" id="'.$this->iId.'_changed" name="attr_'.$sCode.'_changed" value="0"/>';
$sHtmlValue = '<input type="password" maxlength="255" name="attr_'.$sCode.'" id="'.$this->iId.'" value="'.htmlentities($sPasswordValue, ENT_QUOTES, 'UTF-8').'"/>&nbsp;<span id="v_'.$this->iId.'"></span><br/>';
$sHtmlValue .= '<input type="password" maxlength="255" id="'.$this->iId.'_confirm" value="'.htmlentities($sConfirmPasswordValue, ENT_QUOTES, 'UTF-8').'" name="attr_'.$sCode.'_confirmed"/> '.Dict::S('UI:PasswordConfirm').' <input type="button" value="'.Dict::S('UI:Button:ResetPassword').'" onClick="ResetPwd(\''.$this->iId.'\');">';
$sHtmlValue .= '<input type="hidden" id="'.$this->iId.'_changed" name="attr_'.$sCode.'_changed" value="'.$sChangedValue.'"/>';
$oPage->add_ready_script("$('#$this->iId').bind('keyup change', function(evt) { return PasswordFieldChanged('$this->iId') } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#$this->iId').bind('keyup change', function(evt) { return PasswordFieldChanged('$this->iId') } );"); // Bind to a custom event: validate

View File

@@ -157,9 +157,14 @@ class utils
return privUITransaction::GetNewTransactionId();
}
public static function IsTransactionValid($sId)
public static function IsTransactionValid($sId, $bRemoveTransaction = true)
{
return privUITransaction::IsTransactionValid($sId);
return privUITransaction::IsTransactionValid($sId, $bRemoveTransaction);
}
public static function RemoveTransaction($sId)
{
return privUITransaction::RemoveTransaction($sId);
}
public static function ReadFromFile($sFileName)
@@ -226,7 +231,7 @@ class utils
static public function GetAbsoluteUrl($bQueryString = true, $bForceHTTPS = false)
{
// Build an absolute URL to this page on this server/port
$sServerName = $_SERVER['SERVER_NAME'];
$sServerName = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
if (self::GetConfig()->GetSecureConnectionRequired() || self::GetConfig()->GetHttpsHyperlinks())
{
// If a secure connection is required, or if the URL is requested to start with HTTPS
@@ -240,14 +245,15 @@ class utils
}
else
{
$sProtocol = isset($_SERVER['HTTPS']) ? 'https' : 'http';
$sProtocol = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!="off")) ? 'https' : 'http';
$iPort = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : 80;
if ($sProtocol == 'http')
{
$sPort = ($_SERVER['SERVER_PORT'] == 80) ? '' : ':'.$_SERVER['SERVER_PORT'];
$sPort = ($iPort == 80) ? '' : ':'.$iPort;
}
else
{
$sPort = ($_SERVER['SERVER_PORT'] == 443) ? '' : ':'.$_SERVER['SERVER_PORT'];
$sPort = ($iPort == 443) ? '' : ':'.$iPort;
}
}
// $_SERVER['REQUEST_URI'] is empty when running on IIS

View File

@@ -30,23 +30,63 @@ require_once("../application/webpage.class.inc.php");
*/
class XMLPage extends WebPage
{
function __construct($s_title)
/**
* For big XML files, it's better NOT to store everything in memory and output the XML piece by piece
*/
var $m_bPassThrough;
var $m_bHeaderSent;
function __construct($s_title, $bPassThrough = false)
{
parent::__construct($s_title);
$this->add_header("Content-type: text/xml; charset=utf-8");
$this->m_bPassThrough = $bPassThrough;
$this->m_bHeaderSent = false;
$this->add_header("Content-type: text/xml; charset=utf-8");
$this->add_header("Cache-control: no-cache");
$this->add_header("Content-location: export.xml");
$this->add("<?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n");
}
public function output()
{
$this->add_header("Content-Length: ".strlen(trim($this->s_content)));
foreach($this->a_headers as $s_header)
{
header($s_header);
}
echo trim($this->s_content);
if (!$this->m_bPassThrough)
{
$this->add("<?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n");
$this->add_header("Content-Length: ".strlen(trim($this->s_content)));
foreach($this->a_headers as $s_header)
{
header($s_header);
}
echo trim($this->s_content);
}
}
public function add($sText)
{
if (!$this->m_bPassThrough)
{
parent::add($sText);
}
else
{
if ($this->m_bHeaderSent)
{
echo $sText;
}
else
{
$s_captured_output = ob_get_contents();
ob_end_clean();
foreach($this->a_headers as $s_header)
{
header($s_header);
}
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n";
echo trim($s_captured_output);
echo trim($this->s_content);
echo $sText;
$this->m_bHeaderSent = true;
}
}
}
public function small_p($sText)

View File

@@ -488,7 +488,7 @@ class Str
*/
protected static function xmlencode($string)
{
return self::xmlentities(iconv("ISO-8859-1", "UTF-8//IGNORE",$string));
return self::xmlentities(iconv("UTF-8", "UTF-8//IGNORE",$string));
}
public static function islowcase($sString)

View File

@@ -359,6 +359,7 @@ class AttributeLinkedSet extends AttributeDefinition
{
return "ERROR: LIST OF OBJECTS";
}
public function DuplicatesAllowed() {return false;} // No duplicates for 1:n links, never
}
/**
@@ -375,6 +376,7 @@ class AttributeLinkedSetIndirect extends AttributeLinkedSet
public function IsIndirect() {return true;}
public function GetExtKeyToRemote() { return $this->Get('ext_key_to_remote'); }
public function GetEditClass() {return "LinkedSet";}
public function DuplicatesAllowed() {return $this->GetOptional("duplicates", false);} // The same object may be linked several times... or not...
}
/**
@@ -575,6 +577,106 @@ class AttributeInteger extends AttributeDBField
}
}
/**
* Map a decimal value column (suitable for financial computations) to an attribute
* internally in PHP such numbers are represented as string. Should you want to perform
* a calculation on them, it is recommended to use the BC Math functions in order to
* retain the precision
*
* @package iTopORM
*/
class AttributeDecimal extends AttributeDBField
{
static protected function ListExpectedParams()
{
return array_merge(parent::ListExpectedParams(), array('digits', 'decimals' /* including precision */));
}
public function GetType() {return "Decimal";}
public function GetTypeDesc() {return "Decimal value (could be negative)";}
public function GetEditClass() {return "String";}
protected function GetSQLCol() {return "DECIMAL(".$this->Get('digits').",".$this->Get('decimals').")";}
public function GetValidationPattern()
{
$iNbDigits = $this->Get('digits');
$iPrecision = $this->Get('decimals');
$iNbIntegerDigits = $iNbDigits - $iPrecision - 1; // -1 because the first digit is treated separately in the pattern below
return "^[-+]?[0-9]\d{0,$iNbIntegerDigits}(\.\d{0,$iPrecision})?$";
}
public function GetBasicFilterOperators()
{
return array(
"!="=>"differs from",
"="=>"equals",
">"=>"greater (strict) than",
">="=>"greater than",
"<"=>"less (strict) than",
"<="=>"less than",
"in"=>"in"
);
}
public function GetBasicFilterLooseOperator()
{
// Unless we implement an "equals approximately..." or "same order of magnitude"
return "=";
}
public function GetBasicFilterSQLExpr($sOpCode, $value)
{
$sQValue = CMDBSource::Quote($value);
switch ($sOpCode)
{
case '!=':
return $this->GetSQLExpr()." != $sQValue";
break;
case '>':
return $this->GetSQLExpr()." > $sQValue";
break;
case '>=':
return $this->GetSQLExpr()." >= $sQValue";
break;
case '<':
return $this->GetSQLExpr()." < $sQValue";
break;
case '<=':
return $this->GetSQLExpr()." <= $sQValue";
break;
case 'in':
if (!is_array($value)) throw new CoreException("Expected an array for argument value (sOpCode='$sOpCode')");
return $this->GetSQLExpr()." IN ('".implode("', '", $value)."')";
break;
case '=':
default:
return $this->GetSQLExpr()." = \"$value\"";
}
}
public function GetNullValue()
{
return null;
}
public function IsNull($proposedValue)
{
return is_null($proposedValue);
}
public function MakeRealValue($proposedValue)
{
if (is_null($proposedValue)) return null;
if ($proposedValue == '') return null;
return (string)$proposedValue;
}
public function ScalarToSQL($value)
{
assert(is_null($value) || preg_match('/'.$this->GetValidationPattern().'/', $value));
return (string)$value; // treated as a string
}
}
/**
* Map a boolean column to an attribute
*
@@ -986,6 +1088,12 @@ class AttributeEmailAddress extends AttributeString
{
return "^([0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})$";
}
public function GetAsHTML($sValue)
{
if (empty($sValue)) return '';
return '<a class="mailto" href="mailto:'.$sValue.'">'.parent::GetAsHTML($sValue).'</a>';
}
}
/**
@@ -1096,6 +1204,22 @@ class AttributeEnum extends AttributeString
}
}
public function ScalarToSQL($value)
{
// Note: for strings, the null value is an empty string and it is recorded as such in the DB
// but that wasn't working for enums, because '' is NOT one of the allowed values
// that's why a null value must be forced to a real null
$value = parent::ScalarToSQL($value);
if ($this->IsNull($value))
{
return null;
}
else
{
return $value;
}
}
public function RequiresIndex()
{
return false;
@@ -1117,7 +1241,15 @@ class AttributeEnum extends AttributeString
public function GetAsHTML($sValue)
{
$sLabel = Dict::S('Class:'.$this->GetHostClass().'/Attribute:'.$this->GetCode().'/Value:'.$sValue, $sValue);
if (is_null($sValue))
{
// Unless a specific label is defined for the null value of this enum, use a generic "undefined" label
$sLabel = Dict::S('Class:'.$this->GetHostClass().'/Attribute:'.$this->GetCode().'/Value:'.$sValue, Dict::S('Enum:Undefined'));
}
else
{
$sLabel = Dict::S('Class:'.$this->GetHostClass().'/Attribute:'.$this->GetCode().'/Value:'.$sValue, $sValue);
}
$sDescription = Dict::S('Class:'.$this->GetHostClass().'/Attribute:'.$this->GetCode().'/Value:'.$sValue.'+', $sValue);
// later, we could imagine a detailed description in the title
return "<span title=\"$sDescription\">".parent::GetAsHtml($sLabel)."</span>";
@@ -1139,7 +1271,19 @@ class AttributeEnum extends AttributeString
$aLocalizedValues[$sKey] = Dict::S('Class:'.$this->GetHostClass().'/Attribute:'.$this->GetCode().'/Value:'.$sKey, $sKey);
}
return $aLocalizedValues;
}
}
/**
* Processes the input value to align it with the values supported
* by this type of attribute. In this case: turns empty strings into nulls
* @param mixed $proposedValue The value to be set for the attribute
* @return mixed The actual value that will be set
*/
public function MakeRealValue($proposedValue)
{
if ($proposedValue == '') return null;
return parent::MakeRealValue($proposedValue);
}
}
/**
@@ -1583,6 +1727,7 @@ class AttributeExternalKey extends AttributeDBFieldVoid
public function MakeRealValue($proposedValue)
{
if (is_null($proposedValue)) return 0;
if ($proposedValue === '') return 0;
if (MetaModel::IsValidObject($proposedValue)) return $proposedValue->GetKey();
return (int)$proposedValue;
}

View File

@@ -127,6 +127,33 @@ class CellStatus_Issue extends CellStatus_Modify
}
}
class CellStatus_SearchIssue extends CellStatus_Issue
{
public function __construct()
{
parent::__construct(null, null, null);
}
public function GetDescription()
{
return 'No match';
}
}
class CellStatus_NullIssue extends CellStatus_Issue
{
public function __construct()
{
parent::__construct(null, null, null);
}
public function GetDescription()
{
return 'Missing mandatory value';
}
}
class CellStatus_Ambiguous extends CellStatus_Issue
{
protected $m_iCount;
@@ -247,6 +274,21 @@ class BulkChange
return array($oReconFilter->ToOql(), $aKeys);
}
// Returns true if the CSV data specifies that the external key must be left undefined
protected function IsNullExternalKeySpec($aRowData, $sAttCode)
{
$oExtKey = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
foreach ($this->m_aExtKeys[$sAttCode] as $sForeignAttCode => $iCol)
{
// The foreign attribute is one of our reconciliation key
if (strlen($aRowData[$iCol]) > 0)
{
return false;
}
}
return true;
}
protected function PrepareObject(&$oTargetObj, $aRowData, &$aErrors)
{
$aResults = array();
@@ -260,36 +302,49 @@ class BulkChange
// if (!array_key_exists($sAttCode, $this->m_aAttList)) continue;
$oExtKey = MetaModel::GetAttributeDef(get_class($oTargetObj), $sAttCode);
$oReconFilter = new CMDBSearchFilter($oExtKey->GetTargetClass());
foreach ($aKeyConfig as $sForeignAttCode => $iCol)
if ($this->IsNullExternalKeySpec($aRowData, $sAttCode))
{
// The foreign attribute is one of our reconciliation key
$oReconFilter->AddCondition($sForeignAttCode, $aRowData[$iCol], '=');
$aResults[$iCol] = new CellStatus_Void($aRowData[$iCol]);
}
$oExtObjects = new CMDBObjectSet($oReconFilter);
switch($oExtObjects->Count())
{
case 0:
foreach ($aKeyConfig as $sForeignAttCode => $iCol)
{
$aResults[$iCol] = new CellStatus_Void($aRowData[$iCol]);
}
if ($oExtKey->IsNullAllowed())
{
$oTargetObj->Set($sAttCode, $oExtKey->GetNullValue());
$aResults[$sAttCode]= new CellStatus_Issue(null, $oTargetObj->Get($sAttCode), 'Object not found');
$aResults[$sAttCode]= new CellStatus_Void($oExtKey->GetNullValue());
}
else
{
$aErrors[$sAttCode] = "Object not found";
$aResults[$sAttCode]= new CellStatus_Issue(null, $oTargetObj->Get($sAttCode), 'Object not found');
$aErrors[$sAttCode] = "Null not allowed";
$aResults[$sAttCode]= new CellStatus_Issue(null, $oTargetObj->Get($sAttCode), 'Null not allowed');
}
}
else
{
$oReconFilter = new CMDBSearchFilter($oExtKey->GetTargetClass());
foreach ($aKeyConfig as $sForeignAttCode => $iCol)
{
// The foreign attribute is one of our reconciliation key
$oReconFilter->AddCondition($sForeignAttCode, $aRowData[$iCol], '=');
$aResults[$iCol] = new CellStatus_Void($aRowData[$iCol]);
}
$oExtObjects = new CMDBObjectSet($oReconFilter);
switch($oExtObjects->Count())
{
case 0:
$aErrors[$sAttCode] = "Object not found";
$aResults[$sAttCode]= new CellStatus_SearchIssue();
break;
case 1:
// Do change the external key attribute
$oForeignObj = $oExtObjects->Fetch();
$oTargetObj->Set($sAttCode, $oForeignObj->GetKey());
break;
default:
$aErrors[$sAttCode] = "Found ".$oExtObjects->Count()." matches";
$aResults[$sAttCode]= new CellStatus_Ambiguous($oTargetObj->Get($sAttCode), $oExtObjects->Count(), $oReconFilter->ToOql());
}
break;
case 1:
// Do change the external key attribute
$oForeignObj = $oExtObjects->Fetch();
$oTargetObj->Set($sAttCode, $oForeignObj->GetKey());
break;
default:
$aErrors[$sAttCode] = "Found ".$oExtObjects->Count()." matches";
$aResults[$sAttCode]= new CellStatus_Ambiguous($oTargetObj->Get($sAttCode), $oExtObjects->Count(), $oReconFilter->ToOql());
}
// Report
@@ -461,7 +516,24 @@ class BulkChange
public function Process(CMDBChange $oChange = null)
{
// Note: $oChange can be null, in which case the aim is to check what would be done
// Debug...
//
if (false)
{
echo "<pre>\n";
echo "Attributes:\n";
print_r($this->m_aAttList);
echo "ExtKeys:\n";
print_r($this->m_aExtKeys);
echo "Reconciliation:\n";
print_r($this->m_aReconcilKeys);
//echo "Data:\n";
//print_r($this->m_aData);
echo "</pre>\n";
exit;
}
// Compute the results
//
$aResult = array();
@@ -474,22 +546,38 @@ class BulkChange
$valuecondition = null;
if (array_key_exists($sAttCode, $this->m_aExtKeys))
{
// The value has to be found or verified
list($sQuery, $aMatches) = $this->ResolveExternalKey($aRowData, $sAttCode, $aResult[$iRow]);
if (count($aMatches) == 1)
if ($this->IsNullExternalKeySpec($aRowData, $sAttCode))
{
$oRemoteObj = reset($aMatches); // first item
$valuecondition = $oRemoteObj->GetKey();
$aResult[$iRow][$sAttCode] = new CellStatus_Void($oRemoteObj->GetKey());
}
elseif (count($aMatches) == 0)
{
$aResult[$iRow][$sAttCode] = new CellStatus_Issue(null, null, 'object not found');
}
$oExtKey = MetaModel::GetAttributeDef($this->m_sClass, $sAttCode);
if ($oExtKey->IsNullAllowed())
{
$valuecondition = $oExtKey->GetNullValue();
$aResult[$iRow][$sAttCode] = new CellStatus_Void($oExtKey->GetNullValue());
}
else
{
$aResult[$iRow][$sAttCode] = new CellStatus_NullIssue();
}
}
else
{
$aResult[$iRow][$sAttCode] = new CellStatus_Ambiguous(null, count($aMatches), $sQuery);
// The value has to be found or verified
list($sQuery, $aMatches) = $this->ResolveExternalKey($aRowData, $sAttCode, $aResult[$iRow]);
if (count($aMatches) == 1)
{
$oRemoteObj = reset($aMatches); // first item
$valuecondition = $oRemoteObj->GetKey();
$aResult[$iRow][$sAttCode] = new CellStatus_Void($oRemoteObj->GetKey());
}
elseif (count($aMatches) == 0)
{
$aResult[$iRow][$sAttCode] = new CellStatus_SearchIssue();
}
else
{
$aResult[$iRow][$sAttCode] = new CellStatus_Ambiguous(null, count($aMatches), $sQuery);
}
}
}
else
@@ -546,7 +634,10 @@ class BulkChange
if (!array_key_exists($sAttCode, $aResult[$iRow]))
{
$aResult[$iRow][$sAttCode] = new CellStatus_Void('n/a');
foreach ($aForeignAtts as $sForeignAttCode => $iCol)
}
foreach ($aForeignAtts as $sForeignAttCode => $iCol)
{
if (!array_key_exists($iCol, $aResult[$iRow]))
{
// The foreign attribute is one of our reconciliation key
$aResult[$iRow][$iCol] = new CellStatus_Void($aRowData[$iCol]);

View File

@@ -110,6 +110,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'session_name' => array(
'type' => 'string',
'description' => 'The name of the cookie used to store the PHP session id',
'default' => 'iTop',
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
);
public function IsProperty($sPropCode)
@@ -263,6 +271,8 @@ class Config
'../dictionaries/es_cr.dictionary.itop.core.php', // Support for Spanish (from Costa Rica)
'../dictionaries/de.dictionary.itop.ui.php', // Support for German
'../dictionaries/de.dictionary.itop.core.php', // Support for German
'../dictionaries/pt_br.dictionary.itop.ui.php', // Support for Brazilian Portuguese
'../dictionaries/pt_br.dictionary.itop.core.php', // Support for Brazilian Portuguese
);
foreach($this->m_aSettings as $sPropCode => $aSettingInfo)

View File

@@ -400,7 +400,8 @@ abstract class DBObject
$aAvailableFields = array();
foreach ($aExtKeyFriends as $sDispAttCode => $oExtField)
{
$aAvailableFields[$oExtField->GetExtAttCode()] = $oExtField->GetAsHTML($this->Get($oExtField->GetCode()));
// $aAvailableFields[$oExtField->GetExtAttCode()] = $oExtField->GetAsHTML($this->Get($oExtField->GetCode()));
$aAvailableFields[$oExtField->GetExtAttCode()] = $this->Get($oExtField->GetCode());
}
$sTargetClass = $oAtt->GetTargetClass(EXTKEY_ABSOLUTE);
@@ -669,6 +670,8 @@ abstract class DBObject
// a displayable error is returned
public function DoCheckToWrite()
{
$this->DoComputeValues();
$this->m_aCheckIssues = array();
foreach(MetaModel::ListAttributeDefs(get_class($this)) as $sAttCode=>$oAttDef)

View File

@@ -722,11 +722,25 @@ class DBObjectSearch
}
elseif ($oExpression instanceof ListOqlExpression)
{
return new ListExpression($oExpression->GetItems());
$aItems = array();
foreach ($oExpression->GetItems() as $oItemExpression)
{
$aItems[] = $this->OQLExpressionToCondition($sQuery, $oItemExpression, $aClassAliases);
}
return new ListExpression($aItems);
}
elseif ($oExpression instanceof FunctionOqlExpression)
{
return new FunctionExpression($oExpression->GetVerb(), $oExpression->GetArgs());
$aArgs = array();
foreach ($oExpression->GetArgs() as $oArgExpression)
{
$aArgs[] = $this->OQLExpressionToCondition($sQuery, $oArgExpression, $aClassAliases);
}
return new FunctionExpression($oExpression->GetVerb(), $aArgs);
}
elseif ($oExpression instanceof IntervalOqlExpression)
{
return new IntervalExpression($oExpression->GetValue(), $oExpression->GetUnit());
}
else
{
@@ -860,6 +874,7 @@ class DBObjectSearch
}
$aSelected[$sClassToSelect] = $aAliases[$sClassToSelect];
}
$oResultFilter->m_aClasses = $aAliases;
$oResultFilter->SetSelectedClasses($aSelected);
$oConditionTree = $oOqlQuery->GetCondition();

View File

@@ -128,6 +128,13 @@ class Dict
{
return $aDefaultDictionary[$sStringCode];
}
// Attempt to find the string in english
//
$aDefaultDictionary = self::$m_aData['EN US'];
if (array_key_exists($sStringCode, $aDefaultDictionary))
{
return $aDefaultDictionary[$sStringCode];
}
// Could not find the string...
//
switch (self::$m_iErrorMode)

View File

@@ -1619,7 +1619,7 @@ abstract class MetaModel
$oConditionTree = $oFilter->GetCriteria();
$oKPI = new ExecutionKPI();
$oSelect = self::MakeQuery($oFilter->GetSelectedClasses(), $oConditionTree, $aClassAliases, $aTableAliases, $aTranslation, $oFilter);
$oSelect = self::MakeQuery($oFilter->GetSelectedClasses(), $oConditionTree, $aClassAliases, $aTableAliases, $aTranslation, $oFilter, array(), array(), true /* main query */);
$oKPI->ComputeStats('MakeQuery (select)', $sOqlQuery);
self::$m_aQueryStructCache[$sOqlId] = clone $oSelect;
@@ -1734,7 +1734,7 @@ abstract class MetaModel
$aClassAliases = array();
$aTableAliases = array();
$oConditionTree = $oFilter->GetCriteria();
$oSelect = self::MakeQuery($oFilter->GetSelectedClasses(), $oConditionTree, $aClassAliases, $aTableAliases, $aTranslation, $oFilter);
$oSelect = self::MakeQuery($oFilter->GetSelectedClasses(), $oConditionTree, $aClassAliases, $aTableAliases, $aTranslation, $oFilter, array(), array(), true /* main query */);
$aScalarArgs = array_merge(self::PrepareQueryArguments($aArgs), $oFilter->GetInternalParams());
return $oSelect->RenderDelete($aScalarArgs);
}
@@ -1746,12 +1746,12 @@ abstract class MetaModel
$aClassAliases = array();
$aTableAliases = array();
$oConditionTree = $oFilter->GetCriteria();
$oSelect = self::MakeQuery($oFilter->GetSelectedClasses(), $oConditionTree, $aClassAliases, $aTableAliases, $aTranslation, $oFilter, array(), $aValues);
$oSelect = self::MakeQuery($oFilter->GetSelectedClasses(), $oConditionTree, $aClassAliases, $aTableAliases, $aTranslation, $oFilter, array(), $aValues, true /* main query */);
$aScalarArgs = array_merge(self::PrepareQueryArguments($aArgs), $oFilter->GetInternalParams());
return $oSelect->RenderUpdate($aScalarArgs);
}
private static function MakeQuery($aSelectedClasses, &$oConditionTree, &$aClassAliases, &$aTableAliases, &$aTranslation, DBObjectSearch $oFilter, $aExpectedAtts = array(), $aValues = array())
private static function MakeQuery($aSelectedClasses, &$oConditionTree, &$aClassAliases, &$aTableAliases, &$aTranslation, DBObjectSearch $oFilter, $aExpectedAtts = array(), $aValues = array(), $bIsMainQuery = false)
{
// Note: query class might be different than the class of the filter
// -> this occurs when we are linking our class to an external class (referenced by, or pointing to)
@@ -1909,7 +1909,7 @@ abstract class MetaModel
// Translate the conditions... and go
//
if ($bIsOnQueriedClass)
if ($bIsMainQuery)
{
$oConditionTranslated = $oConditionTree->Translate($aTranslation);
$oSelectBase->SetCondition($oConditionTranslated);
@@ -3007,7 +3007,7 @@ abstract class MetaModel
$sRemoteTable = self::DBGetTable($sRemoteClass);
$sRemoteKey = self::DBGetKey($sRemoteClass);
$aCols = $oKeyAttDef->GetSQLExpressions(); // Workaround a PHP bug: sometimes issuing a Notice if invoking current(somefunc())
$aCols = $oAttDef->GetSQLExpressions(); // Workaround a PHP bug: sometimes issuing a Notice if invoking current(somefunc())
$sExtKeyField = current($aCols); // get the first column for an external key
// Note: a class/table may have an external key on itself
@@ -3054,7 +3054,7 @@ abstract class MetaModel
{
$sExpectedValues = implode(",", CMDBSource::Quote(array_keys($aAllowedValues), true));
$aCols = $oKeyAttDef->GetSQLExpressions(); // Workaround a PHP bug: sometimes issuing a Notice if invoking current(somefunc())
$aCols = $oAttDef->GetSQLExpressions(); // Workaround a PHP bug: sometimes issuing a Notice if invoking current(somefunc())
$sMyAttributeField = current($aCols); // get the first column for the moment
$sDefaultValue = $oAttDef->GetDefaultValue();
$sSelWrongRecs = "SELECT DISTINCT maintable.`$sKeyField` AS id FROM `$sTable` AS maintable WHERE maintable.`$sMyAttributeField` NOT IN ($sExpectedValues)";

View File

@@ -35,7 +35,7 @@
}
.ac_loading {
background: white url('indicator.gif') right center no-repeat;
background: white url('../images/indicator.gif') right center no-repeat;
}
.ac_odd {

View File

@@ -172,6 +172,19 @@ td a.no-arrow:hover {
padding-left:0px;
background: inherit;
}
td a.mailto, td a.mailto:visited {
text-decoration:none;
color:#000000;
padding-left:20px;
background: url(../images/mail.png) no-repeat left;
}
td a.mailto:hover {
text-decoration:underline;
color:#EB8F00;
padding-left:20px;
background: url(../images/mail.png) no-repeat left;
}
a.small_action {
font-family: Tahoma, Verdana, Arial, Helvetica;
font-size: 8pt;
@@ -781,7 +794,7 @@ div#inner_menu {
}
div#logo {
height: 70px;
width: 100%;
nowidth: 100%;
text-align: center;
}
div#logo div {
@@ -797,7 +810,7 @@ div#logo div {
#global-search {
height: 55px;
float: right;
background: url(../images/banner-search.png) no-repeat left;
background: url(../images/banner-search.png) no-repeat;
nopadding-top: 15px;
text-align: right;
overflow-y: hidden;
@@ -817,7 +830,7 @@ div#logo div {
#global-search > form input[type="text"] {
border: 0;
height: 18px;
width: 180px;E8FFD3
width: 180px;
padding-top: 4;
background: transparent;
}
@@ -856,4 +869,21 @@ div.footer{
#SearchResultsToAdd table.listResults tbody {
height: 300px;
overflow-y: auto;
}
tr.row_unchanged td {
border-bottom: 1px #ccc solid;
padding: 2px;
}
.wizContainer table tr.row_error td {
border-bottom: 1px #ccc solid;
background-color: #fdd;
padding: 2px;
}
tr.row_modified td {
border-bottom: 1px #ccc solid;
padding: 2px;
}
tr.row_added td {
border-bottom: 1px #ccc solid;
padding: 2px;
}

View File

@@ -35,7 +35,7 @@
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:CMDBChange' => 'Change',
'Class:CMDBChange+' => 'Changes Tracking',
'Class:CMDBChange+' => 'Protokllierung der Changes',
'Class:CMDBChange/Attribute:date' => 'Datum',
'Class:CMDBChange/Attribute:date+' => 'Datum und Uhrzeit der Änderungen',
'Class:CMDBChange/Attribute:userinfo' => 'Sonstige Informationen',
@@ -47,8 +47,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:CMDBChangeOp' => 'Change Operation',
'Class:CMDBChangeOp+' => 'Change operations tracking',
'Class:CMDBChangeOp' => 'Change-Operation',
'Class:CMDBChangeOp+' => 'Protokoll der Change-Operation',
'Class:CMDBChangeOp/Attribute:change' => 'Change',
'Class:CMDBChangeOp/Attribute:change+' => 'Change',
'Class:CMDBChangeOp/Attribute:date' => 'Datum',

View File

@@ -121,33 +121,30 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:URP_Users' => 'Benutzer',
'Class:URP_Users+' => 'Benutzer und Berechtigungen',
'Class:URP_Users/Attribute:userid' => 'Kontakt (Person)',
'Class:URP_Users/Attribute:userid+' => 'Persönliche Details aus den Geschäftsdaten',
'Class:URP_Users/Attribute:last_name' => 'Nachname',
'Class:URP_Users/Attribute:last_name+' => 'Name des dazugehörigen Kontaktes',
'Class:URP_Users/Attribute:first_name' => 'Vorname',
'Class:URP_Users/Attribute:first_name+' => 'Vorname des dazugehörigen Kontaktes',
'Class:URP_Users/Attribute:email' => 'Email-Adresse',
'Class:URP_Users/Attribute:email+' => 'Email-Adresse des dazugehörigen Kontaktes',
'Class:URP_Users/Attribute:login' => 'Loginname',
'Class:URP_Users/Attribute:login+' => 'Benutzerkennung zur Identifizierung',
'Class:URP_Users/Attribute:password' => 'Passwort',
'Class:URP_Users/Attribute:password+' => 'Benutzerkennung zur Authentifizierung',
'Class:URP_Users/Attribute:language' => 'Sprache',
'Class:URP_Users/Attribute:language+' => 'Benutzersprache',
'Class:URP_Users/Attribute:language/Value:EN US' => 'English',
'Class:URP_Users/Attribute:language/Value:EN US+' => 'English U.S.',
'Class:URP_Users/Attribute:language/Value:FR FR' => 'French',
'Class:URP_Users/Attribute:language/Value:FR FR+' => 'FR FR',
'Class:URP_Users/Attribute:language/Value:DE DE' => 'German',
'Class:URP_Users/Attribute:language/Value:DE DE+' => 'DE DE',
'Class:User' => 'Benutzer',
'Class:User+' => 'Benutzer-Login',
'Class:User/Attribute:finalclass' => 'Typ des Benutzerkontos',
'Class:User/Attribute:finalclass+' => '',
'Class:User/Attribute:contactid' => 'Kontakt (Person)',
'Class:User/Attribute:contactid+' => 'Persönliche Details der Geschäftsdaten',
'Class:User/Attribute:last_name' => 'Nachname',
'Class:User/Attribute:last_name+' => 'Nachname des Kontaktes',
'Class:User/Attribute:first_name' => 'Vorname',
'Class:User/Attribute:first_name+' => 'Vorname des Kontaktes',
'Class:User/Attribute:email' => 'Email-Adresse',
'Class:User/Attribute:email+' => 'Email-Adresse des Kontaktes',
'Class:User/Attribute:login' => 'Login',
'Class:User/Attribute:login+' => 'Benutzer-Anmeldename',
'Class:User/Attribute:language' => 'Sprache',
'Class:User/Attribute:language+' => 'Benutzersprache',
'Class:User/Attribute:language/Value:EN US' => 'English',
'Class:User/Attribute:language/Value:EN US+' => 'English (U.S.)',
'Class:User/Attribute:language/Value:FR FR' => 'French',
'Class:User/Attribute:language/Value:FR FR+' => 'French (France)',
'Class:User/Attribute:profile_list' => 'Profile',
'Class:User/Attribute:profile_list+' => 'Rollen, Rechtemanagement für diese Personn',
'Class:User/Attribute:allowed_org_list' => 'Zugelassenen Organisationen',
'Class:User/Attribute:allowed_org_list+' => 'Der Endbenutzer ist berechtigt, die daten der folgenden Organisationen zu sehen. Wenn keine Organisation zu sehen ist, gibt es keine Beschränkung.',
'Class:User/Attribute:profile_list+' => 'Rollen, Rechtemanagement für diese Person',
'Class:User/Attribute:allowed_org_list' => '',
'Class:User/Attribute:allowed_org_list+' => 'Der Endbenutzer ist berechtigt, die Daten der folgenden Organisationen zu sehen. Wenn keine Organisation zu sehen ist, gibt es keine Beschränkung.',
'Class:User/Error:LoginMustBeUnique' => 'Login-Namen müssen unterschiedlich sein - "%1s" benutzt diesen Login-Name bereits.',
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'Mindestens ein Profil muss diesem Benutzer zugewiesen sein.',
));
@@ -167,6 +164,26 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:URP_Profiles/Attribute:user_list+' => 'Personen, die diese Rolle haben',
));
//
// Class: URP_UserOrg
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:URP_UserOrg' => 'Benutzerorganisationen',
'Class:URP_UserOrg+' => 'Zulässige Organisationen',
'Class:URP_UserProfile/Attribute:userid' => 'Benutzer',
'Class:URP_UserProfile/Attribute:userid+' => 'Benutzerkonto',
'Class:URP_UserProfile/Attribute:userlogin' => 'Benutzer-Login',
'Class:URP_UserProfile/Attribute:userlogin+' => 'Logindaten des Benutzers',
'Class:URP_UserProfile/Attribute:allowed_org_id' => 'Organisation',
'Class:URP_UserProfile/Attribute:allowed_org_id+' => 'Gestattete Organisation',
'Class:URP_UserProfile/Attribute:allowed_org_name' => 'Organisation',
'Class:URP_UserProfile/Attribute:allowed_org_name+' => 'Gestattete Organisation',
'Class:URP_UserProfile/Attribute:reason' => 'Grund',
'Class:URP_UserProfile/Attribute:reason+' => 'Erklären Sie, warum diese Person berechtigt ist, Zugriff auf die Daten der Organisation zu haben',
));
//
// Class: URP_Dimensions
//
@@ -314,7 +331,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:WelcomeMenu:LeftBlock' => '<p>iTop ist ein ein vollständiges, ITIL- und webbasiertes IT-Service-Management-Tool (ITSM)</p>
<ul>Es umfasst...
<li>eine vollständige CMDB (Configuration Management Database), um das IT-Portfolio zu dokumentieren und zu managen,</li>
<li>ein Incident Mangement-Modul, um alle Störfälle in der IT-Landschaft zu beobachten und diese zu kommunizieren,</li>
<li>ein Incident Management-Modul, um alle Störfälle in der IT-Landschaft zu beobachten und diese zu kommunizieren,</li>
<li>ein Change Management-Modul, um Änderungen der IT-Landschaft zu planen und zu beobachten,</li>
<li>eine Datenbank mit bekannten Fehlern, um Zwischenfälle schneller anhand bekannter Problemlösungen zu beseitigen,</li>
<li>ein Ausfall-Modul, um geplante Ausfälle zu dokumentieren und die betreffenden Kontakte zu informieren,</li>
@@ -373,8 +390,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Button:ResetPassword' => ' Passwort zurücksetzen ',
'UI:SearchToggle' => 'Suche',
'UI:ClickToCreateNew' => 'Klicken Sie hier, um einen neuen %1$s zu erstellen',
'UI:SearchFor_Class' => 'Suche nach Objekten: %1$',
'UI:ClickToCreateNew' => 'Klicken Sie hier, um eine neues Objekt vom Typ %1$s zu erstellen',
'UI:SearchFor_Class' => 'Suche nach Objekten vom Typ "%1$s"',
'UI:NoObjectToDisplay' => 'Kein Objekt zur Anzeige vorhanden.',
'UI:Error:MandatoryTemplateParameter_object_id' => 'Parameter object_id ist erforderlich, wenn link_attr verwendet wird. Überprüfen Sie die Defintion des Display-Templates.',
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Parameter target_attr ist erforderlich, wenn link_attr verwendet wird. Überprüfen Sie die Defintion des Display-Templates.',
@@ -382,9 +399,9 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Error:InvalidGroupByFields' => 'Ungültige Felder-Liste, um diese zu gruppieren von: "%1$s".',
'UI:Error:UnsupportedStyleOfBlock' => 'Fehler: nicht unterstützter Blockform: "%1$s".',
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Ungültige Link-Defintion: die Klasse der zu managenden Objekte: %1$s wurde nicht als externer Schlüssel in der Klasse %2$s gefunden.',
'UI:Error:Object_Class_Id_NotFound' => 'Object: %1$s:%2$d wurde nicht gefunden.',
'UI:Error:Object_Class_Id_NotFound' => 'Objekt: %1$s:%2$d wurde nicht gefunden.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Fehler: gegenseitige Beziehung in den Abhängigkeiten zwischen den Feldern, überprüfen Sie das Datenmodell.',
'UI:Error:UploadedFileTooBig' => 'Die hochgeladene Datei ist zu groß. (Maximal erlaubte Dateigröße ist %1$s. Überprüfen Sie upload_max_filesize in der PHP-Konfiguration.',
'UI:Error:UploadedFileTooBig' => 'Die hochgeladene Datei ist zu groß. (Maximal erlaubte Dateigröße ist %1$s. Überprüfen Sie upload_max_filesize und post_max_size in der PHP-Konfiguration.',
'UI:Error:UploadedFileTruncated.' => 'Hochgeladene Datei wurde beschränkt!',
'UI:Error:NoTmpDir' => 'Der temporäre Ordner ist nicht definiert.',
'UI:Error:CannotWriteToTmp_Dir' => 'Nicht möglich, die tempöräre Datei auf die Festplatte zu speicher: upload_tmp_dir = "%1$s".',
@@ -412,7 +429,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:GroupBy:Count+' => 'Anzahl der Elemente',
'UI:CountOfObjects' => '%1$d Objekte, die das Kriterium erfüllen.',
'UI_CountOfObjectsShort' => '%1$d Objekte.',
'UI:NoObject_Class_ToDisplay' => 'Kein %1$s zur Anzeige',
'UI:NoObject_Class_ToDisplay' => 'Kein Objekt vom Typ "%1$s" zur Anzeige vorhanden',
'UI:History:LastModified_On_By' => 'Zuletzt verändert am %1$s von %2$s.',
'UI:HistoryTab' => 'Verlauf',
'UI:NotificationsTab' => 'Benachrichtigungen',
@@ -562,7 +579,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Schema:NullAllowed' => 'Null zugelassen',
'UI:Schema:NullNotAllowed' => 'Null NICHT zugelassen',
'UI:Schema:Attributes' => 'Attribute',
'UI:Schema:AttributeCode' => 'Attribute-Code',
'UI:Schema:AttributeCode' => 'Attribut-Code',
'UI:Schema:AttributeCode+' => 'Interner Code des Attributes',
'UI:Schema:Label' => 'Label',
'UI:Schema:Label+' => 'Label des Attributes',
@@ -618,10 +635,10 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => 'Fügen Sie %1$s Objekte verbunden mit %2$s hinzu: %3$s',
'UI:AddObjectsOf_Class_LinkedWith_Class' => 'Fügen Sie %1$s Objekte verbunden mit %2$s hinzu',
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => 'Verwalten Sie %1$s Objekte verbunden mit %2$s: %3$s',
'UI:AddLinkedObjectsOf_Class' => ' %1$se hinzufügen...',
'UI:AddLinkedObjectsOf_Class' => ' %1$s hinzufügen...',
'UI:RemoveLinkedObjectsOf_Class' => 'Entferne ausgewählte Objekte',
'UI:Message:EmptyList:UseAdd' => 'Die Liste ist leer, benutzten Sie "Hinzufügen..." um Elemente hinzuzufügen.',
'UI:Message:EmptyList:UseSearchForm' => 'Benutzen Sie das Suchformular oben, um nach hinzufügenbaren Objekten zu suchen.',
'UI:Message:EmptyList:UseSearchForm' => 'Benutzen Sie das Suchformular oben, um nach hinzufügbaren Objekten zu suchen.',
'UI:Wizard:FinalStepTitle' => 'Letzter Schritt: Bestätigung',
'UI:Title:DeletionOf_Object' => 'Löschung von %1$s',
@@ -656,7 +673,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:WelcomeToITop' => 'Willkommen bei iTop',
'UI:DetailsPageTitle' => 'iTop - %1$s - %2$s Details',
'UI:ErrorPageTitle' => 'iTop - Fehler',
'UI:ObjectDoesNotExist' => 'Entschuldigung, dies Objekt exisitert nicht oder Sie sind nicht berechtigt es einzusehen.',
'UI:ObjectDoesNotExist' => 'Entschuldigung, dieses Objekt exisitert nicht oder Sie sind nicht berechtigt es einzusehen.',
'UI:SearchResultsPageTitle' => 'iTop - Suchergebnisse',
'UI:Search:NoSearch' => 'Nichts, wonach man suchen kann...',
'UI:FullTextSearchTitle_Text' => 'Ergebnisse für "%1$s":',
@@ -666,18 +683,18 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:ModificationTitle_Class_Object' => 'Änderungen von %1$s: <span class=\"hilite\">%2$s</span>',
'UI:ClonePageTitle_Object_Class' => 'iTop - Dupliziere %1$s - %2$s Änderung',
'UI:CloneTitle_Class_Object' => 'Duplizieren von %1$s: <span class=\"hilite\">%2$s</span>',
'UI:CreationPageTitle_Class' => 'iTop - Erstellung einer neue %1$s ',
'UI:CreationTitle_Class' => 'Erstellung einer neue %1$s',
'UI:SelectTheTypeOf_Class_ToCreate' => 'Wählen Sie den Typ von %1$s aus, den Sie erstellen möchten:',
'UI:CreationPageTitle_Class' => 'iTop - Erstellung eines neuen Objekts vom Typ "%1$s" ',
'UI:CreationTitle_Class' => 'Erstellung eines neuen Objekts vom Typ "%1$s"',
'UI:SelectTheTypeOf_Class_ToCreate' => 'Wählen Sie den Typ vom Objekt "%1$s" aus, den Sie erstellen möchten:',
'UI:Class_Object_NotUpdated' => 'Keine Änderung festgestellt, %1$s (%2$s) wurde <strong>nicht</strong> modifiziert.',
'UI:Class_Object_Updated' => '%1$s (%2$s) aktualisiert.',
'UI:BulkDeletePageTitle' => 'iTop - Massenlöschung',
'UI:BulkDeletePageTitle' => 'iTop - Massenlöschung von Objekten',
'UI:BulkDeleteTitle' => 'Wählen Sie die Objekte aus, die Sie löschen möchten:',
'UI:PageTitle:ObjectCreated' => 'iTop-Objekt wurde erstellt.',
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s erstellt.',
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Anwenden von %1$s auf Objekt: %2$s in Status %3$s zu Zielstatus: %4$s.',
'UI:PageTitle:FatalError' => 'iTop - Fataler Fehler',
'UI:FatalErrorMessage' => 'Fataler Fehler, iTop kann nicht forfahren.',
'UI:FatalErrorMessage' => 'Fataler Fehler! iTop kann leider nicht forfahren.',
'UI:Error_Details' => 'Fehler: %1$s.',
'UI:PageTitle:ClassProjections' => 'iTop Benutzerverwaltung - Klassenabbildung',
@@ -697,7 +714,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:UserManagement:Action:Modify+' => 'Erstellen und editieren (modifizieren) von Objekten',
'UI:UserManagement:Action:Delete' => 'Löschen',
'UI:UserManagement:Action:Delete+' => 'Objekte löschen',
'UI:UserManagement:Action:BulkRead' => 'Massenlesen (Export)',
'UI:UserManagement:Action:BulkRead' => 'Masseneinlesen (Export)',
'UI:UserManagement:Action:BulkRead+' => 'Objekte massenhaft auflisten oder exportieren',
'UI:UserManagement:Action:BulkModify' => 'Massenmodifikation',
'UI:UserManagement:Action:BulkModify+' => 'Massenerstellung/-bearbeitung (CSV-Import)',
@@ -718,7 +735,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:UserManagement:NoLifeCycleApplicable+' => 'Kein Lebenszyklus wurde für diese Klasse definiert.',
'UI:UserManagement:GrantMatrix' => 'Zugriffsmatrix',
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Verbindung zwischen %1$s und %2$s',
'UI:UserManagement:LinkBetween_User_And_Org' => 'Verbindung zwischen %1$s und %2$s',
'Menu:AdminTools' => 'Admin-Tools',
'Menu:AdminTools+' => 'Administrationswerkzeuge',
'Menu:AdminTools?' => 'Werkzeuge, die nur für Benutzer mit Adminstratorprofil zugänglich sind',
@@ -853,13 +870,13 @@ Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnumm
'UI:Deadline_Days_Hours_Minutes' => '%1$dTage %2$dStunden %3$dMinuten',
'UI:Help' => 'Hilfe',
'UI:PasswordConfirm' => '(Bestätigen)',
'UI:BeforeAdding_Class_ObjectsSaveThisObject' => 'Bevor weitere Objekte vom Typ "%1$s" hinzugefügt werden, speichern Sie dieses Objekt.',
'UI:DisplayThisMessageAtStartup' => 'Diese Meldung beim Start anzeigen',
'UI:BeforeAdding_Class_ObjectsSaveThisObject' => 'Bevor weitere Objekte vom Typ "%1$s" hinzugefügt werden können, speichern Sie bitte dieses Objekt.',
'UI:DisplayThisMessageAtStartup' => 'Diese Meldung beim Start immer anzeigen',
'UI:RelationshipGraph' => 'Grafische Ansicht',
'UI:RelationshipList' => 'Liste',
'Portal:Title' => 'iTop-Benutzerportal',
'Portal:Refresh' => 'Erneuern',
'Portal:Refresh' => 'Neu laden',
'Portal:Back' => 'Zurück',
'Portal:CreateNewRequest' => 'Einen neuen Request erstellen',
'Portal:ChangeMyPassword' => 'Mein Passwort ändern',
@@ -876,6 +893,8 @@ Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnumm
'Portal:Button:CloseTicket' => 'Dieses Ticket schließen',
'Portal:EnterYourCommentsOnTicket' => 'Geben Sie einen Kommentar zur Lösung dieses Tickets ein:',
'Portal:ErrorNoContactForThisUser' => 'Fehler: der derzeitige Benutzer wurde nicht einem Kontakt oder einer Person zugewiesen. Bitte kontaktieren Sie Ihren Administrator.',
'Enum:Undefined' => 'Nicht definiert',
));

View File

@@ -366,7 +366,7 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Incorrect link definition: the class of objects to manage: %1$s was not found as an external key in the class %2$s',
'UI:Error:Object_Class_Id_NotFound' => 'Object: %1$s:%2$d not found.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Error: Circular reference in the dependencies between the fields, check the data model.',
'UI:Error:UploadedFileTooBig' => 'Uploaded file is too big. (Max allowed size is %1$s). Check you PHP configuration for upload_max_filesize.',
'UI:Error:UploadedFileTooBig' => 'Uploaded file is too big. (Max allowed size is %1$s). Check you PHP configuration for upload_max_filesize and post_max_size.',
'UI:Error:UploadedFileTruncated.' => 'Uploaded file has been truncated !',
'UI:Error:NoTmpDir' => 'The temporary directory is not defined.',
'UI:Error:CannotWriteToTmp_Dir' => 'Unable to write the temporary file to the disk. upload_tmp_dir = "%1$s".',
@@ -861,6 +861,8 @@ When associated with a trigger, each action is given an "order" number, specifyi
'Portal:Button:CloseTicket' => 'Close this ticket',
'Portal:EnterYourCommentsOnTicket' => 'Enter your comments about the resolution of this ticket:',
'Portal:ErrorNoContactForThisUser' => 'Error: the current user is not associated with a Contact/Person. Please contact your administrator.',
'Enum:Undefined' => 'Undefined',
));

View File

@@ -375,7 +375,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Incorrect link definition: the class of objects to manage: %1$s was not found as an external key in the class %2$s',
'UI:Error:Object_Class_Id_NotFound' => 'Object: %1$s:%2$d not found.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Error: Circular reference in the dependencies between the fields, check the data model.',
'UI:Error:UploadedFileTooBig' => 'Uploaded file is too big. (Max allowed size is %1$s. Check you PHP configuration for upload_max_filesize.',
'UI:Error:UploadedFileTooBig' => 'Uploaded file is too big. (Max allowed size is %1$s. Check you PHP configuration for upload_max_filesize and post_max_size.',
'UI:Error:UploadedFileTruncated.' => 'Uploaded file has been truncated !',
'UI:Error:NoTmpDir' => 'The temporary directory is not defined.',
'UI:Error:CannotWriteToTmp_Dir' => 'Unable to write the temporary file to the disk. upload_tmp_dir = "%1$s".',
@@ -837,6 +837,8 @@ When associated with a trigger, each action is given an "order" number, specifyi
'UI:Deadline_Days_Hours_Minutes' => '%1$dd %2$dh %3$dmin',
'UI:Help' => 'Ayuda',
'UI:PasswordConfirm' => '(Confirm)',
'Enum:Undefined' => 'Undefined',
));
?>

View File

@@ -368,7 +368,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'la définition du lien est incorrecte: la classe d\'objets à gérer: %1$s n\'est référencée par aucune clef externe de la classe %2$s',
'UI:Error:Object_Class_Id_NotFound' => 'L\'objet: %1$s:%2$d est introuvable.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Erreur: Référence circulaire entre les dépendences entre champs, vérifiez le modèle de données.',
'UI:Error:UploadedFileTooBig' => 'Le fichier téléchargé est trop gros. (La taille maximale autorisée est %1$s). Vérifiez la valeur de la variable upload_max_filesize dans la configuration PHP.',
'UI:Error:UploadedFileTooBig' => 'Le fichier téléchargé est trop gros. (La taille maximale autorisée est %1$s). Vérifiez la valeur des variables upload_max_filesize et post_max_size dans la configuration PHP.',
'UI:Error:UploadedFileTruncated.' => 'Le fichier téléchargé a été tronqué !',
'UI:Error:NoTmpDir' => 'Il n\'y a aucun répertoire temporaire de défini.',
'UI:Error:CannotWriteToTmp_Dir' => 'Impossible d\'écrire le fichier temporaire sur disque. upload_tmp_dir = "%1$s".',
@@ -870,6 +870,8 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'Portal:Button:CloseTicket' => 'Clôre cette requête',
'Portal:EnterYourCommentsOnTicket' => 'Vos commentaires à propos du traitement de cette requête:',
'Portal:ErrorNoContactForThisUser' => 'Erreur: l\'utilisateur courant n\'est pas associé à une Personne/Contact. Contactez votre administrateur.',
'Enum:Undefined' => 'Non défini',
));
?>

View File

@@ -0,0 +1,378 @@
<?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
*/
//////////////////////////////////////////////////////////////////////
// Classes in 'core/cmdb'
//////////////////////////////////////////////////////////////////////
//
//
// Class: CMDBChange
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChange' => 'Mudan&ccedil;as',
'Class:CMDBChange+' => 'Monitoramento Mudan&ccedil;as',
'Class:CMDBChange/Attribute:date' => 'data',
'Class:CMDBChange/Attribute:date+' => 'data e hora que as mudan&ccedil;as tenham sido registradas.',
'Class:CMDBChange/Attribute:userinfo' => 'misc. info',
'Class:CMDBChange/Attribute:userinfo+' => 'Solicitante definido informa&ccedil;&atilde;o',
));
//
// Class: CMDBChangeOp
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOp' => 'Opera&ccedil;&atilde;o Mudan&ccedil;a',
'Class:CMDBChangeOp+' => 'Controle Opera&ccedil;&atilde;o Mudan&ccedil;a',
'Class:CMDBChangeOp/Attribute:change' => 'mudan&ccedil;as',
'Class:CMDBChangeOp/Attribute:change+' => 'mudan&ccedil;as',
'Class:CMDBChangeOp/Attribute:date' => 'data',
'Class:CMDBChangeOp/Attribute:date+' => 'data e hora das mudan&ccedil;as',
'Class:CMDBChangeOp/Attribute:userinfo' => 'usu&aacute;rio',
'Class:CMDBChangeOp/Attribute:userinfo+' => 'quem fez esta mudan&ccedil;as',
'Class:CMDBChangeOp/Attribute:objclass' => 'classe objeto',
'Class:CMDBChangeOp/Attribute:objclass+' => 'classe objeto',
'Class:CMDBChangeOp/Attribute:objkey' => 'id objeto',
'Class:CMDBChangeOp/Attribute:objkey+' => 'objeto',
'Class:CMDBChangeOp/Attribute:finalclass' => 'tipo',
'Class:CMDBChangeOp/Attribute:finalclass+' => '',
));
//
// Class: CMDBChangeOpCreate
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpCreate' => 'objeto criado',
'Class:CMDBChangeOpCreate+' => 'Controle cria&ccedil;&atilde;o objeto',
));
//
// Class: CMDBChangeOpDelete
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpDelete' => 'objeto apagado',
'Class:CMDBChangeOpDelete+' => 'Controle objeto eliminado',
));
//
// Class: CMDBChangeOpSetAttribute
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpSetAttribute' => 'objeto alterado',
'Class:CMDBChangeOpSetAttribute+' => 'Controle do objeto alterado',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode' => 'Atributo',
'Class:CMDBChangeOpSetAttribute/Attribute:attcode+' => 'c&oacute;digo da modifica&ccedil;&atilde;o',
));
//
// Class: CMDBChangeOpSetAttributeScalar
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpSetAttributeScalar' => 'mudan&ccedil;a propriedade',
'Class:CMDBChangeOpSetAttributeScalar+' => 'controle da mudan&ccedil;a propriedade do objeto',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue' => 'Valor anterior',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:oldvalue+' => 'valores anteriores do atributo',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue' => 'Novo valor',
'Class:CMDBChangeOpSetAttributeScalar/Attribute:newvalue+' => 'novo valor do atributo',
));
//
// Class: CMDBChangeOpSetAttributeBlob
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpSetAttributeBlob' => 'mudan&ccedil;a dado',
'Class:CMDBChangeOpSetAttributeBlob+' => 'controle mudan&ccedil;a dado',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata' => 'Dado anterior',
'Class:CMDBChangeOpSetAttributeBlob/Attribute:prevdata+' => 'conte&uacute;do anterior do atributo',
));
//
// Class: CMDBChangeOpSetAttributeText
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CMDBChangeOpSetAttributeText' => 'mudan&ccedil;a texto',
'Class:CMDBChangeOpSetAttributeText+' => 'controle mudan&ccedil;a texto',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata' => 'Dado anterior',
'Class:CMDBChangeOpSetAttributeText/Attribute:prevdata+' => 'conte&uacute;do anterior do atributo',
));
//
// Class: Event
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Event' => 'Log Eventos',
'Class:Event+' => 'An application internal event',
'Class:Event/Attribute:message' => 'mensagem',
'Class:Event/Attribute:message+' => 'descri&ccedil;&atilde;o curta do evento',
'Class:Event/Attribute:date' => 'data',
'Class:Event/Attribute:date+' => 'data e hora em que as mudan&ccedil;as tenham sido registadas',
'Class:Event/Attribute:userinfo' => 'info usu&acute;rio',
'Class:Event/Attribute:userinfo+' => 'identifica&ccedil;&atilde;o do usu&aacute;rio queestava fazendo a a&ccedil;&atilde;o e desencadeou este evento',
'Class:Event/Attribute:finalclass' => 'tipo',
'Class:Event/Attribute:finalclass+' => '',
));
//
// Class: EventNotification
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EventNotification' => 'Notifica&ccedil;&atilde;o evento',
'Class:EventNotification+' => 'Trace of a notification that has been sent',
'Class:EventNotification/Attribute:trigger_id' => 'Trigger',
'Class:EventNotification/Attribute:trigger_id+' => 'conta usu&aacute;rio',
'Class:EventNotification/Attribute:action_id' => 'usu&aacute;rio',
'Class:EventNotification/Attribute:action_id+' => 'conta usu&aacute;rio',
'Class:EventNotification/Attribute:object_id' => 'Objeto id',
'Class:EventNotification/Attribute:object_id+' => 'objeto id (classe definida pela trigger ?)',
));
//
// Class: EventNotificationEmail
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EventNotificationEmail' => 'Enviando evento Email',
'Class:EventNotificationEmail+' => 'Controle de um email que foi enviado',
'Class:EventNotificationEmail/Attribute:to' => 'Para',
'Class:EventNotificationEmail/Attribute:to+' => 'Para',
'Class:EventNotificationEmail/Attribute:cc' => 'CC',
'Class:EventNotificationEmail/Attribute:cc+' => 'CC',
'Class:EventNotificationEmail/Attribute:bcc' => 'BCC',
'Class:EventNotificationEmail/Attribute:bcc+' => 'BCC',
'Class:EventNotificationEmail/Attribute:from' => 'De',
'Class:EventNotificationEmail/Attribute:from+' => 'Rementente da mensagem',
'Class:EventNotificationEmail/Attribute:subject' => 'Assunto',
'Class:EventNotificationEmail/Attribute:subject+' => 'Assunto',
'Class:EventNotificationEmail/Attribute:body' => 'Corpo',
'Class:EventNotificationEmail/Attribute:body+' => 'Corpo',
));
//
// Class: EventIssue
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EventIssue' => 'Emiss&atilde;o de evento',
'Class:EventIssue+' => 'Controle da emiss&atilde;o (aten&ccedil;&atilde;o, erros, etc.)',
'Class:EventIssue/Attribute:issue' => 'Emiss&atilde;o',
'Class:EventIssue/Attribute:issue+' => 'O que aconteceu?',
'Class:EventIssue/Attribute:impact' => 'Impacto',
'Class:EventIssue/Attribute:impact+' => 'Quais s&atilde;o as consequ&ecirc;ncias?',
'Class:EventIssue/Attribute:page' => 'P&aacute;gina',
'Class:EventIssue/Attribute:page+' => 'HTTP ponto de entrada',
'Class:EventIssue/Attribute:arguments_post' => 'Postados argumentos',
'Class:EventIssue/Attribute:arguments_post+' => 'HTTP POST argumentos',
'Class:EventIssue/Attribute:arguments_get' => 'URL argumentos',
'Class:EventIssue/Attribute:arguments_get+' => 'HTTP GET argumentos',
'Class:EventIssue/Attribute:callstack' => 'Callstack',
'Class:EventIssue/Attribute:callstack+' => 'Call stack',
'Class:EventIssue/Attribute:data' => 'Dado',
'Class:EventIssue/Attribute:data+' => 'Mais informa&ccedil;&otilde;es',
));
//
// Class: EventWebService
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EventWebService' => 'Evento Web service',
'Class:EventWebService+' => 'Controle chamado do web service',
'Class:EventWebService/Attribute:verb' => 'Verb',
'Class:EventWebService/Attribute:verb+' => 'Nome da opera&ccedil;&atilde;o',
'Class:EventWebService/Attribute:result' => 'Resultado',
'Class:EventWebService/Attribute:result+' => 'Vis&atilde;o geral successos/falhas',
'Class:EventWebService/Attribute:log_info' => 'Info log',
'Class:EventWebService/Attribute:log_info+' => 'Resultado info log',
'Class:EventWebService/Attribute:log_warning' => 'Log aten&ccedil;&atilde;o',
'Class:EventWebService/Attribute:log_warning+' => 'Resultado Log aten&ccedil;&atilde;o',
'Class:EventWebService/Attribute:log_error' => 'Log erro',
'Class:EventWebService/Attribute:log_error+' => 'Resultado log erro',
'Class:EventWebService/Attribute:data' => 'Dado',
'Class:EventWebService/Attribute:data+' => 'Resultado dado',
));
//
// Class: Action
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Action' => 'Personalizar A&ccedil;&atilde;o',
'Class:Action+' => 'A&ccedil;&atilde;o definida usu&aacute;rio',
'Class:Action/Attribute:name' => 'Nome',
'Class:Action/Attribute:name+' => '',
'Class:Action/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Action/Attribute:description+' => '',
'Class:Action/Attribute:status' => 'Status',
'Class:Action/Attribute:status+' => 'Em produ&ccedil;&atilde;o ou ?',
'Class:Action/Attribute:status/Value:test' => 'Que est&aacute; sendo testado',
'Class:Action/Attribute:status/Value:test+' => 'Que est&aacute; sendo testado',
'Class:Action/Attribute:status/Value:enabled' => 'Em produ&ccedil;&atilde;o',
'Class:Action/Attribute:status/Value:enabled+' => 'Em produ&ccedil;&atilde;o',
'Class:Action/Attribute:status/Value:disabled' => 'Inativo',
'Class:Action/Attribute:status/Value:disabled+' => 'Inativo',
'Class:Action/Attribute:trigger_list' => 'Triggers relacionados',
'Class:Action/Attribute:trigger_list+' => 'Triggers ligado a esta a&ccedil;&atilde;o',
'Class:Action/Attribute:finalclass' => 'Tipo',
'Class:Action/Attribute:finalclass+' => '',
));
//
// Class: ActionNotification
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ActionNotification' => 'Notifica&ccedil;&atilde;o',
'Class:ActionNotification+' => 'Notifica&ccedil;&atilde;o (abstrato)',
));
//
// Class: ActionEmail
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ActionEmail' => 'Email notifica&ccedil;&atilde;o',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:test_recipient' => 'Teste destino',
'Class:ActionEmail/Attribute:test_recipient+' => 'Destinat&aacute;rio o status est&aacute; como "Teste"',
'Class:ActionEmail/Attribute:from' => 'De',
'Class:ActionEmail/Attribute:from+' => 'Ser&aacute; enviado dentro do cabe&ccedil;alho do email',
'Class:ActionEmail/Attribute:reply_to' => 'Responder para',
'Class:ActionEmail/Attribute:reply_to+' => 'Ser&aacute; enviado dentro do cabe&ccedil;alho do email',
'Class:ActionEmail/Attribute:to' => 'Para',
'Class:ActionEmail/Attribute:to+' => 'Destinat&aacute;rio para o email',
'Class:ActionEmail/Attribute:cc' => 'Cc',
'Class:ActionEmail/Attribute:cc+' => 'Com c&oacute;pia',
'Class:ActionEmail/Attribute:bcc' => 'bcc',
'Class:ActionEmail/Attribute:bcc+' => 'Com c&oacute;pia oculta',
'Class:ActionEmail/Attribute:subject' => 'assunto',
'Class:ActionEmail/Attribute:subject+' => 'T&iacute;tulo do email',
'Class:ActionEmail/Attribute:body' => 'corpo',
'Class:ActionEmail/Attribute:body+' => 'Conte&uacute;do do email',
'Class:ActionEmail/Attribute:importance' => 'import&acirc;ncia',
'Class:ActionEmail/Attribute:importance+' => 'Flag import&acirc;ncia',
'Class:ActionEmail/Attribute:importance/Value:low' => 'baixo',
'Class:ActionEmail/Attribute:importance/Value:low+' => 'baixo',
'Class:ActionEmail/Attribute:importance/Value:normal' => 'normal',
'Class:ActionEmail/Attribute:importance/Value:normal+' => 'normal',
'Class:ActionEmail/Attribute:importance/Value:high' => 'alto',
'Class:ActionEmail/Attribute:importance/Value:high+' => 'alto',
));
//
// Class: Trigger
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Trigger' => 'Trigger',
'Class:Trigger+' => 'Personalizar manipulador de eventos',
'Class:Trigger/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Trigger/Attribute:description+' => 'uma linha descri&ccedil;&atilde;o',
'Class:Trigger/Attribute:action_list' => 'A&ccedil;&otilde;es desencadeadas',
'Class:Trigger/Attribute:action_list+' => 'A&ccedil;&otilde;es executadas quando a Trigger é ativado',
'Class:Trigger/Attribute:finalclass' => 'Tipo',
'Class:Trigger/Attribute:finalclass+' => '',
));
//
// Class: TriggerOnObject
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnObject' => 'Trigger (classe dependente)',
'Class:TriggerOnObject+' => 'Trigger em uma determinada classe de objetos',
'Class:TriggerOnObject/Attribute:target_class' => 'Alvo classe',
'Class:TriggerOnObject/Attribute:target_class+' => '',
));
//
// Class: TriggerOnStateChange
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnStateChange' => 'Trigger (em estato mudan&ccedil;a)',
'Class:TriggerOnStateChange+' => 'Trigger sobre a mudan&ccedil;a de estado do objeto',
'Class:TriggerOnStateChange/Attribute:state' => 'Estado',
'Class:TriggerOnStateChange/Attribute:state+' => '',
));
//
// Class: TriggerOnStateEnter
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnStateEnter' => 'Trigger (ao entrar em um estado)',
'Class:TriggerOnStateEnter+' => 'Trigger sobre a mudan&ccedil;a de estado do objeto - entrar',
));
//
// Class: TriggerOnStateLeave
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnStateLeave' => 'Trigger (na saída de um estado)',
'Class:TriggerOnStateLeave+' => 'Trigger sobre a mudan&ccedil;a de estado do objeto - deixando',
));
//
// Class: TriggerOnObjectCreate
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:TriggerOnObjectCreate' => 'Trigger (sobre a cria&ccedil;&atilde;o do objeto)',
'Class:TriggerOnObjectCreate+' => 'Trigger sobre a cria&ccedil;&atilde;o do objeto de [uma classe filha de] uma determinada classe',
));
//
// Class: lnkTriggerAction
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkTriggerAction' => 'A&ccedil;&atilde;o/Trigger',
'Class:lnkTriggerAction+' => 'Liga&ccedil;&atilde;o entre uma trigger e uma a&ccedil;&atilde;o',
'Class:lnkTriggerAction/Attribute:action_id' => 'A&ccedil;&atilde;o',
'Class:lnkTriggerAction/Attribute:action_id+' => 'A&ccedil;&atilde;o a ser executada',
'Class:lnkTriggerAction/Attribute:action_name' => 'A&ccedil;&atilde;o',
'Class:lnkTriggerAction/Attribute:action_name+' => '',
'Class:lnkTriggerAction/Attribute:trigger_id' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_id+' => '',
'Class:lnkTriggerAction/Attribute:trigger_name' => 'Trigger',
'Class:lnkTriggerAction/Attribute:trigger_name+' => '',
'Class:lnkTriggerAction/Attribute:order' => 'Ordem',
'Class:lnkTriggerAction/Attribute:order+' => 'AA&ccedil;&otilde;es executadas ordem',
));
?>

View File

@@ -0,0 +1,842 @@
<?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
*/
//////////////////////////////////////////////////////////////////////
// Classes in 'gui'
//////////////////////////////////////////////////////////////////////
//
//
// Class: menuNode
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:menuNode' => 'menuNode',
'Class:menuNode+' => 'Menu principal configuracoes elementos',
'Class:menuNode/Attribute:name' => 'Nome menu',
'Class:menuNode/Attribute:name+' => 'Nome curto para este menu',
'Class:menuNode/Attribute:label' => 'Descricao do menu',
'Class:menuNode/Attribute:label+' => 'Descricao longa para este menu',
'Class:menuNode/Attribute:hyperlink' => 'Hyperlink',
'Class:menuNode/Attribute:hyperlink+' => 'Hyperlink para a p&aacute;gina',
'Class:menuNode/Attribute:icon_path' => 'Icones menu',
'Class:menuNode/Attribute:icon_path+' => 'Caminho parra o icone do menu',
'Class:menuNode/Attribute:template' => 'Modelo',
'Class:menuNode/Attribute:template+' => 'Modelo HTML para ver',
'Class:menuNode/Attribute:type' => 'Tipo',
'Class:menuNode/Attribute:type+' => 'Tipo de menu',
'Class:menuNode/Attribute:type/Value:application' => 'aplicacao',
'Class:menuNode/Attribute:type/Value:application+' => 'aplicacao',
'Class:menuNode/Attribute:type/Value:user' => 'usuario',
'Class:menuNode/Attribute:type/Value:user+' => 'usuario',
'Class:menuNode/Attribute:type/Value:administrator' => 'administrador',
'Class:menuNode/Attribute:type/Value:administrator+' => 'administrador',
'Class:menuNode/Attribute:rank' => 'Mostrar rank',
'Class:menuNode/Attribute:rank+' => 'Ordem de classificação para exibir o menu',
'Class:menuNode/Attribute:parent_id' => 'Item Menu principal',
'Class:menuNode/Attribute:parent_id+' => 'Item Menu principal',
'Class:menuNode/Attribute:parent_name' => 'Item Menu principal',
'Class:menuNode/Attribute:parent_name+' => 'Item Menu principal',
'Class:menuNode/Attribute:user_id' => 'Proprietario do menu',
'Class:menuNode/Attribute:user_id+' => 'O usuário que possui este menu (menu para usuario definido)',
));
//////////////////////////////////////////////////////////////////////
// Classes in 'application'
//////////////////////////////////////////////////////////////////////
//
//
// Class: AuditCategory
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:AuditCategory' => 'AuditCategory',
'Class:AuditCategory+' => 'Uma seção dentro da auditoria global',
'Class:AuditCategory/Attribute:name' => 'Nome categoria',
'Class:AuditCategory/Attribute:name+' => 'Nome curto da categoria',
'Class:AuditCategory/Attribute:description' => 'Descricao categoria auditoria',
'Class:AuditCategory/Attribute:description+' => 'Descricao longa para a categoria auditoria',
'Class:AuditCategory/Attribute:definition_set' => 'Definicao configuracao',
'Class:AuditCategory/Attribute:definition_set+' => 'Expressão OQL que define o conjunto de objetos de auditoria',
));
//
// Class: AuditRule
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:AuditRule' => 'AuditRule',
'Class:AuditRule+' => 'A regra para verificar se há uma categoria de Auditoria dado',
'Class:AuditRule/Attribute:name' => 'Nome regra',
'Class:AuditRule/Attribute:name+' => 'Nome curto para a regra',
'Class:AuditRule/Attribute:description' => 'Descricao regra auditoria',
'Class:AuditRule/Attribute:description+' => 'Descricao longa para este regra auditoria',
'Class:AuditRule/Attribute:query' => 'Executar consulta',
'Class:AuditRule/Attribute:query+' => 'A expressão OQL a executar',
'Class:AuditRule/Attribute:valid_flag' => 'Objetos validos?',
'Class:AuditRule/Attribute:valid_flag+' => 'True se a regra retorna os objetos válido, false caso contrário',
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'verdadeiro',
'Class:AuditRule/Attribute:valid_flag/Value:true+' => 'verdadeiro',
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'falso',
'Class:AuditRule/Attribute:valid_flag/Value:false+' => 'falso',
'Class:AuditRule/Attribute:category_id' => 'Categoria',
'Class:AuditRule/Attribute:category_id+' => 'A categoria para esta regra',
'Class:AuditRule/Attribute:category_name' => 'Categoria',
'Class:AuditRule/Attribute:category_name+' => 'Nome da categoria para esta regra',
));
//////////////////////////////////////////////////////////////////////
// Classes in 'addon/userrights'
//////////////////////////////////////////////////////////////////////
//
//
// Class: URP_Users
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_Users' => 'Usuario',
'Class:URP_Users+' => 'Usuarios e credenciais',
'Class:URP_Users/Attribute:userid' => 'Contatos (pessoa)',
'Class:URP_Users/Attribute:userid+' => 'Os dados pessoais a partir dos dados de negócio',
'Class:URP_Users/Attribute:last_name' => 'Ultimo nome',
'Class:URP_Users/Attribute:last_name+' => 'Nome do contato correspondente',
'Class:URP_Users/Attribute:first_name' => 'Primeiro nome',
'Class:URP_Users/Attribute:first_name+' => 'Primeiro nome do contato correspondente',
'Class:URP_Users/Attribute:email' => 'Email',
'Class:URP_Users/Attribute:email+' => 'Email do contato correspondente',
'Class:URP_Users/Attribute:login' => 'Usuario',
'Class:URP_Users/Attribute:login+' => 'identificação do usuário',
'Class:URP_Users/Attribute:password' => 'Senha',
'Class:URP_Users/Attribute:password+' => 'autenticação/senha usuário',
'Class:URP_Users/Attribute:language' => 'Linguagem',
'Class:URP_Users/Attribute:language+' => 'linguagem usuário',
'Class:URP_Users/Attribute:language/Value:EN US' => 'Ingles',
'Class:URP_Users/Attribute:language/Value:EN US+' => 'Ingles U.S.',
'Class:URP_Users/Attribute:language/Value:FR FR' => 'Frances',
'Class:URP_Users/Attribute:language/Value:FR FR+' => 'FR FR',
'Class:URP_Users/Attribute:language/Value:PT BR' => 'Brazilian',
'Class:URP_Users/Attribute:language/Value:PT BR+' => 'PT BR',
'Class:URP_Users/Attribute:profile_list' => 'Profiles',
'Class:URP_Users/Attribute:profile_list+' => 'Regras, permissao direitos para esta pessoa',
));
//
// Class: URP_Profiles
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_Profiles' => 'Profile',
'Class:URP_Profiles+' => 'Profile usuario',
'Class:URP_Profiles/Attribute:name' => 'Nome',
'Class:URP_Profiles/Attribute:name+' => 'Titulo',
'Class:URP_Profiles/Attribute:description' => 'Descricao',
'Class:URP_Profiles/Attribute:description+' => 'uma linha descricao',
'Class:URP_Profiles/Attribute:user_list' => 'Usuarios',
'Class:URP_Profiles/Attribute:user_list+' => 'pessoas possuem esta regra',
));
//
// Class: URP_Dimensions
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_Dimensions' => 'dimensão',
'Class:URP_Dimensions+' => 'dimensão aplicação',
'Class:URP_Dimensions/Attribute:name' => 'Nome',
'Class:URP_Dimensions/Attribute:name+' => 'label',
'Class:URP_Dimensions/Attribute:description' => 'Descrição',
'Class:URP_Dimensions/Attribute:description+' => 'one line description',
'Class:URP_Dimensions/Attribute:type' => 'Tipo',
'Class:URP_Dimensions/Attribute:type+' => 'nome classe ou tipo dado (unidade projetada)',
));
//
// Class: URP_UserProfile
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_UserProfile' => 'Usuario para profile',
'Class:URP_UserProfile+' => 'profiles usuario',
'Class:URP_UserProfile/Attribute:userid' => 'Usuario',
'Class:URP_UserProfile/Attribute:userid+' => 'conta usuario',
'Class:URP_UserProfile/Attribute:userlogin' => 'Login',
'Class:URP_UserProfile/Attribute:userlogin+' => 'Login Usuario\'s',
'Class:URP_UserProfile/Attribute:profileid' => 'Profile',
'Class:URP_UserProfile/Attribute:profileid+' => 'profile utilizada',
'Class:URP_UserProfile/Attribute:profile' => 'Profile',
'Class:URP_UserProfile/Attribute:profile+' => 'Nome profile',
'Class:URP_UserProfile/Attribute:reason' => 'Razao',
'Class:URP_UserProfile/Attribute:reason+' => 'explicar porque este usuario teve ter esta regra',
));
//
// Class: URP_ProfileProjection
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_ProfileProjection' => 'profile_projection',
'Class:URP_ProfileProjection+' => 'profile projections',
'Class:URP_ProfileProjection/Attribute:dimensionid' => 'Dimension',
'Class:URP_ProfileProjection/Attribute:dimensionid+' => 'application dimension',
'Class:URP_ProfileProjection/Attribute:dimension' => 'Dimension',
'Class:URP_ProfileProjection/Attribute:dimension+' => 'application dimension',
'Class:URP_ProfileProjection/Attribute:profileid' => 'Profile',
'Class:URP_ProfileProjection/Attribute:profileid+' => 'usage profile',
'Class:URP_ProfileProjection/Attribute:profile' => 'Profile',
'Class:URP_ProfileProjection/Attribute:profile+' => 'Profile name',
'Class:URP_ProfileProjection/Attribute:value' => 'Value expression',
'Class:URP_ProfileProjection/Attribute:value+' => 'OQL expression (using $user) | constant | | +attribute code',
'Class:URP_ProfileProjection/Attribute:attribute' => 'Attribute',
'Class:URP_ProfileProjection/Attribute:attribute+' => 'Target attribute code (optional)',
));
//
// Class: URP_ClassProjection
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_ClassProjection' => 'class_projection',
'Class:URP_ClassProjection+' => 'class projections',
'Class:URP_ClassProjection/Attribute:dimensionid' => 'Dimension',
'Class:URP_ClassProjection/Attribute:dimensionid+' => 'application dimension',
'Class:URP_ClassProjection/Attribute:dimension' => 'Dimension',
'Class:URP_ClassProjection/Attribute:dimension+' => 'application dimension',
'Class:URP_ClassProjection/Attribute:class' => 'Class',
'Class:URP_ClassProjection/Attribute:class+' => 'Target class',
'Class:URP_ClassProjection/Attribute:value' => 'Value expression',
'Class:URP_ClassProjection/Attribute:value+' => 'OQL expression (using $this) | constant | | +attribute code',
'Class:URP_ClassProjection/Attribute:attribute' => 'Attribute',
'Class:URP_ClassProjection/Attribute:attribute+' => 'Target attribute code (optional)',
));
//
// Class: URP_ActionGrant
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_ActionGrant' => 'action_permission',
'Class:URP_ActionGrant+' => 'permissões nas classes',
'Class:URP_ActionGrant/Attribute:profileid' => 'Profile',
'Class:URP_ActionGrant/Attribute:profileid+' => 'profiles usadas',
'Class:URP_ActionGrant/Attribute:profile' => 'Profile',
'Class:URP_ActionGrant/Attribute:profile+' => 'usage profile',
'Class:URP_ActionGrant/Attribute:class' => 'Class',
'Class:URP_ActionGrant/Attribute:class+' => 'Target class',
'Class:URP_ActionGrant/Attribute:permission' => 'Permission',
'Class:URP_ActionGrant/Attribute:permission+' => 'allowed or not allowed?',
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'yes',
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => 'yes',
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'no',
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => 'no',
'Class:URP_ActionGrant/Attribute:action' => 'Action',
'Class:URP_ActionGrant/Attribute:action+' => 'operations to perform on the given class',
));
//
// Class: URP_StimulusGrant
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_StimulusGrant' => 'stimulus_permission',
'Class:URP_StimulusGrant+' => 'permissions on stimilus in the life cycle of the object',
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profile',
'Class:URP_StimulusGrant/Attribute:profileid+' => 'usage profile',
'Class:URP_StimulusGrant/Attribute:profile' => 'Profile',
'Class:URP_StimulusGrant/Attribute:profile+' => 'usage profile',
'Class:URP_StimulusGrant/Attribute:class' => 'Class',
'Class:URP_StimulusGrant/Attribute:class+' => 'Target class',
'Class:URP_StimulusGrant/Attribute:permission' => 'Permission',
'Class:URP_StimulusGrant/Attribute:permission+' => 'allowed or not allowed?',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'yes',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => 'yes',
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'no',
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => 'no',
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Stimulus',
'Class:URP_StimulusGrant/Attribute:stimulus+' => 'stimulus code',
));
//
// Class: URP_AttributeGrant
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:URP_AttributeGrant' => 'attribute_permission',
'Class:URP_AttributeGrant+' => 'permissions at the attributes level',
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Action grant',
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => 'action grant',
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribute',
'Class:URP_AttributeGrant/Attribute:attcode+' => 'attribute code',
));
//
// String from the User Interface: menu, messages, buttons, etc...
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:WelcomeMenu' => 'Bem-vindo',
'Menu:WelcomeMenu+' => 'Bem-vindo ao iTop',
'Menu:WelcomeMenuPage' => 'Bem-vindo',
'Menu:WelcomeMenuPage+' => 'Bem-vindo ao iTop',
'UI:WelcomeMenu:Title' => 'Bem-vindo ao iTop',
'UI:WelcomeMenu:LeftBlock' => '<p>iTop é um completo, livre, portal IT.</p>
<ul>Inclui:
<li>completo CMDB (Configuration management database) documentar e gerenciar inventários IT.</li>
<li>módulo Gerenciador Incidente para monitorar e comunicar-se sobre todas as questões que ocorrem na TI.</li>
<li>módulo Gerenciador Mudanças/Alterações para planejar e monitorar mudanças/alterações no ambiente TI.</li>
<li>base de dados com erros conhecidos para agilizar a solução de incidentes.</li>
<li>módulo falha para documentar todas as interrupções planejadas e notificar os contatos adequados.</li>
<li>painéis para obter rapidamente uma visão geral de TI.</li>
</ul>
<p>Todos os módulos podem ser configurados, passo a passo, cada um, independente dos outros..</p>',
'UI:WelcomeMenu:RightBlock' => '<p>iTop é um provedor de serviço, que permite gerenciar facilmente múltiplos clientes ou organizações.
<ul>iTop, oferece um conjunto rico em recursos de processos de negócios que:
<li>melhora a eficácia da gestão de TI</li>
<li>melhora operações de TI</li>
<li>melhora o desempenho da satisfação do cliente.</li>
</ul>
</p>
<p>iTop é completamente aberto para ser integrado com infra-estrutura de IT atuais.</p>
<p>
<ul>Adopting this new generation of IT Operational portal will help you to:
<li>Better manage a more and more complex IT environment.</li>
<li>Implement ITIL processes at your own pace.</li>
<li>Manage the most important asset of your IT: Documentation.</li>
</ul>
</p>',
'UI:WelcomeMenu:AllOpenRequests' => 'Chamados Abertos: %1$d',
'UI:WelcomeMenu:MyCalls' => 'Solicitações de usuários atribuído a mim',
'UI:WelcomeMenu:OpenIncidents' => 'Incidentes Abertos: %1$d',
'UI:WelcomeMenu:AllConfigItems' => 'Configuração Itens: %1$d',
'UI:WelcomeMenu:MyIncidents' => 'Incidentes atribuídas a mim',
'UI:AllOrganizations' => ' Todas Organizações ',
'UI:YourSearch' => 'Pesquisar',
'UI:LoggedAsMessage' => 'Conectado como %1$s',
'UI:LoggedAsMessage+Admin' => 'Conectado como %1$s (Administrador)',
'UI:Button:Logoff' => 'Sair',
'UI:Button:GlobalSearch' => 'Pesquisar',
'UI:Button:Search' => ' Pesquisar ',
'UI:Button:Query' => ' Consultar ',
'UI:Button:Ok' => 'Ok',
'UI:Button:Cancel' => 'Cancelar',
'UI:Button:Apply' => 'Aplicar',
'UI:Button:Back' => ' << Voltar ',
'UI:Button:Next' => ' Proximo >> ',
'UI:Button:Finish' => ' Finalizar ',
'UI:Button:DoImport' => ' Executar para importar ! ',
'UI:Button:Done' => ' Concluido ',
'UI:Button:SimulateImport' => ' Simulate the Import ',
'UI:Button:Test' => 'Testar!',
'UI:Button:Evaluate' => ' Evaluate ',
'UI:Button:AddObject' => ' Adicionar... ',
'UI:Button:BrowseObjects' => ' Navegar... ',
'UI:Button:Add' => ' Adicionar ',
'UI:Button:AddToList' => ' << Adicionar ',
'UI:Button:RemoveFromList' => ' Remover >> ',
'UI:Button:FilterList' => ' Filtrar... ',
'UI:Button:Create' => ' Criar ',
'UI:Button:Delete' => ' Apagar ! ',
'UI:Button:ChangePassword' => ' Alterar senha ',
'UI:SearchToggle' => 'Pesquisar',
'UI:ClickToCreateNew' => 'Criar um(a) novo(a) %1$s',
'UI:SearchFor_Class' => 'Pesquisa para %1$s objetos',
'UI:NoObjectToDisplay' => 'Nenhum objeto encontrado.',
'UI:Error:MandatoryTemplateParameter_object_id' => 'Parâmetro object_id é obrigatório quando link_attr é especificado. Verifique a definição do modelo.',
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Parâmetro target_attr é obrigatório quando link_attr é especificado. Verifique a definição do modelo.',
'UI:Error:MandatoryTemplateParameter_group_by' => 'Parâmetro group_by é obrigatório. Verifique a definição do modelo.',
'UI:Error:InvalidGroupByFields' => 'Inválido lista de campos para agrupar por: "%1$s".',
'UI:Error:UnsupportedStyleOfBlock' => 'Erro: não suportado estilo de bloco: "%1$s".',
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Incorreta definição link: a classe de objetos para gerenciar: %1$s não foi encontrado como uma chave externa na classe %2$s',
'UI:Error:Object_Class_Id_NotFound' => 'Objeto: %1$s:%2$d não encontrado.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Erro: Referência circular nas dependências entre os campos, verifique o modelo de dados.',
'UI:Error:UploadedFileTooBig' => 'O arquivo enviado é muito grande (Tamanho máximo permitido é %1$s. Verifique sua configuração do PHP para upload_max_filesize.',
'UI:Error:UploadedFileTruncated.' => 'Envio de arquivo foi truncado!',
'UI:Error:NoTmpDir' => 'O diretorio temporário não está definido.',
'UI:Error:CannotWriteToTmp_Dir' => 'Desabilitado escrever o arquivo temporario no disco. upload_tmp_dir = "%1$s".',
'UI:Error:UploadStoppedByExtension_FileName' => 'Upload parado por extensao. (Nome original arquivo = "%1$s").',
'UI:Error:UploadFailedUnknownCause_Code' => 'Upload de arquivo falhou, causa desconhecida. (Erro codigo = "%1$s").',
'UI:Error:1ParametersMissing' => 'Erro: o seguinte parametro deve ser especificado para esta operacao: %1$s.',
'UI:Error:2ParametersMissing' => 'Erro: os seguinte parametros devem ser especificados para esta operacao: %1$s e %2$s.',
'UI:Error:3ParametersMissing' => 'Erro: os seguinte parametros devem ser especificados para esta operacao: %1$s, %2$s e %3$s.',
'UI:Error:4ParametersMissing' => 'Erro: os seguinte parametros devem ser especificados para esta operacao: %1$s, %2$s, %3$s e %4$s.',
'UI:Error:IncorrectOQLQuery_Message' => 'Erro: Consulta OQL incorreta: %1$s',
'UI:Error:AnErrorOccuredWhileRunningTheQuery_Message' => 'Um erro ocorreu enquanto executava a consulta: %1$s',
'UI:Error:ObjectAlreadyUpdated' => 'Erro: o objeto já foi atualizado.',
'UI:Error:ObjectCannotBeUpdated' => 'Erro: objeto nao pode ser atualizado.',
'UI:Error:ObjectsAlreadyDeleted' => 'Erro: objeto já pode ter sido eliminada!',
'UI:Error:BulkDeleteNotAllowedOn_Class' => 'Permissão negado para executar uma exclusão em massa de objetos da classe %1$s',
'UI:Error:DeleteNotAllowedOn_Class' => 'Permissão negado para apagar objeto da classe %1$s',
'UI:Error:ObjectAlreadyCloned' => 'Erro: o objeto ja foi clonado!',
'UI:Error:ObjectAlreadyCreated' => 'Erro: o objeto ja foi criado!',
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'Erro: invalid stimulus "%1$s" on object %2$s in state "%3$s".',
'UI:GroupBy:Count' => 'Contagem',
'UI:GroupBy:Count+' => 'N&uacute;mero de elementos',
'UI:CountOfObjects' => '%1$d objetos que correspondem aos criterios.',
'UI:NoObject_Class_ToDisplay' => 'Nenhum %1$s para mostrar',
'UI:History:LastModified_On_By' => 'Ultima modificacao de %1$s por %2$s.',
'UI:HistoryTab' => 'Historico',
'UI:History:Date' => 'Data',
'UI:History:Date+' => 'Data da alteração',
'UI:History:User' => 'Usuario',
'UI:History:User+' => 'Usuario que fez alteração',
'UI:History:Changes' => 'Alterações',
'UI:History:Changes+' => 'Alterações feita no objeto',
'UI:Loading' => 'Carregando...',
'UI:Menu:Actions' => 'Ações',
'UI:Menu:New' => 'Novo...',
'UI:Menu:Add' => 'Adicionar...',
'UI:Menu:Manage' => 'Gerencia...',
'UI:Menu:EMail' => 'eMail',
'UI:Menu:CSVExport' => 'Exportar CSV',
'UI:Menu:Modify' => 'Modificar...',
'UI:Menu:Delete' => 'Apagar...',
'UI:Menu:Manage' => 'Gerencia...',
'UI:Menu:BulkDelete' => 'Apagar...',
'UI:UndefinedObject' => 'indefinido',
'UI:Document:OpenInNewWindow:Download' => 'Abrir em nova janela: %1$s, Download: %2$s',
'UI:SelectAllToggle+' => 'Selecionar / Deselecionar todos',
'UI:TruncatedResults' => '%1$d objetos mostrados out of %2$d',
'UI:DisplayAll' => 'Mostrar todos',
'UI:CountOfResults' => '%1$d objeto(s)',
'UI:ChangesLogTitle' => 'Alteracoes log (%1$d):',
'UI:EmptyChangesLogTitle' => 'Alteracoes log esta limpo',
'UI:SearchFor_Class_Objects' => 'Pesquisa para %1$s objetos',
'UI:OQLQueryBuilderTitle' => 'Construir consulta OQL',
'UI:OQLQueryTab' => 'Consulta OQL',
'UI:SimpleSearchTab' => 'Pesquisa simples',
'UI:Details+' => 'Detalhes',
'UI:SearchValue:Any' => '* Qualquer *',
'UI:SearchValue:Mixed' => '* mix *',
'UI:SelectOne' => '-- selecione um --',
'UI:Login:Welcome' => 'Bem-vindo ao iTop!',
'UI:Login:IncorrectLoginPassword' => 'Usuario/senha incorreto(s), por favor, tente novamente.',
'UI:Login:IdentifyYourself' => 'Identifique-se antes continuar...',
'UI:Login:UserNamePrompt' => 'Nome usuario',
'UI:Login:PasswordPrompt' => 'Senha',
'UI:Login:ChangeYourPassword' => 'Alterar sua senha',
'UI:Login:OldPasswordPrompt' => 'Senha antiga',
'UI:Login:NewPasswordPrompt' => 'Nova senha',
'UI:Login:RetypeNewPasswordPrompt' => 'Digite novamente a senha',
'UI:Login:IncorrectOldPassword' => 'Erro: senha incorreta',
'UI:LogOffMenu' => 'Sair',
'UI:ChangePwdMenu' => 'Alterar senha...',
'UI:Login:RetypePwdDoesNotMatch' => 'A nova senha nao confere!',
'UI:Button:Login' => 'Enter iTop',
'UI:Login:Error:AccessRestricted' => 'iTop accesso restrito. Por favor, contate o suporte.',
'UI:CSVImport:MappingSelectOne' => '-- selecione um --',
'UI:CSVImport:MappingNotApplicable' => '-- ignore este campo --',
'UI:CSVImport:NoData' => 'Conjunto vazio de dados..., forneca alguns dados!',
'UI:Title:DataPreview' => 'Visualizar dado',
'UI:CSVImport:ErrorOnlyOneColumn' => 'Erro: Os dados contem apenas uma coluna. Sera que voce selecionou o separador adequado?',
'UI:CSVImport:FieldName' => 'Campo %1$d',
'UI:CSVImport:DataLine1' => 'Dado linha 1',
'UI:CSVImport:DataLine2' => 'Dado linha 2',
'UI:CSVImport:idField' => 'id (Chave primaria)',
'UI:Title:BulkImport' => 'iTop - Importacao em massa',
'UI:Title:BulkImport+' => 'CSV Assistente de Importacao',
'UI:CSVImport:ClassesSelectOne' => '-- selecione um --',
'UI:CSVImport:ErrorExtendedAttCode' => 'Erro interno: "%1$s" e um codigo incorreto, pois "%2$s" NAO e chave externa da classe "%3$s"',
'UI:CSVImport:ObjectsWillStayUnchanged' => '%1$d objeto(s) permanecera inalterados.',
'UI:CSVImport:ObjectsWillBeModified' => '%1$d objeto(s) sera modificado.',
'UI:CSVImport:ObjectsWillBeAdded' => '%1$d objeto(s) sera adicionado.',
'UI:CSVImport:ObjectsWillHaveErrors' => '%1$d objeto(s) tem erros.',
'UI:CSVImport:ObjectsRemainedUnchanged' => '%1$d objeto(s) manteve-se inalterada.',
'UI:CSVImport:ObjectsWereModified' => '%1$d objeto(s) foram modificados.',
'UI:CSVImport:ObjectsWereAdded' => '%1$d objeto(s) foram adicionados.',
'UI:CSVImport:ObjectsAddErrors' => '%1$d objeto(s) apresentam erros.',
'UI:Title:CSVImportStep2' => 'Step 2 of 5: CSV opcoes dados',
'UI:Title:CSVImportStep3' => 'Step 3 of 5: Mapeamento de dados',
'UI:Title:CSVImportStep4' => 'Step 4 of 5: Simulacao Importacao',
'UI:Title:CSVImportStep5' => 'Step 5 of 5: Importacao completado',
'UI:CSVImport:LinesNotImported' => 'Linhas que nao pode ser carregadas:',
'UI:CSVImport:LinesNotImported+' => 'As seguintes linhas nao foram importados, porque eles contem erros',
'UI:CSVImport:SeparatorComma+' => ', (comma)',
'UI:CSVImport:SeparatorSemicolon+' => '; (semicolon)',
'UI:CSVImport:SeparatorTab+' => 'tab',
'UI:CSVImport:SeparatorOther' => 'outros:',
'UI:CSVImport:QualifierDoubleQuote+' => '" (aspa dupla)',
'UI:CSVImport:QualifierSimpleQuote+' => '\' (simple quote)',
'UI:CSVImport:QualifierOther' => 'outros:',
'UI:CSVImport:TreatFirstLineAsHeader' => 'Tratar a primeira linha como um cabecalho (nome da coluna)',
'UI:CSVImport:Skip_N_LinesAtTheBeginning' => 'Skip %1$s line(s) at the beginning of the file',
'UI:CSVImport:CSVDataPreview' => 'CSV Data Preview',
'UI:CSVImport:SelectFile' => 'Select the file to import:',
'UI:CSVImport:Tab:LoadFromFile' => 'Load from a file',
'UI:CSVImport:Tab:CopyPaste' => 'Copy and paste data',
'UI:CSVImport:Tab:Templates' => 'Templates',
'UI:CSVImport:PasteData' => 'Paste the data to import:',
'UI:CSVImport:PickClassForTemplate' => 'Pick the template to download: ',
'UI:CSVImport:SeparatorCharacter' => 'Separator character:',
'UI:CSVImport:TextQualifierCharacter' => 'Text qualifier character',
'UI:CSVImport:CommentsAndHeader' => 'Comments and header',
'UI:CSVImport:SelectClass' => 'Select the class to import:',
'UI:CSVImport:AdvancedMode' => 'Advanced mode',
'UI:CSVImport:AdvancedMode+' => 'In advanced mode the "id" (primary key) of the objects can be used to update and rename objects.' .
'However the column "id" (if present) can only be used as a search criteria and can not be combined with any other search criteria.',
'UI:CSVImport:SelectAClassFirst' => 'To configure the mapping, select a class first.',
'UI:CSVImport:HeaderFields' => 'Fields',
'UI:CSVImport:HeaderMappings' => 'Mappings',
'UI:CSVImport:HeaderSearch' => 'Search?',
'UI:CSVImport:AlertIncompleteMapping' => 'Please select a mapping for every field.',
'UI:CSVImport:AlertNoSearchCriteria' => 'Please select at least one search criteria',
'UI:UniversalSearchTitle' => 'iTop - Pesquisa universal',
'UI:UniversalSearch:Error' => 'Erro: %1$s',
'UI:UniversalSearch:LabelSelectTheClass' => 'Selecione a classe para pesquisa: ',
'UI:Audit:Title' => 'iTop - CMDB Auditoria',
'UI:Audit:InteractiveAudit' => 'Interactive Audit',
'UI:Audit:HeaderAuditRule' => 'Audit Rule',
'UI:Audit:HeaderNbObjects' => '# Objects',
'UI:Audit:HeaderNbErrors' => '# Errors',
'UI:Audit:PercentageOk' => '% Ok',
'UI:RunQuery:Title' => 'iTop - OQL Query Evaluation',
'UI:RunQuery:QueryExamples' => 'Query Examples',
'UI:RunQuery:HeaderPurpose' => 'Purpose',
'UI:RunQuery:HeaderPurpose+' => 'Explanation about the query',
'UI:RunQuery:HeaderOQLExpression' => 'OQL Expression',
'UI:RunQuery:HeaderOQLExpression+' => 'The query in OQL syntax',
'UI:RunQuery:ExpressionToEvaluate' => 'Expression to evaluate: ',
'UI:RunQuery:MoreInfo' => 'More information about the query: ',
'UI:RunQuery:DevelopedQuery' => 'Redevelopped query expression: ',
'UI:RunQuery:SerializedFilter' => 'Serialized filter: ',
'UI:RunQuery:Error' => 'An error occured while running the query: %1$s',
'UI:Schema:Title' => 'iTop objects schema',
'UI:Schema:CategoryMenuItem' => 'Category <b>%1$s</b>',
'UI:Schema:Relationships' => 'Relationships',
'UI:Schema:AbstractClass' => 'Abstract class: no object from this class can be instantiated.',
'UI:Schema:NonAbstractClass' => 'Non abstract class: objects from this class can be instantiated.',
'UI:Schema:ClassHierarchyTitle' => 'Class hierarchy',
'UI:Schema:AllClasses' => 'All classes',
'UI:Schema:ExternalKey_To' => 'External key to %1$s',
'UI:Schema:Columns_Description' => 'Columns: <em>%1$s</em>',
'UI:Schema:Default_Description' => 'Default: "%1$s"',
'UI:Schema:NullAllowed' => 'Null Allowed',
'UI:Schema:NullNotAllowed' => 'Null NOT Allowed',
'UI:Schema:Attributes' => 'Attributes',
'UI:Schema:AttributeCode' => 'Attribute Code',
'UI:Schema:AttributeCode+' => 'Internal code of the attribute',
'UI:Schema:Label' => 'Label',
'UI:Schema:Label+' => 'Label of the attribute',
'UI:Schema:Type' => 'Type',
'UI:Schema:Type+' => 'Data type of the attribute',
'UI:Schema:Origin' => 'Origin',
'UI:Schema:Origin+' => 'The base class in which this attribute is defined',
'UI:Schema:Description' => 'Description',
'UI:Schema:Description+' => 'Description of the attribute',
'UI:Schema:AllowedValues' => 'Allowed values',
'UI:Schema:AllowedValues+' => 'Restrictions on the possible values for this attribute',
'UI:Schema:MoreInfo' => 'More info',
'UI:Schema:MoreInfo+' => 'More information about the field defined in the database',
'UI:Schema:SearchCriteria' => 'Search criteria',
'UI:Schema:FilterCode' => 'Filter code',
'UI:Schema:FilterCode+' => 'Code of this search criteria',
'UI:Schema:FilterDescription' => 'Description',
'UI:Schema:FilterDescription+' => 'Description of this search criteria',
'UI:Schema:AvailOperators' => 'Available operators',
'UI:Schema:AvailOperators+' => 'Possible operators for this search criteria',
'UI:Schema:ChildClasses' => 'Child classes',
'UI:Schema:ReferencingClasses' => 'Referencing classes',
'UI:Schema:RelatedClasses' => 'Related classes',
'UI:Schema:LifeCycle' => 'Life cycle',
'UI:Schema:Triggers' => 'Triggers',
'UI:Schema:Relation_Code_Description' => 'Relation <em>%1$s</em> (%2$s)',
'UI:Schema:RelationDown_Description' => 'Down: %1$s',
'UI:Schema:RelationUp_Description' => 'Up: %1$s',
'UI:Schema:RelationPropagates' => '%1$s: propagate to %2$d levels, query: %3$s',
'UI:Schema:RelationDoesNotPropagate' => '%1$s: does not propagates (%2$d levels), query: %3$s',
'UI:Schema:Class_ReferencingClasses_From_By' => '%1$s is referenced by the class %2$s via the field %3$s',
'UI:Schema:Class_IsLinkedTo_Class_Via_ClassAndAttribute' => '%1$s is linked to %2$s via %3$s::<em>%4$s</em>',
'UI:Schema:Links:1-n' => 'Classes pointing to %1$s (1:n links):',
'UI:Schema:Links:n-n' => 'Classes linked to %1$s (n:n links):',
'UI:Schema:Links:All' => 'Graph of all related classes',
'UI:Schema:NoLifeCyle' => 'There is no life cycle defined for this class.',
'UI:Schema:LifeCycleTransitions' => 'Transitions',
'UI:Schema:LifeCyleAttributeOptions' => 'Attribute options',
'UI:Schema:LifeCycleHiddenAttribute' => 'Hidden',
'UI:Schema:LifeCycleReadOnlyAttribute' => 'Read-only',
'UI:Schema:LifeCycleMandatoryAttribute' => 'Mandatory',
'UI:Schema:LifeCycleAttributeMustChange' => 'Must change',
'UI:Schema:LifeCycleAttributeMustPrompt' => 'User will be prompted to change the value',
'UI:Schema:LifeCycleEmptyList' => 'lista limpa',
'UI:LinksWidget:Autocomplete+' => 'Type the first 3 characters...',
'UI:Combo:SelectValue' => '--- select a value ---',
'UI:Label:SelectedObjects' => 'Objetos selecionados: ',
'UI:Label:AvailableObjects' => 'Objetos dispon&iacute;veis: ',
'UI:Link_Class_Attributes' => '%1$s atributos',
'UI:SelectAllToggle+' => 'Marque todos / Desmarque todos',
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => 'Adionar %1$s objetos ligados com %2$s: %3$s',
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => 'Manage %1$s objects linked with %2$s: %3$s',
'UI:AddLinkedObjectsOf_Class' => 'Adicionado %1$ss...',
'UI:RemoveLinkedObjectsOf_Class' => 'Apagado objeto(s) selecionado(s)',
'UI:Message:EmptyList:UseAdd' => 'A lista est&aacute; limpa, use o &iacute;cone "Adicionar..." para adicionar elementos.',
'UI:Message:EmptyList:UseSearchForm' => 'Use o formul&aacute;rio Pesquisa para pesquisar objetos a ser adicionado.',
'UI:Wizard:FinalStepTitle' => 'Passo Final: confirmação',
'UI:Title:DeletionOf_Object' => 'Eliminação de %1$s',
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Bulk deletion of %1$d objects of class %2$s',
'UI:Delete:NotAllowedToDelete' => 'Permissão negado para eliminar este objeto',
'UI:Delete:NotAllowedToUpdate_Fields' => 'Permissão negado para atualizar o(s) seguinte(s) campo(s): %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'Este objeto não pode ser apagado pelo usu&aacute;rio não ter direitos administrativos',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'This object could not be deleted because some manual operations must be performed prior to that',
'UI:Archive_User_OnBehalfOf_User' => '%1$s em nome de %2$s',
'UI:Delete:AutomaticallyDeleted' => 'eliminado automaticamente',
'UI:Delete:AutomaticResetOf_Fields' => 'reset autom&aacute;tico dos campo(s): %1$s',
'UI:Delete:CleaningUpRefencesTo_Object' => 'Limpar todas as refer&ecirc;ncias a %1$s...',
'UI:Delete:CleaningUpRefencesTo_Several_ObjectsOf_Class' => 'Limpando todas as referências ao objeto %1$d da classe %2$s...',
'UI:Delete:Done+' => 'What was done...',
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s eliminado.',
'UI:Delete:ConfirmDeletionOf_Name' => 'Eliminação de %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Eliminação do objeto %1$d da classe %2$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotAllowed' => 'Should be automaticaly deleted, but you are not allowed to do so',
'UI:Delete:MustBeDeletedManuallyButNotAllowed' => 'Must be deleted manually - but you are not allowed to delete this object, please contact your application admin',
'UI:Delete:WillBeDeletedAutomatically' => 'Ser&aacute; automaticamente exclu&iacute;do',
'UI:Delete:MustBeDeletedManually' => 'Deve ser exclu&iacute;do manualmente',
'UI:Delete:CannotUpdateBecause_Issue' => 'Devem ser atualizados automaticamente, mas: %1$s',
'UI:Delete:WillAutomaticallyUpdate_Fields' => 'ser&aacute; automaticamente atualizado (reset: %1$s)',
'UI:Delete:Count_Objects/LinksReferencing_Object' => '%1$d objects/links are referencing %2$s',
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d objects/links are referencing some of the objects to be deleted',
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'To ensure Database integrity, any reference should be further eliminated',
'UI:Delete:Consequence+' => 'What will be done',
'UI:Delete:SorryDeletionNotAllowed' => 'Sorry, you are not allowed to delete this object, see the detailed explanations above',
'UI:Delete:PleaseDoTheManualOperations' => 'Please perform the manual operations listed above prior to requesting the deletion of this object',
'UI:Delect:Confirm_Object' => 'Deseja realmente apagar %1$s.',
'UI:Delect:Confirm_Count_ObjectsOf_Class' => 'Por favor, confirme que deseja apagar o seguinte %1$d objetos da classe %2$s.',
'UI:WelcomeToITop' => 'Bem-vindo ao iTop',
'UI:DetailsPageTitle' => 'iTop - %1$s - %2$s detalhes',
'UI:ErrorPageTitle' => 'iTop - Erro',
'UI:ObjectDoesNotExist' => 'Desculpe, este objeto não existe (ou voc&ecirc; não tem permissão para v&ecirc;-lo).',
'UI:SearchResultsPageTitle' => 'iTop - Pesquisa resultados',
'UI:Search:NoSearch' => 'Nada para pesquisar',
'UI:FullTextSearchTitle_Text' => 'Resultados para "%1$s":',
'UI:Search:Count_ObjectsOf_Class_Found' => '%1$d objeto(s) da classe %2$s encontrado(s).',
'UI:Search:NoObjectFound' => 'Nenhum objeto encontrado.',
'UI:ModificationPageTitle_Object_Class' => 'iTop - %1$s - %2$s modificação',
'UI:ModificationTitle_Class_Object' => 'Modificação de %1$s: <span class=\"hilite\">%2$s</span>',
'UI:ClonePageTitle_Object_Class' => 'iTop - Clone %1$s - %2$s modificação',
'UI:CloneTitle_Class_Object' => 'Clone de %1$s: <span class=\"hilite\">%2$s</span>',
'UI:CreationPageTitle_Class' => 'iTop - Criação de um(a) novo(a) %1$s ',
'UI:CreationTitle_Class' => 'Criação de um(a) novo(a) %1$s',
'UI:SelectTheTypeOf_Class_ToCreate' => 'Selecione o tipo de %1$s a ser criado:',
'UI:Class_Object_NotUpdated' => 'Nenhuma mudança detectada, %1$s (%2$s) <strong>não</strong> foi modificado.',
'UI:Class_Object_Updated' => '%1$s (%2$s) atualizado.',
'UI:BulkDeletePageTitle' => 'iTop - Excluir em massa',
'UI:BulkDeleteTitle' => 'Marque os objetos que deseja excluir:',
'UI:PageTitle:ObjectCreated' => 'iTop Objeto criado.',
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s criado.',
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Applying %1$s on object: %2$s in state %3$s to target state: %4$s.',
'UI:PageTitle:FatalError' => 'iTop - Erro fatal',
'UI:FatalErrorMessage' => 'Erro fatal, não pode continuar.',
'UI:Error_Details' => 'Erro: %1$s.',
'UI:PageTitle:ClassProjections' => 'iTop user management - class projections',
'UI:PageTitle:ProfileProjections' => 'iTop user management - profile projections',
'UI:UserManagement:Class' => 'Class',
'UI:UserManagement:Class+' => 'Class of objects',
'UI:UserManagement:ProjectedObject' => 'Object',
'UI:UserManagement:ProjectedObject+' => 'Projected object',
'UI:UserManagement:AnyObject' => '* any *',
'UI:UserManagement:User' => 'User',
'UI:UserManagement:User+' => 'User involved in the projection',
'UI:UserManagement:Profile' => 'Profile',
'UI:UserManagement:Profile+' => 'Profile in which the projection is specified',
'UI:UserManagement:Action:Read' => 'Read',
'UI:UserManagement:Action:Read+' => 'Read/display objects',
'UI:UserManagement:Action:Modify' => 'Modify',
'UI:UserManagement:Action:Modify+' => 'Create and edit (modify) objects',
'UI:UserManagement:Action:Delete' => 'Delete',
'UI:UserManagement:Action:Delete+' => 'Delete objects',
'UI:UserManagement:Action:BulkRead' => 'Bulk Read (Export)',
'UI:UserManagement:Action:BulkRead+' => 'List objects or export massively',
'UI:UserManagement:Action:BulkModify' => 'Bulk Modify',
'UI:UserManagement:Action:BulkModify+' => 'Massively create/edit (CSV import)',
'UI:UserManagement:Action:BulkDelete' => 'Bulk Delete',
'UI:UserManagement:Action:BulkDelete+' => 'Massively delete objects',
'UI:UserManagement:Action:Stimuli' => 'Stimuli',
'UI:UserManagement:Action:Stimuli+' => 'Allowed (compound) actions',
'UI:UserManagement:Action' => 'Action',
'UI:UserManagement:Action+' => 'Action performed by the user',
'UI:UserManagement:TitleActions' => 'Actions',
'UI:UserManagement:Permission' => 'Permission',
'UI:UserManagement:Permission+' => 'User\'s permissions',
'UI:UserManagement:Attributes' => 'Attributes',
'UI:UserManagement:ActionAllowed:Yes' => 'Yes',
'UI:UserManagement:ActionAllowed:No' => 'No',
'UI:UserManagement:AdminProfile+' => 'Administrators have full read/write access to all objects in the database.',
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
'UI:UserManagement:NoLifeCycleApplicable+' => 'No lifecycle has been defined for this class',
'UI:UserManagement:GrantMatrix' => 'Grant Matrix',
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Link between %1$s and %2$s',
'Menu:AdminTools' => 'Ferramentas administrativa',
'Menu:AdminTools+' => 'Ferramentas administrativa',
'Menu:AdminTools?' => 'Ferramentas permitidas somente para usu&aacute;rio com profile administrador',
'UI:ChangeManagementMenu' => 'Gerenciamento Mudanças',
'UI:ChangeManagementMenu+' => 'Gerenciamento Mudanças',
'UI:ChangeManagementMenu:Title' => 'Visão geral Mudanças',
'UI-ChangeManagementMenu-ChangesByType' => 'Mudanças por tipo',
'UI-ChangeManagementMenu-ChangesByStatus' => 'Mudanças por status',
'UI-ChangeManagementMenu-ChangesByWorkgroup' => 'Mudanças por grupo de trabalho',
'UI-ChangeManagementMenu-ChangesNotYetAssigned' => 'Mudanças não atribu&iacute;das',
'UI:ConfigurationItemsMenu'=> 'Configuração Itens',
'UI:ConfigurationItemsMenu+'=> 'Todos dispositivos',
'UI:ConfigurationItemsMenu:Title' => 'Visão geral Configuração Itens',
'UI-ConfigurationItemsMenu-ServersByCriticity' => 'Servidores por criticidade',
'UI-ConfigurationItemsMenu-PCsByCriticity' => 'PCs por criticidade',
'UI-ConfigurationItemsMenu-NWDevicesByCriticity' => 'Dispositivo de rede por criticidade',
'UI-ConfigurationItemsMenu-ApplicationsByCriticity' => 'Aplicação por criticidade',
'UI:ConfigurationManagementMenu' => 'Gerenciamento Configuração',
'UI:ConfigurationManagementMenu+' => 'Gerenciamento Configuração',
'UI:ConfigurationManagementMenu:Title' => 'Visão geral Infra-estrutura',
'UI-ConfigurationManagementMenu-InfraByType' => 'Objetos Infra-estrutura por tipo',
'UI-ConfigurationManagementMenu-InfraByStatus' => 'Objetos Infra-estrutura por status',
'UI:ConfigMgmtMenuOverview:Title' => 'Painel para Gerenciamento Configuração',
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Configuração Itens por status',
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Configuração Itens por tipo',
'UI:RequestMgmtMenuOverview:Title' => 'Painel para Gerenciamento de Pedido',
'UI-RequestManagementOverview-RequestByService' => 'User Requests by service',
'UI-RequestManagementOverview-RequestByPriority' => 'User Requests by priority',
'UI-RequestManagementOverview-RequestUnassigned' => 'User Requests not yet assigned to an agent',
'UI:IncidentMgmtMenuOverview:Title' => 'Painel para Gerenciamento Incidentes',
'UI-IncidentManagementOverview-IncidentByService' => 'Incidentes por serviço',
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidentes por prioridade',
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidentes não atribu&iacute;dos para agentes',
'UI:ChangeMgmtMenuOverview:Title' => 'Painel para Gerenciamento Mudanças',
'UI-ChangeManagementOverview-ChangeByType' => 'Mudanças por tipo',
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Mudanças não atribu&iacute;dos para agentes',
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Interrupç&otilde;es devido a mudanças',
'UI:ServiceMgmtMenuOverview:Title' => 'Painel para Gerenciamento Serviço',
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'Contratos de clientes deverão serem renovados em 30 dias',
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'Contratos de prestação a serem renovados em 30 dias',
'UI:ContactsMenu' => 'Contatos',
'UI:ContactsMenu+' => 'Contatos',
'UI:ContactsMenu:Title' => 'Visão global contatos',
'UI-ContactsMenu-ContactsByLocation' => 'Contatos por Localização',
'UI-ContactsMenu-ContactsByType' => 'Contatos por tipo',
'UI-ContactsMenu-ContactsByStatus' => 'Contatos por status',
'Menu:CSVImportMenu' => 'Importacao CSV',
'Menu:CSVImportMenu+' => 'Bulk creation or update',
'Menu:DataModelMenu' => 'Modelo dados',
'Menu:DataModelMenu+' => 'Visao geral do Modelo dados',
'Menu:ExportMenu' => 'Exportar',
'Menu:ExportMenu+' => 'Exportar o resultado de qualquer consulta em HTML, CSV or XML',
'Menu:NotificationsMenu' => 'Notificações',
'Menu:NotificationsMenu+' => 'Configuração da notificações',
'UI:NotificationsMenu:Title' => 'Configuração da <span class="hilite">Notificações</span>',
'UI:NotificationsMenu:Help' => 'Ajuda',
'UI:NotificationsMenu:HelpContent' => '<p>In iTop the notifications are fully customizable. They are based on two sets of objects: <i>triggers and actions</i>.</p>
<p><i><b>Triggers</b></i> define when a notification will be executed. There are 3 types of triggers for covering 3 differents phases of an object life cycle:
<ol>
<li>the "OnCreate" triggers get executed when an object of the specified class is created</li>
<li>the "OnStateEnter" triggers get executed before an object of the given class enters a specified state (coming from another state)</li>
<li>the "OnStateLeave" triggers get executed when an object of the given class is leaving a specified state</li>
</ol>
</p>
<p>
<i><b>Actions</b></i> define the actions to be performed when the triggers execute. For now there is only one kind of action consisting in sending an email message.
Such actions also define the template to be used for sending the email as well as the other parameters of the message like the recipients, importance, etc.
</p>
<p>A special page: <a href="../setup/email.test.php" target="_blank">email.test.php</a> is available for testing and troubleshooting your PHP mail configuration.</p>
<p>To be executed, actions must be associated to triggers.
When associated with a trigger, each action is given an "order" number, specifying in which order the actions are to be executed.</p>',
'UI:NotificationsMenu:Triggers' => 'Triggers',
'UI:NotificationsMenu:AvailableTriggers' => 'Triggers disponivel',
'UI:NotificationsMenu:OnCreate' => 'Quando um objeto e criado',
'UI:NotificationsMenu:OnStateEnter' => 'Quando um objeto entra em um determinado estado',
'UI:NotificationsMenu:OnStateLeave' => 'Quando um objeto deixa um determinado estado',
'UI:NotificationsMenu:Actions' => 'Acoes',
'UI:NotificationsMenu:AvailableActions' => 'Acoes disponiveis',
'Menu:RunQueriesMenu' => 'Executar consultas',
'Menu:RunQueriesMenu+' => 'Executar qualquer consulta',
'Menu:DataAdministration' => 'Administracao de dados',
'Menu:DataAdministration+' => 'Administracao de dados',
'Menu:UniversalSearchMenu' => 'Pesquisa Universal',
'Menu:UniversalSearchMenu+' => 'Pesquisa por nada...',
'Menu:ApplicationLogMenu' => 'Log de l\'aplicacao',
'Menu:ApplicationLogMenu+' => 'Log de l\'aplicacao',
'Menu:ApplicationLogMenu:Title' => 'Log de l\'aplicacao',
'Menu:UserManagementMenu' => 'Gerenciamento Usuario',
'Menu:UserManagementMenu+' => 'Gerenciamento usuario',
'Menu:ProfilesMenu' => 'Profiles',
'Menu:ProfilesMenu+' => 'Profiles',
'Menu:ProfilesMenu:Title' => 'Profiles',
'Menu:UserAccountsMenu' => 'Contas usuarios',
'Menu:UserAccountsMenu+' => 'Contas usuarios',
'Menu:UserAccountsMenu:Title' => 'Contas usuarios',
'UI:iTopVersion:Short' => 'iTop versão %1$s',
'UI:iTopVersion:Long' => 'iTop versão %1$s-%2$s built on %3$s',
'UI:PropertiesTab' => 'Propriedades',
'UI:OpenDocumentInNewWindow_' => 'Abrir este documento em uma nova janela: %1$s',
'UI:DownloadDocument_' => 'Baixar este documento: %1$s',
'UI:Document:NoPreview' => 'Nã h&aacute; visualização dispon&iacute;vel para este tipo de documento',
'UI:DeadlineMissedBy_duration' => 'Perdido por %1$s',
'UI:Deadline_LessThan1Min' => '< 1 min',
'UI:Deadline_Minutes' => '%1$d min',
'UI:Deadline_Hours_Minutes' => '%1$dh %2$dmin',
'UI:Deadline_Days_Hours_Minutes' => '%1$dd %2$dh %3$dmin',
'UI:Help' => 'Ajuda',
));
?>

BIN
images/mail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

View File

@@ -154,7 +154,11 @@ function ValidateField(sFieldId, sPattern, bMandatory, sFormId, nullValue)
{
var bValid = true;
var currentVal = $('#'+sFieldId).val();
if (bMandatory && (currentVal == nullValue))
if (currentVal == '$$NULL$$') // Convention to indicate a non-valid value since it may have to be passed as text
{
bValid = false;
}
else if (bMandatory && (currentVal == nullValue))
{
bValid = false;
}
@@ -248,3 +252,26 @@ function ValidatePasswordField(id, sFormId)
$('#v_'+id).html(''); //<img src="../images/validation_ok.png" />');
return true;
}
// Called when filling an autocomplete field
function OnAutoComplete(id, event, data, formatted)
{
if (data)
{
// A valid match was found: data[0] => label, data[1] => value
$('#'+id).val(data[1]);
$('#'+id).trigger('change');
}
else
{
if ($('#label_'+id).val() == '')
{
$('#'+id).val(''); // Empty value
}
else
{
$('#'+id).val('$$NULL$$'); // Convention: not a valid value
}
$('#'+id).trigger('change');
}
}

View File

@@ -1,11 +1,12 @@
// JavaScript Document
function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix)
function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates)
{
this.id = id;
this.iInputId = iInputId;
this.sClass = sClass;
this.sAttCode = sAttCode;
this.sSuffix = sSuffix;
this.bDuplicates = bDuplicates;
var me = this;
this.Init = function()
{
@@ -64,7 +65,8 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix)
{
var theMap = { sAttCode: me.sAttCode,
iInputId: me.iInputId,
sSuffix: me.sSuffix
sSuffix: me.sSuffix,
bDuplicates: me.bDuplicates
}
// Gather the parameters from the search form
@@ -112,6 +114,7 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix)
var theMap = { sAttCode: me.sAttCode,
iInputId: me.iInputId,
sSuffix: me.sSuffix,
bDuplicates: me.bDuplicates,
'class': me.sClass
}

View File

@@ -99,20 +99,24 @@ function UpdateFileName(id, sNewFileName)
/**
* Reload a search form for the specified class
*/
function ReloadSearchForm(divId, sClassName, sBaseClass)
function ReloadSearchForm(divId, sClassName, sBaseClass, sContext)
{
var oDiv = $('#'+divId);
oDiv.block();
var oFormEvents = $('#'+divId+' form').data('events');
var aSubmit = new Array();
// Save the submit handlers
aSubmit = new Array();
aSubmit = new Array();
if ( (oFormEvents != null) && (oFormEvents.submit != undefined))
{
aSubmit = oFormEvents.submit;
for(index = 0; index < oFormEvents.submit.length; index++)
{
aSubmit [index ] = { data:oFormEvents.submit[index].data, namespace:oFormEvents.submit[index].namespace, handler: oFormEvents.submit[index].handler};
}
}
$.post('ajax.render.php',
$.post('ajax.render.php?'+sContext,
{ operation: 'search_form', className: sClassName, baseClass: sBaseClass, currentId: divId },
function(data) {
oDiv.empty();
@@ -177,3 +181,14 @@ function GetUserPreference(sPreferenceCode, sDefaultValue)
}
return value;
}
/**
* Check/uncheck a whole list of checkboxes
*/
function CheckAll(sSelector, bValue)
{
var value = bValue;
$(sSelector).each( function() {
this.checked = value;
});
}

View File

@@ -39,7 +39,7 @@
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserLDAP' => 'LDAP-Benutzer',
'Class:UserLDAP+' => 'Benutzer,der über LDP authenifiziert wird',
'Class:UserLDAP+' => 'Benutzer,der über LDAP authenifiziert wird',
'Class:UserLDAP/Attribute:password' => 'Passwort',
'Class:UserLDAP/Attribute:password+' => 'Benutzerpasswort',
));

View File

@@ -25,6 +25,8 @@ SetupWebPage::AddModule(
'dictionary' => array(
'en.dict.itop-basic.php',
'es_cr.dict.itop-basic.php',
'fr.dict.itop-basic.php',
'pt_br.dict.itop-basic.php',
),
'data.struct' => array(
//'data.struct.itop-basic.xml',

View File

@@ -0,0 +1,51 @@
<?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
*/
// 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>+
//////////////////////////////////////////////////////////////////////
// Classes in 'bizmodel'
//////////////////////////////////////////////////////////////////////
//
// 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>+
?>

View File

@@ -103,7 +103,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:last_update' => 'Letzte Aktualisierung',
'Class:Change/Attribute:last_update+' => '',
'Class:Change/Attribute:end_date' => 'End date',
'Class:Change/Attribute:end_date' => 'Enddatum',
'Class:Change/Attribute:end_date+' => '',
'Class:Change/Attribute:close_date' => 'Geschlossen',
'Class:Change/Attribute:close_date+' => '',

View File

@@ -118,7 +118,7 @@ abstract class Change extends Ticket
'workgroup_id' => OPT_ATT_MANDATORY,
'supervisor_group_id' => OPT_ATT_MANDATORY,
'manager_group_id' => OPT_ATT_MANDATORY,
'description' => OPT_ATT_READONLY,
'description' => OPT_ATT_READONLY,
'requestor_id' => OPT_ATT_READONLY,
'title' => OPT_ATT_MANDATORY,
),
@@ -141,7 +141,7 @@ abstract class Change extends Ticket
'agent_id' => OPT_ATT_MUSTCHANGE,
'supervisor_id' => OPT_ATT_MUSTCHANGE,
'manager_id' => OPT_ATT_MUSTCHANGE,
'description' => OPT_ATT_READONLY,
'description' => OPT_ATT_READONLY,
'requestor_id' => OPT_ATT_READONLY,
),
)
@@ -288,14 +288,18 @@ abstract class Change extends Ticket
public function ComputeValues()
{
$iKey = $this->GetKey();
if ($iKey < 0)
$sCurrRef = $this->Get('ref');
if (strlen($sCurrRef) == 0)
{
// Object not yet in the Database
$iKey = MetaModel::GetNextKey(get_class($this));
$iKey = $this->GetKey();
if ($iKey < 0)
{
// Object not yet in the Database
$iKey = MetaModel::GetNextKey(get_class($this));
}
$sName = sprintf('C-%06d', $iKey);
$this->Set('ref', $sName);
}
$sName = sprintf('C-%06d', $iKey);
$this->Set('ref', $sName);
}
/**
@@ -311,12 +315,12 @@ abstract class Change extends Ticket
case 'approved':
case 'implemented':
case 'monitored':
$sIconName = self::MakeIconFromName('change-approved.png');
$sIcon = self::MakeIconFromName('change-approved.png');
break;
case 'rejected':
case 'notapproved':
$sIconName = self::MakeIconFromName('change-rejected.png');
$sIcon = self::MakeIconFromName('change-rejected.png');
break;
case 'closed':

View File

@@ -29,6 +29,7 @@ SetupWebPage::AddModule(
'fr.dict.itop-change-mgmt.php',
'es_cr.dict.itop-change-mgmt.php',
'de.dict.itop-change-mgmt.php',
'pt_br.dict.itop-change-mgmt.php',
),
'data.struct' => array(
//'data.struct.itop-change-mgmt.xml',

View File

@@ -0,0 +1,347 @@
<?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('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:ChangeManagement' => 'Gerenciamento Mudan&ccedil;as',
'Menu:Change:Overview' => 'Vis&atilde;o geral',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => 'Nova Mudan&ccedil;a',
'Menu:NewChange+' => 'Nova Mudan&ccedil;a',
'Menu:SearchChanges' => 'Pesquisa para Mudan&ccedil;a',
'Menu:SearchChanges+' => 'Pesquisa para Mudan&ccedil;a',
'Menu:Change:Shortcuts' => 'Atalhos',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => 'Mudan&ccedil;as à espera de aceita&ccedil;&atilde;o',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => 'Mudan&ccedil;as à espera de aprova&ccedil;&atilde;o',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => 'Mudan&ccedil;as abertas',
'Menu:Changes+' => '',
'Menu:MyChanges' => 'Mudan&ccedil;as atribu&iacute;da a mim',
'Menu:MyChanges+' => 'Mudan&ccedil;as atribu&iacute;da para mim (como Agente)',
));
// 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('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Change' => 'Mudan&ccedil;a',
'Class:Change+' => '',
'Class:Change/Attribute:start_date' => 'In&iacute;cio planejado',
'Class:Change/Attribute:start_date+' => '',
'Class:Change/Attribute:status' => 'Status',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => 'Novo',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:validated' => 'Validado',
'Class:Change/Attribute:status/Value:validated+' => '',
'Class:Change/Attribute:status/Value:rejected' => 'Rejeitado',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:assigned' => 'Atribu&iacute;do',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:plannedscheduled' => 'Planejado e agendado',
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
'Class:Change/Attribute:status/Value:approved' => 'Aprovado',
'Class:Change/Attribute:status/Value:approved+' => '',
'Class:Change/Attribute:status/Value:notapproved' => 'N&atilde;o aprovado',
'Class:Change/Attribute:status/Value:notapproved+' => '',
'Class:Change/Attribute:status/Value:implemented' => 'Implementado',
'Class:Change/Attribute:status/Value:implemented+' => '',
'Class:Change/Attribute:status/Value:monitored' => 'Monitorado',
'Class:Change/Attribute:status/Value:monitored+' => '',
'Class:Change/Attribute:status/Value:closed' => 'Fechado',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:reason' => 'Raz&atilde;o',
'Class:Change/Attribute:reason+' => '',
'Class:Change/Attribute:requestor_id' => 'Solicitador',
'Class:Change/Attribute:requestor_id+' => '',
'Class:Change/Attribute:requestor_email' => 'Solicitador',
'Class:Change/Attribute:requestor_email+' => '',
'Class:Change/Attribute:org_id' => 'Cliente',
'Class:Change/Attribute:org_id+' => '',
'Class:Change/Attribute:org_name' => 'Cliente',
'Class:Change/Attribute:org_name+' => '',
'Class:Change/Attribute:workgroup_id' => 'Grupo de trabalho',
'Class:Change/Attribute:workgroup_id+' => '',
'Class:Change/Attribute:workgroup_name' => 'Grupo de trabalho',
'Class:Change/Attribute:workgroup_name+' => '',
'Class:Change/Attribute:creation_date' => 'Criado',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:last_update' => '&Uacute;ltima atualiza&ccedil;&atilde;o',
'Class:Change/Attribute:last_update+' => '',
'Class:Change/Attribute:end_date' => 'Data final',
'Class:Change/Attribute:end_date+' => '',
'Class:Change/Attribute:close_date' => 'Fechado',
'Class:Change/Attribute:close_date+' => '',
'Class:Change/Attribute:impact' => 'Impacto',
'Class:Change/Attribute:impact+' => '',
'Class:Change/Attribute:agent_id' => 'Agente',
'Class:Change/Attribute:agent_id+' => '',
'Class:Change/Attribute:agent_name' => 'Agente',
'Class:Change/Attribute:agent_name+' => '',
'Class:Change/Attribute:agent_email' => 'Agente',
'Class:Change/Attribute:agent_email+' => '',
'Class:Change/Attribute:supervisor_group_id' => 'Supervisor equipe',
'Class:Change/Attribute:supervisor_group_id+' => '',
'Class:Change/Attribute:supervisor_group_name' => 'Supervisor equipe',
'Class:Change/Attribute:supervisor_group_name+' => '',
'Class:Change/Attribute:supervisor_id' => 'Supervisor',
'Class:Change/Attribute:supervisor_id+' => '',
'Class:Change/Attribute:supervisor_email' => 'Supervisor',
'Class:Change/Attribute:supervisor_email+' => '',
'Class:Change/Attribute:manager_group_id' => 'Gerente equipe',
'Class:Change/Attribute:manager_group_id+' => '',
'Class:Change/Attribute:manager_group_name' => 'Gerente equipe',
'Class:Change/Attribute:manager_group_name+' => '',
'Class:Change/Attribute:manager_id' => 'Gerente',
'Class:Change/Attribute:manager_id+' => '',
'Class:Change/Attribute:manager_email' => 'Gerente',
'Class:Change/Attribute:manager_email+' => '',
'Class:Change/Attribute:outage' => 'Outage',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:yes' => 'Sim',
'Class:Change/Attribute:outage/Value:yes+' => '',
'Class:Change/Attribute:outage/Value:no' => 'N&atilde;o',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:change_request' => 'Solicita&ccedil;&atilde;o',
'Class:Change/Attribute:change_request+' => '',
'Class:Change/Attribute:fallback' => 'Plano de contig&ecirc;ncia',
'Class:Change/Attribute:fallback+' => '',
'Class:Change/Stimulus:ev_validate' => 'Validar',
'Class:Change/Stimulus:ev_validate+' => '',
'Class:Change/Stimulus:ev_reject' => 'Rejeitar',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_assign' => 'Atribu&iacute;r',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_reopen' => 'Re-abrir',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_plan' => 'Planejar',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_approve' => 'Aprovar',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_replan' => 'Re-planejar',
'Class:Change/Stimulus:ev_replan+' => '',
'Class:Change/Stimulus:ev_notapprove' => 'Rejeitar',
'Class:Change/Stimulus:ev_notapprove+' => '',
'Class:Change/Stimulus:ev_implement' => 'Implementar',
'Class:Change/Stimulus:ev_implement+' => '',
'Class:Change/Stimulus:ev_monitor' => 'Monitorar',
'Class:Change/Stimulus:ev_monitor+' => '',
'Class:Change/Stimulus:ev_finish' => 'Finalizar',
'Class:Change/Stimulus:ev_finish+' => '',
));
//
// Class: RoutineChange
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:RoutineChange' => 'Mudan&ccedil;a Rotina',
'Class:RoutineChange+' => '',
'Class:RoutineChange/Attribute:status/Value:new' => 'Nova',
'Class:RoutineChange/Attribute:status/Value:new+' => '',
'Class:RoutineChange/Attribute:status/Value:assigned' => 'Atribu&iacute;do',
'Class:RoutineChange/Attribute:status/Value:assigned+' => '',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled' => 'Planejado e agendado',
'Class:RoutineChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:RoutineChange/Attribute:status/Value:approved' => 'Aprovado',
'Class:RoutineChange/Attribute:status/Value:approved+' => '',
'Class:RoutineChange/Attribute:status/Value:implemented' => 'Implementado',
'Class:RoutineChange/Attribute:status/Value:implemented+' => '',
'Class:RoutineChange/Attribute:status/Value:monitored' => 'Monitorado',
'Class:RoutineChange/Attribute:status/Value:monitored+' => '',
'Class:RoutineChange/Attribute:status/Value:closed' => 'Fechado',
'Class:RoutineChange/Attribute:status/Value:closed+' => '',
'Class:RoutineChange/Stimulus:ev_validate' => 'Validado',
'Class:RoutineChange/Stimulus:ev_validate+' => '',
'Class:RoutineChange/Stimulus:ev_assign' => 'Atribu&iacute;r',
'Class:RoutineChange/Stimulus:ev_assign+' => '',
'Class:RoutineChange/Stimulus:ev_reopen' => 'Re-abrir',
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
'Class:RoutineChange/Stimulus:ev_plan' => 'Planejar',
'Class:RoutineChange/Stimulus:ev_plan+' => '',
'Class:RoutineChange/Stimulus:ev_replan' => 'Re-planejar',
'Class:RoutineChange/Stimulus:ev_replan+' => '',
'Class:RoutineChange/Stimulus:ev_implement' => 'Implementar',
'Class:RoutineChange/Stimulus:ev_implement+' => '',
'Class:RoutineChange/Stimulus:ev_monitor' => 'Monitorar',
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
'Class:RoutineChange/Stimulus:ev_finish' => 'Finalizar',
'Class:RoutineChange/Stimulus:ev_finish+' => '',
));
//
// Class: ApprovedChange
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ApprovedChange' => 'Mudan&ccedil;as aprovadas',
'Class:ApprovedChange+' => '',
'Class:ApprovedChange/Attribute:approval_date' => 'Data aprova&ccedil;&atilde;o',
'Class:ApprovedChange/Attribute:approval_date+' => '',
'Class:ApprovedChange/Attribute:approval_comment' => 'Coment&aacute;rio aprova&ccedil;&atilde;o',
'Class:ApprovedChange/Attribute:approval_comment+' => '',
'Class:ApprovedChange/Stimulus:ev_validate' => 'Validar',
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
'Class:ApprovedChange/Stimulus:ev_reject' => 'Rejeitar',
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange/Stimulus:ev_assign' => 'Atribu&iacute;r',
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
'Class:ApprovedChange/Stimulus:ev_reopen' => 'Re-abrir',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
'Class:ApprovedChange/Stimulus:ev_plan' => 'Planejar',
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
'Class:ApprovedChange/Stimulus:ev_approve' => 'Aprovar',
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
'Class:ApprovedChange/Stimulus:ev_replan' => 'Re-planejar',
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Rejeitar aprova&ccedil;&atilde;o',
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
'Class:ApprovedChange/Stimulus:ev_implement' => 'Implementar',
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
'Class:ApprovedChange/Stimulus:ev_monitor' => 'Monitorar',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
'Class:ApprovedChange/Stimulus:ev_finish' => 'Finalizar',
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
));
//
// Class: NormalChange
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:NormalChange' => 'Mudan&ccedil;a Normal',
'Class:NormalChange+' => '',
'Class:NormalChange/Attribute:status/Value:new' => 'Novo',
'Class:NormalChange/Attribute:status/Value:new+' => '',
'Class:NormalChange/Attribute:status/Value:validated' => 'Validado',
'Class:NormalChange/Attribute:status/Value:validated+' => '',
'Class:NormalChange/Attribute:status/Value:rejected' => 'Rejeitado',
'Class:NormalChange/Attribute:status/Value:rejected+' => '',
'Class:NormalChange/Attribute:status/Value:assigned' => 'Atribu&iacute;do',
'Class:NormalChange/Attribute:status/Value:assigned+' => '',
'Class:NormalChange/Attribute:status/Value:plannedscheduled' => 'Planejado e agendado',
'Class:NormalChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:NormalChange/Attribute:status/Value:approved' => 'Aprovado',
'Class:NormalChange/Attribute:status/Value:approved+' => '',
'Class:NormalChange/Attribute:status/Value:notapproved' => 'N&atilde;o aprovado',
'Class:NormalChange/Attribute:status/Value:notapproved+' => '',
'Class:NormalChange/Attribute:status/Value:implemented' => 'Implementado',
'Class:NormalChange/Attribute:status/Value:implemented+' => '',
'Class:NormalChange/Attribute:status/Value:monitored' => 'Monitorado',
'Class:NormalChange/Attribute:status/Value:monitored+' => '',
'Class:NormalChange/Attribute:status/Value:closed' => 'Fechado',
'Class:NormalChange/Attribute:status/Value:closed+' => '',
'Class:NormalChange/Attribute:acceptance_date' => 'Data aceita&ccedil;&atilde;o',
'Class:NormalChange/Attribute:acceptance_date+' => '',
'Class:NormalChange/Attribute:acceptance_comment' => 'Coment&aacute;rio aprova&ccedil;&atilde;o',
'Class:NormalChange/Attribute:acceptance_comment+' => '',
'Class:NormalChange/Stimulus:ev_validate' => 'Validar',
'Class:NormalChange/Stimulus:ev_validate+' => '',
'Class:NormalChange/Stimulus:ev_reject' => 'Rejeitar',
'Class:NormalChange/Stimulus:ev_reject+' => '',
'Class:NormalChange/Stimulus:ev_assign' => 'Atribu&iacute;r',
'Class:NormalChange/Stimulus:ev_assign+' => '',
'Class:NormalChange/Stimulus:ev_reopen' => 'Re-abrir',
'Class:NormalChange/Stimulus:ev_reopen+' => '',
'Class:NormalChange/Stimulus:ev_plan' => 'Planejar',
'Class:NormalChange/Stimulus:ev_plan+' => '',
'Class:NormalChange/Stimulus:ev_approve' => 'Aprovar',
'Class:NormalChange/Stimulus:ev_approve+' => '',
'Class:NormalChange/Stimulus:ev_replan' => 'Re-planejar',
'Class:NormalChange/Stimulus:ev_replan+' => '',
'Class:NormalChange/Stimulus:ev_notapprove' => 'Rejeitar aprova&ccedil;&atilde;o',
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
'Class:NormalChange/Stimulus:ev_implement' => 'Implementar',
'Class:NormalChange/Stimulus:ev_implement+' => '',
'Class:NormalChange/Stimulus:ev_monitor' => 'Monitorar',
'Class:NormalChange/Stimulus:ev_monitor+' => '',
'Class:NormalChange/Stimulus:ev_finish' => 'Finalizar',
'Class:NormalChange/Stimulus:ev_finish+' => '',
));
//
// Class: EmergencyChange
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:EmergencyChange' => 'Mudan&ccedil;a Emerg&ecirc;ncia',
'Class:EmergencyChange+' => '',
'Class:EmergencyChange/Attribute:status/Value:new' => 'Novo',
'Class:EmergencyChange/Attribute:status/Value:new+' => '',
'Class:EmergencyChange/Attribute:status/Value:validated' => 'Validado',
'Class:EmergencyChange/Attribute:status/Value:validated+' => '',
'Class:EmergencyChange/Attribute:status/Value:rejected' => 'Rejeitado',
'Class:EmergencyChange/Attribute:status/Value:rejected+' => '',
'Class:EmergencyChange/Attribute:status/Value:assigned' => 'Atribu&iacute;do',
'Class:EmergencyChange/Attribute:status/Value:assigned+' => '',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled' => 'Planejado e agendado',
'Class:EmergencyChange/Attribute:status/Value:plannedscheduled+' => '',
'Class:EmergencyChange/Attribute:status/Value:approved' => 'Aprovado',
'Class:EmergencyChange/Attribute:status/Value:approved+' => '',
'Class:EmergencyChange/Attribute:status/Value:notapproved' => 'N&atilde;o aprovado',
'Class:EmergencyChange/Attribute:status/Value:notapproved+' => '',
'Class:EmergencyChange/Attribute:status/Value:implemented' => 'Implementado',
'Class:EmergencyChange/Attribute:status/Value:implemented+' => '',
'Class:EmergencyChange/Attribute:status/Value:monitored' => 'Monitorado',
'Class:EmergencyChange/Attribute:status/Value:monitored+' => '',
'Class:EmergencyChange/Attribute:status/Value:closed' => 'Fechado',
'Class:EmergencyChange/Attribute:status/Value:closed+' => '',
'Class:EmergencyChange/Stimulus:ev_validate' => 'Validar',
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
'Class:EmergencyChange/Stimulus:ev_reject' => 'Rejeitar',
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
'Class:EmergencyChange/Stimulus:ev_assign' => 'Atribu&iacute;r',
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
'Class:EmergencyChange/Stimulus:ev_reopen' => 'Re-abrir',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
'Class:EmergencyChange/Stimulus:ev_plan' => 'Planejar',
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
'Class:EmergencyChange/Stimulus:ev_approve' => 'Aprovar',
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
'Class:EmergencyChange/Stimulus:ev_replan' => 'Re-planejar',
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Rejeitar aprova&ccedil;&atilde;o',
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
'Class:EmergencyChange/Stimulus:ev_implement' => 'Implementar',
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
'Class:EmergencyChange/Stimulus:ev_monitor' => 'Monitorar',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
'Class:EmergencyChange/Stimulus:ev_finish' => 'Finalizar',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
));
?>

View File

@@ -213,15 +213,15 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Contact/Attribute:location_name' => 'Standort',
'Class:Contact/Attribute:location_name+' => '',
'Class:Contact/Attribute:ci_list' => 'CIs',
'Class:Contact/Attribute:ci_list+' => 'CIs, die den Vertrag betreffen',
'Class:Contact/Attribute:ci_list+' => 'CIs, die den Kontakt betreffen',
'Class:Contact/Attribute:contract_list' => 'Verträge',
'Class:Contact/Attribute:contract_list+' => 'Kontakte, die den Vertrag betreffen',
'Class:Contact/Attribute:contract_list+' => 'Verträge, die diesen Kontakt betreffen',
'Class:Contact/Attribute:service_list' => 'Services',
'Class:Contact/Attribute:service_list+' => 'Services, die den Vertrag betreffen',
'Class:Contact/Attribute:service_list+' => 'Services, die diesen Kontakt betreffen',
'Class:Contact/Attribute:ticket_list' => 'Tickets',
'Class:Contact/Attribute:ticket_list+' => 'Tickets, die den Vertrag betreffen',
'Class:Contact/Attribute:ticket_list+' => 'Tickets, die diesen Kontakt betreffen',
'Class:Contact/Attribute:team_list' => 'Teams',
'Class:Contact/Attribute:team_list+' => 'Teams, die diesem Vertrag zugeordnet sind',
'Class:Contact/Attribute:team_list+' => 'Teams, denen dieser Kontakt zugehörig ist',
'Class:Contact/Attribute:finalclass' => 'Typ',
'Class:Contact/Attribute:finalclass+' => '',
));
@@ -282,7 +282,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Document/Attribute:name+' => '',
'Class:Document/Attribute:org_id' => 'Organisation',
'Class:Document/Attribute:description+' => '',
'Class:Document/Attribute:org_name' => 'Organizationsname',
'Class:Document/Attribute:org_name' => 'Organisationsname',
'Class:Document/Attribute:org_name+' => '',
'Class:Document/Attribute:description+' => '',
'Class:Document/Attribute:description' => 'Beschreibung',
@@ -524,15 +524,15 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:FunctionalCI/Attribute:importance/Value:medium' => 'Medium',
'Class:FunctionalCI/Attribute:importance/Value:medium+' => '',
'Class:FunctionalCI/Attribute:contact_list' => 'Kontakte',
'Class:FunctionalCI/Attribute:contact_list+' => 'Kontakte für diesen CI',
'Class:FunctionalCI/Attribute:contact_list+' => 'Kontakte für dieses CI',
'Class:FunctionalCI/Attribute:document_list' => 'Dokumente',
'Class:FunctionalCI/Attribute:document_list+' => 'Dokumentaion für diesen CI',
'Class:FunctionalCI/Attribute:document_list+' => 'Dokumentation für dieses CI',
'Class:FunctionalCI/Attribute:solution_list' => 'Anwendungslösungen',
'Class:FunctionalCI/Attribute:solution_list+' => 'Anwendungslösungen für diesen CI',
'Class:FunctionalCI/Attribute:solution_list+' => 'Anwendungslösungen, die dieses CI benutzen',
'Class:FunctionalCI/Attribute:contract_list' => 'Verträge',
'Class:FunctionalCI/Attribute:contract_list+' => 'Verträge, die diesen CI unterstützen',
'Class:FunctionalCI/Attribute:contract_list+' => 'Verträge, die dieses CI unterstützen',
'Class:FunctionalCI/Attribute:ticket_list' => 'Tickets',
'Class:FunctionalCI/Attribute:ticket_list+' => 'Tickets, die den CI betreffen',
'Class:FunctionalCI/Attribute:ticket_list+' => 'Tickets, die das CI betreffen',
'Class:FunctionalCI/Attribute:finalclass' => 'Typ',
'Class:FunctionalCI/Attribute:finalclass+' => '',
));
@@ -639,8 +639,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ConnectableCI' => 'Verknüpfbarer CI',
'Class:ConnectableCI+' => 'Physischer CI',
'Class:ConnectableCI' => 'Verknüpfbares CI',
'Class:ConnectableCI+' => 'Physisches CI',
'Class:ConnectableCI/Attribute:brand' => 'Hersteller',
'Class:ConnectableCI/Attribute:brand+' => '',
'Class:ConnectableCI/Attribute:model' => 'Modell',
@@ -700,7 +700,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:NetworkInterface/Attribute:duplex/Value:full+' => '',
'Class:NetworkInterface/Attribute:duplex/Value:half' => 'Half',
'Class:NetworkInterface/Attribute:duplex/Value:half+' => '',
'Class:NetworkInterface/Attribute:duplex/Value:unknown' => 'Unknown',
'Class:NetworkInterface/Attribute:duplex/Value:unknown' => 'unbekannt',
'Class:NetworkInterface/Attribute:duplex/Value:unknown+' => '',
'Class:NetworkInterface/Attribute:connected_if' => 'Angeschlossen an',
'Class:NetworkInterface/Attribute:connected_if+' => 'Angeschlossenes Interface',
@@ -1038,7 +1038,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:SearchCIs+' => 'Nach CIs suchen',
'Menu:ConfigManagement:Devices' => 'Geräte',
'Menu:ConfigManagement:AllDevices' => 'Anzahl der Geräte: %1$d',
'Menu:ConfigManagement:SWAndApps' => 'Software und Anwendunge',
'Menu:ConfigManagement:SWAndApps' => 'Software und Anwendungen',
'Menu:ConfigManagement:Misc' => 'Diverses',
'Menu:Group' => 'Gruppen von CIs',
'Menu:Group+' => 'Gruppen von CIs',

View File

@@ -458,49 +458,49 @@ class Subnet extends cmdbAbstractObject
if (!$bEditMode)
{
$oPage->SetCurrentTab(Dict::S('Class:Subnet/Tab:IPUsage'));
$bit_ip = ip2long($this->Get('ip'));
$bit_mask = ip2long($this->Get('ip_mask'));
$iIPMin = $bit_ip & $bit_mask;
$iIPMax = ($bit_ip | (~$bit_mask)) - 1;
$sIPMin = long2ip($iIPMin);
$sIPMax = long2ip($iIPMax);
$oPage->p(Dict::Format('Class:Subnet/Tab:IPUsage-explain', $sIPMin, $sIPMax));
$oIfSet = new CMDBObjectSet(DBObjectSearch::FromOQL("SELECT NetworkInterface AS if WHERE INET_ATON(if.ip_address) >= INET_ATON('$sIPMin') AND INET_ATON(if.ip_address) <= INET_ATON('$sIPMax')"));
self::DisplaySet($oPage, $oIfSet, array('block_id' => 'nwif'));
$iCountUsed = $oIfSet->Count();
$iCountRange = $iIPMax - $iIPMin;
$iFreeCount = $iCountRange - $iCountUsed;
$oPage->SetCurrentTab(Dict::S('Class:Subnet/Tab:FreeIPs'));
$oPage->p(Dict::Format('Class:Subnet/Tab:FreeIPs-count', $iFreeCount));
$oPage->p(Dict::S('Class:Subnet/Tab:FreeIPs-explain'));
$aUsedIPs = $oIfSet->GetColumnAsArray('ip_address', false);
$iAnIP = $iIPMin;
$iFound = 0;
while (($iFound < min($iFreeCount, 10)) && ($iAnIP <= $iIPMax))
{
$sAnIP = long2ip($iAnIP);
if (!in_array($sAnIP, $aUsedIPs))
$oPage->SetCurrentTab(Dict::S('Class:Subnet/Tab:IPUsage'));
$bit_ip = ip2long($this->Get('ip'));
$bit_mask = ip2long($this->Get('ip_mask'));
$iIPMin = ($bit_ip & $bit_mask) + 1; // exclude the first one: identifies the subnet itsel
$iIPMax = ($bit_ip | (~$bit_mask)) - 1; // exclude the last one : reserved for DHCP
$sIPMin = long2ip($iIPMin);
$sIPMax = long2ip($iIPMax);
$oPage->p(Dict::Format('Class:Subnet/Tab:IPUsage-explain', $sIPMin, $sIPMax));
$oIfSet = new CMDBObjectSet(DBObjectSearch::FromOQL("SELECT NetworkInterface AS if WHERE INET_ATON(if.ip_address) >= INET_ATON('$sIPMin') AND INET_ATON(if.ip_address) <= INET_ATON('$sIPMax')"));
self::DisplaySet($oPage, $oIfSet, array('block_id' => 'nwif'));
$iCountUsed = $oIfSet->Count();
$iCountRange = $iIPMax - $iIPMin;
$iFreeCount = $iCountRange - $iCountUsed;
$oPage->SetCurrentTab(Dict::S('Class:Subnet/Tab:FreeIPs'));
$oPage->p(Dict::Format('Class:Subnet/Tab:FreeIPs-count', $iFreeCount));
$oPage->p(Dict::S('Class:Subnet/Tab:FreeIPs-explain'));
$aUsedIPs = $oIfSet->GetColumnAsArray('ip_address', false);
$iAnIP = $iIPMin;
$iFound = 0;
while (($iFound < min($iFreeCount, 10)) && ($iAnIP <= $iIPMax))
{
$iFound++;
$oPage->p($sAnIP);
$sAnIP = long2ip($iAnIP);
if (!in_array($sAnIP, $aUsedIPs))
{
$iFound++;
$oPage->p($sAnIP);
}
else
{
}
$iAnIP++;
}
else
{
}
$iAnIP++;
}
}
}
}
class Patch extends cmdbAbstractObject
{
@@ -911,7 +911,7 @@ class Group extends cmdbAbstractObject
MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'org_id', 'type'));
MetaModel::Init_SetZListItems('list', array('status', 'org_id', 'type','parent_id'));
}
}
}
class lnkGroupToCI extends cmdbAbstractObject
{
@@ -1112,7 +1112,7 @@ class NetworkInterface extends ConnectableCI
MetaModel::Init_SetZListItems('details', array('name', 'status', 'org_id', 'importance', 'brand', 'model', 'serial_number', 'asset_ref', 'device_id', 'logical_type', 'physical_type', 'ip_address', 'ip_mask', 'mac_address', 'speed', 'duplex', 'link_type', 'connected_if', 'connected_if_device_id', 'contact_list', 'document_list', 'solution_list', 'contract_list', 'ticket_list'));
MetaModel::Init_SetZListItems('advanced_search', array('name', 'status', 'org_id', 'importance', 'brand', 'model', 'serial_number', 'asset_ref', 'device_id', 'logical_type', 'physical_type', 'ip_address', 'ip_mask', 'mac_address', 'speed', 'duplex', 'connected_if', 'connected_if_device_id'));
MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'org_id', 'importance', 'device_id', 'logical_type', 'physical_type', 'ip_address', 'ip_mask', 'mac_address', 'connected_if_device_id'));
MetaModel::Init_SetZListItems('list', array('status', 'org_id', 'importance', 'device_id', 'logical_type', 'physical_type', 'link_type', 'connected_if_device_id'));
MetaModel::Init_SetZListItems('list', array('status', 'ip_address', 'importance', 'device_id', 'logical_type', 'physical_type', 'link_type', 'connected_if_device_id'));
}
public function GetName()

View File

@@ -28,6 +28,7 @@ SetupWebPage::AddModule(
'fr.dict.itop-config-mgmt.php',
'es_cr.dict.itop-config-mgmt.php',
'de.dict.itop-config-mgmt.php',
'pt_br.dict.itop-config-mgmt.php',
),
'data.struct' => array(
'data.struct.Audit.xml',

View File

@@ -0,0 +1,975 @@
<?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
*/
//////////////////////////////////////////////////////////////////////
// Relations
//////////////////////////////////////////////////////////////////////
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Relation:impacts/Description' => 'Elementos impactados por',
'Relation:impacts/VerbUp' => 'Impacto...',
'Relation:impacts/VerbDown' => 'Elementos impactados por...',
'Relation:depends on/Description' => 'Elements this element depends on',
'Relation:depends on/VerbUp' => 'Dependente...',
'Relation:depends on/VerbDown' => 'Impactos...',
));
// 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>+
//////////////////////////////////////////////////////////////////////
// Classes in 'bizmodel'
//////////////////////////////////////////////////////////////////////
//
// 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>+
//////////////////////////////////////////////////////////////////////
// Note: The classes have been grouped by categories: bizmodel
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Classes in 'bizmodel'
//////////////////////////////////////////////////////////////////////
//
//
// Class: Organization
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Organization' => 'Organização',
'Class:Organization+' => '',
'Class:Organization/Attribute:name' => 'Nome',
'Class:Organization/Attribute:name+' => 'Nome comum',
'Class:Organization/Attribute:code' => 'Codigo',
'Class:Organization/Attribute:code+' => 'C&oacute;digo Organiza&ccedil;&atilde;o',
'Class:Organization/Attribute:status' => 'Status',
'Class:Organization/Attribute:status+' => '',
'Class:Organization/Attribute:status/Value:active' => 'Ativo',
'Class:Organization/Attribute:status/Value:active+' => 'Ativo',
'Class:Organization/Attribute:status/Value:inactive' => 'Inativo',
'Class:Organization/Attribute:status/Value:inactive+' => 'Inativo',
'Class:Organization/Attribute:parent_id' => 'Matriz',
'Class:Organization/Attribute:parent_id+' => 'Organização matriz',
'Class:Organization/Attribute:parent_name' => 'Nome matriz',
'Class:Organization/Attribute:parent_name+' => 'Nome da matriz',
));
//
// Class: Location
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Location' => 'Localizacao',
'Class:Location+' => 'Qualquer tipo localizacao: Região, Pais, Cidade, Site, Construção, Piso, Sala, Rack,...',
'Class:Location/Attribute:name' => 'Nome',
'Class:Location/Attribute:name+' => '',
'Class:Location/Attribute:status' => 'Status',
'Class:Location/Attribute:status+' => '',
'Class:Location/Attribute:status/Value:active' => 'Ativo',
'Class:Location/Attribute:status/Value:active+' => 'Ativo',
'Class:Location/Attribute:status/Value:inactive' => 'Inativo',
'Class:Location/Attribute:status/Value:inactive+' => 'Inativo',
'Class:Location/Attribute:org_id' => 'Proprietário',
'Class:Location/Attribute:org_id+' => '',
'Class:Location/Attribute:org_name' => 'Nome do proprietário',
'Class:Location/Attribute:org_name+' => '',
'Class:Location/Attribute:address' => 'Endereço',
'Class:Location/Attribute:address+' => 'Endereço',
'Class:Location/Attribute:postal_code' => 'CEP',
'Class:Location/Attribute:postal_code+' => 'CEP',
'Class:Location/Attribute:city' => 'Cidade',
'Class:Location/Attribute:city+' => '',
'Class:Location/Attribute:country' => 'Pais',
'Class:Location/Attribute:country+' => '',
'Class:Location/Attribute:parent_id' => 'Parent location',
'Class:Location/Attribute:parent_id+' => '',
'Class:Location/Attribute:parent_name' => 'Parent name',
'Class:Location/Attribute:parent_name+' => '',
'Class:Location/Attribute:contact_list' => 'Contatos',
'Class:Location/Attribute:contact_list+' => 'Contatos localizados neste site',
'Class:Location/Attribute:infra_list' => 'Infra-estrutura',
'Class:Location/Attribute:infra_list+' => 'CIs localizados neste site',
));
//
// Class: Contact
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Contact' => 'Contato',
'Class:Contact+' => '',
'Class:Contact/Attribute:name' => 'Nome',
'Class:Contact/Attribute:name+' => '',
'Class:Contact/Attribute:status' => 'Status',
'Class:Contact/Attribute:status+' => '',
'Class:Contact/Attribute:status/Value:active' => 'Ativo',
'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+' => '',
'Class:Contact/Attribute:org_name' => 'Organizacao',
'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+' => '',
'Class:Contact/Attribute:location_name' => 'Localizacao',
'Class:Contact/Attribute:location_name+' => '',
'Class:Contact/Attribute:ci_list' => 'CIs',
'Class:Contact/Attribute:ci_list+' => 'CIs relacionados para o contato',
'Class:Contact/Attribute:contract_list' => 'Contratos',
'Class:Contact/Attribute:contract_list+' => 'Contratos relativo ao contato',
'Class:Contact/Attribute:service_list' => 'Servicos',
'Class:Contact/Attribute:service_list+' => 'Servicos relativo ao contato',
'Class:Contact/Attribute:ticket_list' => 'Tickets',
'Class:Contact/Attribute:ticket_list+' => 'Tickets relacionado ao contato',
'Class:Contact/Attribute:team_list' => 'Equipes',
'Class:Contact/Attribute:team_list+' => 'Equipes que esse contato pertence',
'Class:Contact/Attribute:finalclass' => 'Tipo',
'Class:Contact/Attribute:finalclass+' => '',
));
//
// Class: Person
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Person' => 'Pessoas',
'Class:Person+' => '',
'Class:Person/Attribute:first_name' => 'Primeiro nome',
'Class:Person/Attribute:first_name+' => '',
'Class:Person/Attribute:employee_id' => 'ID colaborador',
'Class:Person/Attribute:employee_id+' => '',
));
//
// Class: Team
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Team' => 'Equipe',
'Class:Team+' => '',
'Class:Team/Attribute:member_list' => 'Membros',
'Class:Team/Attribute:member_list+' => 'Contatos que são partes da equipe',
));
//
// Class: lnkTeamToContact
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkTeamToContact' => 'Membros equipe',
'Class:lnkTeamToContact+' => 'Membros da equipe',
'Class:lnkTeamToContact/Attribute:team_id' => 'Equipe',
'Class:lnkTeamToContact/Attribute:team_id+' => '',
'Class:lnkTeamToContact/Attribute:contact_id' => 'Membro',
'Class:lnkTeamToContact/Attribute:contact_id+' => '',
'Class:lnkTeamToContact/Attribute:contact_location_id' => 'Localização',
'Class:lnkTeamToContact/Attribute:contact_location_id+' => '',
'Class:lnkTeamToContact/Attribute:contact_email' => 'Email',
'Class:lnkTeamToContact/Attribute:contact_email+' => '',
'Class:lnkTeamToContact/Attribute:contact_phone' => 'Telefone',
'Class:lnkTeamToContact/Attribute:contact_phone+' => '',
'Class:lnkTeamToContact/Attribute:role' => 'Regra',
'Class:lnkTeamToContact/Attribute:role+' => '',
));
//
// Class: Document
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Document' => 'Documentos',
'Class:Document+' => '',
'Class:Document/Attribute:name' => 'Nome',
'Class:Document/Attribute:name+' => '',
'Class:Document/Attribute:description' => 'Descrição',
'Class:Document/Attribute:description+' => '',
'Class:Document/Attribute:type' => 'Tipo',
'Class:Document/Attribute:type+' => '',
'Class:Document/Attribute:type/Value:contract' => 'Contrato',
'Class:Document/Attribute:type/Value:contract+' => '',
'Class:Document/Attribute:type/Value:networkmap' => 'Mapa rede',
'Class:Document/Attribute:type/Value:networkmap+' => '',
'Class:Document/Attribute:type/Value:presentation' => 'Apresentação',
'Class:Document/Attribute:type/Value:presentation+' => '',
'Class:Document/Attribute:type/Value:training' => 'Treinamento',
'Class:Document/Attribute:type/Value:training+' => '',
'Class:Document/Attribute:type/Value:whitePaper' => 'How To',
'Class:Document/Attribute:type/Value:whitePaper+' => '',
'Class:Document/Attribute:type/Value:workinginstructions' => 'Instruções trabalho',
'Class:Document/Attribute:type/Value:workinginstructions+' => '',
'Class:Document/Attribute:status' => 'Status',
'Class:Document/Attribute:status+' => '',
'Class:Document/Attribute:status/Value:draft' => 'Rascunho',
'Class:Document/Attribute:status/Value:draft+' => '',
'Class:Document/Attribute:status/Value:obsolete' => 'Obsoleto',
'Class:Document/Attribute:status/Value:obsolete+' => '',
'Class:Document/Attribute:status/Value:published' => 'Publicado',
'Class:Document/Attribute:status/Value:published+' => '',
'Class:Document/Attribute:ci_list' => 'CIs',
'Class:Document/Attribute:ci_list+' => 'CIs referente a este documento',
'Class:Document/Attribute:contract_list' => 'Contratos',
'Class:Document/Attribute:contract_list+' => 'Contratos referente a este documento',
'Class:Document/Attribute:service_list' => 'Serviços',
'Class:Document/Attribute:service_list+' => 'Serviços referente a este documento',
'Class:Document/Attribute:ticket_list' => 'Tickets',
'Class:Document/Attribute:ticket_list+' => 'Tickets referente a este documento',
'Class:Document:PreviewTab' => 'Visualização',
));
//
// Class: ExternalDoc
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ExternalDoc' => 'Documento externo',
'Class:ExternalDoc+' => 'Documento disponível em outro web server',
'Class:ExternalDoc/Attribute:url' => 'Url',
'Class:ExternalDoc/Attribute:url+' => '',
));
//
// Class: Note
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Note' => 'Notas',
'Class:Note+' => '',
'Class:Note/Attribute:note' => 'Textos',
'Class:Note/Attribute:note+' => '',
));
//
// Class: FileDoc
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:FileDoc' => 'Documento (arquivo)',
'Class:FileDoc+' => '',
'Class:FileDoc/Attribute:contents' => 'Conteudos',
'Class:FileDoc/Attribute:contents+' => '',
));
//
// Class: Licence
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Licence' => 'Licenças',
'Class:Licence+' => '',
'Class:Licence/Attribute:provider' => 'Provedora',
'Class:Licence/Attribute:provider+' => '',
'Class:Licence/Attribute:product' => 'Produto',
'Class:Licence/Attribute:product+' => '',
'Class:Licence/Attribute:name' => 'Nome',
'Class:Licence/Attribute:name+' => '',
'Class:Licence/Attribute:start' => 'Data início',
'Class:Licence/Attribute:start+' => '',
'Class:Licence/Attribute:end' => 'Data final',
'Class:Licence/Attribute:end+' => '',
'Class:Licence/Attribute:licence_key' => 'Chave',
'Class:Licence/Attribute:licence_key+' => '',
'Class:Licence/Attribute:scope' => 'Scope',
'Class:Licence/Attribute:scope+' => '',
'Class:Licence/Attribute:usage_limit' => 'Limite uso',
'Class:Licence/Attribute:usage_limit+' => '',
'Class:Licence/Attribute:usage_list' => 'Usado',
'Class:Licence/Attribute:usage_list+' => 'inst&acirc;ncias de aplicativos usando esta licen&ccedil;a',
));
//
// Class: Subnet
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Subnet' => 'Sub-rede',
'Class:Subnet+' => '',
//'Class:Subnet/Attribute:name' => 'Nome',
//'Class:Subnet/Attribute:name+' => '',
'Class:Subnet/Attribute:org_id' => 'Organização',
'Class:Subnet/Attribute:org_id+' => '',
'Class:Subnet/Attribute:description' => 'Descrição',
'Class:Subnet/Attribute:description+' => '',
'Class:Subnet/Attribute:ip' => 'IP',
'Class:Subnet/Attribute:ip+' => '',
'Class:Subnet/Attribute:ip_mask' => 'Máscara de rede',
'Class:Subnet/Attribute:ip_mask+' => '',
));
//
// Class: Patch
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Patch' => 'Patch',
'Class:Patch+' => '',
'Class:Patch/Attribute:name' => 'Nome',
'Class:Patch/Attribute:name+' => '',
'Class:Patch/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Patch/Attribute:description+' => '',
'Class:Patch/Attribute:target_sw' => 'Application scope',
'Class:Patch/Attribute:target_sw+' => 'Destino software (OS ou aplica&ccedil;&atilde;o)',
'Class:Patch/Attribute:version' => 'Vers&atilde;o',
'Class:Patch/Attribute:version+' => '',
'Class:Patch/Attribute:type' => 'Tipo',
'Class:Patch/Attribute:type+' => '',
'Class:Patch/Attribute:type/Value:application' => 'Applica&ccedil;&atilde;o',
'Class:Patch/Attribute:type/Value:application+' => '',
'Class:Patch/Attribute:type/Value:os' => 'OS',
'Class:Patch/Attribute:type/Value:os+' => '',
'Class:Patch/Attribute:type/Value:security' => 'Seguran&ccedil;a',
'Class:Patch/Attribute:type/Value:security+' => '',
'Class:Patch/Attribute:type/Value:servicepack' => 'Service Pack',
'Class:Patch/Attribute:type/Value:servicepack+' => '',
'Class:Patch/Attribute:ci_list' => 'Dispositivo',
'Class:Patch/Attribute:ci_list+' => 'Dispositivo onde o patch est&aacute; instalado',
));
//
// Class: Software
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Software' => 'Software',
'Class:Software+' => '',
'Class:Software/Attribute:name' => 'Nome',
'Class:Software/Attribute:name+' => '',
'Class:Software/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Software/Attribute:description+' => '',
'Class:Software/Attribute:instance_list' => 'Instala&ccedil;&otilde;es',
'Class:Software/Attribute:instance_list+' => 'Inst&acirc;ncias do software',
'Class:Software/Attribute:finalclass' => 'Tipo',
'Class:Software/Attribute:finalclass+' => '',
));
//
// Class: Application
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Application' => 'Aplica&ccedil;&otilde;es',
'Class:Application+' => '',
'Class:Application/Attribute:name' => 'Nome',
'Class:Application/Attribute:name+' => '',
'Class:Application/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Application/Attribute:description+' => '',
'Class:Application/Attribute:instance_list' => 'Instala&ccedil;&otilde;es',
'Class:Application/Attribute:instance_list+' => 'Inst&acirc;ncias da aplica&ccedil;&atilde;o',
));
//
// Class: DBServer
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:DBServer' => 'Database',
'Class:DBServer+' => 'Database server SW',
'Class:DBServer/Attribute:instance_list' => 'Instala&ccedil;&otilde;es',
'Class:DBServer/Attribute:instance_list+' => 'Inst&acirc;ncias desta base de dados do servidor',
));
//
// Class: lnkPatchToCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkPatchToCI' => 'Patch utilizado',
'Class:lnkPatchToCI+' => '',
'Class:lnkPatchToCI/Attribute:patch_id' => 'Patch',
'Class:lnkPatchToCI/Attribute:patch_id+' => '',
'Class:lnkPatchToCI/Attribute:patch_name' => 'Patch',
'Class:lnkPatchToCI/Attribute:patch_name+' => '',
'Class:lnkPatchToCI/Attribute:ci_id' => 'CI',
'Class:lnkPatchToCI/Attribute:ci_id+' => '',
'Class:lnkPatchToCI/Attribute:ci_name' => 'CI',
'Class:lnkPatchToCI/Attribute:ci_name+' => '',
'Class:lnkPatchToCI/Attribute:ci_status' => 'CI Status',
'Class:lnkPatchToCI/Attribute:ci_status+' => '',
));
//
// Class: FunctionalCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:FunctionalCI' => 'CI funcionalidades',
'Class:FunctionalCI+' => '',
'Class:FunctionalCI/Attribute:name' => 'Nome',
'Class:FunctionalCI/Attribute:name+' => '',
'Class:FunctionalCI/Attribute:status' => 'Status',
'Class:FunctionalCI/Attribute:status+' => '',
'Class:FunctionalCI/Attribute:status/Value:implementation' => 'Implementação',
'Class:FunctionalCI/Attribute:status/Value:implementation+' => '',
'Class:FunctionalCI/Attribute:status/Value:obsolete' => 'Obsoleto',
'Class:FunctionalCI/Attribute:status/Value:obsolete+' => '',
'Class:FunctionalCI/Attribute:status/Value:production' => 'Produção',
'Class:FunctionalCI/Attribute:status/Value:production+' => '',
'Class:FunctionalCI/Attribute:org_id' => 'Organização',
'Class:FunctionalCI/Attribute:org_id+' => '',
'Class:FunctionalCI/Attribute:owner_name' => 'Organização',
'Class:FunctionalCI/Attribute:owner_name+' => '',
'Class:FunctionalCI/Attribute:importance' => 'Criticidade negócio',
'Class:FunctionalCI/Attribute:importance+' => '',
'Class:FunctionalCI/Attribute:importance/Value:high' => 'Alto',
'Class:FunctionalCI/Attribute:importance/Value:high+' => '',
'Class:FunctionalCI/Attribute:importance/Value:low' => 'Baixo',
'Class:FunctionalCI/Attribute:importance/Value:low+' => '',
'Class:FunctionalCI/Attribute:importance/Value:medium' => 'Médio',
'Class:FunctionalCI/Attribute:importance/Value:medium+' => '',
'Class:FunctionalCI/Attribute:contact_list' => 'Contatos',
'Class:FunctionalCI/Attribute:contact_list+' => 'Contatos para este CI',
'Class:FunctionalCI/Attribute:document_list' => 'Documentos',
'Class:FunctionalCI/Attribute:document_list+' => 'Documenção para este CI',
'Class:FunctionalCI/Attribute:solution_list' => 'Application solutions',
'Class:FunctionalCI/Attribute:solution_list+' => 'Application solutions using this CI',
'Class:FunctionalCI/Attribute:contract_list' => 'Contratos',
'Class:FunctionalCI/Attribute:contract_list+' => 'Contratos suportanto este CI',
'Class:FunctionalCI/Attribute:ticket_list' => 'Tickets',
'Class:FunctionalCI/Attribute:ticket_list+' => 'Tickets relacionado a este CI',
'Class:FunctionalCI/Attribute:finalclass' => 'Tipo',
'Class:FunctionalCI/Attribute:finalclass+' => '',
));
//
// Class: SoftwareInstance
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:SoftwareInstance' => 'Software Instance',
'Class:SoftwareInstance+' => '',
'Class:SoftwareInstance/Attribute:device_id' => 'Dispositivo',
'Class:SoftwareInstance/Attribute:device_id+' => '',
'Class:SoftwareInstance/Attribute:device_name' => 'Dispositivo',
'Class:SoftwareInstance/Attribute:device_name+' => '',
'Class:SoftwareInstance/Attribute:licence_id' => 'Licen&ccedil;a',
'Class:SoftwareInstance/Attribute:licence_id+' => '',
'Class:SoftwareInstance/Attribute:licence_name' => 'Licen&ccedil;a',
'Class:SoftwareInstance/Attribute:licence_name+' => '',
'Class:SoftwareInstance/Attribute:software_id' => 'Software',
'Class:SoftwareInstance/Attribute:software_id+' => '',
'Class:SoftwareInstance/Attribute:software_name' => 'Software',
'Class:SoftwareInstance/Attribute:software_name+' => '',
'Class:SoftwareInstance/Attribute:version' => 'Vers&atilde;o',
'Class:SoftwareInstance/Attribute:version+' => '',
'Class:SoftwareInstance/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:SoftwareInstance/Attribute:description+' => '',
));
//
// Class: ApplicationInstance
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ApplicationInstance' => 'Inst&acirc;ncia Aplica&ccedil;&atilde;o',
'Class:ApplicationInstance+' => '',
));
//
// Class: DBServerInstance
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:DBServerInstance' => 'Inst&acirc;ncias DB Server',
'Class:DBServerInstance+' => '',
'Class:DBServerInstance/Attribute:dbinstance_list' => 'Base de Dados',
'Class:DBServerInstance/Attribute:dbinstance_list+' => 'Origem Base de dados',
));
//
// Class: DatabaseInstance
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:DatabaseInstance' => 'Inst&acirc;ncia Base de Dados',
'Class:DatabaseInstance+' => '',
'Class:DatabaseInstance/Attribute:db_server_instance_id' => 'Servidor Base de Dados',
'Class:DatabaseInstance/Attribute:db_server_instance_id+' => '',
'Class:DatabaseInstance/Attribute:db_server_instance_version' => 'Vers&atilde;o Base de Dados',
'Class:DatabaseInstance/Attribute:db_server_instance_version+' => '',
'Class:DatabaseInstance/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:DatabaseInstance/Attribute:description+' => '',
));
//
// Class: ApplicationSolution
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ApplicationSolution' => 'Application Solution',
'Class:ApplicationSolution+' => '',
'Class:ApplicationSolution/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:ApplicationSolution/Attribute:description+' => '',
'Class:ApplicationSolution/Attribute:ci_list' => 'CIs',
'Class:ApplicationSolution/Attribute:ci_list+' => 'CIs que comp&otilde;em a solu&ccedil&atilde;o',
'Class:ApplicationSolution/Attribute:process_list' => 'Os processos do neg&oacute;cios',
'Class:ApplicationSolution/Attribute:process_list+' => 'Os processos de neg&oacute;cio baseando-se na solu&ccedil;&atilde;o',
));
//
// Class: BusinessProcess
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:BusinessProcess' => 'Processos Neg&oacute;cio',
'Class:BusinessProcess+' => '',
'Class:BusinessProcess/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:BusinessProcess/Attribute:description+' => '',
'Class:BusinessProcess/Attribute:used_solution_list' => 'Application solutions',
'Class:BusinessProcess/Attribute:used_solution_list+' => 'Application solutions the process is relying on',
));
//
// Class: ConnectableCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ConnectableCI' => 'Conectividade CI',
'Class:ConnectableCI+' => 'CI físicos',
'Class:ConnectableCI/Attribute:brand' => 'Fabricante',
'Class:ConnectableCI/Attribute:brand+' => '',
'Class:ConnectableCI/Attribute:model' => 'Modelo',
'Class:ConnectableCI/Attribute:model+' => '',
'Class:ConnectableCI/Attribute:serial_number' => 'Serial Number',
'Class:ConnectableCI/Attribute:serial_number+' => '',
'Class:ConnectableCI/Attribute:asset_ref' => 'Atribuir Refer&ecirc;ncia',
'Class:ConnectableCI/Attribute:asset_ref+' => '',
));
//
// Class: NetworkInterface
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:NetworkInterface' => 'Interface de rede',
'Class:NetworkInterface+' => '',
'Class:NetworkInterface/Attribute:device_id' => 'Dispositivo',
'Class:NetworkInterface/Attribute:device_id+' => '',
'Class:NetworkInterface/Attribute:device_name' => 'Dispositivo',
'Class:NetworkInterface/Attribute:device_name+' => '',
'Class:NetworkInterface/Attribute:logical_type' => 'Tipo lógico',
'Class:NetworkInterface/Attribute:logical_type+' => '',
'Class:NetworkInterface/Attribute:logical_type/Value:backup' => 'Backup',
'Class:NetworkInterface/Attribute:logical_type/Value:backup+' => '',
'Class:NetworkInterface/Attribute:logical_type/Value:logical' => 'Lógico',
'Class:NetworkInterface/Attribute:logical_type/Value:logical+' => '',
'Class:NetworkInterface/Attribute:logical_type/Value:port' => 'Porta',
'Class:NetworkInterface/Attribute:logical_type/Value:port+' => '',
'Class:NetworkInterface/Attribute:logical_type/Value:primary' => 'Primário',
'Class:NetworkInterface/Attribute:logical_type/Value:primary+' => '',
'Class:NetworkInterface/Attribute:logical_type/Value:secondary' => 'Secundário',
'Class:NetworkInterface/Attribute:logical_type/Value:secondary+' => '',
'Class:NetworkInterface/Attribute:physical_type' => 'Físico',
'Class:NetworkInterface/Attribute:physical_type+' => '',
'Class:NetworkInterface/Attribute:physical_type/Value:atm' => 'ATM',
'Class:NetworkInterface/Attribute:physical_type/Value:atm+' => '',
'Class:NetworkInterface/Attribute:physical_type/Value:ethernet' => 'Ethernet',
'Class:NetworkInterface/Attribute:physical_type/Value:ethernet+' => '',
'Class:NetworkInterface/Attribute:physical_type/Value:framerelay' => 'Frame Relay',
'Class:NetworkInterface/Attribute:physical_type/Value:framerelay+' => '',
'Class:NetworkInterface/Attribute:physical_type/Value:vlan' => 'VLAN',
'Class:NetworkInterface/Attribute:physical_type/Value:vlan+' => '',
'Class:NetworkInterface/Attribute:ip_address' => 'Endereço IP',
'Class:NetworkInterface/Attribute:ip_address+' => '',
'Class:NetworkInterface/Attribute:ip_mask' => 'Máscara de rede',
'Class:NetworkInterface/Attribute:ip_mask+' => '',
'Class:NetworkInterface/Attribute:mac_address' => 'Endereço MAC',
'Class:NetworkInterface/Attribute:mac_address+' => '',
'Class:NetworkInterface/Attribute:speed' => 'Velocidade',
'Class:NetworkInterface/Attribute:speed+' => '',
'Class:NetworkInterface/Attribute:duplex' => 'Duplex',
'Class:NetworkInterface/Attribute:duplex+' => '',
'Class:NetworkInterface/Attribute:duplex/Value:full' => 'Full',
'Class:NetworkInterface/Attribute:duplex/Value:full+' => '',
'Class:NetworkInterface/Attribute:duplex/Value:half' => 'Half',
'Class:NetworkInterface/Attribute:duplex/Value:half+' => '',
'Class:NetworkInterface/Attribute:duplex/Value:unknown' => 'Desconhecido',
'Class:NetworkInterface/Attribute:duplex/Value:unknown+' => '',
'Class:NetworkInterface/Attribute:connected_if' => 'Connected to',
'Class:NetworkInterface/Attribute:connected_if+' => 'Connected interface',
'Class:NetworkInterface/Attribute:connected_name' => 'Connected to',
'Class:NetworkInterface/Attribute:connected_name+' => '',
'Class:NetworkInterface/Attribute:connected_if_device_id' => 'Connected device',
'Class:NetworkInterface/Attribute:connected_if_device_id+' => '',
'Class:NetworkInterface/Attribute:link_type' => 'Link type',
'Class:NetworkInterface/Attribute:link_type+' => '',
'Class:NetworkInterface/Attribute:link_type/Value:uplink' => 'Link Up',
'Class:NetworkInterface/Attribute:link_type/Value:uplink+' => '',
'Class:NetworkInterface/Attribute:link_type/Value:downlink' => 'Link Down',
'Class:NetworkInterface/Attribute:link_type/Value:downlink+' => '',
));
//
// Class: Device
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Device' => 'Dispositivo',
'Class:Device+' => '',
'Class:Device/Attribute:nwinterface_list' => 'Interfaces de rede',
'Class:Device/Attribute:nwinterface_list+' => '',
));
//
// Class: PC
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:PC' => 'PC',
'Class:PC+' => '',
'Class:PC/Attribute:cpu' => 'CPU',
'Class:PC/Attribute:cpu+' => '',
'Class:PC/Attribute:ram' => 'RAM',
'Class:PC/Attribute:ram+' => '',
'Class:PC/Attribute:hdd' => 'Hard disk',
'Class:PC/Attribute:hdd+' => '',
'Class:PC/Attribute:os_family' => 'Família OS',
'Class:PC/Attribute:os_family+' => '',
'Class:PC/Attribute:os_version' => 'Versão OS',
'Class:PC/Attribute:os_version+' => '',
'Class:PC/Attribute:application_list' => 'Aplicativos',
'Class:PC/Attribute:application_list+' => 'Aplicativos instalados neste PC',
'Class:PC/Attribute:patch_list' => 'Patches',
'Class:PC/Attribute:patch_list+' => 'Patches instalados neste PC',
));
//
// Class: MobileCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:MobileCI' => 'Mobile CI',
'Class:MobileCI+' => '',
));
//
// Class: MobilePhone
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:MobilePhone' => 'Telefone celular',
'Class:MobilePhone+' => '',
'Class:MobilePhone/Attribute:number' => 'N&uacute;mero telefone',
'Class:MobilePhone/Attribute:number+' => '',
'Class:MobilePhone/Attribute:imei' => 'IMEI',
'Class:MobilePhone/Attribute:imei+' => '',
'Class:MobilePhone/Attribute:hw_pin' => 'Hardware PIN',
'Class:MobilePhone/Attribute:hw_pin+' => '',
));
//
// Class: InfrastructureCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:InfrastructureCI' => 'Infra-estrutura CI',
'Class:InfrastructureCI+' => '',
'Class:InfrastructureCI/Attribute:description' => 'Descrição',
'Class:InfrastructureCI/Attribute:description+' => '',
'Class:InfrastructureCI/Attribute:location_id' => 'Localização',
'Class:InfrastructureCI/Attribute:location_id+' => '',
'Class:InfrastructureCI/Attribute:location_name' => 'Localização',
'Class:InfrastructureCI/Attribute:location_name+' => '',
'Class:InfrastructureCI/Attribute:location_details' => 'Detalhes localização',
'Class:InfrastructureCI/Attribute:location_details+' => '',
'Class:InfrastructureCI/Attribute:management_ip' => 'IP gerenciamento',
'Class:InfrastructureCI/Attribute:management_ip+' => '',
'Class:InfrastructureCI/Attribute:default_gateway' => 'Gateway padrão',
'Class:InfrastructureCI/Attribute:default_gateway+' => '',
));
//
// Class: NetworkDevice
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:NetworkDevice' => 'Dispositivo rede',
'Class:NetworkDevice+' => '',
'Class:NetworkDevice/Attribute:type' => 'Tipo',
'Class:NetworkDevice/Attribute:type+' => '',
'Class:NetworkDevice/Attribute:type/Value:wanaccelerator' => 'WAN Accelerator',
'Class:NetworkDevice/Attribute:type/Value:wanaccelerator+' => '',
'Class:NetworkDevice/Attribute:type/Value:firewall' => 'Firewall',
'Class:NetworkDevice/Attribute:type/Value:firewall+' => '',
'Class:NetworkDevice/Attribute:type/Value:hub' => 'Hub',
'Class:NetworkDevice/Attribute:type/Value:hub+' => '',
'Class:NetworkDevice/Attribute:type/Value:loadbalancer' => 'Load Balancer',
'Class:NetworkDevice/Attribute:type/Value:loadbalancer+' => '',
'Class:NetworkDevice/Attribute:type/Value:router' => 'Roteador',
'Class:NetworkDevice/Attribute:type/Value:router+' => '',
'Class:NetworkDevice/Attribute:type/Value:switch' => 'Switch',
'Class:NetworkDevice/Attribute:type/Value:switch+' => '',
'Class:NetworkDevice/Attribute:ios_version' => 'Versão IOS',
'Class:NetworkDevice/Attribute:ios_version+' => '',
'Class:NetworkDevice/Attribute:ram' => 'RAM',
'Class:NetworkDevice/Attribute:ram+' => '',
'Class:NetworkDevice/Attribute:snmp_read' => 'SNMP Read',
'Class:NetworkDevice/Attribute:snmp_read+' => '',
'Class:NetworkDevice/Attribute:snmp_write' => 'SNMP Write',
'Class:NetworkDevice/Attribute:snmp_write+' => '',
));
//
// Class: Server
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Server' => 'Servidor',
'Class:Server+' => '',
'Class:Server/Attribute:cpu' => 'CPU',
'Class:Server/Attribute:cpu+' => '',
'Class:Server/Attribute:ram' => 'RAM',
'Class:Server/Attribute:ram+' => '',
'Class:Server/Attribute:hdd' => 'Hard Disk',
'Class:Server/Attribute:hdd+' => '',
'Class:Server/Attribute:os_family' => 'Família OS',
'Class:Server/Attribute:os_family+' => '',
'Class:Server/Attribute:os_version' => 'Versão OS',
'Class:Server/Attribute:os_version+' => '',
'Class:Server/Attribute:application_list' => 'Aplicativos',
'Class:Server/Attribute:application_list+' => 'Aplicativos instalados neste servidor',
'Class:Server/Attribute:patch_list' => 'Patches',
'Class:Server/Attribute:patch_list+' => 'Patches instalados neste servidor',
));
//
// Class: Printer
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Printer' => 'Impress&otilde;es',
'Class:Printer+' => '',
'Class:Printer/Attribute:type' => 'Tipo',
'Class:Printer/Attribute:type+' => '',
'Class:Printer/Attribute:type/Value:mopier' => 'Mopier',
'Class:Printer/Attribute:type/Value:mopier+' => '',
'Class:Printer/Attribute:type/Value:printer' => 'Impressora',
'Class:Printer/Attribute:type/Value:printer+' => '',
'Class:Printer/Attribute:technology' => 'Tecnologia',
'Class:Printer/Attribute:technology+' => '',
'Class:Printer/Attribute:technology/Value:inkjet' => 'Inkjet',
'Class:Printer/Attribute:technology/Value:inkjet+' => '',
'Class:Printer/Attribute:technology/Value:laser' => 'Laser',
'Class:Printer/Attribute:technology/Value:laser+' => '',
'Class:Printer/Attribute:technology/Value:tracer' => 'Tracer',
'Class:Printer/Attribute:technology/Value:tracer+' => '',
));
//
// Class: lnkCIToDoc
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkCIToDoc' => 'Doc/CI',
'Class:lnkCIToDoc+' => '',
'Class:lnkCIToDoc/Attribute:ci_id' => 'CI',
'Class:lnkCIToDoc/Attribute:ci_id+' => '',
'Class:lnkCIToDoc/Attribute:ci_name' => 'CI',
'Class:lnkCIToDoc/Attribute:ci_name+' => '',
'Class:lnkCIToDoc/Attribute:ci_status' => 'CI Status',
'Class:lnkCIToDoc/Attribute:ci_status+' => '',
'Class:lnkCIToDoc/Attribute:document_id' => 'Documento',
'Class:lnkCIToDoc/Attribute:document_id+' => '',
'Class:lnkCIToDoc/Attribute:document_name' => 'Documento',
'Class:lnkCIToDoc/Attribute:document_name+' => '',
'Class:lnkCIToDoc/Attribute:document_type' => 'Tipo documento',
'Class:lnkCIToDoc/Attribute:document_type+' => '',
'Class:lnkCIToDoc/Attribute:document_status' => 'Status documento',
'Class:lnkCIToDoc/Attribute:document_status+' => '',
));
//
// Class: lnkCIToContact
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkCIToContact' => 'CI/Contatos',
'Class:lnkCIToContact+' => '',
'Class:lnkCIToContact/Attribute:ci_id' => 'CI',
'Class:lnkCIToContact/Attribute:ci_id+' => '',
'Class:lnkCIToContact/Attribute:ci_name' => 'CI',
'Class:lnkCIToContact/Attribute:ci_name+' => '',
'Class:lnkCIToContact/Attribute:ci_status' => 'CI Status',
'Class:lnkCIToContact/Attribute:ci_status+' => '',
'Class:lnkCIToContact/Attribute:contact_id' => 'Contatos',
'Class:lnkCIToContact/Attribute:contact_id+' => '',
'Class:lnkCIToContact/Attribute:contact_name' => 'Contatos',
'Class:lnkCIToContact/Attribute:contact_name+' => '',
'Class:lnkCIToContact/Attribute:contact_email' => 'Contatos Email',
'Class:lnkCIToContact/Attribute:contact_email+' => '',
'Class:lnkCIToContact/Attribute:role' => 'Papel',
'Class:lnkCIToContact/Attribute:role+' => 'Papel do contato em rela&ccedil;&atilde;o ao CI',
));
//
// Class: lnkSolutionToCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkSolutionToCI' => 'CI/Solu&ccedil;&atilde;o',
'Class:lnkSolutionToCI+' => '',
'Class:lnkSolutionToCI/Attribute:solution_id' => 'Application solution',
'Class:lnkSolutionToCI/Attribute:solution_id+' => '',
'Class:lnkSolutionToCI/Attribute:solution_name' => 'Application solution',
'Class:lnkSolutionToCI/Attribute:solution_name+' => '',
'Class:lnkSolutionToCI/Attribute:ci_id' => 'CI',
'Class:lnkSolutionToCI/Attribute:ci_id+' => '',
'Class:lnkSolutionToCI/Attribute:ci_name' => 'CI',
'Class:lnkSolutionToCI/Attribute:ci_name+' => '',
'Class:lnkSolutionToCI/Attribute:ci_status' => 'CI Status',
'Class:lnkSolutionToCI/Attribute:ci_status+' => '',
'Class:lnkSolutionToCI/Attribute:utility' => 'Utilidade',
'Class:lnkSolutionToCI/Attribute:utility+' => 'Utilidade da CI na solu&ccedil;&atilde;o',
));
//
// Class: lnkProcessToSolution
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkProcessToSolution' => 'Business process/Solution',
'Class:lnkProcessToSolution+' => '',
'Class:lnkProcessToSolution/Attribute:solution_id' => 'Application solution',
'Class:lnkProcessToSolution/Attribute:solution_id+' => '',
'Class:lnkProcessToSolution/Attribute:solution_name' => 'Application solution',
'Class:lnkProcessToSolution/Attribute:solution_name+' => '',
'Class:lnkProcessToSolution/Attribute:process_id' => 'Processo',
'Class:lnkProcessToSolution/Attribute:process_id+' => '',
'Class:lnkProcessToSolution/Attribute:process_name' => 'Processo',
'Class:lnkProcessToSolution/Attribute:process_name+' => '',
'Class:lnkProcessToSolution/Attribute:reason' => 'Raz&atilde;o',
'Class:lnkProcessToSolution/Attribute:reason+' => 'Mais informa&ccedil;&otilde;es sobre a liga&ccedil;&atilde;o entre o processo e a solução',
));
//
// Class extensions
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Subnet/Tab:IPUsage' => 'IP Usado',
'Class:Subnet/Tab:IPUsage-explain' => 'Interfaces possuem um endereço IP na faixa: <em>%1$s</em> até <em>%2$s</em>',
'Class:Subnet/Tab:FreeIPs' => 'IPs livres',
'Class:Subnet/Tab:FreeIPs-count' => 'IPs livres: %1$s',
'Class:Subnet/Tab:FreeIPs-explain' => 'Abaixo um extrato de 10 endereços de IP livres',
));
//
// Application Menu
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:Catalogs' => 'Catálogos',
'Menu:Catalogs+' => 'Tipo de dados',
'Menu:Audit' => 'Auditoria',
'Menu:Audit+' => 'Auditoria',
'Menu:Organization' => 'Organizações',
'Menu:Organization+' => 'Todas Organizações',
'Menu:Application' => 'Aplicativos',
'Menu:Application+' => 'Todos Aplicativos',
'Menu:DBServer' => 'Banco de dado Servers',
'Menu:DBServer+' => 'Banco de dado Servers',
'Menu:Audit' => 'Auditoria',
'Menu:ConfigManagement' => 'Gerenciamento Configurações',
'Menu:ConfigManagement+' => 'Gerenciamento Configurações',
'Menu:ConfigManagementOverview' => 'Visão Global',
'Menu:ConfigManagementOverview+' => 'Visão Global',
'Menu:Contact' => 'Contatos',
'Menu:Contact+' => 'Contatos',
'Menu:Person' => 'Pessoas',
'Menu:Person+' => 'Todas Pessoas',
'Menu:Team' => 'Equipes',
'Menu:Team+' => 'Todas Equipes',
'Menu:Document' => 'Documentos',
'Menu:Document+' => 'Todos Documentos',
'Menu:Location' => 'Localizações',
'Menu:Location+' => 'Todas Localizações',
'Menu:ConfigManagementCI' => 'Configura&ccedil;&atilde;o Itens',
'Menu:ConfigManagementCI+' => 'Configura&ccedil;&atilde;o Itens',
'Menu:BusinessProcess' => 'Processos Negócio',
'Menu:BusinessProcess+' => 'Todos Processos Negócio',
'Menu:ApplicationSolution' => 'Application Solutions',
'Menu:ApplicationSolution+' => 'All Application Solutions',
'Menu:ConfigManagementSoftware' => 'Gerenciamento Aplicativos',
'Menu:Licence' => 'Licenças',
'Menu:Licence+' => 'Todas Licenças',
'Menu:Patch' => 'Patches',
'Menu:Patch+' => 'Todos Patches',
'Menu:ApplicationInstance' => 'Software instalados',
'Menu:ApplicationInstance+' => 'Aplicativos e Banco de dados em servidores',
'Menu:ConfigManagementHardware' => 'Gerenciamento Infra-estrutura',
'Menu:Subnet' => 'Sub-redes',
'Menu:Subnet+' => 'Todas as sub-redes',
'Menu:NetworkDevice' => 'Dispositivos de rede',
'Menu:NetworkDevice+' => 'Todos os dispositivos de rede',
'Menu:Server' => 'Servidores',
'Menu:Server+' => 'Todos servidores',
'Menu:Printer' => 'Impressoras',
'Menu:Printer+' => 'Todas impressoras',
'Menu:MobilePhone' => 'Mobilidade',
'Menu:MobilePhone+' => 'Todos dispositivos móveis',
'Menu:PC' => 'Micro-computadores',
'Menu:PC+' => 'Todos micro-computadores',
'Menu:NewContact' => 'Novo Contato',
'Menu:NewContact+' => 'Novo Contato',
'Menu:SearchContacts' => 'Pesquisa para contatos',
'Menu:SearchContacts+' => 'Pesquisa para contatos',
'Menu:NewCI' => 'Novo Configuração Iten',
'Menu:NewCI+' => 'Novo Configuração Iten',
'Menu:SearchCIs' => 'Pesquisa para CIs',
'Menu:SearchCIs+' => 'Pesquisa para CIs',
'Menu:ConfigManagement:Devices' => 'Devices',
'Menu:ConfigManagement:AllDevices' => 'Number of devices: %1$d',
'Menu:ConfigManagement:SWAndApps' => 'Software and Applications',
'Menu:ConfigManagement:Misc' => 'Miscellaneous',
'Menu:Group' => 'Grupo de CIs',
'Menu:Group+' => 'Grupo de CIs',
'Menu:ConfigManagement:Shortcuts' => 'Atalhos',
'Menu:ConfigManagement:AllContacts' => 'Todos contatos: %1$d',
));
?>

View File

@@ -52,14 +52,19 @@ class Incident extends ResponseTicket
public function ComputeValues()
{
$iKey = $this->GetKey();
if ($iKey < 0)
$sCurrRef = $this->Get('ref');
if (strlen($sCurrRef) == 0)
{
// Object not yet in the Database
$iKey = MetaModel::GetNextKey(get_class($this));
$iKey = $this->GetKey();
if ($iKey < 0)
{
// Object not yet in the Database
$iKey = MetaModel::GetNextKey(get_class($this));
}
$sName = sprintf('I-%06d', $iKey);
$this->Set('ref', $sName);
}
$sName = sprintf('I-%06d', $iKey);
$this->Set('ref', $sName);
return parent::ComputeValues();
}
@@ -108,7 +113,7 @@ class Incident extends ResponseTicket
case 'escalated_tto':
case 'escalated_ttr':
$sIconName = self::MakeIconFromName('incident-escalated.png');
$sIcon = self::MakeIconFromName('incident-escalated.png');
break;
case 'resolved':

View File

@@ -30,6 +30,7 @@ SetupWebPage::AddModule(
'fr.dict.itop-incident-mgmt.php',
'es_cr.dict.itop-incident-mgmt.php',
'de.dict.itop-incident-mgmt.php',
'pt_br.dict.itop-incident-mgmt.php',
),
'data.struct' => array(
'data.struct.ta-triggers.xml',

View File

@@ -0,0 +1,75 @@
<?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('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:IncidentManagement' => 'Gerenciamento Incidentes',
'Menu:IncidentManagement+' => 'Gerenciamento Incidentes',
'Menu:Incident:Overview' => 'Vis&atilde;o Geral',
'Menu:Incident:Overview+' => 'Vis&atilde;o Geral',
'Menu:NewIncident' => 'Novo Incidente',
'Menu:NewIncident+' => 'Novo Incidente',
'Menu:SearchIncidents' => 'Pesquisa para Incidentes',
'Menu:SearchIncidents+' => 'Pesquisa para Incidentes',
'Menu:Incident:Shortcuts' => 'Atalhos',
'Menu:Incident:Shortcuts+' => '',
'Menu:Incident:MyIncidents' => 'Incidentes atribu&iacute;do a mim',
'Menu:Incident:MyIncidents+' => 'Incidentes atribu&iacute; para mim (como agente)',
'Menu:Incident:EscalatedIncidents' => 'Incidentes encaminhados',
'Menu:Incident:EscalatedIncidents+' => 'Incidentes encaminhados',
'Menu:Incident:OpenIncidents' => 'Todos Incidentes abertos',
'Menu:Incident:OpenIncidents+' => 'Todos Incidentes abertos',
));
// 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('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Incident' => 'Incidentes',
'Class:Incident+' => '',
'Class:Incident/Stimulus:ev_assign' => 'Atribu&iacute;r',
'Class:Incident/Stimulus:ev_assign+' => '',
'Class:Incident/Stimulus:ev_reassign' => 'Re-atribu&iacute;r',
'Class:Incident/Stimulus:ev_reassign+' => '',
'Class:Incident/Stimulus:ev_timeout' => 'ev_timeout',
'Class:Incident/Stimulus:ev_timeout+' => '',
'Class:Incident/Stimulus:ev_resolve' => 'Marque como resolvido',
'Class:Incident/Stimulus:ev_resolve+' => '',
'Class:Incident/Stimulus:ev_close' => 'Fechado',
'Class:Incident/Stimulus:ev_close+' => '',
));
?>

View File

@@ -67,7 +67,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:KnownError/Attribute:problem_ref+' => '',
'Class:KnownError/Attribute:symptom' => 'Symptom',
'Class:KnownError/Attribute:symptom+' => '',
'Class:KnownError/Attribute:root_cause' => 'Hauptursache',
'Class:KnownError/Attribute:root_cause' => 'Grundursache',
'Class:KnownError/Attribute:root_cause+' => '',
'Class:KnownError/Attribute:workaround' => 'Workaround',
'Class:KnownError/Attribute:workaround+' => '',
@@ -85,7 +85,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:KnownError/Attribute:domain/Value:Network+' => 'Netzwerk',
'Class:KnownError/Attribute:domain/Value:Server' => 'Server',
'Class:KnownError/Attribute:domain/Value:Server+' => 'Server',
'Class:KnownError/Attribute:vendor' => 'Verkäufer',
'Class:KnownError/Attribute:vendor' => 'Anbieter',
'Class:KnownError/Attribute:vendor+' => '',
'Class:KnownError/Attribute:model' => 'Modell',
'Class:KnownError/Attribute:model+' => '',
@@ -137,7 +137,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkDocumentError/Attribute:link_type' => 'Information',
'Class:lnkDocumentError/Attribute:link_type+' => '',
));
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:ProblemManagement' => 'Problem Management', // Duplicated from Pb Mgmt module, since the two modules are independent
'Menu:ProblemManagement+' => 'Problem Management',// and the KEDB may be installed independently of the Pb Mgmt module

View File

@@ -30,6 +30,7 @@ SetupWebPage::AddModule(
'es_cr.dict.itop-knownerror-mgmt.php',
'fr.dict.itop-knownerror-mgmt.php',
'de.dict.itop-knownerror-mgmt.php',
'pt_br.dict.itop-knownerror-mgmt.php',
),
'data.struct' => array(
//'data.struct.itop-knownerror-mgmt.xml',

View File

@@ -0,0 +1,147 @@
<?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
*/
// 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>+
//////////////////////////////////////////////////////////////////////
// Classes in 'bizmodel'
//////////////////////////////////////////////////////////////////////
//
// 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('PT BR', 'Brazilian', 'Brazilian', array(
'Class:KnownError' => 'Known Error',
'Class:KnownError+' => 'Error documented for a known issue',
'Class:KnownError/Attribute:name' => 'Name',
'Class:KnownError/Attribute:name+' => '',
'Class:KnownError/Attribute:org_id' => 'Customer',
'Class:KnownError/Attribute:org_id+' => '',
'Class:KnownError/Attribute:cust_name' => 'Customer Name',
'Class:KnownError/Attribute:cust_name+' => '',
'Class:KnownError/Attribute:problem_id' => 'Related Problem',
'Class:KnownError/Attribute:problem_id+' => '',
'Class:KnownError/Attribute:problem_ref' => 'Ref',
'Class:KnownError/Attribute:problem_ref+' => '',
'Class:KnownError/Attribute:symptom' => 'Symptom',
'Class:KnownError/Attribute:symptom+' => '',
'Class:KnownError/Attribute:root_cause' => 'Root Cause',
'Class:KnownError/Attribute:root_cause+' => '',
'Class:KnownError/Attribute:workaround' => 'Workaround',
'Class:KnownError/Attribute:workaround+' => '',
'Class:KnownError/Attribute:solution' => 'Solution',
'Class:KnownError/Attribute:solution+' => '',
'Class:KnownError/Attribute:error_code' => 'Error Code',
'Class:KnownError/Attribute:error_code+' => '',
'Class:KnownError/Attribute:domain' => 'Domain',
'Class:KnownError/Attribute:domain+' => '',
'Class:KnownError/Attribute:domain/Value:Application' => 'Application',
'Class:KnownError/Attribute:domain/Value:Application+' => 'Application',
'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Network' => 'Network',
'Class:KnownError/Attribute:domain/Value:Network+' => 'Network',
'Class:KnownError/Attribute:domain/Value:Server' => 'Server',
'Class:KnownError/Attribute:domain/Value:Server+' => 'Server',
'Class:KnownError/Attribute:vendor' => 'Vendor',
'Class:KnownError/Attribute:vendor+' => '',
'Class:KnownError/Attribute:model' => 'Model',
'Class:KnownError/Attribute:model+' => '',
'Class:KnownError/Attribute:version' => 'Version',
'Class:KnownError/Attribute:version+' => '',
'Class:KnownError/Attribute:ci_list' => 'CIs',
'Class:KnownError/Attribute:ci_list+' => '',
'Class:KnownError/Attribute:document_list' => 'Documents',
'Class:KnownError/Attribute:document_list+' => '',
));
//
// Class: lnkInfraError
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkInfraError' => 'InfraErrorLinks',
'Class:lnkInfraError+' => 'Infra related to a known error',
'Class:lnkInfraError/Attribute:infra_id' => 'CI',
'Class:lnkInfraError/Attribute:infra_id+' => '',
'Class:lnkInfraError/Attribute:infra_name' => 'CI Name',
'Class:lnkInfraError/Attribute:infra_name+' => '',
'Class:lnkInfraError/Attribute:infra_status' => 'CI Status',
'Class:lnkInfraError/Attribute:infra_status+' => '',
'Class:lnkInfraError/Attribute:error_id' => 'Error',
'Class:lnkInfraError/Attribute:error_id+' => '',
'Class:lnkInfraError/Attribute:error_name' => 'Error name',
'Class:lnkInfraError/Attribute:error_name+' => '',
'Class:lnkInfraError/Attribute:reason' => 'Reason',
'Class:lnkInfraError/Attribute:reason+' => '',
));
//
// Class: lnkDocumentError
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkDocumentError' => 'DocumentsErrorLinks',
'Class:lnkDocumentError+' => 'A link between a document and a known error',
'Class:lnkDocumentError/Attribute:doc_id' => 'Document',
'Class:lnkDocumentError/Attribute:doc_id+' => '',
'Class:lnkDocumentError/Attribute:doc_name' => 'Document Name',
'Class:lnkDocumentError/Attribute:doc_name+' => '',
'Class:lnkDocumentError/Attribute:error_id' => 'Error',
'Class:lnkDocumentError/Attribute:error_id+' => '',
'Class:lnkDocumentError/Attribute:error_name' => 'Error Name',
'Class:lnkDocumentError/Attribute:error_name+' => '',
'Class:lnkDocumentError/Attribute:link_type' => 'Information',
'Class:lnkDocumentError/Attribute:link_type+' => '',
));
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:NewError' => 'New Known Error',
'Menu:NewError+' => 'Creation of a new known error',
'Menu:SearchError' => 'Search for Known Errors',
'Menu:SearchError+' => 'Search for Known Errors',
'Menu:Problem:KnownErrors' => 'All Known Errors',
'Menu:Problem:KnownErrors+' => 'All Known Errors',
));
?>

View File

@@ -209,17 +209,21 @@ class Problem extends Ticket
public function ComputeValues()
{
// Compute the priority of the ticket
$this->Set('priority', $this->ComputePriority());
// Compute the priority of the ticket
$this->Set('priority', $this->ComputePriority());
$iKey = $this->GetKey();
if ($iKey < 0)
$sCurrRef = $this->Get('ref');
if (strlen($sCurrRef) == 0)
{
// Object not yet in the Database
$iKey = MetaModel::GetNextKey(get_class($this));
$iKey = $this->GetKey();
if ($iKey < 0)
{
// Object not yet in the Database
$iKey = MetaModel::GetNextKey(get_class($this));
}
$sName = sprintf('P-%06d', $iKey);
$this->Set('ref', $sName);
}
$sName = sprintf('P-%06d', $iKey);
$this->Set('ref', $sName);
}
}

View File

@@ -30,6 +30,7 @@ SetupWebPage::AddModule(
'es_cr.dict.itop-problem-mgmt.php',
'fr.dict.itop-problem-mgmt.php',
'de.dict.itop-problem-mgmt.php',
'pt_br.dict.itop-problem-mgmt.php',
),
'data.struct' => array(
//'data.struct.itop-problem-mgmt.xml',

View File

@@ -0,0 +1,138 @@
<?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('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:ProblemManagement' => 'Gerenciamento Problemas',
'Menu:ProblemManagement+' => 'Gerenciamento Problemas',
'Menu:Problem:Overview' => 'Visão geral',
'Menu:Problem:Overview+' => 'Visão geral',
'Menu:NewProblem' => 'Novo Problema',
'Menu:NewProblem+' => 'Novo Problema',
'Menu:SearchProblems' => 'Pesquisa para Problemas',
'Menu:SearchProblems+' => 'Pesquisa para Problemas',
'Menu:Problem:Shortcuts' => 'Atalhos',
'Menu:Problem:MyProblems' => 'My Problems',
'Menu:Problem:MyProblems+' => 'My Problems',
'Menu:Problem:OpenProblems' => 'Todos Problemas abertos',
'Menu:Problem:OpenProblems+' => 'Todos Problemas abertos',
'UI-ProblemManagementOverview-ProblemByService' => 'Problems by Service',
'UI-ProblemManagementOverview-ProblemByService+' => 'Problems by Service',
'UI-ProblemManagementOverview-ProblemByPriority' => 'Problems by Priority',
'UI-ProblemManagementOverview-ProblemByPriority+' => 'Problems by Priority',
'UI-ProblemManagementOverview-ProblemUnassigned' => 'Unassigned Problems',
'UI-ProblemManagementOverview-ProblemUnassigned+' => 'Unassigned Problems',
'UI:ProblemMgmtMenuOverview:Title' => 'Dashboard for Problem Management',
'UI:ProblemMgmtMenuOverview:Title+' => 'Dashboard for Problem Management',
));
//
// Class: Problem
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Problem' => 'Problema',
'Class:Problem+' => '',
'Class:Problem/Attribute:status' => 'Status',
'Class:Problem/Attribute:status+' => '',
'Class:Problem/Attribute:status/Value:new' => 'New',
'Class:Problem/Attribute:status/Value:new+' => '',
'Class:Problem/Attribute:status/Value:assigned' => 'Assigned',
'Class:Problem/Attribute:status/Value:assigned+' => '',
'Class:Problem/Attribute:status/Value:resolved' => 'Resolved',
'Class:Problem/Attribute:status/Value:resolved+' => '',
'Class:Problem/Attribute:status/Value:closed' => 'Closed',
'Class:Problem/Attribute:status/Value:closed+' => '',
'Class:Problem/Attribute:org_id' => 'Customer',
'Class:Problem/Attribute:org_id+' => '',
'Class:Problem/Attribute:org_name' => 'Name',
'Class:Problem/Attribute:org_name+' => 'Common name',
'Class:Problem/Attribute:service_id' => 'Service',
'Class:Problem/Attribute:service_id+' => '',
'Class:Problem/Attribute:service_name' => 'Name',
'Class:Problem/Attribute:service_name+' => '',
'Class:Problem/Attribute:servicesubcategory_id' => 'Service Category',
'Class:Problem/Attribute:servicesubcategory_id+' => '',
'Class:Problem/Attribute:servicesubcategory_name' => 'Name',
'Class:Problem/Attribute:servicesubcategory_name+' => '',
'Class:Problem/Attribute:product' => 'Product',
'Class:Problem/Attribute:product+' => '',
'Class:Problem/Attribute:impact' => 'Impact',
'Class:Problem/Attribute:impact+' => '',
'Class:Problem/Attribute:impact/Value:1' => 'A Person',
'Class:Problem/Attribute:impact/Value:1+' => '',
'Class:Problem/Attribute:impact/Value:2' => 'A Service',
'Class:Problem/Attribute:impact/Value:2+' => '',
'Class:Problem/Attribute:impact/Value:3' => 'A Department',
'Class:Problem/Attribute:impact/Value:3+' => '',
'Class:Problem/Attribute:urgency' => 'Urgency',
'Class:Problem/Attribute:urgency+' => '',
'Class:Problem/Attribute:urgency/Value:1' => 'Low',
'Class:Problem/Attribute:urgency/Value:1+' => 'Low',
'Class:Problem/Attribute:urgency/Value:2' => 'Medium',
'Class:Problem/Attribute:urgency/Value:2+' => 'Medium',
'Class:Problem/Attribute:urgency/Value:3' => 'High',
'Class:Problem/Attribute:urgency/Value:3+' => 'High',
'Class:Problem/Attribute:priority' => 'Priority',
'Class:Problem/Attribute:priority+' => '',
'Class:Problem/Attribute:priority/Value:1' => 'Low',
'Class:Problem/Attribute:priority/Value:1+' => '',
'Class:Problem/Attribute:priority/Value:2' => 'Medium',
'Class:Problem/Attribute:priority/Value:2+' => '',
'Class:Problem/Attribute:priority/Value:3' => 'High',
'Class:Problem/Attribute:priority/Value:3+' => '',
'Class:Problem/Attribute:workgroup_id' => 'WorkGroup',
'Class:Problem/Attribute:workgroup_id+' => '',
'Class:Problem/Attribute:workgroup_name' => 'Name',
'Class:Problem/Attribute:workgroup_name+' => '',
'Class:Problem/Attribute:agent_id' => 'Agent',
'Class:Problem/Attribute:agent_id+' => '',
'Class:Problem/Attribute:agent_name' => 'Agent Name',
'Class:Problem/Attribute:agent_name+' => '',
'Class:Problem/Attribute:agent_email' => 'Agent Email',
'Class:Problem/Attribute:agent_email+' => '',
'Class:Problem/Attribute:related_change_id' => 'Related Change',
'Class:Problem/Attribute:related_change_id+' => '',
'Class:Problem/Attribute:related_change_ref' => 'Ref',
'Class:Problem/Attribute:related_change_ref+' => '',
'Class:Problem/Attribute:close_date' => 'Close Date',
'Class:Problem/Attribute:close_date+' => '',
'Class:Problem/Attribute:last_update' => 'Last Update',
'Class:Problem/Attribute:last_update+' => '',
'Class:Problem/Attribute:assignment_date' => 'Assignment Date',
'Class:Problem/Attribute:assignment_date+' => '',
'Class:Problem/Attribute:resolution_date' => 'Resolution Date',
'Class:Problem/Attribute:resolution_date+' => '',
'Class:Problem/Attribute:knownerrors_list' => 'Known Errors',
'Class:Problem/Attribute:knownerrors_list+' => '',
'Class:Problem/Stimulus:ev_assign' => 'Assign',
'Class:Problem/Stimulus:ev_assign+' => '',
'Class:Problem/Stimulus:ev_reassign' => 'Reaassign',
'Class:Problem/Stimulus:ev_reassign+' => '',
'Class:Problem/Stimulus:ev_resolve' => 'Resolve',
'Class:Problem/Stimulus:ev_resolve+' => '',
'Class:Problem/Stimulus:ev_close' => 'Close',
'Class:Problem/Stimulus:ev_close+' => '',
));
?>

View File

@@ -59,6 +59,14 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserRequest' => 'Benutzeranfrage',
'Class:UserRequest+' => '',
'Class:UserRequest/Attribute:request_type' => 'Art der Anfrage',
'Class:UserRequest/Attribute:request_type+' => '',
'Class:UserRequest/Attribute:request_type/Value:information' => 'Information',
'Class:UserRequest/Attribute:request_type/Value:information+' => 'Information',
'Class:UserRequest/Attribute:request_type/Value:issue' => 'Problem',
'Class:UserRequest/Attribute:request_type/Value:issue+' => 'Problem',
'Class:UserRequest/Attribute:request_type/Value:service request' => 'Service-Anfrage',
'Class:UserRequest/Attribute:request_type/Value:service request+' => 'Service-Anfrage',
'Class:UserRequest/Attribute:freeze_reason' => 'Grund für nicht erledigen',
'Class:UserRequest/Attribute:freeze_reason+' => '',
'Class:UserRequest/Stimulus:ev_assign' => 'Zuteilen',

View File

@@ -75,14 +75,19 @@ class UserRequest extends ResponseTicket
public function ComputeValues()
{
$iKey = $this->GetKey();
if ($iKey < 0)
$sCurrRef = $this->Get('ref');
if (strlen($sCurrRef) == 0)
{
// Object not yet in the Database
$iKey = MetaModel::GetNextKey(get_class($this));
$iKey = $this->GetKey();
if ($iKey < 0)
{
// Object not yet in the Database
$iKey = MetaModel::GetNextKey(get_class($this));
}
$sName = sprintf('R-%06d', $iKey);
$this->Set('ref', $sName);
}
$sName = sprintf('R-%06d', $iKey);
$this->Set('ref', $sName);
return parent::ComputeValues();
}
@@ -99,7 +104,7 @@ class UserRequest extends ResponseTicket
case 'escalated_tto':
case 'escalated_ttr':
$sIconName = self::MakeIconFromName('user-request-escalated.png');
$sIcon = self::MakeIconFromName('user-request-escalated.png');
break;
case 'resolved':

View File

@@ -29,6 +29,7 @@ SetupWebPage::AddModule(
'fr.dict.itop-request-mgmt.php',
'es_cr.dict.itop-request-mgmt.php',
'de.dict.itop-request-mgmt.php',
'pt_br.dict.itop-request-mgmt.php',
),
'data.struct' => array(
'data.struct.ta-triggers.xml',

View File

@@ -0,0 +1,78 @@
<?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('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:RequestManagement' => 'Help Desk',
'Menu:RequestManagement+' => 'Help Desk',
'Menu:UserRequest:Overview' => 'Vis&atilde;o geral',
'Menu:UserRequest:Overview+' => 'Vis&atilde;o geral',
'Menu:NewUserRequest' => 'Novo Chamado',
'Menu:NewUserRequest+' => 'Novo Chamado',
'Menu:SearchUserRequests' => 'Pesquisa para Chamados',
'Menu:SearchUserRequests+' => 'Pesquisa para Chamados',
'Menu:UserRequest:Shortcuts' => 'Atalhos',
'Menu:UserRequest:Shortcuts+' => '',
'Menu:UserRequest:MyRequests' => 'Chamados atribu&aacute;dos para mim',
'Menu:UserRequest:MyRequests+' => 'Chamados atribu&aacute;dos para mim (como Agente)',
'Menu:UserRequest:EscalatedRequests' => 'Chamados encaminhados',
'Menu:UserRequest:EscalatedRequests+' => 'Chamados encaminhados',
'Menu:UserRequest:OpenRequests' => 'Todos chamados abertos',
'Menu:UserRequest:OpenRequests+' => 'Todos chamados abertos',
));
// 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: UserRequest
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:UserRequest' => 'Usu&aacute;rio solicitante',
'Class:UserRequest+' => '',
'Class:UserRequest/Attribute:freeze_reason' => 'Pending reason',
'Class:UserRequest/Attribute:freeze_reason+' => '',
'Class:UserRequest/Stimulus:ev_assign' => 'Atribu&iacute;r',
'Class:UserRequest/Stimulus:ev_assign+' => '',
'Class:UserRequest/Stimulus:ev_freeze' => 'Marque como pendente',
'Class:UserRequest/Stimulus:ev_freeze+' => '',
'Class:UserRequest/Stimulus:ev_reassign' => 'Re-atribu&iacute;r',
'Class:UserRequest/Stimulus:ev_reassign+' => '',
'Class:UserRequest/Stimulus:ev_timeout' => 'ev_timeout',
'Class:UserRequest/Stimulus:ev_timeout+' => '',
'Class:UserRequest/Stimulus:ev_resolve' => 'Marque como resolvido',
'Class:UserRequest/Stimulus:ev_resolve+' => '',
'Class:UserRequest/Stimulus:ev_close' => 'Fechado',
'Class:UserRequest/Stimulus:ev_close+' => '',
));
?>

View File

@@ -82,7 +82,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:description' => 'Description',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => 'Start data',
'Class:Contract/Attribute:start_date' => 'Start date',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => 'End date',
'Class:Contract/Attribute:end_date+' => '',
@@ -151,27 +151,27 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:CustomerContract/Attribute:provider_list' => 'Underpinning Contracts',
'Class:CustomerContract/Attribute:sla_list+' => '',
));
//
// Class: lnkCustomerContractToProviderContract
//
Dict::Add('EN US', 'English', 'English', array(
'Class:lnkCustomerContractToProviderContract' => 'lnkCustomerContractToProviderContract',
'Class:lnkCustomerContractToProviderContract+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'Customer Contract',
'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 hours',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
));
//
// Class: lnkCustomerContractToProviderContract
//
Dict::Add('EN US', 'English', 'English', array(
'Class:lnkCustomerContractToProviderContract' => 'lnkCustomerContractToProviderContract',
'Class:lnkCustomerContractToProviderContract+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'Customer Contract',
'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 hours',
'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
));
//
// Class: lnkContractToSLA
@@ -290,8 +290,8 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:Service/Attribute:document_list+' => 'Documents attached to the service',
'Class:Service/Attribute:contact_list' => 'Contacts',
'Class:Service/Attribute:contact_list+' => 'Contacts having a role for this service',
'Class:Service/Tab:Related_Contracts' => 'Related Contracts',
'Class:Service/Tab:Related_Contracts+' => 'Contracts signed for this service',
'Class:Service/Tab:Related_Contracts' => 'Related Contracts',
'Class:Service/Tab:Related_Contracts+' => 'Contracts signed for this service',
));
//

View File

@@ -28,6 +28,7 @@ SetupWebPage::AddModule(
'fr.dict.itop-service-mgmt.php',
'es_cr.dict.itop-service-mgmt.php',
'de.dict.itop-service-mgmt.php',
'pt_br.dict.itop-service-mgmt.php',
),
'data.struct' => array(
//'data.struct.itop-service-mgmt.xml',

View File

@@ -0,0 +1,430 @@
<?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
*/
// 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('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:ServiceManagement' => 'Gerenciamento Servi&ccedil;os',
'Menu:ServiceManagement+' => 'Vis&atilde;o geral Gerenciamento Servi&ccedil;os',
'Menu:Service:Overview' => 'Vis&atilde;o geral',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contratos por n&iacute;vel de servi&ccedil;o',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Contratos por status',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contratos terminando em menos de 30 dias',
'Menu:ServiceType' => 'Tipos Servi&ccedil;os',
'Menu:ServiceType+' => 'Tipos Servi&ccedil;os',
'Menu:ProviderContract' => 'Contratos Provedor(as)',
'Menu:ProviderContract+' => 'Contratos Provedor',
'Menu:CustomerContract' => 'Contratos Clientes',
'Menu:CustomerContract+' => 'Contratos Clientes',
'Menu:ServiceSubcategory' => 'Sub-categorias Servi&ccedil;os',
'Menu:ServiceSubcategory+' => 'Sub-categorias Servi&ccedil;os',
'Menu:Service' => 'Servi&ccedil;os',
'Menu:Service+' => 'Servi&ccedil;os',
'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('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Contract' => 'Contratos',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => 'Nome',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => 'Data in&iacute;cio',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => 'Data t&eacute;rmino',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => 'Valor',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => 'Moeda atual',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dollars',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euros',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:cost_unit' => 'Valor unit&aacute;rio',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:billing_frequency' => 'Frequ&ecirc;ncia pagamento',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:contact_list' => 'Contatos',
'Class:Contract/Attribute:contact_list+' => 'Contatos relacionado para ocontrato',
'Class:Contract/Attribute:document_list' => 'Documentos',
'Class:Contract/Attribute:document_list+' => 'Documentos anexados para o contrato',
'Class:Contract/Attribute:ci_list' => 'CIs',
'Class:Contract/Attribute:ci_list+' => 'CI suportado para o contrato contrato',
'Class:Contract/Attribute:finalclass' => 'Tipo',
'Class:Contract/Attribute:finalclass+' => '',
));
//
// Class: ProviderContract
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ProviderContract' => 'Contrato Provedor',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:provider_id' => 'Provedor',
'Class:ProviderContract/Attribute:provider_id+' => '',
'Class:ProviderContract/Attribute:provider_name' => 'Nome Provedor',
'Class:ProviderContract/Attribute:provider_name+' => '',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => 'Service Level Agreement',
'Class:ProviderContract/Attribute:coverage' => 'Cobertura',
'Class:ProviderContract/Attribute:coverage+' => '',
));
//
// Class: CustomerContract
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:CustomerContract' => 'Contrato Cliente',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:org_id' => 'Cliente',
'Class:CustomerContract/Attribute:org_id+' => '',
'Class:CustomerContract/Attribute:org_name' => 'Nome cliente',
'Class:CustomerContract/Attribute:org_name+' => '',
'Class:CustomerContract/Attribute:provider_id' => 'Provedor',
'Class:CustomerContract/Attribute:provider_id+' => '',
'Class:CustomerContract/Attribute:provider_name' => 'Nome provedor',
'Class:CustomerContract/Attribute:provider_name+' => '',
'Class:CustomerContract/Attribute:support_team_id' => 'Equipe suporte',
'Class:CustomerContract/Attribute:support_team_id+' => '',
'Class:CustomerContract/Attribute:support_team_name' => 'Equipe suporte',
'Class:CustomerContract/Attribute:support_team_name+' => '',
'Class:CustomerContract/Attribute:provider_list' => 'Provedores',
'Class:CustomerContract/Attribute:provider_list+' => '',
'Class:CustomerContract/Attribute:sla_list' => 'SLAs',
'Class:CustomerContract/Attribute:sla_list+' => 'Lista de SLA relacionado ao contrato',
));
//
// Class: lnkContractToSLA
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkContractToSLA' => 'Contrato/SLA',
'Class:lnkContractToSLA+' => '',
'Class:lnkContractToSLA/Attribute:contract_id' => 'Contrato',
'Class:lnkContractToSLA/Attribute:contract_id+' => '',
'Class:lnkContractToSLA/Attribute:contract_name' => 'Contrato',
'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' => 'Cobertura',
'Class:lnkContractToSLA/Attribute:coverage+' => '',
));
//
// Class: lnkContractToDoc
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkContractToDoc' => 'Contrato/Doc',
'Class:lnkContractToDoc+' => '',
'Class:lnkContractToDoc/Attribute:contract_id' => 'Contrato',
'Class:lnkContractToDoc/Attribute:contract_id+' => '',
'Class:lnkContractToDoc/Attribute:contract_name' => 'Contrato',
'Class:lnkContractToDoc/Attribute:contract_name+' => '',
'Class:lnkContractToDoc/Attribute:document_id' => 'Documento',
'Class:lnkContractToDoc/Attribute:document_id+' => '',
'Class:lnkContractToDoc/Attribute:document_name' => 'Documento',
'Class:lnkContractToDoc/Attribute:document_name+' => '',
'Class:lnkContractToDoc/Attribute:document_type' => 'Tipo documento',
'Class:lnkContractToDoc/Attribute:document_type+' => '',
'Class:lnkContractToDoc/Attribute:document_status' => 'Status documento',
'Class:lnkContractToDoc/Attribute:document_status+' => '',
));
//
// Class: lnkContractToContact
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkContractToContact' => 'Contrato/Contato',
'Class:lnkContractToContact+' => '',
'Class:lnkContractToContact/Attribute:contract_id' => 'Contrato',
'Class:lnkContractToContact/Attribute:contract_id+' => '',
'Class:lnkContractToContact/Attribute:contract_name' => 'Contrato',
'Class:lnkContractToContact/Attribute:contract_name+' => '',
'Class:lnkContractToContact/Attribute:contact_id' => 'Contato',
'Class:lnkContractToContact/Attribute:contact_id+' => '',
'Class:lnkContractToContact/Attribute:contact_name' => 'Contato',
'Class:lnkContractToContact/Attribute:contact_name+' => '',
'Class:lnkContractToContact/Attribute:contact_email' => 'Contato email',
'Class:lnkContractToContact/Attribute:contact_email+' => '',
'Class:lnkContractToContact/Attribute:role' => 'Regras',
'Class:lnkContractToContact/Attribute:role+' => '',
));
//
// Class: lnkContractToCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkContractToCI' => 'Contrato/CI',
'Class:lnkContractToCI+' => '',
'Class:lnkContractToCI/Attribute:contract_id' => 'Contrato',
'Class:lnkContractToCI/Attribute:contract_id+' => '',
'Class:lnkContractToCI/Attribute:contract_name' => 'Contrato',
'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('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Service' => 'Servi&ccedil;o',
'Class:Service+' => '',
'Class:Service/Attribute:org_id' => 'Provedor',
'Class:Service/Attribute:org_id+' => '',
'Class:Service/Attribute:provider_name' => 'Provedor',
'Class:Service/Attribute:provider_name+' => '',
'Class:Service/Attribute:name' => 'Nome',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:type' => 'Tipo',
'Class:Service/Attribute:type+' => '',
'Class:Service/Attribute:type/Value:IncidentManagement' => 'Gerenciamento Incidentes',
'Class:Service/Attribute:type/Value:IncidentManagement+' => 'Gerenciamento Incidentes',
'Class:Service/Attribute:type/Value:RequestManagement' => 'Gerenciamento Pedidos',
'Class:Service/Attribute:type/Value:RequestManagement+' => 'Gerenciamento Pedidos',
'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' => 'Obsoleto',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => 'Produ&ccedil;&atilde;o',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:subcategory_list' => 'Sub-categoria Servi&ccedil;o',
'Class:Service/Attribute:subcategory_list+' => '',
'Class:Service/Attribute:sla_list' => 'SLAs',
'Class:Service/Attribute:sla_list+' => '',
'Class:Service/Attribute:document_list' => 'Documentos',
'Class:Service/Attribute:document_list+' => 'Documentos anexado para o servi&ccedil;o',
'Class:Service/Attribute:contact_list' => 'Contatos',
'Class:Service/Attribute:contact_list+' => 'Contatos tendo um papel para este servi&ccedil;o',
));
//
// Class: ServiceSubcategory
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ServiceSubcategory' => 'Sub-categoria Servi&ccedil;o',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => 'Nome',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => 'Descri&ccedil;&atilde;o',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => 'Servi&ccedil;o',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:ServiceSubcategory/Attribute:service_name' => 'Servi&ccedil;o',
'Class:ServiceSubcategory/Attribute:service_name+' => '',
));
//
// Class: SLA
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => 'Nome',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:service_id' => 'Servi&ccedil;o',
'Class:SLA/Attribute:service_id+' => '',
'Class:SLA/Attribute:service_name' => 'Servi&ccedil;o',
'Class:SLA/Attribute:service_name+' => '',
'Class:SLA/Attribute:slt_list' => 'SLTs',
'Class:SLA/Attribute:slt_list+' => 'Lista Service Level Thresholds',
));
//
// Class: SLT
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:SLT' => 'SLT',
'Class:SLT+' => '',
'Class:SLT/Attribute:name' => 'Nome',
'Class:SLT/Attribute:name+' => '',
'Class:SLT/Attribute:metric' => 'M&eacute;trica',
'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' => 'Ticket prioridade',
'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' => 'Valor',
'Class:SLT/Attribute:value+' => '',
'Class:SLT/Attribute:value_unit' => 'Unidade',
'Class:SLT/Attribute:value_unit+' => '',
'Class:SLT/Attribute:value_unit/Value:days' => 'dias',
'Class:SLT/Attribute:value_unit/Value:days+' => 'dias',
'Class:SLT/Attribute:value_unit/Value:hours' => 'horas',
'Class:SLT/Attribute:value_unit/Value:hours+' => 'horas',
'Class:SLT/Attribute:value_unit/Value:minutes' => 'minutos',
'Class:SLT/Attribute:value_unit/Value:minutes+' => 'minutos',
'Class:SLT/Attribute:sla_list' => 'SLAs',
'Class:SLT/Attribute:sla_list+' => 'SLAs utilizando o SLT',
));
//
// Class: lnkSLTToSLA
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', 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' => 'M&eacute;trica',
'Class:lnkSLTToSLA/Attribute:slt_metric+' => '',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority' => 'Ticket prioridade',
'Class:lnkSLTToSLA/Attribute:slt_ticket_priority+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value' => 'Valor',
'Class:lnkSLTToSLA/Attribute:slt_value+' => '',
'Class:lnkSLTToSLA/Attribute:slt_value_unit' => 'Unidade',
'Class:lnkSLTToSLA/Attribute:slt_value_unit+' => '',
));
//
// Class: lnkServiceToDoc
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkServiceToDoc' => 'Servi&ccedil;o/Doc',
'Class:lnkServiceToDoc+' => '',
'Class:lnkServiceToDoc/Attribute:service_id' => 'Servi&ccedil;o',
'Class:lnkServiceToDoc/Attribute:service_id+' => '',
'Class:lnkServiceToDoc/Attribute:service_name' => 'Servi&ccedil;o',
'Class:lnkServiceToDoc/Attribute:service_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_id' => 'Documento',
'Class:lnkServiceToDoc/Attribute:document_id+' => '',
'Class:lnkServiceToDoc/Attribute:document_name' => 'Documento',
'Class:lnkServiceToDoc/Attribute:document_name+' => '',
'Class:lnkServiceToDoc/Attribute:document_type' => 'Tipo documento',
'Class:lnkServiceToDoc/Attribute:document_type+' => '',
'Class:lnkServiceToDoc/Attribute:document_status' => 'Status documento',
'Class:lnkServiceToDoc/Attribute:document_status+' => '',
));
//
// Class: lnkServiceToContact
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkServiceToContact' => 'Servi&ccedil;o/Contato',
'Class:lnkServiceToContact+' => '',
'Class:lnkServiceToContact/Attribute:service_id' => 'Servi&ccedil;o',
'Class:lnkServiceToContact/Attribute:service_id+' => '',
'Class:lnkServiceToContact/Attribute:service_name' => 'Servi&ccedil;o',
'Class:lnkServiceToContact/Attribute:service_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_id' => 'Contato',
'Class:lnkServiceToContact/Attribute:contact_id+' => '',
'Class:lnkServiceToContact/Attribute:contact_name' => 'Contato',
'Class:lnkServiceToContact/Attribute:contact_name+' => '',
'Class:lnkServiceToContact/Attribute:contact_email' => 'Contato email',
'Class:lnkServiceToContact/Attribute:contact_email+' => '',
'Class:lnkServiceToContact/Attribute:role' => 'Regra',
'Class:lnkServiceToContact/Attribute:role+' => '',
));
//
// Class: lnkServiceToCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkServiceToCI' => 'Servi&ccedil;o/CI',
'Class:lnkServiceToCI+' => '',
'Class:lnkServiceToCI/Attribute:service_id' => 'Servi&ccedil;o',
'Class:lnkServiceToCI/Attribute:service_id+' => '',
'Class:lnkServiceToCI/Attribute:service_name' => 'Servi&ccedil;o',
'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+' => '',
));
?>

View File

@@ -127,7 +127,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ResponseTicket' => 'ResponseTicket',
'Class:ResponseTicket' => 'Antwortticket',
'Class:ResponseTicket+' => '',
'Class:ResponseTicket/Attribute:status' => 'Status',
'Class:ResponseTicket/Attribute:status+' => '',
@@ -141,22 +141,28 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'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' => 'Caller',
'Class:ResponseTicket/Attribute:caller_id' => 'Melder',
'Class:ResponseTicket/Attribute:caller_id+' => '',
'Class:ResponseTicket/Attribute:workgroup_name' => 'Arbeitsgruppe',
'Class:ResponseTicket/Attribute:workgroup_name+' => '',
'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',
@@ -185,12 +191,18 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'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' => 'Agent Email',
'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',
@@ -201,8 +213,12 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ResponseTicket/Attribute:last_update+' => '',
'Class:ResponseTicket/Attribute:assignment_date' => 'Zugeteilt',
'Class:ResponseTicket/Attribute:assignment_date+' => '',
'Class:ResponseTicket/Attribute:escalation_deadline' => 'Eskalationsfrist',
'Class:ResponseTicket/Attribute:escalation_deadline+' => '',
'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',

View File

@@ -28,6 +28,7 @@ SetupWebPage::AddModule(
'fr.dict.itop-tickets.php',
'es_cr.dict.itop-tickets.php',
'de.dict.itop-tickets.php',
'pt_br.dict.itop-tickets.php',
),
'data.struct' => array(
'data.struct.ta-actions.xml',

View File

@@ -0,0 +1,239 @@
<?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
*/
// 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('PT BR', 'Brazilian', 'Brazilian', array(
'Class:Ticket' => 'Ticket',
'Class:Ticket+' => '',
'Class:Ticket/Attribute:ref' => 'Ref',
'Class:Ticket/Attribute:ref+' => '',
'Class:Ticket/Attribute:title' => 'T&iacute;tulo',
'Class:Ticket/Attribute:title+' => '',
'Class:Ticket/Attribute:ticket_log' => 'Log',
'Class:Ticket/Attribute:ticket_log+' => '',
'Class:Ticket/Attribute:start_date' => 'Iniciado',
'Class:Ticket/Attribute:start_date+' => '',
'Class:Ticket/Attribute:document_list' => 'Documentos',
'Class:Ticket/Attribute:document_list+' => 'Documentos relacionado ao ticket',
'Class:Ticket/Attribute:ci_list' => 'CIs',
'Class:Ticket/Attribute:ci_list+' => 'CIs preocupado com o incidente',
'Class:Ticket/Attribute:contact_list' => 'Contatos',
'Class:Ticket/Attribute:contact_list+' => 'Equipe(s) e pessoa(s) envolvidas',
'Class:Ticket/Attribute:finalclass' => 'Tipo',
'Class:Ticket/Attribute:finalclass+' => '',
));
//
// Class: lnkTicketToDoc
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkTicketToDoc' => 'Ticket/Documento',
'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' => 'Documento',
'Class:lnkTicketToDoc/Attribute:document_id+' => '',
'Class:lnkTicketToDoc/Attribute:document_name' => 'Documento',
'Class:lnkTicketToDoc/Attribute:document_name+' => '',
));
//
// Class: lnkTicketToContact
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:lnkTicketToContact' => 'Ticket/Contato',
'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' => 'Contato',
'Class:lnkTicketToContact/Attribute:contact_id+' => '',
'Class:lnkTicketToContact/Attribute:contact_name' => 'Contato',
'Class:lnkTicketToContact/Attribute:contact_name+' => '',
'Class:lnkTicketToContact/Attribute:contact_email' => 'Email',
'Class:lnkTicketToContact/Attribute:contact_email+' => '',
'Class:lnkTicketToContact/Attribute:role' => 'Regra',
'Class:lnkTicketToContact/Attribute:role+' => '',
));
//
// Class: lnkTicketToCI
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', 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: ResponseTicket
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Class:ResponseTicket' => 'ResponseTicket',
'Class:ResponseTicket+' => '',
'Class:ResponseTicket/Attribute:status' => 'Status',
'Class:ResponseTicket/Attribute:status+' => '',
'Class:ResponseTicket/Attribute:status/Value:new' => 'Novo',
'Class:ResponseTicket/Attribute:status/Value:new+' => 'novamente aberto',
'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Pendente',
'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'Escalada/TTO',
'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
'Class:ResponseTicket/Attribute:status/Value:assigned' => 'Atribu&aacute;do',
'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'Escalada/TTR',
'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
'Class:ResponseTicket/Attribute:status/Value:resolved' => 'Resolvido',
'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
'Class:ResponseTicket/Attribute:status/Value:closed' => 'Fechado',
'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
'Class:ResponseTicket/Attribute:caller_id' => 'Solicita&ccedil;&atilde;o',
'Class:ResponseTicket/Attribute:caller_id+' => '',
'Class:ResponseTicket/Attribute:workgroup_name' => 'Grupo de trabalho',
'Class:ResponseTicket/Attribute:workgroup_name+' => '',
'Class:ResponseTicket/Attribute:org_id' => 'Cliente',
'Class:ResponseTicket/Attribute:org_id+' => '',
'Class:ResponseTicket/Attribute:org_name' => 'Cliente',
'Class:ResponseTicket/Attribute:org_name+' => '',
'Class:ResponseTicket/Attribute:service_id' => 'Servi&ccedil;o',
'Class:ResponseTicket/Attribute:service_id+' => '',
'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'Elemento Servi&ccedil;o',
'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
'Class:ResponseTicket/Attribute:product' => 'Produto',
'Class:ResponseTicket/Attribute:product+' => '',
'Class:ResponseTicket/Attribute:impact' => 'Impacto',
'Class:ResponseTicket/Attribute:impact+' => '',
'Class:ResponseTicket/Attribute:impact/Value:1' => 'Uma pessoa',
'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
'Class:ResponseTicket/Attribute:impact/Value:2' => 'Um servi&ccedil;o',
'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
'Class:ResponseTicket/Attribute:impact/Value:3' => 'Um departamento',
'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
'Class:ResponseTicket/Attribute:urgency' => 'Urgente',
'Class:ResponseTicket/Attribute:urgency+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:1' => 'Baixo',
'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:2' => 'M&eacute;dio',
'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
'Class:ResponseTicket/Attribute:urgency/Value:3' => 'Alto',
'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
'Class:ResponseTicket/Attribute:priority' => 'Prioridade',
'Class:ResponseTicket/Attribute:priority+' => '',
'Class:ResponseTicket/Attribute:priority/Value:1' => 'Baixo',
'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
'Class:ResponseTicket/Attribute:priority/Value:2' => 'M&eacute;dio',
'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
'Class:ResponseTicket/Attribute:priority/Value:3' => 'Alto',
'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
'Class:ResponseTicket/Attribute:workgroup_id' => 'Grupo de trabalho',
'Class:ResponseTicket/Attribute:workgroup_id+' => '',
'Class:ResponseTicket/Attribute:agent_id' => 'Agente',
'Class:ResponseTicket/Attribute:agent_id+' => '',
'Class:ResponseTicket/Attribute:agent_name' => 'Agente',
'Class:ResponseTicket/Attribute:agent_name+' => '',
'Class:ResponseTicket/Attribute:agent_email' => 'Email agente',
'Class:ResponseTicket/Attribute:agent_email+' => '',
'Class:ResponseTicket/Attribute:related_change_id' => 'Mudan&ccedil;as relacionadas',
'Class:ResponseTicket/Attribute:related_change_id+' => '',
'Class:ResponseTicket/Attribute:related_change_ref' => 'Mudan&ccedil;as relacionadas',
'Class:ResponseTicket/Attribute:related_change_ref+' => '',
'Class:ResponseTicket/Attribute:close_date' => 'Fechado',
'Class:ResponseTicket/Attribute:close_date+' => '',
'Class:ResponseTicket/Attribute:last_update' => '&Uacute;ltima atualiza&ccedil;&atilde;o',
'Class:ResponseTicket/Attribute:last_update+' => '',
'Class:ResponseTicket/Attribute:assignment_date' => 'Atribu&iacute;do',
'Class:ResponseTicket/Attribute:assignment_date+' => '',
'Class:ResponseTicket/Attribute:escalation_deadline' => 'Prazo de escalonamento',
'Class:ResponseTicket/Attribute:escalation_deadline+' => '',
'Class:ResponseTicket/Attribute:closure_deadline' => 'Prazo fechamento',
'Class:ResponseTicket/Attribute:closure_deadline+' => '',
'Class:ResponseTicket/Attribute:resolution_code' => 'C&oacute;digo resolu&ccedil;&atilde;o',
'Class:ResponseTicket/Attribute:resolution_code+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => 'N&atilde;o pode ser reproduzida',
'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'Ticket duplicado',
'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => 'Fixo',
'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => 'Irrelevante',
'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
'Class:ResponseTicket/Attribute:solution' => 'Solu&ccedil;&atilde;o',
'Class:ResponseTicket/Attribute:solution+' => '',
'Class:ResponseTicket/Attribute:user_satisfaction' => 'Satisfa&ccedil;&atilde;o usu&aacute;rio',
'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' => 'Coment&aacute;rio usu&aacute;rio',
'Class:ResponseTicket/Attribute:user_commment+' => '',
'Class:ResponseTicket/Stimulus:ev_assign' => 'Atribuir',
'Class:ResponseTicket/Stimulus:ev_assign+' => '',
'Class:ResponseTicket/Stimulus:ev_reassign' => 'Re-atribuir',
'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
'Class:ResponseTicket/Stimulus:ev_timeout' => 'ev_timeout',
'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
'Class:ResponseTicket/Stimulus:ev_resolve' => 'Marque como resolvido',
'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
'Class:ResponseTicket/Stimulus:ev_close' => 'Fechado',
'Class:ResponseTicket/Stimulus:ev_close+' => '',
));
?>

View File

@@ -500,18 +500,17 @@ try
require_once('../application/wizardhelper.class.inc.php');
require_once('../application/startup.inc.php');
$oAppContext = new ApplicationContext();
$currentOrganization = utils::ReadParam('org_id', '');
$operation = utils::ReadParam('operation', '');
$oKPI = new ExecutionKPI();
require_once('../application/loginwebpage.class.inc.php');
LoginWebPage::DoLogin(); // Check user rights and prompt if needed
$oAppContext = new ApplicationContext();
$oKPI->ComputeAndReport('User login');
$oP = new iTopWebPage(Dict::S('UI:WelcomeToITop'), $currentOrganization);
$oP = new iTopWebPage(Dict::S('UI:WelcomeToITop'));
switch($operation)
{
@@ -609,7 +608,13 @@ try
$oSet = new DBObjectSet($oFilter);
if ($bSearchForm)
{
$oBlock = new DisplayBlock($oFilter, 'search', false /* Asynchronous */, array('open' => true));
$aParams = array('open' => true);
$sBaseClass = utils::ReadParam('baseClass', '');
if (!empty($sBaseClass))
{
$aParams['baseClass'] = $sBaseClass;
}
$oBlock = new DisplayBlock($oFilter, 'search', false /* Asynchronous */, $aParams);
$oBlock->Display($oP, 0);
}
if (strtolower($sFormat) == 'csv')
@@ -775,7 +780,12 @@ try
$oP->add_linked_script("../js/linkswidget.js");
$oP->add_linked_script("../js/jquery.blockUI.js");
$aArgs = array_merge($oAppContext->GetAsHash(), utils::ReadParam('default', array()));
$aArgs = utils::ReadParam('default', array());
$aContext = $oAppContext->GetAsHash();
foreach( $oAppContext->GetNames() as $key)
{
$aArgs[$key] = $oAppContext->GetCurrentValue($key);
}
// If the specified class has subclasses, ask the user an instance of which class to create
$aSubClasses = MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL); // Including the specified class itself
@@ -812,9 +822,9 @@ try
$oP->add("<div class=\"wizContainer\">\n");
$aDefaults = utils::ReadParam('default', array());
$aContext = $oAppContext->GetAsHash();
foreach($aContext as $key => $value)
foreach( $oAppContext->GetNames() as $key)
{
$aDefaults[$key] = $value;
$aDefaults[$key] = $oAppContext->GetCurrentValue($key);
}
// Set all the default values in an object and clone this "default" object
$oObjToClone = MetaModel::NewObject($sRealClass);
@@ -881,7 +891,7 @@ try
$oP->set_title(Dict::S('UI:ErrorPageTitle'));
$oP->P(Dict::S('UI:ObjectDoesNotExist'));
}
elseif (!utils::IsTransactionValid($sTransactionId))
elseif (!utils::IsTransactionValid($sTransactionId, false))
{
$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
$oP->p("<strong>".Dict::S('UI:Error:ObjectAlreadyUpdated')."</strong>\n");
@@ -916,6 +926,7 @@ try
$oMyChange->Set("userinfo", $sUserString);
$iChangeId = $oMyChange->DBInsert();
$oObj->DBUpdateTracked($oMyChange);
utils::RemoveTransaction($sTransactionId);
$oP->p(Dict::Format('UI:Class_Object_Updated', MetaModel::GetName(get_class($oObj)), $oObj->GetName()));
}
@@ -1021,7 +1032,7 @@ try
{
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'class'));
}
if (!utils::IsTransactionValid($sTransactionId))
if (!utils::IsTransactionValid($sTransactionId, false))
{
$oP->p("<strong>".Dict::S('UI:Error:ObjectAlreadyCreated')."</strong>\n");
}
@@ -1051,6 +1062,7 @@ try
$oMyChange->Set("userinfo", $sUserString);
$iChangeId = $oMyChange->DBInsert();
$oObj->DBInsertTracked($oMyChange);
utils::RemoveTransaction($sTransactionId);
$oP->set_title(Dict::S('UI:PageTitle:ObjectCreated'));
$oP->add("<h1>".Dict::Format('UI:Title:Object_Of_Class_Created', $oObj->GetName(), $sClassLabel)."</h1>\n");
$oObj->DisplayDetails($oP);
@@ -1194,6 +1206,12 @@ try
oWizardHelper.SetFieldsMap($sJsonFieldsMap);
oWizardHelper.SetFieldsCount($iFieldsCount);
EOF
);
$oP->add_ready_script(
<<<EOF
// Starts the validation when the page is ready
CheckFields('apply_stimulus', false);
EOF
);
}
else
@@ -1412,8 +1430,6 @@ EOF
$oP->add("<div id=\"impacted_objects\" style=\"width:100%;background-color:#fff;padding:10px;\"><p style=\"height:150px;\">&nbsp;</p></div>");
$oP->add_ready_script(
<<<EOF
UpdateImpactedObjects('$sClass', $id, '$sRelation');
var ajax_request = null;
function UpdateImpactedObjects(sClass, iId, sRelation)
@@ -1431,7 +1447,7 @@ EOF
ajax_request = null;
}
ajax_request = $.get('xml.navigator.php', { class: sClass, id: iId, relation: sRelation, format: 'html' },
ajax_request = $.get('xml.navigator.php', { 'class': sClass, id: iId, relation: sRelation, format: 'html' },
function(data)
{
$('#impacted_objects').empty();
@@ -1443,6 +1459,8 @@ EOF
);
}
}
UpdateImpactedObjects('$sClass', $id, '$sRelation');
EOF
);
$oP->SetCurrentTab('');

View File

@@ -33,10 +33,8 @@ require_once('../application/loginwebpage.class.inc.php');
LoginWebPage::DoLogin(true); // Check user rights and prompt if needed (must be admin)
$oAppContext = new ApplicationContext();
$iActiveNodeId = utils::ReadParam('menu', -1);
$currentOrganization = utils::ReadParam('org_id', '');
$oP = new iTopWebPage(Dict::S('UI:UniversalSearchTitle'), $currentOrganization);
$oP = new iTopWebPage(Dict::S('UI:UniversalSearchTitle'));
// From now on the context is limited to the the selected organization ??

View File

@@ -104,6 +104,13 @@ function GetMappingForField($sClassName, $sFieldName, $iFieldIndex, $bAdvancedMo
$aChoices = array('' => Dict::S('UI:CSVImport:MappingSelectOne'));
$aChoices[':none:'] = Dict::S('UI:CSVImport:MappingNotApplicable');
$sFieldCode = ''; // Code of the attribute, if there is a match
$aMatches = array();
if (preg_match('/^(.+)\*$/', $sFieldName, $aMatches))
{
// Remove any trailing "star" character.
// A star character at the end can be used to indicate a mandatory field
$sFieldName = $aMatches[1];
}
if ($sFieldName == 'id')
{
$sFieldCode = 'id';
@@ -114,6 +121,7 @@ function GetMappingForField($sClassName, $sFieldName, $iFieldIndex, $bAdvancedMo
}
foreach(MetaModel::ListAttributeDefs($sClassName) as $sAttCode => $oAttDef)
{
$sStar = '';
if ($oAttDef->IsExternalKey())
{
if ( ($sFieldName == $oAttDef->GetLabel()) || ($sFieldName == $sAttCode))
@@ -124,6 +132,11 @@ function GetMappingForField($sClassName, $sFieldName, $iFieldIndex, $bAdvancedMo
{
$aChoices[$sAttCode] = $oAttDef->GetLabel();
}
$oExtKeyAttDef = MetaModel::GetAttributeDef($sClassName, $oAttDef->GetKeyAttCode());
if (!$oExtKeyAttDef->IsNullAllowed())
{
$sStar = '*';
}
// Get fields of the external class that are considered as reconciliation keys
$sTargetClass = $oAttDef->GetTargetClass();
foreach(MetaModel::ListAttributeDefs($sTargetClass) as $sTargetAttCode => $oTargetAttDef)
@@ -140,8 +153,8 @@ function GetMappingForField($sClassName, $sFieldName, $iFieldIndex, $bAdvancedMo
{
// When not in advanced mode do not allow to use reconciliation keys (on external keys) if they are themselves external keys !
$aChoices[$sAttCode.'->'.$sTargetAttCode] = $oAttDef->GetLabel().'->'.$oTargetAttDef->GetLabel().$sSuffix;
if ((strcasecmp($sFieldName, $aChoices[$sAttCode.'->'.$sTargetAttCode]) == 0) || (strcasecmp($sFieldName, ($sAttCode.'->'.$sTargetAttCode.$sSuffix)) == 0) )
$aChoices[$sAttCode.'->'.$sTargetAttCode] = $oAttDef->GetLabel().'->'.$oTargetAttDef->GetLabel().$sSuffix.$sStar;
if ((strcasecmp($sFieldName, $oAttDef->GetLabel().'->'.$oTargetAttDef->GetLabel().$sSuffix) == 0) || (strcasecmp($sFieldName, ($sAttCode.'->'.$sTargetAttCode.$sSuffix)) == 0) )
{
$sFieldCode = $sAttCode.'->'.$sTargetAttCode;
}
@@ -151,7 +164,11 @@ function GetMappingForField($sClassName, $sFieldName, $iFieldIndex, $bAdvancedMo
}
else if ( ($oAttDef->IsWritable()) && (!$oAttDef->IsLinkSet()) )
{
$aChoices[$sAttCode] = $oAttDef->GetLabel();
if (!$oAttDef->IsNullAllowed())
{
$sStar = '*';
}
$aChoices[$sAttCode] = $oAttDef->GetLabel().$sStar;
if ( ($sFieldName == $oAttDef->GetLabel()) || ($sFieldName == $sAttCode))
{
$sFieldCode = $sAttCode;
@@ -356,7 +373,7 @@ EOF
$oSearch = new DBObjectSearch($sClassName);
$oSearch->AddCondition('id', 0, '='); // Make sure we create an empty set
$oSet = new CMDBObjectSet($oSearch);
$sResult = cmdbAbstractObject::GetSetAsCSV($oSet);
$sResult = cmdbAbstractObject::GetSetAsCSV($oSet, array('showMandatoryFields' => true));
//$aCSV = explode("\n", $sCSV);
// If there are more than one line, let's assume that the first line is a comment and skip it.
//if (count($aCSV) > 1)
@@ -373,6 +390,7 @@ EOF
if ($sDisposition == 'attachment')
{
$oPage = new CSVPage("");
$oPage->add_header("Content-type: text/csv; charset=utf-8");
$oPage->add_header("Content-disposition: attachment; filename=\"{$sClassDisplayName}.csv\"");
$oPage->no_cache();
$oPage->add($sResult);

View File

@@ -62,8 +62,9 @@ switch($operation)
$sAttCode = utils::ReadParam('sAttCode', '');
$iInputId = utils::ReadParam('iInputId', '');
$sSuffix = utils::ReadParam('sSuffix', '');
$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
$aAlreadyLinked = utils::ReadParam('aAlreadyLinked', array());
$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix);
$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
$oWidget->SearchObjectsToAdd($oPage, $sRemoteClass, $aAlreadyLinked);
break;
@@ -72,8 +73,9 @@ switch($operation)
$sAttCode = utils::ReadParam('sAttCode', '');
$iInputId = utils::ReadParam('iInputId', '');
$sSuffix = utils::ReadParam('sSuffix', '');
$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
$aLinkedObjectIds = utils::ReadParam('selectObject', array());
$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix);
$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
$oWidget->DoAddObjects($oPage, $aLinkedObjectIds);
break;

View File

@@ -28,14 +28,13 @@ try
require_once('../application/itopwebpage.class.inc.php');
require_once('../application/startup.inc.php');
$currentOrganization = utils::ReadParam('org_id', '');
$operation = utils::ReadParam('operation', '');
$oAppContext = new ApplicationContext();
require_once('../application/loginwebpage.class.inc.php');
LoginWebPage::DoLogin(); // Check user rights and prompt if needed
$oP = new iTopWebPage(Dict::S('UI:Audit:Title'), $currentOrganization);
$oP = new iTopWebPage(Dict::S('UI:Audit:Title'));
function GetRuleResultSet($iRuleId, $oDefinitionFilter)
{

View File

@@ -35,10 +35,9 @@ try
LoginWebPage::DoLogin(); // Check user rights and prompt if needed
$oAppContext = new ApplicationContext();
$currentOrganization = utils::ReadParam('org_id', 1);
$iStep = utils::ReadParam('step', 1);
$oPage = new iTopWebPage(Dict::S('UI:Title:BulkImport'), $currentOrganization);
$oPage = new iTopWebPage(Dict::S('UI:Title:BulkImport'));
/**
* Helper function to build a select from the list of valid classes for a given action
@@ -338,16 +337,16 @@ try
$oPage->add('<input type="hidden" name="csvdata_truncated" id="csvdata_truncated" value="'.htmlentities($sCSVDataTruncated, ENT_QUOTES, 'UTF-8').'"/>');
$aRes = $oBulk->Process($oMyChange);
$sHtml = '<table id="bulk_preview">';
$sHtml .= '<tr><th>Line</th>';
$sHtml .= '<th>Status</th>';
$sHtml .= '<th>Object</th>';
$sHtml = '<table id="bulk_preview" style="border-collapse: collapse;">';
$sHtml .= '<tr><th style="padding:2px;border-right: 2px #fff solid;">Line</th>';
$sHtml .= '<th style="padding:2px;border-right: 2px #fff solid;">Status</th>';
$sHtml .= '<th style="padding:2px;border-right: 2px #fff solid;">Object</th>';
foreach($aFieldsMapping as $iNumber => $sAttCode)
{
if (!empty($sAttCode) && ($sAttCode != ':none:') && ($sAttCode != 'finalclass'))
{
$sHtml .= "<th>".GetFriendlyAttCodeName($sClassName, $sAttCode)."</th>";
$sHtml .= "<th style=\"padding:2px;border-right: 2px #fff solid;\">".GetFriendlyAttCodeName($sClassName, $sAttCode)."</th>";
}
}
$sHtml .= '<th>Message</th>';
@@ -414,9 +413,9 @@ try
break;
}
$sHtml .= '<tr class="'.$sCSSRowClass.'">';
$sHtml .= "<td>".sprintf("%0{$sMaxLen}d", 1+$iLine+$iRealSkippedLines)."</td>";
$sHtml .= "<td>$sStatus</td>";
$sHtml .= "<td>$sUrl</td>";
$sHtml .= "<td style=\"background-color:#f1f1f1;border-right:2px #fff solid;\">".sprintf("%0{$sMaxLen}d", 1+$iLine+$iRealSkippedLines)."</td>";
$sHtml .= "<td style=\"text-align:center;background-color:#f1f1f1;border-right:2px #fff solid;\">$sStatus</td>";
$sHtml .= "<td style=\"text-align:center;background-color:#f1f1f1;\">$sUrl</td>";
foreach($aFieldsMapping as $iNumber => $sAttCode)
{
if (!empty($sAttCode) && ($sAttCode != ':none:') && ($sAttCode != 'finalclass'))
@@ -430,6 +429,8 @@ try
switch(get_class($oExtKeyCellStatus))
{
case 'CellStatus_Issue':
case 'CellStatus_SearchIssue':
case 'CellStatus_NullIssue':
$sCellMessage .= $oPage->GetP($oExtKeyCellStatus->GetDescription());
break;
@@ -445,24 +446,29 @@ try
{
case 'CellStatus_Issue':
$sCellMessage .= $oPage->GetP($oCellStatus->GetDescription());
$sHtml .= '<td class="cell_error" style="border-right:1px #eee solid;">ERROR: '.htmlentities($aData[$iLine][$iNumber-1], ENT_QUOTES, 'UTF-8').$sCellMessage.'</td>';
break;
case 'CellStatus_SearchIssue':
$sCellMessage .= $oPage->GetP($oCellStatus->GetDescription());
$sHtml .= '<td class="cell_error">ERROR: '.htmlentities($aData[$iLine][$iNumber-1], ENT_QUOTES, 'UTF-8').$sCellMessage.'</td>';
break;
case 'CellStatus_Ambiguous':
$sCellMessage .= $oPage->GetP($oCellStatus->GetDescription());
$sHtml .= '<td class="cell_error">AMBIGUOUS: '.htmlentities($aData[$iLine][$iNumber-1], ENT_QUOTES, 'UTF-8').$sCellMessage.'</td>';
$sHtml .= '<td class="cell_error" style="border-right:1px #eee solid;">AMBIGUOUS: '.htmlentities($aData[$iLine][$iNumber-1], ENT_QUOTES, 'UTF-8').$sCellMessage.'</td>';
break;
case 'CellStatus_Modify':
$sHtml .= '<td class="cell_modified"><b>'.htmlentities($aData[$iLine][$iNumber-1], ENT_QUOTES, 'UTF-8').'</b></td>';
$sHtml .= '<td class="cell_modified" style="border-right:1px #eee solid;"><b>'.htmlentities($aData[$iLine][$iNumber-1], ENT_QUOTES, 'UTF-8').'</b></td>';
break;
default:
$sHtml .= '<td class="cell_ok">'.htmlentities($aData[$iLine][$iNumber-1], ENT_QUOTES, 'UTF-8').$sCellMessage.'</td>';
$sHtml .= '<td class="cell_ok" style="border-right:1px #eee solid;">'.htmlentities($aData[$iLine][$iNumber-1], ENT_QUOTES, 'UTF-8').$sCellMessage.'</td>';
}
}
}
$sHtml .= "<td class=\"$sCSSMessageClass\">$sMessage</td>";
$sHtml .= "<td class=\"$sCSSMessageClass\" style=\"background-color:#f1f1f1;\">$sMessage</td>";
$iLine++;
$sHtml .= '</tr>';
}

View File

@@ -24,6 +24,7 @@ $currentOrganization = utils::ReadParam('org_id', '');
$operation = utils::ReadParam('operation', '');
require_once('../application/loginwebpage.class.inc.php');
session_name(utils::GetConfig()->Get('session_name'));
session_start();
LoginWebPage::ResetSession();
$oPage = new LoginWebPage();

View File

@@ -27,10 +27,8 @@ LoginWebPage::DoLogin(); // Check user rights and prompt if needed
$sOperation = utils::ReadParam('operation', 'menu');
$oAppContext = new ApplicationContext();
$iActiveNodeId = utils::ReadParam('menu', -1);
$currentOrganization = utils::ReadParam('org_id', '');
$oP = new iTopWebPage("iTop - Navigator", $currentOrganization);
$oP = new iTopWebPage("iTop - Navigator");
// Main program
$sClass = utils::ReadParam('class', '');

View File

@@ -23,9 +23,9 @@
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
$sFullUrl = 'http'.(empty($_SERVER['HTTPS']) ? '' : 's').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/UI.php';
$sICOFullUrl = 'http'.(empty($_SERVER['HTTPS']) ? '' : 's').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/../images/iTop-icon.ico';
$sPNGFullUrl = 'http'.(empty($_SERVER['HTTPS']) ? '' : 's').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/../images/iTop-icon.png';
$sFullUrl = 'http'.((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off')) ? 's' : '').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/UI.php';
$sICOFullUrl = 'http'.((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off')) ? 's' : '').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/../images/iTop-icon.ico';
$sPNGFullUrl = 'http'.((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off')) ? 's' : '').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/../images/iTop-icon.png';
header('Content-type: text/xml');
?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/">

View File

@@ -0,0 +1,231 @@
<?php
/**
* A private class. All the other line-dots inherit from this.
* Gives them all some common methods.
*/
class dot_base
{
/**
* @param $type string
* @param $value integer
*/
function dot_base($type, $value=null)
{
$this->type = $type;
if( isset( $value ) )
$this->value( $value );
}
/**
* For line charts that only require a Y position
* for each point.
* @param $value as integer, the Y position
*/
function value( $value )
{
$this->value = $value;
}
/**
* For scatter charts that require an X and Y position for
* each point.
*
* @param $x as integer
* @param $y as integer
*/
function position( $x, $y )
{
$this->x = $x;
$this->y = $y;
}
/**
* @param $colour is a string, HEX colour, e.g. '#FF0000' red
*/
function colour($colour)
{
$this->colour = $colour;
return $this;
}
/**
* The tooltip for this dot.
*/
function tooltip( $tip )
{
$this->tip = $tip;
return $this;
}
/**
* @param $size is an integer. Size of the dot.
*/
function size($size)
{
$tmp = 'dot-size';
$this->$tmp = $size;
return $this;
}
/**
* a private method
*/
function type( $type )
{
$this->type = $type;
return $this;
}
/**
* @param $size is an integer. The size of the hollow 'halo' around the dot that masks the line.
*/
function halo_size( $size )
{
$tmp = 'halo-size';
$this->$tmp = $size;
return $this;
}
/**
* @param $do as string. One of three options (examples):
* - "http://example.com" - browse to this URL
* - "https://example.com" - browse to this URL
* - "trace:message" - print this message in the FlashDevelop debug pane
* - all other strings will be called as Javascript functions, so a string "hello_world"
* will call the JS function "hello_world(index)". It passes in the index of the
* point.
*/
function on_click( $do )
{
$tmp = 'on-click';
$this->$tmp = $do;
}
}
/**
* Draw a hollow dot
*/
class hollow_dot extends dot_base
{
function hollow_dot($value=null)
{
parent::dot_base( 'hollow-dot', $value );
}
}
/**
* Draw a star
*/
class star extends dot_base
{
/**
* The constructor, takes an optional $value
*/
function star($value=null)
{
parent::dot_base( 'star', $value );
}
/**
* @param $angle is an integer.
*/
function rotation($angle)
{
$this->rotation = $angle;
return $this;
}
/**
* @param $is_hollow is a boolean.
*/
function hollow($is_hollow)
{
$this->hollow = $is_hollow;
}
}
/**
* Draw a 'bow tie' shape.
*/
class bow extends dot_base
{
/**
* The constructor, takes an optional $value
*/
function bow($value=null)
{
parent::dot_base( 'bow', $value );
}
/**
* Rotate the anchor object.
* @param $angle is an integer.
*/
function rotation($angle)
{
$this->rotation = $angle;
return $this;
}
}
/**
* An <i><b>n</b></i> sided shape.
*/
class anchor extends dot_base
{
/**
* The constructor, takes an optional $value
*/
function anchor($value=null)
{
parent::dot_base( 'anchor', $value );
}
/**
* Rotate the anchor object.
* @param $angle is an integer.
*/
function rotation($angle)
{
$this->rotation = $angle;
return $this;
}
/**
* @param $sides is an integer. Number of sides this shape has.
*/
function sides($sides)
{
$this->sides = $sides;
return $this;
}
}
/**
* A simple dot
*/
class dot extends dot_base
{
/**
* The constructor, takes an optional $value
*/
function dot($value=null)
{
parent::dot_base( 'dot', $value );
}
}
/**
* A simple dot
*/
class solid_dot extends dot_base
{
/**
* The constructor, takes an optional $value
*/
function solid_dot($value=null)
{
parent::dot_base( 'solid-dot', $value );
}
}

View File

@@ -0,0 +1,27 @@
<?php
class ofc_arrow
{
/**
*@param $x as number. Start x position
*@param $y as number. Start y position
*@param $a as number. End x position
*@param $b as number. End y position
*@param $colour as string.
*@param $barb_length as number. Length of the barbs in pixels.
*/
function ofc_arrow($x, $y, $a, $b, $colour, $barb_length=10)
{
$this->type = "arrow";
$this->start = array("x"=>$x, "y"=>$y);
$this->end = array("x"=>$a, "y"=>$b);
$this->colour($colour);
$this->{"barb-length"} = $barb_length;
}
function colour( $colour )
{
$this->colour = $colour;
return $this;
}
}

View File

@@ -0,0 +1,41 @@
<?php
include_once 'ofc_bar_base.php';
class candle_value
{
/**
*
*/
function candle_value( $high, $open, $close, $low )
{
$this->high = $high;
$this->top = $open;
$this->bottom = $close;
$this->low = $low;
}
function set_colour( $colour )
{
$this->colour = $colour;
}
function set_tooltip( $tip )
{
$this->tip = $tip;
}
}
class candle extends bar_base
{
function candle($colour, $negative_colour=null)
{
$this->type = "candle";
parent::bar_base();
$this->set_colour( $colour );
if(!is_null($negative_colour))
$this->{'negative-colour'} = $negative_colour;
}
}

View File

@@ -0,0 +1,56 @@
<?php
class ofc_menu_item
{
/**
* @param $text as string. The menu item text.
* @param $javascript_function_name as string. The javascript function name, the
* js function takes one parameter, the chart ID. See ofc_menu_item_camera for
* some example code.
*/
function ofc_menu_item($text, $javascript_function_name)
{
$this->type = "text";
$this->text = $text;
$tmp = 'javascript-function';
$this->$tmp = $javascript_function_name;
}
}
class ofc_menu_item_camera
{
/**
* @param $text as string. The menu item text.
* @param $javascript_function_name as string. The javascript function name, the
* js function takes one parameter, the chart ID. So for example, our js function
* could look like this:
*
* function save_image( chart_id )
* {
* alert( chart_id );
* }
*
* to make a menu item call this: ofc_menu_item_camera('Save chart', 'save_image');
*/
function ofc_menu_item_camera($text, $javascript_function_name)
{
$this->type = "camera-icon";
$this->text = $text;
$tmp = 'javascript-function';
$this->$tmp = $javascript_function_name;
}
}
class ofc_menu
{
function ofc_menu($colour, $outline_colour)
{
$this->colour = $colour;
$this->outline_colour = $outline_colour;
}
function values($values)
{
$this->values = $values;
}
}

View File

@@ -0,0 +1,43 @@
<?php
/**
* Sugar: to make stars easier sometimes
*/
class s_star extends star
{
/**
* I use this wrapper for default dot types,
* it just makes the code easier to read.
*/
function s_star($colour, $size)
{
parent::star();
$this->colour($colour)->size($size);
}
}
class s_box extends anchor
{
/**
* I use this wrapper for default dot types,
* it just makes the code easier to read.
*/
function s_box($colour, $size)
{
parent::anchor();
$this->colour($colour)->size($size)->rotation(45)->sides(4);
}
}
class s_hollow_dot extends hollow_dot
{
/**
* I use this wrapper for default dot types,
* it just makes the code easier to read.
*/
function s_hollow_dot($colour, $size)
{
parent::hollow_dot();
$this->colour($colour)->size($size);
}
}

View File

@@ -0,0 +1,133 @@
<?php
class ofc_tags
{
function ofc_tags()
{
$this->type = "tags";
$this->values = array();
}
function colour( $colour )
{
$this->colour = $colour;
return $this;
}
/**
*@param $font as string. e.g. "Verdana"
*@param $size as integer. Size in px
*/
function font($font, $size)
{
$this->font = $font;
$this->{'font-size'} = $size;
return $this;
}
/**
*@param $x as integer. Size of x padding in px
*@param $y as integer. Size of y padding in px
*/
function padding($x, $y)
{
$this->{"pad-x"} = $x;
$this->{"pad-y"} = $y;
return $this;
}
function rotate($angle)
{
$this->rotate($angle);
return $this;
}
function align_x_center()
{
$this->{"align-x"} = "center";
return $this;
}
function align_x_left()
{
$this->{"align-x"} = "left";
return $this;
}
function align_x_right()
{
$this->{"align-x"} = "right";
return $this;
}
function align_y_above()
{
$this->{"align-y"} = "above";
return $this;
}
function align_y_below()
{
$this->{"align-y"} = "below";
return $this;
}
function align_y_center()
{
$this->{"align-y"} = "center";
return $this;
}
/**
* This can contain some HTML, e.g:
* - "More <a href="javascript:alert(12);">info</a>"
* - "<a href="http://teethgrinder.co.uk">ofc</a>"
*/
function text($text)
{
$this->text = $text;
return $this;
}
/**
* This works, but to get the mouse pointer to change
* to a little hand you need to use "<a href="">stuff</a>"-- see text()
*/
function on_click($on_click)
{
$this->{'on-click'} = $on_click;
return $this;
}
/**
*@param $bold boolean.
*@param $underline boolean.
*@param $border boolean.
*@prarm $alpha real (0 to 1.0)
*/
function style($bold, $underline, $border, $alpha )
{
$this->bold = $bold;
$this->border = $underline;
$this->underline = $border;
$this->alpha = $alpha;
return $this;
}
/**
*@param $tag as ofc_tag
*/
function append_tag($tag)
{
$this->values[] = $tag;
}
}
class ofc_tag extends ofc_tags
{
function ofc_tag($x, $y)
{
$this->x = $x;
$this->y = $y;
}
}

View File

@@ -0,0 +1,38 @@
<?php
/**
* y_axis_label see y_axis_labels
*/
class y_axis_label
{
function y_axis_label( $y, $text)
{
$this->y = $y;
$this->set_text( $text );
}
function set_text( $text )
{
$this->text = $text;
}
function set_colour( $colour )
{
$this->colour = $colour;
}
function set_size( $size )
{
$this->size = $size;
}
function set_rotate( $rotate )
{
$this->rotate = $rotate;
}
function set_vertical()
{
$this->rotate = "vertical";
}
}

View File

@@ -0,0 +1,57 @@
<?php
class y_axis_labels
{
function y_axis_labels(){}
/**
* @param $steps which labels are generated
*/
function set_steps( $steps )
{
$this->steps = $steps;
}
/**
*
* @param $labels as an array of [y_axis_label or string]
*/
function set_labels( $labels )
{
$this->labels = $labels;
}
function set_colour( $colour )
{
$this->colour = $colour;
}
/**
* font size in pixels
*/
function set_size( $size )
{
$this->size = $size;
}
/**
* rotate labels
*/
function set_vertical()
{
$this->rotate = 270;
}
function rotate( $angle )
{
$this->rotate = $angle;
}
/**
* @param $text default text that all labels inherit
*/
function set_text( $text )
{
$this->text = $text;
}
}

View File

@@ -91,10 +91,8 @@ function ShowExamples($oP, $sExpression)
$sOperation = utils::ReadParam('operation', 'menu');
$oAppContext = new ApplicationContext();
$iActiveNodeId = utils::ReadParam('menu', -1);
$currentOrganization = utils::ReadParam('org_id', '');
$oP = new iTopWebPage(Dict::S('UI:RunQuery:Title'), $currentOrganization);
$oP = new iTopWebPage(Dict::S('UI:RunQuery:Title'));
// Main program
$sExpression = utils::ReadParam('expression', '');

View File

@@ -507,11 +507,9 @@ function DisplayRelationDetails($oPage, $sRelCode)
// Display the menu on the left
$oAppContext = new ApplicationContext();
$iActiveNodeId = utils::ReadParam('menu', -1);
$currentOrganization = utils::ReadParam('org_id', 1);
$operation = utils::ReadParam('operation', '');
$oPage = new iTopWebPage(Dict::S('UI:Schema:Title'), $currentOrganization);
$oPage = new iTopWebPage(Dict::S('UI:Schema:Title'));
$oPage->no_cache();
$operation = utils::ReadParam('operation', '');

View File

@@ -121,9 +121,8 @@ function SelectService($oP, $oUserOrg)
{
$sChecked = "checked";
}
$oP->p("<tr><td style=\"vertical-align:top\"><p><input name=\"attr_service_id\" $sChecked type=\"radio\" id=\"svc_$id\" value=\"$id\"></p></td><td style=\"vertical-align:top\"><p><b><label for=\"svc_$id\">".htmlentities($oService->GetName())."</label></b></p>");
$oP->p("<p>".htmlentities($oService->Get('description'))."</p></td></tr>"); DumpHiddenParams($oP, array('service_id'), $aParameters);
$oP->p("<tr><td style=\"vertical-align:top\"><p><input name=\"attr_service_id\" $sChecked type=\"radio\" id=\"svc_$id\" value=\"$id\"></p></td><td style=\"vertical-align:top\"><p><b><label for=\"svc_$id\">".htmlentities($oService->GetName(), ENT_QUOTES, 'UTF-8')."</label></b></p>");
$oP->p("<p>".htmlentities($oService->Get('description'), ENT_QUOTES, 'UTF-8')."</p></td></tr>");
}
$oP->add("</table>\n");
DumpHiddenParams($oP, array('service_id'), $aParameters);
@@ -163,7 +162,7 @@ function SelectSubService($oP, $oUserOrg)
if (is_object($oService))
{
$oP->add("<div class=\"wizContainer\" id=\"form_select_servicesubcategory\">\n");
$oP->add("<h1 id=\"select_subcategory\">".Dict::Format('Portal:SelectSubcategoryFrom_Service', htmlentities($oService->GetName()))."</h1>\n");
$oP->add("<h1 id=\"select_subcategory\">".Dict::Format('Portal:SelectSubcategoryFrom_Service', htmlentities($oService->GetName(), ENT_QUOTES, 'UTF-8'))."</h1>\n");
$oP->add("<form id=\"request_form\" method=\"get\">\n");
$oP->add("<table>\n");
while($oSubService = $oSet->Fetch())
@@ -174,8 +173,8 @@ function SelectSubService($oP, $oUserOrg)
{
$sChecked = "checked";
}
$oP->p("<tr><td style=\"vertical-align:top\"><p><input name=\"attr_servicesubcategory_id\" $sChecked type=\"radio\" id=\"subsvc_$id\" value=\"$id\"></p></td><td style=\"vertical-align:top\"><p><b><label for=\"subsvc_$id\">".htmlentities($oSubService->GetName())."</label></b></p>");
$oP->p("<p>".htmlentities($oSubService->Get('description'))."</p></td></tr>");
$oP->p("<tr><td style=\"vertical-align:top\"><p><input name=\"attr_servicesubcategory_id\" $sChecked type=\"radio\" id=\"subsvc_$id\" value=\"$id\"></p></td><td style=\"vertical-align:top\"><p><b><label for=\"subsvc_$id\">".htmlentities($oSubService->GetName(), ENT_QUOTES, 'UTF-8')."</label></b></p>");
$oP->p("<p>".htmlentities($oSubService->Get('description'), ENT_QUOTES, 'UTF-8')."</p></td></tr>");
}
$sMessage = Dict::S('Portal:PleaseSelectAServiceSubCategory');
$oP->add_ready_script(
@@ -220,9 +219,9 @@ function RequestCreationForm($oP, $oUserOrg)
$oRequest->Set('servicesubcategory_id', $aParameters['servicesubcategory_id']);
$oAttDef = MetaModel::GetAttributeDef('UserRequest', 'service_id');
$aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => htmlentities($oService->GetName()));
$aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => htmlentities($oService->GetName(), ENT_QUOTES, 'UTF-8'));
$oAttDef = MetaModel::GetAttributeDef('UserRequest', 'servicesubcategory_id');
$aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => htmlentities($oSubService->GetName()));
$aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => htmlentities($oSubService->GetName(), ENT_QUOTES, 'UTF-8'));
$iFlags = 0;
foreach($aList as $sAttCode)
{
@@ -372,7 +371,7 @@ function CreateRequest(WebPage $oP, Organization $oUserOrg)
case 2:
$oP->AddMenuButton('cancel', 'UI:Button:Cancel', './index.php?operation=welcome');
RequestCreationForm($oP, $oUserOrg);
RequestCreationForm($oP, $oUserOrg);
break;
case 3:

View File

@@ -1,4 +1,4 @@
iTop - version 1.0.0 - 20-Sep-2010
iTop - version 1.0.1 - 03-Nov-2010
Readme file
1. ABOUT THIS RELEASE
@@ -7,33 +7,46 @@ Readme file
2.2. Install procedure
2.3. Migration from previous version
3. FEATURES
3.1. Changes since 0.9.1
3.1. Changes since 1.0
3.2. Known limitations
3.3. Known issues
1. ABOUT THIS RELEASE
==================
Thank you for downloading the seventh packaged release of iTop. This version is
the first complete version of iTop: it aims at being really used professionally.
Thank you for downloading the eigth packaged release of iTop. This version is
a maintenance release. It aims at upgrading seemlessly an existing 1.0 installation.
Additional documentation can be downloaded from http://www.combodo.com/itopdocumentation
- User guide
- Administrator guide
- Customization guide
- How to upgrade from previous versions
- Implementation guide
iTop is released under the GPL (v3) license. (Check license.txt in this directory).
The source code of iTop can be found on SourceForge: http://itop.sourceforge.net
1.1 Special Thanks To:
1.1 Should I upgrade to 1.0.1 ?
---------------------------
This maintenance release fixes a number of usability issues of iTop 1.0:
- Better handling of forms: fields validation and default values handling have been improved
- Support of IE8 and Safari
- Support of IIS
- Support of localized texts in the User Portal
If any of the above items is important for you, then you should upgrade your version of iTop.
If you are Brazilian and want to run iTop on IIS with IE8, then this release is for you !
1.2 Special Thanks To:
-----------------
Bruno Bonfils for his guidance about LDAP and authentication.
Randall Badilla Castro for the Spanish translation.
Jonathan Lucas and David Gumbel from ITOMIG BmBh, for the German translation.
Jonathan Lucas and David Gumbel from ITOMIG Gmbh, for the German translation.
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.
Marco Tulio for the Portuguese (Brazilian) translation
2. INSTALLATION
============
@@ -44,11 +57,11 @@ Server configuration:
iTop is based on the AMP (Apache / MySQL / PHP) platform and requires PHP 5.2 and
MySQL 5. The installation of iTop does not require any command line access to the
server. The only operations required to install iTop are: copying the files to the
server and browsing web pages.
server and browsing web pages. iTop can be installed on Apache and IIS.
Client configuration:
End-user configuration:
Although iTop should work with most modern web browsers, the application has been
tested mostly on Firefox 3, IE7/IE8 and Chrome. iTop was designed for at least a
tested mostly Firefox 3, IE8, Safari 5 and Chrome. iTop was designed for at least a
1024x768 screen resolution. For the graphical view of the impact analysis, Flash
version 8 or higher is required.
@@ -70,112 +83,96 @@ innodb_flush_method = O_DSYNC
On some systems you'll see a 5 to 10 times performance boost for writing data into
the MySQL database !
2.3. Migrating from a previous version
---------------------------------
Please refer to the migration guide available at http://www.combodo.com/itopdocumentation.
2.3. Migrating from 1.0
------------------
Overwrite your current installation files with the new ones.
Configuration file, Data model files, and the database made by iTop 1.0 are
fully compatible with iTop 1.0.1.
2.4. Migrating from 0.9
------------------
Depending on your current situation, there are several possible migration paths.
Please refer to the migration guide available at http://www.combodo.com/itopdocumentation.
3. FEATURES
========
3.1. Changes since 0.9.1
-------------------
3.1. Changes since 1.0
-----------------
Version 1.0 is a major release.
Version 1.0.1 is a maintenance release.
Localization
------------
iTop is localized: English, French, Spanish and German are available.
User portal
-----------
Customers may submit their request directly into a dedicated page.
The same page shows a report of ongoing requests.
SLA Management
--------------
SLAs can be defined in the service management module.
An escalation deadline is automatically computed upon ticket creation.
In the tickets dashboard, tickets close to reach the deadline are highlighted.
When the deadline is reached, the ticket automatically switches to an "escalation"
state. An acknowledgement is required before returning to normal operations on
that ticket.
Modular setup
-------------
It is now possible to select ITIL modules you would like to use.
For instance, you might want to install only the configuration management
along with incident management.
Portuguese (Brazil) has been added.
German localization reviewed.
Major changes
-------------
- A brand new data model has been designed to make iTop more compliant to ITIL.
- Graphical views have been developed to represent the relations between CIS.
Two views are available today.
* "impact" defines the CIs that are impacted by a given CI.
* "depends on" defines the CIs that are a threat to a given CI.
When creating an incident ticket, the impacted CIs and contacts to notify are
automatically computed, and attached to the ticket.
- The UI has been reviewed to make the application more professional.
- The CSV import tool has been improved to make it easier to use.
- A Web service has been developed to allow tickets to be created automatically
from emails. This feature simplifies ticket creation for end-users.
- User management: Finalized the UI to create new users and manage their profiles
- Authentication: Added the possibility to rely on an LDAP authentication, or
and external authentication (e.g. Web Server single sign-on, relying on a .htaccess file)
None: this is a maintenance release!
Minor changes
-------------
- User welcome splash screen: message displayed to new users, the first time
they logon to iTop
- Implemented validation of attributes entered in forms
- import.php has been finalized, and is the preferred way to load/synchronize
data in a non-interactive way
- New menu to edit the Audit Category and Rules
#246 The page import.php can be used in CLI mode, allowing for massive data load
#311 Improved the reporting in the bulk import GUI (reconciliation of external keys, how to specify "undefined")
#293 Show the IP address against the device in the IP usage table for a subnet
#276 Show mandatory fields during CSV import
#285 Email addresses displayed as Mailto hyperlinks
Nicer display of the CSV import results...
Special passthrough mode for big XML pages output.
Allow n:n links to link several times to the same remote object (if "duplicates)=> true in the linkedset definition)
#284 Improved the behavior and reporting when attempting to create a document after a huge file
#111 Improved the data loader, and added a REST service to load data from a file.
This is particularly interesting to facilitate the migration from an older installation.
Browser compatibility
---------------------
Tested successfully with IE8 and Chrome.
Fixed the "Relationships" Flash navigator so that it works also on Safari. (tested with Safari 5.0.2 on Windows) (Trac #310)
- Fixed the search form, and also fixed the search/selection of objects to link (n:n links) that was broken on IE8.
Fix to prevent IE 8 from running in IE7 compatibility mode... to be tested...
Security improvements
---------------------
- Data Administration menu is now restricted to administrators and
configuration managers
- Administration menu restricted to administrators
- The same restrictions apply whenever a user attempts to access the pages directly
- New setting to enforce HTTPS
- Strong encryption of passwords
- Prevent users from listing the application directories
#300 When logged onto an iTop instance, you are allowed on any other instance
Bugs fixed
----------
The complete list can be reviewed on http://sourceforge.net/apps/trac/itop/report/1
#182 Setup fails with mysql error 1046 or 1146
#144 Could not create a workgroup
#97 Issue when removing an organization
#105 Issue in exporting a given class of object
#106 Importing data using import CSV
#116 When modifying a user, the link with the profile(s) is lost.
#98 Computation of free IPs in a subnet is wrong
#126 'magic_quotes_gpc' test issue during setup
#128 Issue when using AttributeBlob not mandatory
#136 Context menus
#102 Allow users to change their password.
#210 Error message when trying to uploading a big file
#139 mysSQL error: "truncated column", or truncated string
#223 Trim spaces in CSV imports
#215 Support several characters encoding for the CSV imports
#239 Issue with character set (impacting searches with accents)
#234 PHP Strict Standards warnings
#140 Check that user logins are unique
#286 GetAbsoluteUrl creates broken links on IIS
#278 Missing PHP5 modules not detected properly
#289 Misleading errors when apache not authorized to write files in "setup" directory
#295 Unable to update or insert data
#313 Provider Contracts are not filtered by Allowed Organizations
#309 some of php-ofc-library files are missing
#315 Default organization not handled properly when there is just one organization allowed for the user
#308 Subnet / Free IPs: the subnet address is reserved (e.g. x.x.x.0)
#312 Exclamation sign not displayed for mandatory fields
#307 Auto-complete not reporting wrong selection
#302 Error: Unknown variable sIcon
#298 CSV template file opened in the browser instead of "downloaded"
#245 Search form gets too specialized
#306 Password gets corrupted if the admin forgets to select a profile
#297 Fixed a reporting issue on the SOAP service CreateIncidentTicket
#296 Incorrect display of Service/Subcategory localized characters in the portal
#292 Could not leave "User Satisfaction" field undefined
#258 Context automatically selected when searching on organization
#282 OQL Error when using functions
#288 Some multi objects OQL queries do not work
Fixed a bug in the XML encoding function
Fixed the issue "Object already modified". The mechanism that prevents a user from submitting the same form twice has been redesigned.
#283 Fixed issue with the default value of Enum attributes
Fixed limitation: tickets named automatically even if a name is specified (attribute : ref) ; this is stopper when importing tickets from an existing workflow tool
3.2. Known limitations (https://sourceforge.net/apps/trac/itop/report/3)
-----------------
#71 The same MySQL credentials are used during the setup and for running the application.
#246 Massive data load requiring to setup specific HTTP sessions with higher timeouts and memory limits
#257 Could not delete more than 997 items when SUHOSIN is installed with its default settings (See TRAC)
#265 Add reconciliations keys into CSV template
Internet Explorer 7 is not supported (neither IE7 nor IE8 in compatibility mode)
3.3. Known issues (https://sourceforge.net/apps/trac/itop/report/3)

View File

@@ -166,7 +166,7 @@ function CheckPHPVersion(SetupWebPage $oP)
$oP->error("Error: The current PHP Version (".phpversion().") is lower than the minimum required version (".PHP_MIN_VERSION.")");
return false;
}
$aMandatoryExtensions = array('mysql', 'iconv', 'simplexml', 'soap');
$aMandatoryExtensions = array('mysql', 'iconv', 'simplexml', 'soap', 'hash', 'json', 'session', 'pcre');
$aOptionalExtensions = array('mcrypt' => 'Strong encryption will not be used.',
'ldap' => 'LDAP authentication will be disabled.');
asort($aMandatoryExtensions); // Sort the list to look clean !
@@ -1058,6 +1058,9 @@ function SetupFinished(SetupWebPage $oP, $aParamValues, $iCurrentStep, Config $o
$sAuthPwd = $aParamValues['auth_pwd'];
try
{
$sSessionName = sprintf('iTop-%x', rand());
$oConfig->Set('session_name', $sSessionName);
session_name($sSessionName);
session_start();
// Write the final configuration file
@@ -1179,6 +1182,15 @@ else
$oP->output();
exit;
}
if (!is_writable(dirname(FINAL_CONFIG_FILE).'/setup'))
{
$oP->add("<h1>iTop configuration wizard</h1>\n");
$oP->add("<h2>Fatal error</h2>\n");
$oP->error("<b>Error:</b> the directory where to store temporary setup files is not writable.");
$oP->p("The wizard cannot create operate. Please make sure that the directory '<b>".realpath(dirname(FINAL_CONFIG_FILE))."/setup</b>' is writable for the web server.");
$oP->output();
exit;
}
}
try

View File

@@ -41,7 +41,11 @@ class XMLDataLoader
protected $m_bSessionActive;
protected $m_oChange;
protected $m_sCacheFileName;
protected $m_aErrors;
protected $m_aWarnings;
protected $m_iCountCreated;
public function __construct($sConfigFileName)
{
$this->m_aKeys = array();
@@ -51,7 +55,9 @@ class XMLDataLoader
$this->InitDataModel($sConfigFileName);
$this->LoadKeysCache();
$this->m_bSessionActive = true;
$this->m_aErrors = array();
$this->m_aWarnings = array();
$this->m_iCountCreated = 0;
}
public function StartSession($oChange)
@@ -63,10 +69,38 @@ class XMLDataLoader
$this->m_bSessionActive = true;
}
public function EndSession()
public function EndSession($bStrict = false)
{
$this->ResolveExternalKeys();
$this->m_bSessionActive = false;
if (count($this->m_aErrors) > 0)
{
return false;
}
elseif ($bStrict && count($this->m_aWarnings) > 0)
{
return false;
}
else
{
return true;
}
}
public function GetErrors()
{
return $this->m_aErrors;
}
public function GetWarnings()
{
return $this->m_aWarnings;
}
public function GetCountCreated()
{
return $this->m_iCountCreated;
}
public function __destruct()
@@ -116,7 +150,10 @@ class XMLDataLoader
{
$sData = serialize( array('keys' => $this->m_aKeys,
'objects' => $this->m_aObjectsCache,
'change' => $this->m_oChange));
'change' => $this->m_oChange,
'errors' => $this->m_aErrors,
'warnings' => $this->m_aWarnings,
));
fwrite($hFile, $sData);
fclose($hFile);
}
@@ -137,7 +174,9 @@ class XMLDataLoader
$aCache = unserialize($sFileContent);
$this->m_aKeys = $aCache['keys'];
$this->m_aObjectsCache = $aCache['objects'];
$this->m_oChange = $aCache['change'];
$this->m_oChange = $aCache['change'];
$this->m_aErrors = $aCache['errors'];
$this->m_aWarnings = $aCache['warnings'];
}
}
@@ -170,6 +209,12 @@ class XMLDataLoader
$aReplicas = array();
foreach($oXml as $sClass => $oXmlObj)
{
if (!MetaModel::IsValidClass($sClass))
{
SetupWebPage::log_error("Unknown class - $sClass");
throw(new Exception("Unknown class - $sClass"));
}
$iSrcId = (integer)$oXmlObj['id']; // Mandatory to cast
// Import algorithm
@@ -177,40 +222,84 @@ class XMLDataLoader
// for all attribute that is neither an external field
// not an external key, assign it
// Store all external keys for further reference
// Create the object an store the correspondence between its newly created Id
// Create the object an store the correspondance between its newly created Id
// and its original Id
// Once all the objects have been created re-assign all the external keys to
// their actual Ids
$oTargetObj = MetaModel::NewObject($sClass);
foreach(MetaModel::ListAttributeDefs($sClass) as $sAttCode=>$oAttDef)
foreach($oXmlObj as $sAttCode => $oSubNode)
{
if (!MetaModel::IsValidAttCode($sClass, $sAttCode))
{
$sMsg = "Unknown attribute code - $sClass/$sAttCode";
SetupWebPage::log_error($sMsg);
throw(new Exception($sMsg));
}
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if (($oAttDef->IsWritable()) && ($oAttDef->IsScalar()))
{
if ($oAttDef->IsExternalKey())
{
$iDstObj = (integer)($oXmlObj->$sAttCode);
// Attempt to find the object in the list of loaded objects
$iExtKey = $this->GetObjectKey($oAttDef->GetTargetClass(), $iDstObj);
if ($iExtKey == 0)
if (substr(trim($oSubNode), 0, 6) == 'SELECT')
{
$iExtKey = -$iDstObj; // Convention: Unresolved keys are stored as negative !
$oTargetObj->RegisterAsDirty();
$sQuery = trim($oSubNode);
$oSet = new DBObjectSet(DBObjectSearch::FromOQL($sQuery));
$iMatches = $oSet->Count();
if ($iMatches == 1)
{
$oFoundObject = $oSet->Fetch();
$iExtKey = $oFoundObject->GetKey();
}
else
{
$sMsg = "Ext key not reconcilied - $sClass/$iSrcId - $sAttCode: '".$sQuery."' - found $iMatches matche(s)";
SetupWebPage::log_error($sMsg);
$this->m_aErrors[] = $sMsg;
$iExtKey = 0;
}
}
else
{
$iDstObj = (integer)($oSubNode);
// Attempt to find the object in the list of loaded objects
$iExtKey = $this->GetObjectKey($oAttDef->GetTargetClass(), $iDstObj);
if ($iExtKey == 0)
{
$iExtKey = -$iDstObj; // Convention: Unresolved keys are stored as negative !
$oTargetObj->RegisterAsDirty();
}
// here we allow external keys to be invalid because we will resolve them later on...
}
// here we allow external keys to be invalid because we will resolve them later on...
//$oTargetObj->CheckValue($sAttCode, $iExtKey);
$oTargetObj->Set($sAttCode, $iExtKey);
}
elseif ($oAttDef instanceof AttributeBlob)
{
$sMimeType = (string) $oSubNode->mimetype;
$sFileName = (string) $oSubNode->filename;
$data = base64_decode((string) $oSubNode->data);
$oDoc = new ormDocument($data, $sMimeType, $sFileName);
$oTargetObj->Set($sAttCode, $oDoc);
}
else
{
// tested by Romain, little impact on perf (not significant on the intial setup)
$res = $oTargetObj->CheckValue($sAttCode, (string)$oXmlObj->$sAttCode);
$value = (string)$oSubNode;
if ($value == '')
{
$value = $oAttDef->GetNullValue();
}
$res = $oTargetObj->CheckValue($sAttCode, $value);
if ($res !== true)
{
// $res contains the error description
SetupWebPage::log_error("Value not allowed - $sClass/$iSrcId - $sAttCode: '".$oXmlObj->$sAttCode."' ; $res");
throw(new Exception("Value not allowed - $sClass/$iSrcId - $sAttCode: '".$oXmlObj->$sAttCode."' ; $res"));
$sMsg = "Value not allowed - $sClass/$iSrcId - $sAttCode: '".$oSubNode."' ; $res";
SetupWebPage::log_error($sMsg);
$this->m_aErrors[] = $sMsg;
}
$oTargetObj->Set($sAttCode, (string)$oXmlObj->$sAttCode);
$oTargetObj->Set($sAttCode, $value);
}
}
}
@@ -283,12 +372,13 @@ class XMLDataLoader
{
$iObjId = $oTargetObj->DBInsertNoReload();
}
$this->m_iCountCreated++;
}
}
catch(Exception $e)
{
SetupWebPage::log_error("An object could not be loaded - $sClass/$iSrcId - ".$e->getMessage());
echo $e->GetHtmlDesc();
SetupWebPage::log_error("An object could not be recorded - $sClass/$iSrcId - ".$e->getMessage());
$this->m_aErrors[] = "An object could not be recorded - $sClass/$iSrcId - ".$e->getMessage();
}
$aParentClasses = MetaModel::EnumParentClasses($sClass);
$aParentClasses[] = $sClass;
@@ -323,6 +413,7 @@ class XMLDataLoader
{
$sMsg = "unresolved extkey in $sClass::".$oTargetObj->GetKey()."(".$oTargetObj->GetName().")::$sAttCode=$sTargetClass::$iTempKey";
SetupWebPage::log_warning($sMsg);
$this->m_aWarnings[] = $sMsg;
//echo "<pre>aKeys[".$sTargetClass."]:\n";
//print_r($this->m_aKeys[$sTargetClass]);
//echo "</pre>\n";
@@ -349,7 +440,7 @@ class XMLDataLoader
}
catch(Exception $e)
{
echo $e->GetHtmlDesc();
$this->m_aErrors[] = "The object changes could not be tracked - $sClass/$iSrcId - ".$e->getMessage();
}
}
}

View File

@@ -1379,6 +1379,17 @@ class TestImportREST extends TestWebServices
),
'csvdata' => "name;status;owner_name;location_name;location_id->org_name;os_family;os_version;management_ip;cpu;ram;brand;model;serial_number\nlocalhost.;production;Demo;Grenoble;Demo;Ubuntu 9.10;2.6.31-19-generic-#56-Ubuntu SMP Thu Jan 28 01:26:53 UTC 2010;16.16.230.232;Intel(R) Core(TM)2 Duo CPU T7100 @ 1.80GHz;2005;Hewlett-Packard;HP Compaq 6510b (GM108UC#ABF);CNU7370BNP",
),
array(
'desc' => 'Load server - wrong value for status',
'login' => 'admin',
'password' => 'admin',
'args' => array(
'class' => 'Server',
'output' => 'details',
'reconciliationkeys' => '',
),
'csvdata' => "name;status;owner_name;location_name;location_id->org_name;os_family;os_version;management_ip;cpu;ram;brand;model;serial_number\nlocalhost.;Production;Demo;Grenoble;Demo;Ubuntu 9.10;2.6.31-19-generic-#56-Ubuntu SMP Thu Jan 28 01:26:53 UTC 2010;16.16.230.232;Intel(R) Core(TM)2 Duo CPU T7100 @ 1.80GHz;2005;Hewlett-Packard;HP Compaq 6510b (GM108UC#ABF);CNU7370BNP",
),
array(
'desc' => 'Load NW if',
'login' => 'admin',
@@ -1619,7 +1630,7 @@ $aWebServices = array(
'initial situation blah blah blah', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1655,7 +1666,7 @@ $aWebServices = array(
'The power supply suddenly started to warm up', /* sInitialSituation */
new SOAPExternalKeySearch(), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1681,7 +1692,7 @@ $aWebServices = array(
'The power supply suddenly started to warm up', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1707,7 +1718,7 @@ $aWebServices = array(
'The power supply suddenly started to warm up', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1733,7 +1744,7 @@ $aWebServices = array(
'Tried to join the shuttle', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1754,7 +1765,7 @@ $aWebServices = array(
'Tried to join the shuttle', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1774,7 +1785,7 @@ $aWebServices = array(
'Tried to join the shuttle', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1000))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1795,7 +1806,7 @@ $aWebServices = array(
'Tried to join the shuttle', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1816,7 +1827,7 @@ $aWebServices = array(
'Tried to join the shuttle', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1837,7 +1848,7 @@ $aWebServices = array(
'Tried to join the shuttle', /* sInitialSituation */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aCallerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Demo'))), /* aCustomerDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'HW Management'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Computers and peripherals'))), /* aServiceDesc */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('id', 1))), /* aServiceSubcategoryDesc */
'sub product of the service', /* sProduct */
new SOAPExternalKeySearch(array(new SOAPSearchCondition('name', 'Hardware support'))), /* aWorkgroupDesc */
@@ -1862,7 +1873,7 @@ class TestSoap extends TestSoapWebService
global $aSOAPMapping;
// this file is generated dynamically with location = here
$sWsdlUri = 'http'.(empty($_SERVER['HTTPS']) ? '' : 's').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/../webservices/itop.wsdl.php';
$sWsdlUri = 'http'.(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off') ? 's' : '').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/../webservices/itop.wsdl.php';
ini_set("soap.wsdl_cache_enabled","0");
$this->m_SoapClient = new SoapClient
@@ -2101,4 +2112,67 @@ class TestTriggerAndEmail extends TestBizModel
return true;
}
}
class TestCreateObjects extends TestBizModel
{
static public function GetName()
{
return 'Itop - create objects';
}
static public function GetDescription()
{
return 'Create weird objects (reproduce a bug?)';
}
static public function GetConfigFile() {return '../config-itop.php';}
protected function DoExecute()
{
$oMyObj = MetaModel::NewObject("Server");
$oMyObj->Set("name", "test".rand(1,1000));
$oMyObj->Set("org_id", 2);
$oMyObj->Set("status", 'production');
$this->ObjectToDB($oMyObj, $bReload = true);
echo "<p>Created: {$oMyObj->GetHyperLink()}</p>";
$sTicketRef = "I-abcdef";
echo "<p>Creating: $sTicketRef</p>";
$oMyObj = MetaModel::NewObject("Incident");
$oMyObj->Set("ref", $sTicketRef);
$oMyObj->Set("title", "my title");
$oMyObj->Set("description", "my description");
$oMyObj->Set("ticket_log", "my ticket log");
$oMyObj->Set("start_date", "2010-03-08 17:37:00");
$oMyObj->Set("status", "resolved");
$oMyObj->Set("caller_id", 1);
$oMyObj->Set("org_id", 1);
$oMyObj->Set("urgency", 3);
$oMyObj->Set("agent_id", 1);
$oMyObj->Set("close_date", "0000-00-00 00:00:00");
$oMyObj->Set("last_update", "2010-04-08 16:47:29");
$oMyObj->Set("solution", "branche ton pc!");
// External key given as a string -> should be casted to an integer
$oMyObj->Set("service_id", "1");
$oMyObj->Set("servicesubcategory_id", "1");
$oMyObj->Set("product", "");
$oMyObj->Set("impact", 2);
$oMyObj->Set("priority", 3);
$oMyObj->Set("related_problem_id", 0);
$oMyObj->Set("related_change_id", 0);
$oMyObj->Set("assignment_date", "");
$oMyObj->Set("resolution_date", "");
$oMyObj->Set("tto_escalation_deadline", "");
$oMyObj->Set("ttr_escalation_deadline", "");
$oMyObj->Set("closure_deadline", "");
$oMyObj->Set("resolution_code", "fixed");
$oMyObj->Set("user_satisfaction", "");
$oMyObj->Set("user_commment", "");
$oMyObj->Set("workgroup_id", 4);
$this->ObjectToDB($oMyObj, $bReload = true);
echo "<p>Created: {$oMyObj->GetHyperLink()}</p>";
}
}
?>

View File

@@ -0,0 +1,172 @@
<?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
/**
* Does load data from XML files (currently used in the setup and the backoffice data loader utility)
*
* @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
*/
/**
* This page is called to load an XML file into the database
* parameters
* 'file' string Name of the file to load
*/
define('SAFE_MINIMUM_MEMORY', 256*1024*1024);
require_once('../application/utils.inc.php');
require_once("../application/nicewebpage.class.inc.php");
// required because the class xmldataloader is reporting errors in the setup.log file
require_once('../setup/setuppage.class.inc.php');
function SetMemoryLimit($oP)
{
$sMemoryLimit = trim(ini_get('memory_limit'));
if (empty($sMemoryLimit))
{
// On some PHP installations, memory_limit does not exist as a PHP setting!
// (encountered on a 5.2.0 under Windows)
// In that case, ini_set will not work, let's keep track of this and proceed with the data load
$oP->p("No memory limit has been defined in this instance of PHP");
}
else
{
// Check that the limit will allow us to load the data
//
$iMemoryLimit = utils::ConvertToBytes($sMemoryLimit);
if ($iMemoryLimit < SAFE_MINIMUM_MEMORY)
{
if (ini_set('memory_limit', SAFE_MINIMUM_MEMORY) === FALSE)
{
$oP->p("memory_limit is too small: $iMemoryLimit and can not be increased by the script itself.");
}
else
{
$oP->p("memory_limit increased from $iMemoryLimit to ".SAFE_MINIMUM_MEMORY.".");
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
//
// Main
//
////////////////////////////////////////////////////////////////////////////////
require_once('../core/config.class.inc.php');
require_once('../core/log.class.inc.php');
require_once('../core/kpi.class.inc.php');
require_once('../core/cmdbsource.class.inc.php');
require_once('../setup/xmldataloader.class.inc.php');
define('FINAL_CONFIG_FILE', '../config-itop.php');
// Never cache this page
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Fri, 17 Jul 1970 05:00:00 GMT"); // Date in the past
Utils::SpecifyConfigFile(FINAL_CONFIG_FILE);
/**
* Main program
*/
$sFileName = Utils::ReadParam('file', '');
$oP = new WebPage("iTop - Backoffice data loader");
try
{
// Note: the data model must be loaded first
$oDataLoader = new XMLDataLoader(FINAL_CONFIG_FILE); // When called by the wizard, the final config is not yet there
if (empty($sFileName))
{
throw(new Exception("Missing argument 'file'"));
}
if (!file_exists($sFileName))
{
throw(new Exception("File $sFileName does not exist"));
}
SetMemoryLimit($oP);
// The XMLDataLoader constructor has initialized the DB, let's start a transaction
CMDBSource::Query('SET AUTOCOMMIT=0');
CMDBSource::Query('BEGIN WORK');
$oChange = MetaModel::NewObject("CMDBChange");
$oChange->Set("date", time());
$oChange->Set("userinfo", "Initialization");
$iChangeId = $oChange->DBInsert();
$oP->p("Starting data load.");
$oDataLoader->StartSession($oChange);
$oDataLoader->LoadFile($sFileName);
$oP->p("Ending data load session");
if ($oDataLoader->EndSession(true /* strict */))
{
$iCountCreated = $oDataLoader->GetCountCreated();
CMDBSource::Query('COMMIT');
$oP->p("Data successfully written into the DB: $iCountCreated objects created");
}
else
{
CMDBSource::Query('ROLLBACK');
$oP->p("Some issues have been encountered, changes will not be recorded, please review the source data");
$aErrors = $oDataLoader->GetErrors();
if (count($aErrors) > 0)
{
$oP->p('Errors ('.count($aErrors).')');
foreach ($aErrors as $sMsg)
{
$oP->p(' * '.$sMsg);
}
}
$aWarnings = $oDataLoader->GetWarnings();
if (count($aWarnings) > 0)
{
$oP->p('Warnings ('.count($aWarnings).')');
foreach ($aWarnings as $sMsg)
{
$oP->p(' * '.$sMsg);
}
}
}
}
catch(Exception $e)
{
$oP->p("An error happened while loading the data: ".$e->getMessage());
$oP->p("Aborting (no data written)...");
CMDBSource::Query('ROLLBACK');
}
if (function_exists('memory_get_peak_usage'))
{
$oP->p("Information: memory peak usage: ".memory_get_peak_usage());
}
$oP->Output();
?>

View File

@@ -59,7 +59,7 @@ if (!empty($sExpression))
// since this page is in a different folder, let's adjust the HTML 'base' attribute
// to make the relative hyperlinks in the page work
$sServerName = $_SERVER['SERVER_NAME'];
$sProtocol = isset($_SERVER['HTTPS']) ? 'https' : 'http';
$sProtocol = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off')) ? 'https' : 'http';
if ($sProtocol == 'http')
{
$sPort = ($_SERVER['SERVER_PORT'] == 80) ? '' : ':'.$_SERVER['SERVER_PORT'];

View File

@@ -36,7 +36,7 @@
require_once('../application/application.inc.php');
require_once('../application/webpage.class.inc.php');
require_once('../application/csvpage.class.inc.php');
require_once('../application/xmlpage.class.inc.php');
require_once('../application/clipage.class.inc.php');
require_once('../application/startup.inc.php');
@@ -46,45 +46,66 @@ class BulkLoadException extends Exception
$aPageParams = array
(
'auth_user' => array
(
'mandatory' => true,
'modes' => 'cli',
'default' => null,
'description' => 'login (must have enough rights to create objects of the given class)',
),
'auth_pwd' => array
(
'mandatory' => true,
'modes' => 'cli',
'default' => null,
'description' => 'password',
),
'class' => array
(
'mandatory' => true,
'modes' => 'http,cli',
'default' => null,
'description' => 'class of loaded objects',
),
'csvdata' => array
(
'mandatory' => true,
'modes' => 'http',
'default' => null,
'description' => 'data',
),
'csvfile' => array
(
'mandatory' => true,
'modes' => 'cli',
'default' => '',
'description' => 'local data file, replaces csvdata if specified',
),
'charset' => array
(
'mandatory' => false,
'modes' => 'http,cli',
'default' => 'UTF-8',
'description' => 'Character set encoding of the CSV data: UTF-8, ISO-8859-1, WINDOWS-1251, WINDOWS-1252, ISO-8859-15',
),
// 'csvfile' => array
// (
// 'mandatory' => false,
// 'default' => '',
// 'description' => 'local data file, replaces csvdata if specified',
// ),
'separator' => array
(
'mandatory' => false,
'modes' => 'http,cli',
'default' => ';',
'description' => 'column separator in CSV data',
),
'qualifier' => array
(
'mandatory' => false,
'modes' => 'http,cli',
'default' => '"',
'description' => 'test qualifier in CSV data',
),
'output' => array
(
'mandatory' => false,
'modes' => 'http,cli',
'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)',
),
@@ -92,6 +113,7 @@ $aPageParams = array
'reportlevel' => array
(
'mandatory' => false,
'modes' => 'http,cli',
'default' => 'errors|warnings|created|changed|unchanged',
'description' => 'combination of flags to limit the detailed output',
),
@@ -99,18 +121,21 @@ $aPageParams = array
'reconciliationkeys' => array
(
'mandatory' => false,
'modes' => 'http,cli',
'default' => '',
'description' => 'name of the columns used to identify existing objects and update them, or create a new one',
),
'simulate' => array
(
'mandatory' => false,
'modes' => 'http,cli',
'default' => '0',
'description' => 'If set to 1, then the load will not be executed, but the expected report will be produced',
),
'comment' => array
(
'mandatory' => false,
'modes' => 'http,cli',
'default' => '',
'description' => 'Comment to be added into the change log',
),
@@ -119,11 +144,28 @@ $aPageParams = array
function UsageAndExit($oP)
{
global $aPageParams;
$bModeCLI = utils::IsModeCLI();
$oP->p("USAGE:\n");
foreach($aPageParams as $sParam => $aParamData)
{
$sDesc = $aParamData['description'].', '.($aParamData['mandatory'] ? 'mandatory' : 'optional, defaults to ['.$aParamData['default'].']');
$oP->p("$sParam = $sDesc\n");
$aModes = explode(',', $aParamData['modes']);
if ($bModeCLI)
{
if (in_array('cli', $aModes))
{
$sDesc = $aParamData['description'].', '.($aParamData['mandatory'] ? 'mandatory' : 'optional, defaults to ['.$aParamData['default'].']');
$oP->p("$sParam = $sDesc");
}
}
else
{
if (in_array('http', $aModes))
{
$sDesc = $aParamData['description'].', '.($aParamData['mandatory'] ? 'mandatory' : 'optional, defaults to ['.$aParamData['default'].']');
$oP->p("$sParam = $sDesc");
}
}
}
$oP->output();
exit;
@@ -157,16 +199,16 @@ function ReadMandatoryParam($oP, $sParam)
/////////////////////////////////
// Main program
if (false && utils::IsModeCLI())
if (utils::IsModeCLI())
{
// Mode CLI under construction... sorry!
$oP = new CLIPage("iTop - Bulk import");
// Next steps:
// implement a new page: CLIPage, that does a very clean output
// branch if in CLI mode
// enable the new argument 'csvfile'
// specific arguments: 'csvfile'
//
$sAuthUser = ReadMandatoryParam($oP, 'auth_user');
$sAuthPwd = ReadMandatoryParam($oP, 'auth_user');
$sCsvFile = ReadMandatoryParam($oP, 'csv_file');
$sAuthPwd = ReadMandatoryParam($oP, 'auth_pwd');
$sCsvFile = ReadMandatoryParam($oP, 'csvfile');
if (UserRights::CheckCredentials($sAuthUser, $sAuthPwd))
{
UserRights::Login($sAuthUser); // Login & set the user's language
@@ -176,6 +218,14 @@ if (false && utils::IsModeCLI())
$oP->p("Access restricted or wrong credentials ('$sAuthUser')");
exit;
}
if (!is_readable($sCsvFile))
{
$oP->p("Input file could not be found or could not be read: '$sCsvFile'");
exit;
}
$sCSVData = file_get_contents($sCsvFile);
}
else
{
@@ -184,6 +234,7 @@ else
LoginWebPage::DoLogin(); // Check user rights and prompt if needed
$oP = new CSVPage("iTop - Bulk import");
$sCSVData = utils::ReadPostedParam('csvdata');
}
@@ -196,7 +247,6 @@ try
$sClass = ReadMandatoryParam($oP, 'class');
$sSep = ReadParam($oP, 'separator');
$sQualifier = ReadParam($oP, 'qualifier');
$sCSVData = utils::ReadPostedParam('csvdata');
$sCharSet = ReadParam($oP, 'charset');
$sOutput = ReadParam($oP, 'output');
// $sReportLevel = ReadParam($oP, 'reportlevel');
@@ -279,6 +329,12 @@ try
$aExtKeys = array();
foreach($aRawFieldList as $iFieldId => $sFieldName)
{
$aMatches = array();
if (preg_match('/^(.+)\*$/', $sFieldName, $aMatches))
{
// Ignore any trailing "star" (*) that simply indicates a mandatory field
$sFieldName = $aMatches[1];
}
if (preg_match('/^(.*)->(.*)$/', trim($sFieldName), $aMatches))
{
// The column has been specified as "extkey->attcode"
@@ -493,6 +549,8 @@ try
case 'CellStatus_Modify':
break;
case 'CellStatus_Issue':
case 'CellStatus_SearchIssue':
case 'CellStatus_NullIssue':
case 'CellStatus_Ambiguous':
$iCountWarnings++;
break;

View File

@@ -33,7 +33,7 @@ $sMyWsdl = './itop.wsdl.tpl';
$sRawFile = file_get_contents($sMyWsdl);
$sServerURI = 'http'.(empty($_SERVER['HTTPS']) ? '' : 's').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/soapserver.php';
$sServerURI = 'http'.((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off')) ? 's' : '').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/soapserver.php';
$sFinalFile = str_replace(
'___SOAP_SERVER_URI___',

View File

@@ -26,7 +26,7 @@
require_once('itopsoaptypes.class.inc.php');
$sItopRoot = 'http'.(empty($_SERVER['HTTPS']) ? '' : 's').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/..';
$sItopRoot = 'http'.((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off')) ? 's' : '').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/..';
$sWsdlUri = $sItopRoot.'/webservices/itop.wsdl.php';
ini_set("soap.wsdl_cache_enabled","0");

View File

@@ -32,7 +32,7 @@ require_once('../application/startup.inc.php');
require('./webservices.class.inc.php');
// this file is generated dynamically with location = here
$sWsdlUri = 'http'.(empty($_SERVER['HTTPS']) ? '' : 's').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/../webservices/itop.wsdl.php';
$sWsdlUri = 'http'.((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']!='off')) ? 's' : '').'://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER['SCRIPT_NAME']).'/../webservices/itop.wsdl.php';
ini_set("soap.wsdl_cache_enabled","0");

View File

@@ -343,7 +343,7 @@ class WebServices
switch($oExtObjects->Count())
{
case 0:
$sMsg = "Parameter $sParamName: no match (searched: '".$oReconFilter->ToOQL()."')";
$sMsg = "Parameter $sParamName: no match (searched: '".$oReconFilter->ToOQL(true)."')";
$oRes->LogIssue($sMsg, $bIsMandatory);
break;
case 1:
@@ -358,7 +358,7 @@ class WebServices
}
break;
default:
$sMsg = "Parameter $sParamName: Found ".$oExtObjects->Count()." matches (searched: '".$oReconFilter->ToOQL()."')";
$sMsg = "Parameter $sParamName: Found ".$oExtObjects->Count()." matches (searched: '".$oReconFilter->ToOQL(true)."')";
$oRes->LogIssue($sMsg, $bIsMandatory);
}
}
@@ -436,7 +436,7 @@ class WebServices
switch($oExtObjects->Count())
{
case 0:
$oRes->LogWarning("Parameter $sParamName: object to link $sLinkedClass / $sItemDesc could not be found (searched: '".$oReconFilter->ToOQL()."')");
$oRes->LogWarning("Parameter $sParamName: object to link $sLinkedClass / $sItemDesc could not be found (searched: '".$oReconFilter->ToOQL(true)."')");
$aItemsNotFound[] = $sItemDesc;
break;
case 1:
@@ -447,7 +447,7 @@ class WebServices
);
break;
default:
$oRes->LogWarning("Parameter $sParamName: Found ".$oExtObjects->Count()." matches for item '$sItemDesc' (searched: '".$oReconFilter->ToOQL()."')");
$oRes->LogWarning("Parameter $sParamName: Found ".$oExtObjects->Count()." matches for item '$sItemDesc' (searched: '".$oReconFilter->ToOQL(true)."')");
$aItemsNotFound[] = $sItemDesc;
}
}