diff --git a/datamodels/2.x/itop-attachments/dictionaries/cs.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/cs.dict.itop-attachments.php
index bf417ccc8..dc0bc884c 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/cs.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/cs.dict.itop-attachments.php
@@ -85,11 +85,13 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
Dict::Add('CS CZ', 'Czech', 'Čeština', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/da.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/da.dict.itop-attachments.php
index 6fbbe5f2a..df1378e2e 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/da.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/da.dict.itop-attachments.php
@@ -84,11 +84,13 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [
Dict::Add('DA DA', 'Danish', 'Dansk', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/de.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/de.dict.itop-attachments.php
index 5749f92b9..bd86b5a60 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/de.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/de.dict.itop-attachments.php
@@ -84,11 +84,13 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
Dict::Add('DE DE', 'German', 'Deutsch', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (beim Herunterladen eines Attachment eines Objekts)',
'Class:TriggerOnAttachmentDownload+' => 'Trigger für das Herunterladen des Attachments der angegebenen Klasse oder einer Unterklasse',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/en.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/en.dict.itop-attachments.php
index 22ed209b8..c6f1253e4 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/en.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/en.dict.itop-attachments.php
@@ -91,11 +91,13 @@ Dict::Add('EN US', 'English', 'English', [
Dict::Add('EN US', 'English', 'English', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/es_cr.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/es_cr.dict.itop-attachments.php
index 522fec5b2..8a36f9a47 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/es_cr.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/es_cr.dict.itop-attachments.php
@@ -81,11 +81,13 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'Class:TriggerOnAttachmentDownload' => 'Disparador (al descargar el archivo adjunto del objeto)',
'Class:TriggerOnAttachmentDownload+' => 'Disparador al descargar el archivo adjunto del objeto de [una clase secundaria de] la clase dada',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/fr.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/fr.dict.itop-attachments.php
index 20895560a..e6f57da70 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/fr.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/fr.dict.itop-attachments.php
@@ -89,5 +89,7 @@ Dict::Add('FR FR', 'French', 'Français', [
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'Si coché, le fichier sera automatiquement attaché à l\'email quand l\'action email est lancée',
'Class:TriggerOnAttachmentDelete' => 'Déclencheur sur la suppression d\'une pièce jointe',
'Class:TriggerOnAttachmentDelete+' => 'Déclencheur sur la suppression d\'une pièce jointe d\'un objet',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Ajoute le fichier supprimé dans l\'email',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Les Triggers sur les objets ne sont pas autorisés sur la classe Attachement. Veuillez utiliser les triggers spécifiques pour cette classe',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/hu.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/hu.dict.itop-attachments.php
index 14f6ba869..49f77bb75 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/hu.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/hu.dict.itop-attachments.php
@@ -81,11 +81,13 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [
Dict::Add('HU HU', 'Hungarian', 'Magyar', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/it.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/it.dict.itop-attachments.php
index d766a1864..a5a4aaa93 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/it.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/it.dict.itop-attachments.php
@@ -83,11 +83,13 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
Dict::Add('IT IT', 'Italian', 'Italiano', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (al download di un allegato dell\'oggetto)',
'Class:TriggerOnAttachmentDownload+' => 'Trigger al download di un allegato di un oggetto di [una sottoclasse di] la classe data',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/ja.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/ja.dict.itop-attachments.php
index 45f88c3d2..f754b1efd 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/ja.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/ja.dict.itop-attachments.php
@@ -83,11 +83,13 @@ Dict::Add('JA JP', 'Japanese', '日本語', [
Dict::Add('JA JP', 'Japanese', '日本語', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/nl.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/nl.dict.itop-attachments.php
index 0d00101d3..ceee1cf4c 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/nl.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/nl.dict.itop-attachments.php
@@ -91,5 +91,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnAttachmentDelete' => 'Trigger (Bij het verwijderen van een bijlage)',
'Class:TriggerOnAttachmentDelete+' => 'Trigger bij het verwijderen van een bijlage van een object van de opgegeven klasse (of subklasse ervan)',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Bestand toevoegen in e-mail',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/pl.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/pl.dict.itop-attachments.php
index 67a1dc9f8..c948a709f 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/pl.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/pl.dict.itop-attachments.php
@@ -83,11 +83,13 @@ Dict::Add('PL PL', 'Polish', 'Polski', [
Dict::Add('PL PL', 'Polish', 'Polski', [
'Class:TriggerOnAttachmentDownload' => 'Wyzwalacz (po pobraniu załącznika obiektu)',
'Class:TriggerOnAttachmentDownload+' => 'Wyzwalacz po pobraniu załącznika obiektu [klasy podrzędnej] danej klasy',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/pt_br.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/pt_br.dict.itop-attachments.php
index 5afa8f22d..ffcd5278d 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/pt_br.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/pt_br.dict.itop-attachments.php
@@ -83,11 +83,13 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/ru.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/ru.dict.itop-attachments.php
index 666492848..833434634 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/ru.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/ru.dict.itop-attachments.php
@@ -84,11 +84,13 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
Dict::Add('RU RU', 'Russian', 'Русский', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/sk.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/sk.dict.itop-attachments.php
index fafea2013..b6d9c9c75 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/sk.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/sk.dict.itop-attachments.php
@@ -83,11 +83,13 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [
Dict::Add('SK SK', 'Slovak', 'Slovenčina', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/tr.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/tr.dict.itop-attachments.php
index 9c361fe06..e907661ee 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/tr.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/tr.dict.itop-attachments.php
@@ -83,11 +83,13 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [
Dict::Add('TR TR', 'Turkish', 'Türkçe', [
'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~',
'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php
index ebf9b4a82..20bb89467 100644
--- a/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php
+++ b/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php
@@ -83,11 +83,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
Dict::Add('ZH CN', 'Chinese', '简体中文', [
'Class:TriggerOnAttachmentDownload' => '触发器 (于对象附件下载时)',
'Class:TriggerOnAttachmentDownload+' => '触发器于指定类型 [子类型] 对象附件下载时',
- 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~',
- 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~',
+ 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~',
+ 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~',
'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~',
- 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~',
- 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~',
+ 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~',
+ 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~',
+ 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~',
'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~',
]);
diff --git a/datamodels/2.x/itop-attachments/src/Trigger/TriggerOnAttachmentDelete.php b/datamodels/2.x/itop-attachments/src/Trigger/TriggerOnAttachmentDelete.php
index a9c8ac7c6..34d66a692 100644
--- a/datamodels/2.x/itop-attachments/src/Trigger/TriggerOnAttachmentDelete.php
+++ b/datamodels/2.x/itop-attachments/src/Trigger/TriggerOnAttachmentDelete.php
@@ -34,9 +34,11 @@ class TriggerOnAttachmentDelete extends TriggerOnObject
];
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
+ MetaModel::Init_AddAttribute(new AttributeBoolean("file_in_email", ["sql" => 'file_in_email', "is_null_allowed" => false, "default_value" => 'true', "allowed_values" => null, "depends_on" => [], "always_load_in_tables" => false]));
+
// Display lists
- MetaModel::Init_SetZListItems('details', ['description', 'context', 'filter', 'action_list', 'target_class']); // Attributes to be displayed for the complete details
+ MetaModel::Init_SetZListItems('details', ['description', 'context', 'filter', 'action_list', 'target_class','file_in_email']); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', ['finalclass', 'target_class']); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', ['description', 'target_class']); // Criteria of the std search form
diff --git a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-brand.xml b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-brand.xml
index 58c5690b6..0c3ef6b10 100755
--- a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-brand.xml
+++ b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-brand.xml
@@ -14,16 +14,12 @@
A2IDAuMDMsLTAuMDkgMC4wNSwtMC4xOSAwLjA2LC0wLjI4IGwgMC41OSwtMS45MSBjIDAuMSwtMC4zMyAtMC4wNSwtMC40OSAtMC40NSwtMC40OCBsIC0zLjEzLDAuMTUgYyAtMi4wOSwwLjEyIC0zLjcyLDAuMTggLTQuOSwwLjE3IC0xLjU0LDAuMDggLTMuMDgsLTAuMDcgLTQuNTgsLTAuNDYgLTEuMiwtMC40MSAtMS45NCwtMS42MSAtMS43NywtMi44NiBsIDkuOTEsLTEuMjcgYyA0LjQ0LC0wLjU3IDcuNDIsLTEuOTQgOC45MiwtNC4xMiBsIC0zLjM3LDExLjczIGMg
LTAuMDcsMC4xOCAtMC4wNCwwLjM4IDAuMDcsMC41MyAwLjE4LDAuMTcgMC40MSwwLjI1IDAuNjUsMC4yMiBoIDQuMSBjIDAuNDcsMC4wNyAwLjkzLC0wLjIyIDEuMDYsLTAuNjggbCAzLjYyLC0xMi42NyBjIDAuNDgsLTEuNjcgMiwtMi40OCA0LjY3LC0yLjQ4IDIuNDEsMCA0LjIyLDAuMDIgNS4zOCwwLjA3IDAuMDMsMCAwLjA2LDAgMC4wOSwwIDAuMzksMCAwLjc0LC0wLjI2IDAuODQsLTAuNjMgbCAwLjYzLC0xLjc0IGMgMC4xNSwtMC4zIDAuMTIsLTAuNjMgLTAuMD
UsLTAuODkgbSAtNjYuMTIsMTUuMjQgYyAtMS44MywwLjIzIC0zLjY4LDAuMzMgLTUuNTIsMC4zIC00LjE3LDAgLTUuOTksLTAuODQgLTUuNDYsLTIuNTMgMC4zOCwtMS4yMSAxLjQ3LC0xLjk0IDMuMjgsLTIuMTkgbCA5LjQ4LC0xLjI4IHogbSA0My44MywtMTAuMjcgYyAtMC40LDEuMyAtMi4yNSwyLjE5IC01LjU2LDIuNjcgbCAtNy45LDEuMTMgMC4yLC0wLjY1IGMgMC4zOSwtMS43NCAxLjM3LC0zLjI4IDIuNzksLTQuMzcgMS4yLC0wLjc3IDMuMTUsLTEuMTYgNS44NiwtMS4xNiAzLjU2LDAgNS4xLDAuOCA0LjYxLDIuMzgiLz4KPC9zdmc6c3ZnPgo=0
- Brand
- Acer
Apple
image/svg+xmlicons8-mac-os.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwODgzZDkiIGQ9Ik0zNi4yMzIsMjMuOTg1YzAtNS44NjUsNC43NjYtOC41MSw0Ljk2Ni04LjYzNmMtMi41OTYtMy45OTMtNi43OS00LjQ2Ny
04LjM2Mi00LjQ2OCBjLTMuNjQzLDAtNi44NjMsMi4wMjItOC41ODUsMi4wMjJjLTEuNzk3LDAtNC40MTgtMi4xMjEtNy4zNjMtMi4wMjJjLTMuODQzLDAuMDc1LTcuMzYzLDIuMzQ2LTkuMzM0LDUuNjkxIGMtMS4zOTcsMi4zOTYtMS45NDcsNS4yMTctMS44OTYsOC4wODdjMC4wMDIsMC4xMTMsMC4wMTcsMC4yMjgsMC4wMiwwLjM0MUgzNi4zMkMzNi4yNzksMjQuNjcxLDM2LjI0MywyNC4zMzcsMzYuMjMyLDIzLjk4NXoiLz48cGF0aCBmaWxsPSIjMDg4M2Q5IiBkPSJN
MzAuNTY1LDcuMDYzQzMyLjI2MSw1LjE5MSwzMy4yMSwyLjYyMSwzMy4wNiwwYy0yLjM0NiwwLTUuMDY2LDEuMzcyLTYuNzg4LDMuMzk0IGMtMS4zNDgsMS42NzItMi43OTUsNC4yOTMtMi4yNzEsNi45MTNDMjYuNDIyLDEwLjYwNywyOS4wNDMsOS4wODUsMzAuNTY1LDcuMDYzeiIvPjxwYXRoIGZpbGw9IiMwMzcwYzgiIGQ9Ik0xNy41MTEsNDVjMi43NzEsMCwzLjc5NC0xLjg0OCw3LjQxMy0xLjg0OGMzLjM3LDAsNC40MTgsMS44NDgsNy4zMzgsMS44NDggYzMuMDcsMCw1LjA5Mi0yLjc5NSw2LjkxMy01LjU2N2MyLjI5NS0zLjIxOCwzLjA3LTYuMjg4LDMuMTY5LTYuNDE0Yy0wLjA5NCwwLTUuMjg3LTIuMTEyLTYuMDI2LTguMDE5SDUuNjc4IGMwLjE1Nyw1LjMxMSwyLjIyOCwxMC43OSw0LjY3MSwxNC4zMDlDMTIuMjcsNDIuMDU1LDE0LjQ0MSw0NSwxNy41MTEsNDV6Ii8+PC9zdmc+Cg==0
- Brand
- Apple
Asus
@@ -42,8 +38,6 @@
40ODQgMC4wMDEsLTUuNDg0ek0xMy4xMTEsMzkuOTE0aDE1LjczYzIuOTE0LC0wLjY0NyAzLjIxOCwtMy41NzcgMy4yMTgsLTMuNTc3YzAuMTM2LC0wLjg3MSAwLjA1NywtMS41NzQgMC4wNTcsLTEuNTc0Yy0wLjA4OCwtMC41ODggLTEuMDk0LC0zLjE3OCAtMy4yODEsLTMuNDA1Yy0xLjMwNCwtMC4xMzQgLTEyLjkxLC0xLjE1NSAtMTIuOTEsLTEuMTU1YzAuMjI1LDEuMjg4IDAuNzQ4LDEuOTM4IDEuMDk0LDIuMzExYzAuODA1LDAuODU3IDIuMDg3LDEuMDk5IDIuMDg3
LDEuMDk5YzAuMzA5LDAuMDMzIDguOTQ1LDAuODI0IDguOTQ1LDAuODI0YzAuMjc0LDAuMDE3IDAuNzk3LDAuMDkzIDAuNzksMC44NDljMCwwLjA5MSAtMC4wNzUsMC43NTcgLTAuNzM4LDAuNzU3aC0xMi4wMTRjLTAuMjc2LDAgLTAuNSwtMC4yMjQgLTAuNSwtMC41di01LjM3M2wtMy40NzgsLTAuMjgxdjkuMDI3YzAsMC41NSAwLjQ0OCwwLjk5OCAxLDAuOTk4ek00Ny40NDQsMzcuMDE3YzAuMDAxLC0wLjU1MiAwLjQ0OCwtMC45OTggMSwtMC45OThoMTEuNDI5YzAuMj
g2LDAgMC41OTUsLTAuMTg3IDAuNTk1LC0wLjE4N2MwLjEzLC0wLjEyOSAwLjIzNSwtMC4zNjQgMC4yMzUsLTAuNTkxYzAsLTAuNzUzIC0wLjU2MSwtMC43ODYgLTAuODQzLC0wLjgwM2MwLDAgLTguNzMyLC0wLjgwOCAtOS4wMzYsLTAuODM0YzAsMCAtMS4yMTEsLTAuMjA3IC0yLjAxNywtMS4wNjhjLTAuMzUxLC0wLjM2OSAtMC44MTUsLTAuNzcxIC0xLjE2MSwtMi4wOTljMCwwIDExLjY3MSwwLjc2MyAxMi45NjgsMC44OTdjMi4xODksMC4yMzIgMy4yMTUsMi42MzIgMy4zMDgsMy40M2MwLDAgMC4wOTMsMC43MjIgLTAuMDIsMS42MDdjMCwwIC0wLjQ1NCwzLjM3NCAtMy42NjQsMy41NzloLTExLjc5N2MtMC41NTMsMCAtMS4wMDEsLTAuNDQ5IC0xLC0xLjAwMnoiIGZpbGw9InVybCgjY29sb3ItMikiIGlkPSJwYXRoMTEiLz48L2c+PC9nPjwvc3ZnPgo=0
- Brand
- Asus
Cisco
@@ -63,24 +57,18 @@
jEsMC40ODUgMC4wMDMsMC43MjMgYSAxLjUzNiwxLjUzNiAwIDAgMSAtMC43NDQsMC44OTIgMy42OTEsMy42OTEgMCAwIDEgLTEuMjM5LDAuMzg3IDksOSAwIDAgMSAtMS45MiwwLjA5NyAyMS45NzMsMjEuOTczIDAgMCAxIC0yLjUwNywtMC4zMzQgYyAtMC40MzMsLTAuMDkgLTAuODY0LC0wLjE5IC0xLjI5MSwtMC4zMDMgeiBtIC0xMS4xNDQsNC40ODIgaCA0LjczIFYgMzcuODQ2IGggLTQuNzMgeiBNIDg1LjMwNSw0My4zODYgYSA0LjkzNCw0LjkzNCAwIDEgMSA2LjE
1Nyw3LjcxMSA0LjkzNCw0LjkzNCAwIDAgMSAtNi4xNTcsLTcuNzEgbSAtNi44NjcsMy44NDggYSA5Ljg3LDkuODcgMCAwIDAgMTIuMDAyLDkuNDg1IDkuNjI5LDkuNjI5IDAgMCAwIDMuMTU3LC0xNy43MjkgOS45MzQsOS45MzQgMCAwIDAgLTE1LjE2LDguMjQ0IiBpZD0icGF0aDIiLz48dXNlIGhyZWY9IiNiYXJfc2hvcnQiIHg9IjAiIGlkPSJ1c2UzIi8+PHVzZSBocmVmPSIjYmFyX3RhbGwiIHg9IjAiIGlkPSJ1c2U0Ii8+PHVzZSBocmVmPSIjYmFyX2dyYW5kZSIge
D0iMCIgaWQ9InVzZTUiLz48dXNlIGhyZWY9IiNiYXJfdGFsbCIgeD0iMjUuODc1IiBpZD0idXNlNiIvPjx1c2UgaHJlZj0iI2Jhcl9zaG9ydCIgeD0iNTEuNzUiIGlkPSJ1c2U3Ii8+PHVzZSBocmVmPSIjYmFyX3RhbGwiIHg9IjUxLjc1IiBpZD0idXNlOCIvPjx1c2UgaHJlZj0iI2Jhcl9ncmFuZGUiIHg9IjUxLjc1IiBpZD0idXNlOSIvPjx1c2UgaHJlZj0iI2Jhcl90YWxsIiB4PSI3Ny42MjUiIGlkPSJ1c2UxMCIvPjx1c2UgaHJlZj0iI2Jhcl9zaG9ydCIgeD0iMTAzLjM3NSIgaWQ9InVzZTExIi8+PC9nPjxtZXRhZGF0YSBpZD0ibWV0YWRhdGExMSI+PHJkZjpSREY+PGNjOldvcmsgcmRmOmFib3V0PSIiPjxkYzp0aXRsZT5DaXNjby5jb20gRnJhbmNlPC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PC9zdmc+Cg==0
- Brand
- Cisco
Dell
image/svg+xmlicons8-dell.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwMjg4ZDEiIGQ9Ik0yNCw0QzEyLjk1Niw0LDQsMTIuOTU2LDQsMjRzOC45NTYsMjAsMjAsMjBzMjAtOC45NTYsMjAtMjBTMzUuMDQ0LDQsMjQs
NHogTTI0LDQxYy05LjM5MSwwLTE3LTcuNjA5LTE3LTE3UzE0LjYwOSw3LDI0LDdzMTcsNy42MDksMTcsMTdTMzMuMzkxLDQxLDI0LDQxeiIvPjxwYXRoIGZpbGw9IiMwMjg4ZDEiIGQ9Ik0zNS42NDEsMjUuNTYzbDIuODQsMC4wMDRsLTAuMDA0LDIuMzk1bC01LjY5MS0wLjAxMmwwLjAxMi04LjE3MmwyLjg1NSwwLjAwNEwzNS42NDEsMjUuNTYzeiBNMjYuMzQsMjUuMTAybC00LjY5OSwzLjY4NGwtNC4yODUtMy4zNzljLTAuNjIxLDEuNDg0LTIuMTA5LDIuNTItMy44Mz
YsMi41MTZsLTMuNjY0LTAuMDA0bDAuMDA4LTguMTcybDMuNjY4LDAuMDA0YzEuOTI2LDAuMDA0LDMuMzA5LDEuMjIzLDMuODI4LDIuNTMxbDQuMjk3LTMuMzY3bDEuNTg2LDEuMjVsLTMuOTM0LDMuMDg2bDAuNzU0LDAuNTk0bDMuOTM0LTMuMDg2bDEuNTksMS4yNTRsLTMuOTM0LDMuMDgybDAuNzUsMC41OTRsMy45NDEtMy4wODJsMC4wMDQtMi44MzZsMi44NTIsMC4wMDRsLTAuMDA4LDUuNzgxbDIuODQsMC4wMDRsLTAuMDA0LDIuMzkxbC01LjY5MS0wLjAwOEwyNi4zNCwyNS4xMDJ6IE0xNS4wMTIsMjMuODRjMC0xLjExMy0wLjczLTEuNzQyLTEuNzctMS43NDJoLTAuNjM3bC0wLjAwNCwzLjQ3N2gwLjYyMUMxNC4xODQsMjUuNTc0LDE1LjAxMiwyNS4wNTEsMTUuMDEyLDIzLjg0Ii8+PC9zdmc+Cg==0
- Brand
- Dell
HP Inc
image/svg+xmlicons8-hp.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0yNCA0QTIwIDIwIDAgMSAwIDI0IDQ0QTIwIDIwIDAgMSAwIDI0IDRaIi8+PHBhdGggZmlsbD0iIzE5NzZkMiIgZD0iTTI0LDQzLj
k5N2MtMC4xOTksMC0wLjY1MiwwLjAwNi0wLjg1LDBsNC0xMC45OTloNS42MjVjMC45ODcsMCwyLjA3MS0wLjc1OSwyLjQwOS0xLjY4Nmw0Ljc0OC0xMi42ODdjMC43MjUtMS45OTUtMC40MTctMy42MjYtMi41MzktMy42MjZoLTcuODA0bC02LjUxOCwxOC4yNTdoLTAuMDAybC0zLjcxMiwxMC4xOThDMTAuNTUsNDEuMzYxLDQsMzMuNDQ1LDQsMjMuOTk5YzAtOS4xNzQsNi4xNzgtMTYuOTA1LDE0LjYtMTkuMjYxbC0zLjgzLDEwLjUyNmgtMC4wMDFMOC4xNSwzMi45OTho
NC4yMzlsNS41NzYtMTQuOTk5aDMuMTg1bC01LjU3NiwxNC45OTlsMy45MTksMC4wMDFsNS40MzgtMTQuMzc0YzAuNzI2LTEuOTk1LTAuNDE2LTMuNjI2LTIuNTM2LTMuNjI2SDE5LjE1bDMuOTUxLTEwLjk3OEMyMy4zOTksNC4wMDgsMjMuNjk5LDQsMjQsNGMxMS4wNDYsMCwyMCw4Ljk1MywyMCwxOS45OTlTMzUuMDQ2LDQzLjk5NywyNCw0My45OTd6IE0zNi4xNSwxNy45OTloLTMuMTg1bC00LjUwOSwxMS45OTloMy4xODVMMzYuMTUsMTcuOTk5eiIvPjwvc3ZnPgo=0
- Brand
- HP Inc
HPE
@@ -90,8 +78,6 @@
hcGU6Y3g9Ii0yMTcuOTQxNzUiIGlua3NjYXBlOmN5PSIyNzUuMTQyNCIgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIyNTYwIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMzYwIiBpbmtzY2FwZTp3aW5kb3cteD0iMCIgaW5rc2NhcGU6d2luZG93LXk9IjAiIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImthdG1hbl8xIj48c29kaXBvZGk6Z3VpZGUgcG9zaXRpb249IjE5Ny42NjI0NCwzMTQuNDg4NDgiIG9yaWVudGF0a
W9uPSIwLC0xIiBpZD0iZ3VpZGUyIiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PC9zb2RpcG9kaTpuYW1lZHZpZXc+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgaWQ9InN0eWxlMSI+Cgkuc3Qwe2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MzY7fQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwM0E4ODM7c3Ryb2tlLXdpZHRoOjM2O30KPC9zdHlsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0ibSAxOC41MTE5ODcsNDA1LjkzMDEyIHYgLTE4MCBtIDE
1NC4wMDAwMDMsMTgwIHYgLTE4MCBtIC0xNTQuMDAwMDAzLDg5IEggMTU1LjUxMTk5IG0gOTUsOTEgdiAtMTgwIG0gMCwxOCBoIDEwMiBjIDI3LjYsMCA1MCwyMi40IDUwLDUwIDAsMjcuNiAtMjIuNCw1MCAtNTAsNTAgaCAtMTAyIG0gMjIyLC02NyB2IC0zMyBoIDE1OCIgaWQ9InBhdGgxIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Im0gNjMwLjUxMTk5LDM4Ny45MzAxMiBoIC0xNTggdiAtNzYgaCAxNTgiIGlkPSJwYXRoMiIvPgo8L3N2Zz4K0
- Brand
- HPE
IBM
@@ -100,8 +86,6 @@
3IDE2ek0zNi43NzYgMzJMMzcuNTMxIDM0IDM4LjI3NiAzMnpNNDIgMzJINDhWMzRINDJ6TTM5LjQ3OSAxN0wzOC44MTkgMTkgNDYgMTkgNDggMTkgNDggMTd6TTM5LjM5MyAyOUwzNS42NDMgMjkgMzYuMzk4IDMxIDM4LjY0OCAzMXpNNDIgMjZINDZWMjhINDJ6TTM4LjQ5IDIwTDM3LjgzIDIyIDQ2IDIyIDQ2IDIwek0wIDE0SDhWMTZIMHpNMCAxN0g4VjE5SDB6TTIgMjBINlYyMkgyek0yIDIzSDZWMjVIMnpNMiAyNkg2VjI4SDJ6TTAgMjlIOFYzMUgwek0wIDMySDhWM
zRIMHpNMTAgMTdIMThWMTlIMTB6TTI0Ljk3NyAxNmMtLjkxMy0xLjIwOC0yLjM0Ny0yLTMuOTc3LTJIMTB2Mmg3LjAyM0gyNC45Nzd6Ii8+PHBhdGggZmlsbD0iIzNmNTFiNSIgZD0iTTI1LjU3OCAxN2gtOS4xMzFDMTYuMTcxIDE3LjYxMyAxNiAxOC4yODMgMTYgMTloMTBDMjYgMTguMjg4IDI1Ljg0NiAxNy42MTMgMjUuNTc4IDE3ek0yMy45NzUgMjNIMTJ2MmgxMS45NzNjLS44MzMtLjYyLTEuODU0LTEtMi45NzMtMUMyMi4xMTkgMjQgMjMuMTQyIDIzLjYyMSAyMy4
5NzUgMjN6TTE3LjAyMyAzMkgxMHYyaDExYzEuNjMgMCAzLjA2NS0uNzkyIDMuOTc3LTJIMTcuMDIzek0xOCAyOWgtMi02djJoNi40NDdIMThoNy41NzhDMjUuODQ2IDMwLjM4NyAyNiAyOS43MTIgMjYgMjlIMTh6TTIxIDIwYzAgMCAwIC4wODMgMCAxcy0xIDEtMSAxaDQuOTc5Yy40NDEtLjU4NC43Ny0xLjI1Ny45MjEtMkgyMXpNMTIgMjBIMTdWMjJIMTJ6Ii8+PGc+PHBhdGggZmlsbD0iIzNmNTFiNSIgZD0iTTIxIDI4aDQuODg1Yy0uMTU2LS43MzgtLjQ2Ny0xLjQxOC0uOTA3LTJIMjBjMCAwIDEgLjE2NyAxIDFTMjEgMjggMjEgMjh6TTEyIDI2SDE3VjI4SDEyeiIvPjwvZz48L3N2Zz4K0
- Brand
- IBM
Lenovo
@@ -114,8 +98,6 @@
ZmlsbD0iI2ZmZiIgZD0iTTIxLjM3NywyNy45ODdjMC0wLjA5NSwwLjAwMS0yLjU4NywwLTMuNjYzYy0wLjAwMS0wLjc1OS0wLjYwNS0xLjMyNy0xLjQxNC0xLjMzMSBjLTAuNzk0LTAuMDA1LTEuMzgzLDAuNTYtMS4zODQsMS4zMzJjLTAuMDAxLDEuMDc2LDAsMy42NzksMCwzLjY3OWwtMS43NDEsMC4wMDJsMC4wMDctNi4zNzhjMCwwLDEuMTY4LTAuMDE4LDEuNzIyLTAuMDE4IGMwLDAuMjY0LTAuMDA2LDAuODMyLTAuMDA2LDAuODMyczAuMTM4LTAuMTI4LDAuMTgxLT
AuMTcxYzEuMTU3LTEuMTc0LDMuMjI2LTAuOTczLDQuMDMxLDAuMzkxIGMwLjIyMywwLjM3OCwwLjMzOCwwLjc4OSwwLjM0LDEuMjIzYzAuMDA4LDEuMjY0LDAuMDAzLDQuMTA0LDAuMDAzLDQuMTA0UzIxLjk2NCwyNy45ODcsMjEuMzc3LDI3Ljk4N3oiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMzAuMTY0LDIxLjYwOGMwLjY0MiwwLDEuOTY0LDAuMDE1LDEuOTY0LDAuMDE1czEuNDc4LDQuMDI0LDEuNTI2LDQuMTQ5IGMwLjExNS0wLjMxMSwxLjIwOC0zLjI5LDEuNTIx
LTQuMTc0YzAuNjQ2LDAuMDE4LDEuMjg4LDAuMDEsMS45NywwLjAxYy0wLjAyOSwwLjA4NC0yLjU2Miw2LjM5OC0yLjU2Miw2LjM5OGwtMS44NzYtMC4wMDMgQzMxLjkwNSwyNi4wNDIsMzAuMTkxLDIxLjY5MiwzMC4xNjQsMjEuNjA4eiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik01Ljc2NywyNi4zOTNjMC4xMDQsMCwzLjg2OCwwLjAxMSwzLjg2OCwwLjAxMWwtMC4wMDIsMS41ODFMNCwyNy45ODl2LTguMDczaDEuNzcgQzUuNzcsMTkuOTE2LDUuNzY3LDI2LjI4NCw1Ljc2NywyNi4zOTN6Ii8+PC9zdmc+Cg==0
- Brand
- Lenovo
Razer
@@ -146,8 +128,6 @@
zIuNyA4Yy0uMSAwLS4zIDAtLjYuNEMzMiA4LjYgMzIgOC45IDMyIDkuMWMwIDEuMyAxLjggMi45IDMuNSA0LjQgMi43IDIuNCA1LjcgNS4yIDQgOC40LS41IDEtMS4zIDEuNi0yLjMgMS45LTEuMS4zLTIuMy4xLTMuNC0uNEMzMi42IDI0LjYgMzAuOCAyNSAyOS40IDI1ek0yOSAyMWMtLjIgMC0uNC4xLS42LjItLjIuMS0uNC40LS40LjYtLjEuNS4zIDEuMS44IDEuMi41LjEgMS45LjEgMi45LS41LS41LS4zLTEtLjYtMS41LS45LS40LS4zLS45LS42LTEuMS0uNkMyOS4
xIDIxIDI5LjEgMjEgMjkgMjF6Ii8+PHBhdGggZD0iTTMyLjYgMjEuN2MuMi0uMi40LS42LjYtLjkuMi0uMy4zLS43LjMtMS4xIDAtLjQgMC0uNy0uMi0xLjEtLjEtLjQtLjQtLjctLjgtMSAuNC4yLjguMyAxLjIuNy4zLjMuNi44LjggMS4zLjEuNS4yIDEgLjIgMS41IDAgLjUtLjEgMS0uMyAxLjVsMCAuMWMtLjIuNS0uOC44LTEuMy42cy0uOC0uOC0uNi0xLjNDMzIuNCAyMS45IDMyLjUgMjEuOCAzMi42IDIxLjd6TTQwLjggNC4xYy0uMiAwLS40LS4yLS41LS40IDAtL
jMuMS0uNS40LS42LjEgMCAuMi0uMi4yLS42QzQxIDIuMiA0MS4yIDIgNDEuNSAyUzQyIDIuMiA0MiAyLjVDNDIgMy4zIDQxLjUgNCA0MC44IDQuMSA0MC45IDQuMSA0MC45IDQuMSA0MC44IDQuMXoiLz48cGF0aCBkPSJNMzksNC41Yy0wLjIsMC0wLjQtMC4yLTAuNS0wLjRjLTAuMS0wLjMsMC4xLTAuNSwwLjQtMC42QzM5LDMuNSw0MSwzLDQyLjUsM0M0Mi44LDMsNDMsMy4yLDQzLDMuNVM0Mi44LDQsNDIuNSw0IGMtMS40LDAtMy40LDAuNS0zLjQsMC41QzM5LjEsNC41LDM5LDQuNSwzOSw0LjV6Ii8+PC9zdmc+Cg==0
- Brand
- Razer
Samsung
@@ -163,8 +143,6 @@
y0wLjAxMy0wLjIzNS0wLjAxMS0wLjMyNXYtMy41NmgxLjI1NHYzLjY3MmMwLDAuMDY0LDAuMDAyLDAuMTM3LDAuMDEyLDAuMTkgQzI4LjkyMSwyNS40NzMsMjkuMDI1LDI1LjcxMywyOS4zNzIsMjUuNzEzeiIvPjxwYXRoIGZpbGw9IiNmYWZhZmEiIGQ9Ik0zOS43MjUsMjUuNjZjMC4zNTksMCwwLjQ4NS0wLjIyNywwLjUwOC0wLjM1OWMwLjAwOS0wLjA1NywwLjAxMi0wLjEyNiwwLjAxMS0wLjE4OXYtMC43MiBoLTAuNTA5di0wLjcyNGgxLjc2VjI1Yy0wLjAwMSwwLjA
5My0wLjAwMywwLjE2Mi0wLjAxOCwwLjMyN2MtMC4wODIsMC45MDMtMC44NjYsMS4yMjUtMS43NDUsMS4yMjUgYy0wLjg4MSwwLTEuNjYzLTAuMzIyLTEuNzQ3LTEuMjI1Yy0wLjAxNC0wLjE2Ni0wLjAxNi0wLjIzNC0wLjAxOC0wLjMyN2wwLjAwMS0yLjA4OWMwLTAuMDg4LDAuMDExLTAuMjQ0LDAuMDIxLTAuMzI3IGMwLjExLTAuOTI4LDAuODYyLTEuMjI2LDEuNzQzLTEuMjI2YzAuODgsMCwxLjY1MSwwLjI5NywxLjc0MiwxLjIyNmMwLjAxNiwwLjE1OCwwLjAxMSwwL
jMyNywwLjAxMSwwLjMyN3YwLjE2NmgtMS4yNTF2LTAuMjc4IGMwLjAwMSwwLjAwMS0wLjAwMi0wLjExOC0wLjAxNi0wLjE4OWMtMC4wMjEtMC4xMS0wLjExNi0wLjM2Mi0wLjQ5NS0wLjM2MmMtMC4zNjIsMC0wLjQ2NywwLjIzOC0wLjQ5NCwwLjM2MiBjLTAuMDE1LDAuMDY1LTAuMDIxLDAuMTU0LTAuMDIxLDAuMjM0djIuMjdjLTAuMDAxLDAuMDYzLDAuMDAzLDAuMTMyLDAuMDEzLDAuMTg5QzM5LjI0MSwyNS40MzMsMzkuMzY2LDI1LjY2LDM5LjcyNSwyNS42NnoiLz48L3N2Zz4K0
- Brand
- Samsung
Sony
@@ -187,8 +165,6 @@
OTkyIC03Mi4wODk2LC04MS45MTk5OSAtNzUuMjg5NiwtODUuNTAzOTkgLTMuOTkzNiwtNC4zNTIgLTExLjAwOCwtMTEuMDg0NzkgLTIxLjY4MzIsLTExLjA4NDc5IGggLTI0LjQ0Nzk2IHYgLTI1LjAzNjggaCAxMzcuOTgzOTYgdiAyNC45ODU2IGggLTE2LjY0IGMgLTMuODQsMCAtNi40LDMuNjYwNzkgLTMuMTIzMiw3LjY3OTk5IDAsMCA0Ni40Mzg0LDU1LjU1MiA0Ni44NzM2LDU2LjE0MDggMC40MzUyLDAuNTg4OCAwLjgxOTIsMC43MTY4IDEuNDA4LDAuMTc5MiAwLj
U4ODgsLTAuNTM3NiA0Ny41OTA0LC01NS44MDggNDcuOTQ4OCwtNTYuMzIgYSA0Ljc4NzE5OTQsNC43ODcxOTk0IDAgMCAwIC00LjA5NiwtNy42Nzk5OSBoIC0xNy4wNzUyIFYgNTM5LjA2MjEgSCAxMjgwIHYgMjUuMDM2OCBoIC0yNS4yNjcyIGMgLTkuMTY0OCwwIC0xMi44LDEuNjg5NTkgLTE5Ljc4ODgsOS40NzE5OSBsIC03Ni4xNiw4Ni44ODYzOSBhIDUuMzc1OTk5NCw1LjM3NTk5OTQgMCAwIDAgLTAuOTIxNiwzLjY4NjQgdiAzOS41MjY0IGEgMjguMTU5OTk3LDI4
LjE1OTk5NyAwIDAgMCAwLjU2MzIsNS40MDE2IDguNTI0Nzk5LDguNTI0Nzk5IDAgMCAwIDUuNDAxNiw0LjgxMjggNTAuNjExMTk0LDUwLjYxMTE5NCAwIDAgMCA2LjkxMiwwLjQzNTIgaCAyNS44MzA0IHYgMjUuMDM2OCBoIC0xMzcuMjY3MiB2IC0yNS4wMzY4IHoiIGlkPSJwYXRoMSIgZmlsbD0iIzAwMDAwMCIgc3R5bGU9InN0cm9rZS13aWR0aDoyLjU2Ii8+PC9zdmc6Zz48L3N2ZzpnPjwvc3ZnOnN2Zz4K0
- Brand
- Sony
Toshiba
@@ -198,8 +174,6 @@
uMDEzIiBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjI1NjAiIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEzNjAiIGlua3NjYXBlOndpbmRvdy14PSIwIiBpbmtzY2FwZTp3aW5kb3cteT0iMCIgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSI+PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSIyMjcuMzE3MTYsMzk5LjM4NTQyIiBvcmllbnRhdGlvbj0iMCwtMSIgaWQ9Imd1aWRlMSIgaW5rc2NhcGU6bG9ja2VkPSJmY
WxzZSIvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxzdmc6cGF0aCBmaWxsPSIjZTYxZTFlIiBkPSJtIDc2Ni4xMDAxNiw0NTkuNzEzNiBoIDM0LjU1IGwgLTM1LjY1LC0xMTcuNjYgLTQ5LjEsLTAuMDAyIC0zNS42NSwxMTcuNjYgaCAzNC41NiBsIDYuMywtMjEuNzggaCAzOC42NiBsIDYuMzMsMjEuNzggbSAtMzcuNTEsLTQ3Ljk0MyAxMS43NiwtNDAuNjUxIGggMC4yIGwgMTEuNzYsNDAuNjUxIHogbSAtNTU1LjQ2LDUwLjA1NSBjIDM1LjQ4LDAgNTIuNjMsLTYuMjU
gNTUuMDYsLTM4LjI2NSAwLjU4LC03LjYxOCAwLjY5LC0xNS40MzkgMC42OSwtMjIuNjg5IDAuMDEsLTcuMjI1IC0wLjExLC0xNS4wNTQgLTAuNjksLTIyLjY3MSAtMi40MywtMzIuMDI1IC0xOS41OCwtMzguMjY1IC01NS4wNiwtMzguMjY1IC0zNS40OCwwIC01Mi42Miw2LjI0IC01NS4wNCwzOC4yNjUgLTAuNTksNy42MTcgLTAuNzEsMTUuNDQ2IC0wLjcxLDIyLjY3MSAwLjAxLDcuMjUgMC4xMiwxNS4wNzEgMC43MSwyMi42ODkgMi40MiwzMi4wMTUgMTkuNTYsMzguMjY1IDU1LjA0LDM4LjI2NSBtIC0yMi4zMSwtNjAuOTU0IGMgMCwtNi40NjEgMC4xNiwtMTAuMjggMC4zLC0xMy4xMTQgMC45LC0xOC4xNjEgOC4wNywtMjAuMjc4IDIyLjAxLC0yMC4yNzggMTMuOTUsMCAyMS4xMiwyLjExNyAyMi4wMSwyMC4yNzggMC4xNCwyLjgzMyAwLjMxLDYuNjUyIDAuMzEsMTMuMTE0IDAsNi40ODIgLTAuMTcsMTAuMzA4IC0wLjMxLDEzLjEzNSAtMC44OSwxOC4xNjQgLTguMDYsMjAuMjg1IC0yMi4wMSwyMC4yODUgLTEzLjk0LDAgLTIxLjExLC0yLjEyMSAtMjIuMDEsLTIwLjI4NSAtMC4xNCwtMi44MjcgLTAuMywtNi42NTMgLTAuMywtMTMuMTM1IHogTSAwLjY1MDE1ODIyLDM0Mi4xMDU2IHYgMjkuMzMxIEggMzUuODIyMTU4IHYgODguMzI3IGggMzUuMTg1IHYgLTg4LjMyNyBoIDM1LjE3MzAwMiB2IC0yOS4zMzEgSCAwLjY1MDE1ODIyIE0gNTQwLjUwMDE2LDQ1OS43MTM2IHYgLTExNy42NjIgaCAtMzMuMzkgdiAxMTcuNjYyIGggMzMuMzkgbSAtMTM0LjM1LC03NC43MDMgdiAtNDIuOTU5IGggLTMzLjIgdiAxMTcuNjYyIGggMzMuMiB2IC00NS4zNzIgaCAzOC41OCB2IDQ1LjM3MiBoIDMzLjE5IHYgLTExNy42NjIgaCAtMzMuMTkgdiA0Mi45NTkgaCAtMzguNTggbSAyNDQuMTcsMTMuMjA2IGMgMTQuNzksLTMuNzgxIDE5LjEzLC0xMi42MTYgMTkuMTMsLTI1LjM4NiAwLC0yNS44NTkgLTE2LjI3LC0zMC43OCAtMzkuNCwtMzAuNzggaCAtNTkuOTUgdiAxMTcuNjYgaCA2Mi45MiBjIDI4Ljk3LDAgMzguNzEsLTEyLjQ4IDM4LjcxLC0zMS42NzUgMCwtMTMuMzgzIC0zLjA2LC0yNS4xOTEgLTIxLjQxLC0yOS44MjIgbSAtNDcuMDMsMTMuMTY5IGggMjMuMDIgYyA5LjMsMCAxMS4yNCw0LjA3NCAxMS4yNCwxMC43IDAsNi42MzIgLTMuNjQsMTAuNzE3IC0xMS4yNCwxMC43MTcgaCAtMjMuMDIgeiBtIDAsLTQyLjQyNSBoIDIzLjAyIGMgNi4wMSwwIDkuNzMsMi44NTEgOS43Myw5LjcwOCAwLDUuODc4IC0zLjY4LDkuNDk2IC05LjczLDkuNDk2IGggLTIzLjAyIHogbSAtMzU1LjA2LDUyLjE0MyBoIDMxLjY1IGMgMC4wMyw1LjcwOCAwLjc2LDkuNTIzIDMuNTMsMTEuNjMgMy4xNSwyLjM3NCA1Ljk3LDMuMTU4IDE1LjMyLDMuMTU4IDksMCAxOC44NiwwIDE4Ljg2LC0xMS4wODUgMCwtOC43NDIgLTUuNTEsLTEwLjczNyAtMTUuNjgsLTExLjI3OSAtMjUuMjIsLTEuMzM2IC0zNC4zNCwtMi4wNDkgLTQzLjczLC05LjAyNSAtNi40LC00Ljc1NyAtOS43MiwtMTQuMDE4IC05LjcyLC0yNi41NDIgMCwtMjEuMjk3IDcuNDMsLTI4Ljc2OCAxOC4xNSwtMzMuOTgxIDExLjA2LC01LjM4MSA1NC40NywtNS4zODEgNjYuMTUsMCAxNC42OSw2Ljc2OCAxNS4xMiwyMS40MiAxNS4xMiwzNS4wMTEgaCAtMzEuNTcgYyAtMC4wNiwtNi45MjkgLTEuNjIsLTguODg2IC0yLjg5LC0xMC4xNzUgLTMuMjgsLTIuOTA4IC03Ljk1LC0zLjUyMiAtMTQuNjksLTMuNTIyIC04LjE2LDAgLTE3LjYsMC4zNjggLTE3LjYsMTAuMjc3IDAsNy41NiAzLjI3LDEwLjcyIDExLjg1LDExLjI3NiAxMS43OSwwLjc1NCAzNS4wMiwxLjQ5NyA0My4zLDYuMzgzIDExLjYxLDYuODY3IDE0LjYyLDE2LjE1OSAxNC42MiwzMS4zMTkgMCwyMS45MDggLTcuODQsMjguMzM4IC0xOC43NSwzMy4xNTggLTEyLjU5LDUuNTYgLTU0LjY0LDUuNTYgLTY4LjMxLC0wLjQzIC0xNS4zLC02LjY3IC0xNS42MSwtMTkuOTY0IC0xNS42MSwtMzYuMTczIiBpZD0icGF0aDEiLz4KPC9zdmc6c3ZnPgo=0
- Brand
- Toshiba
diff --git a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osfamily.xml b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osfamily.xml
index 371582bad..d9b0bcd89 100755
--- a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osfamily.xml
+++ b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osfamily.xml
@@ -3,8 +3,6 @@
Arch
image/svg+xmlicons8-arch-linux.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iMCwwLDI1NiwyNTYiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIGZpbGwtcnVsZT0ibm9uemVybyI+PGcgZmlsbD0iIzAwODhjYyIgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgZm9udC1mYW1pbHk9Im5vbmUiIGZvbnQtd2VpZ2h0PSJub25lIiBmb250LXNpemU9Im5vbmUiIHRleHQtYW5jaG9yPSJub25lIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI+PGcgdHJhbnNmb3JtPSJzY2FsZSg1LjMzMzMzLDUuMzMzMzMpIj48cGF0aCBkPSJNMjguNDY1LDM4LjYxMWMwLjQxOSwtMS4xMDUgMC42NjQsLTIuMzY1IDAuNjY0LC0zLjcxNGMwLC00LjEzMyAtMi4yMTEsLTcuNDk0IC00LjkyOSwtNy40OTRjLTIuNzQxLDAgLTQuOTUxLDMuMzYxIC00Ljk1MSw3LjQ5NGMwLDEuMzI2IDAuMjIxLDIuNTg2IDAuNjQxLDMuNjY5Yy05LjA0MSwwLjk1MSAtMTUuNDA3LDQuNzMxIC0xNy45OTMsNi40MzJjNC4zNTUsLTYuMjc4IDguOTA5LC0xMy42MzggMTMuMjYyLC0yMi4xMDVjMS4wODMsLTIuMTAxIDIuMTAxLC00LjE3OCAzLjA1LC02LjIxMWMwLjM3NSwwLjI0MyAwLjc1MSwwLjUwOSAxLjE3MSwwLjc3NWMxLjk0NSwxLjIxNSAzLjc1OSwxLjg3OSA1LjA4NCwyLjIzM2MtMC45NzMsLTAuNzMgLTIuMDMzLC0xLjYxMyAtMy4xMTYsLTIuNjk3Yy0wLjgxNywtMC44MTcgLTEuNTQ3LC0xLjYzNyAtMi4xNjcsLTIuNDMzYzEuODM1LC00LjAyMiAzLjQyNywtNy44OTEgNC44MTksLTExLjU2YzIuMzIsNi4xNDQgNS4yMTcsMTIuODQyIDguODQxLDE5Ljg5M2MyLjM0Myw0LjUzMSA0LjczMSw4Ljc1NCA3LjExNywxMi42NDRjLTAuNjg1LC0wLjM3NSAtMS40MzcsLTAuNzMgLTIuMjMzLC0xLjAzOWMtMS4zNzEsLTAuNTMgLTIuNjUyLC0wLjg2MiAtMy43NTksLTEuMDZjMS41MDMsMC43NTEgMy4yNSwxLjc0NyA1LjA4NCwzLjA3M2MxLjE5NCwwLjg4NSAyLjI1NCwxLjc2OSAzLjE2MSwyLjYzMWMwLjAyMSwwLjAyMSAwLjAyMSwwLjAyMSAwLjA0NSwwLjA0NWMxLjI2LDIuMDU2IDIuNTY1LDMuOTU3IDMuODQ2LDUuODEzYy0yLjU0MSwtMS42ODEgLTguNzk2LC01LjM5NSAtMTcuNjM3LC02LjM4OXoiLz48L2c+PC9nPjwvc3ZnPgo=0
- OS Family
- Arch
Debian
@@ -24,8 +22,6 @@
k5LTQuMjZjMC42NjktMC44NDEtMC4xMzItMC4wMDItMC4yNjMtMC4yMTVjMS40NjktMS41MiwxLjkzLTEuMDczLDIuOTItMS4zNDljMS4wNjgtMC42MzMtMC45MTcsMC4yNTEtMC40MS0wLjIzOWMxLjg0OC0wLjQ3MywxLjMxLTEuMDczLDMuNzE4LTEuMzExYzAuMjU0LDAuMTQ1LTAuNTksMC4yMjMtMC44LDAuNDFjMS41MzgtMC43NTMsNC44Ny0wLjU4NCw3LjAzNCwwLjQxN2MyLjUxMSwxLjE3Myw1LjMzLDQuNjQyLDUuNDQzLDcuOTA0bDAuMTI2LDAuMDM1Yy0wLjA2
MywxLjI5OCwwLjE5OCwyLjc5OC0wLjI1Nyw0LjE3NUwzNS4yOTQsMjAuOTg2IE0yMC4wNzIsMjUuMzg5bC0wLjA4NiwwLjQzMWMwLjQwMywwLjU0NywwLjcyNCwxLjE0MiwxLjIzNywxLjU2N0MyMC44NTMsMjYuNjY0LDIwLjU3NywyNi4zNjQsMjAuMDcyLDI1LjM4OSBNMjEuMDIzLDI1LjM1M2MtMC4yMTMtMC4yMzctMC4zNC0wLjUxOC0wLjQ4LTAuODAyYzAuMTM1LDAuNDk1LDAuNDExLDAuOTIyLDAuNjY5LDEuMzU3TDIxLjAyMywyNS4zNTMgTTM3Ljg3NywyMS42OD
hsLTAuMDg4LDAuMjI2Yy0wLjE2NiwxLjE3NC0wLjUyMywyLjMzMi0xLjA2OCwzLjQxMkMzNy4zMjQsMjQuMTg5LDM3LjcxNCwyMi45NDcsMzcuODc3LDIxLjY4OCBNMjQuNTYsNS4xODVDMjQuOTc0LDUuMDMxLDI1LjU3OSw1LjEwMSwyNi4wMTksNWMtMC41NzMsMC4wNDgtMS4xNDQsMC4wNzktMS43MDYsMC4xNTFMMjQuNTYsNS4xODUgTTEwLjAwNywxMi45MjNjMC4wOTUsMC44ODItMC42NjcsMS4yMjksMC4xNjcsMC42NDRDMTAuNjIzLDEyLjU2MiwxMCwxMy4yODYsMTAuMDA3LDEyLjkyMyBNOS4wMjgsMTcuMDE2YzAuMTkxLTAuNTkyLDAuMjI2LTAuOTQzLDAuMy0xLjI4NUM4Ljc5NywxNi40MSw5LjA4NCwxNi41NTMsOS4wMjgsMTcuMDE2Ii8+PC9zdmc+Cg==0
- OS Family
- Debian
Oracle Linux
@@ -41,8 +37,6 @@
Jva2UtbGluZWNhcDpzcXVhcmU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIgZD0ibSAyNS4zOTE1MTcsNDcuOTMwODcxIGggNC45ODA4NjMgdiAzLjgzMDAyNSBoIC00Ljk4MDg2MyB6IG0gNjEuNTAwOCwxOC41NTcwNjEgLTcuMjQsLTEwLjI0MDAwMiBoIDQuOTYgbCA0LjY0LDcuMDgwMDAyIGggMC4yNCBsIDQuNzYsLTcuMDgwMDAyIGggNC43MiBsIC03LjI4LDEwLjE2MDAwMiA3LjY0LDEwLjg4IGggLTQuOTYgbCAtNS4wOCwtNy43MiBoIC0wLjI0IGwg
LTUuMTIsNy43MiBoIC00LjcyIHogbSAtMjEuNTk5OTk4LDExLjI4IHEgLTYuNjgsMCAtNi42OCwtNy4yNCBWIDU2LjI0NzkzIGggNC4xMiB2IDEzLjc2MDAwMiBxIDAsMi4zNiAxLjA0LDMuMzIgMS4wOCwwLjkyIDMuMTIsMC45MiAxLjQsMCAyLjYsLTAuNjggMS4yLC0wLjcyIDEuODgsLTIgMC43MiwtMS4yOCAwLjcyLC0yLjk2IFYgNTYuMjQ3OTMgaCA0LjEyIHYgMjEuMDQwMDAyIGggLTMuMzIgbCAtMC40LC0yLjggaCAtMC4yOCBxIC0xLjE2LDEuNiAtMi45MiwyLj
Q0IC0xLjc2LDAuODQgLTQsMC44NCB6IE0gMzUuODEyMzIsNTYuMjQ3OTMgaCAzLjMyMDAwMSBsIDAuNCwyLjgwMDAwMiBoIDAuMjggcSAxLjEyLC0xLjYwMDAwMiAyLjg4LC0yLjQ0MDAwMiAxLjgsLTAuODQgNC4wNCwtMC44NCA2LjY4LDAgNi42OCw3LjI0MDAwMiB2IDE0LjI4IGggLTQuMTIgdiAtMTMuNzYgcSAwLC0yLjM2IC0xLjA4LC0zLjI4IC0xLjA0LC0wLjk2IC0zLjA4LC0wLjk2IC0xLjQsMCAtMi42LDAuNzIgLTEuMiwwLjY4IC0xLjkyLDEuOTYgLTAuNjgsMS4yOCAtMC42OCwyLjk2IHYgMTIuMzYgSCAzNS44MTIzMiBaIE0gMy42MTIzOSw0Ny45MzA4NzEgaCA0LjQ0IHYgMjUuNTE3MDYxIGggMTQuMjggdiAzLjg0IGggLTE4LjcyIHogTSAyNi4yNTY3NjgsNTkuNDYzOTUgViA3Ny4yODc5MzIgSCAzMC4zNzIzOCBWIDU2LjI3NTQ2NCBoIC02LjM4NzYxMiB2IDEuODI1NjgxIHoiLz48L2c+PC9zdmc+Cg==0
- OS Family
- Oracle Linux
Red Hat
@@ -68,8 +62,6 @@
TggYy0wLjM0NC0wLjAyNy0wLjUyNi0wLjA4Ny0wLjU0My0wLjE2NGMtMC4wMTItMC4wNTIsMC4wNTUtMC4xMTEsMC4xOTctMC4xNzFjMC4wNy0wLjAzLDAuMTUzLTAuMDYxLDAuMjU2LTAuMDg5IGMwLjU4NC0wLjE2OSwwLjkxLTAuNjA4LDAuNTk0LTAuODA1Yy0wLjMzNy0wLjIxMi0xLjQ5Mi0wLjM0NS0yLjAwNC0wLjIzMWMtMC4yMTcsMC4wNDktMC4zNDIsMC4wNTEtMC4zNzQsMC4wMTMgYy0wLjAwMS0wLjAwMS0wLjAwNC0wLjAwMy0wLjAwNS0wLjAwNmMtMC4wMDk
tMC4wMTUtMC4wMDQtMC4wMzUsMC4wMTEtMC4wNjJjMC4wMTItMC4wMTYsMC4wMjYtMC4wMzEsMC4wNDctMC4wNDggYzAsMCwwLjAwMSwwLDAuMDAyLDBjMC4wMTktMC4wMTgsMC4wNDUtMC4wMzIsMC4wNzItMC4wNDZjMC4wMDItMC4wMDMsMC4wMDYtMC4wMDMsMC4wMS0wLjAwNmMwLjAyNy0wLjAxNCwwLjA1Ny0wLjAyNywwLjA5Mi0wLjA0MSBjMC4wMDUtMC4wMDIsMC4wMDgtMC4wMDMsMC4wMTEtMC4wMDVjMC4wMzctMC4wMTQsMC4wNzctMC4wMjgsMC4xMjEtMC4wN
DJjMC4wMDEsMCwwLjAwMy0wLjAwMiwwLjAwNS0wLjAwMiBjMC4yNzYtMC4wOSwwLjY4Mi0wLjE2NCwxLjEtMC4yMTNjMC4wMDgtMC4wMDMsMC4wMTQtMC4wMDMsMC4wMjEtMC4wMDNjMC4wNjEtMC4wMDksMC4xMjMtMC4wMTQsMC4xODYtMC4wMiBjMC4wMDktMC4wMDIsMC4wMTktMC4wMDIsMC4wMjctMC4wMDNjMC4wNjEtMC4wMDQsMC4xMTktMC4wMDksMC4xOC0wLjAxM2MwLjAwOSwwLDAuMDE5LTAuMDAyLDAuMDI3LTAuMDAyIGMwLjA2NS0wLjAwMywwLjEzMS0wLjAwNywwLjE5My0wLjAwOWMwLjAwNCwwLDAuMDA2LDAsMC4wMDYsMGMwLjIwNi0wLjAwOCwwLjQtMC4wMDIsMC41NzEsMC4wMTIgYzAuOTQ4LDAuMDg2LDEuNzE2LDAuNDIxLDEuODY4LDAuODEzYzAuMDE1LDAuMDQsMC4wMjQsMC4wOCwwLjAyNywwLjEyM0MyOS41MSwxMi45NzksMjkuMzIsMTMuMjAxLDI5LjAwMSwxMy4zOHoiLz48L3N2Zz4K0
- OS Family
- Red Hat
Ubuntu
@@ -79,8 +71,6 @@
41LTEuMS0yLjUtMi41YzAtMC4yLDAtMC41LDAuMS0wLjdDMjYuNSwzMy44LDI1LjMsMzQsMjQsMzRjLTUuMSwwLTkuMi0zLjgtOS45LTguN2MtMC40LDAuNy0xLjIsMS4yLTIuMSwxLjIgYy0xLjQsMC0yLjUtMS4xLTIuNS0yLjVzMS4xLTIuNSwyLjUtMi41YzAuOSwwLDEuNywwLjUsMi4xLDEuMmMwLjctNC45LDQuOC04LjcsOS45LTguN2MxLjMsMCwyLjUsMC4yLDMuNiwwLjcgYy0wLjEtMC4yLTAuMS0wLjQtMC4xLTAuN2MwLTEuNCwxLjEtMi41LDIuNS0yLjVzMi41
LDEuMSwyLjUsMi41YzAsMS4yLTAuOCwyLjItMiwyLjRDMzIuNywxOC4zLDM0LDIxLDM0LDI0cy0xLjMsNS43LTMuNSw3LjYgQzMxLjcsMzEuOCwzMi41LDMyLjgsMzIuNSwzNHoiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMzAgMTEuNWMxLjQgMCAyLjUgMS4xIDIuNSAyLjUgMCAxLjQtMS4xIDIuNS0yLjUgMi41cy0yLjUtMS4xLTIuNS0yLjVDMjcuNSAxMi42IDI4LjYgMTEuNSAzMCAxMS41TTMwIDEwLjVjLTEuOSAwLTMuNSAxLjYtMy41IDMuNXMxLjYgMy41ID
MuNSAzLjUgMy41LTEuNiAzLjUtMy41UzMxLjkgMTAuNSAzMCAxMC41ek0yNCAyNGMtMi42LTQuMS01LjItOC4xLTcuOC0xMi4yIi8+PHBhdGggZmlsbD0iI2U2NGExOSIgZD0iTTE5LjEgMTAuN0gyMS4xVjI1LjFIMTkuMXoiIHRyYW5zZm9ybT0icm90YXRlKC0zMi40NjcgMjAuMTI3IDE3LjkxMSkiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQgMjNIMzguNFYyNUgyNHoiLz48Zz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQsMjRjLTIuNyw0LTUuMyw4LTgsMTIiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMTIuOCAyOUgyNy4yMDAwMDAwMDAwMDAwMDNWMzFIMTIuOHoiIHRyYW5zZm9ybT0icm90YXRlKC01Ni4zMTIgMTkuOTk4IDMwLjAwNikiLz48L2c+PC9zdmc+Cg==0
- OS Family
- Ubuntu
Ubuntu server
@@ -90,26 +80,18 @@
41LTEuMS0yLjUtMi41YzAtMC4yLDAtMC41LDAuMS0wLjdDMjYuNSwzMy44LDI1LjMsMzQsMjQsMzRjLTUuMSwwLTkuMi0zLjgtOS45LTguN2MtMC40LDAuNy0xLjIsMS4yLTIuMSwxLjIgYy0xLjQsMC0yLjUtMS4xLTIuNS0yLjVzMS4xLTIuNSwyLjUtMi41YzAuOSwwLDEuNywwLjUsMi4xLDEuMmMwLjctNC45LDQuOC04LjcsOS45LTguN2MxLjMsMCwyLjUsMC4yLDMuNiwwLjcgYy0wLjEtMC4yLTAuMS0wLjQtMC4xLTAuN2MwLTEuNCwxLjEtMi41LDIuNS0yLjVzMi41
LDEuMSwyLjUsMi41YzAsMS4yLTAuOCwyLjItMiwyLjRDMzIuNywxOC4zLDM0LDIxLDM0LDI0cy0xLjMsNS43LTMuNSw3LjYgQzMxLjcsMzEuOCwzMi41LDMyLjgsMzIuNSwzNHoiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMzAgMTEuNWMxLjQgMCAyLjUgMS4xIDIuNSAyLjUgMCAxLjQtMS4xIDIuNS0yLjUgMi41cy0yLjUtMS4xLTIuNS0yLjVDMjcuNSAxMi42IDI4LjYgMTEuNSAzMCAxMS41TTMwIDEwLjVjLTEuOSAwLTMuNSAxLjYtMy41IDMuNXMxLjYgMy41ID
MuNSAzLjUgMy41LTEuNiAzLjUtMy41UzMxLjkgMTAuNSAzMCAxMC41ek0yNCAyNGMtMi42LTQuMS01LjItOC4xLTcuOC0xMi4yIi8+PHBhdGggZmlsbD0iI2U2NGExOSIgZD0iTTE5LjEgMTAuN0gyMS4xVjI1LjFIMTkuMXoiIHRyYW5zZm9ybT0icm90YXRlKC0zMi40NjcgMjAuMTI3IDE3LjkxMSkiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQgMjNIMzguNFYyNUgyNHoiLz48Zz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQsMjRjLTIuNyw0LTUuMyw4LTgsMTIiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMTIuOCAyOUgyNy4yMDAwMDAwMDAwMDAwMDNWMzFIMTIuOHoiIHRyYW5zZm9ybT0icm90YXRlKC01Ni4zMTIgMTkuOTk4IDMwLjAwNikiLz48L2c+PC9zdmc+Cg==0
- OS Family
- Ubuntu server
vCenter Server
image/svg+xmlicons8-vmware.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNTAgNTAiIHdpZHRoPSI1MHB4IiBoZWlnaHQ9IjUwcHgiPjxwYXRoIGQ9Ik0gNDIuNDE0MDYzIDE1IEMgMzguODI0MjE5IDE1IDM2LjU3NDIxOSAxNy41IDM2LjU3NDIxOSAxNy41IEMgMzUuMzc4OTA2IDE1Ljk0MTQwNiAzMy43MzA0NjkgMTUuMDAzOTA2IDMwLjk0MTQwNiAxNS4wMDM5MDYgQyAyNy45OTYwOTQgMTUuMDAzOTA2IDI2LjA0Mjk2OSAxNy41IDI2LjA0Mjk2OSAxNy41IEMgMjQuODQ3NjU2IDE1Ljk0MTQwNiAyMi42ODc1IDE1IDIxIDE1IEMgMTguMzkwNjI1IDE1IDE2LjMyMDMxMyAxNi4xNTIzNDQgMTUuMDU0Njg4IDE5LjA1ODU5NCBMIDEwLjgyMDMxMyAyOC4zMjAzMTMgTCA2LjAzMTI1IDE2LjU1ODU5NCBDIDUuNDI1NzgxIDE1LjIyNjU2MyAzLjkzMzU5NCAxNC42MjUgMi41NDI5NjkgMTUuMjQ2MDk0IEMgMS4xNDg0MzggMTUuODcxMDk0IDAuNjM2NzE5IDE3LjQyNTc4MSAxLjI2NTYyNSAxOC43NTc4MTMgTCA3LjExMzI4MSAzMS45NDUzMTMgQyA4LjAzMTI1IDMzLjk0OTIxOSA5LjAwMzkwNiAzNSAxMC44MjAzMTMgMzUgQyAxMi43NjU2MjUgMzUgMTMuNjA5Mzc1IDMzLjg1NTQ2OSAxNC41MzEyNSAzMS45NDUzMTMgQyAxNC41MzEyNSAzMS45NDUzMTMgMTguNTExNzE5IDIzLjA2MjUgMTkgMjIgQyAxOS40ODgyODEgMjAuOTM3NSAyMC4zMDA3ODEgMjAgMjEuNSAyMCBDIDIyLjg3NSAyMCAyNCAyMS4xMjUgMjQgMjIuNSBMIDI0IDMyLjM3NSBDIDI0IDMzLjgyMDMxMyAyNS4wODU5MzggMzUgMjYuNTIzNDM4IDM1IEMgMjcuOTU3MDMxIDM1IDI5IDMzLjgyMDMxMyAyOSAzMi4zNzUgTCAyOSAyMi41IEMgMjkgMjEuMTI1IDMwLjEyNSAyMCAzMS41IDIwIEMgMzIuODc1IDIwIDM0IDIxLjEyNSAzNCAyMi41IEwgMzQgMzIuNSBDIDM0IDMzLjg3NSAzNS4xMjUgMzUgMzYuNSAzNSBDIDM3Ljg3NSAzNSAzOSAzMy44NzUgMzkgMzIuNSBMIDM5IDIyLjUgQyAzOSAyMS4xMjUgNDAuMTI1IDIwIDQxLjUgMjAgQyA0Mi44NzUgMjAgNDQgMjEuMTI1IDQ0IDIyLjUgTCA0NCAzMi41IEMgNDQgMzMuODc1IDQ1LjEyNSAzNSA0Ni41IDM1IEMgNDcuODc1IDM1IDQ5IDMzLjg3NSA0OSAzMi41IEwgNDkgMjEuMzU1NDY5IEMgNDkgMTcuNjE3MTg4IDQ2LjAxMTcxOSAxNSA0Mi40MTQwNjMgMTUgWiIvPjwvc3ZnPgo=0
- OS Family
- vCenter Server
Windows
image/svg+xmlicons8-windows.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik02LDZoMTd2MTdINlY2eiIvPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik0yNS4wNDIsMjIuOTU4VjZINDJ2MTYuOTU4SDI1LjA0MnoiLz48cGF0aCBmaWxsPSIjMTk3NmQyIiBkPSJNNiwyNWgxN3YxN0g2VjI1eiIvPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik0yNSw0MlYyNWgxN3YxN0gyNXoiLz48L3N2Zz4K0
- OS Family
- Windows
Windows server
image/svg+xmlicons8-windows-server.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwMGIwZmYiIGQ9Ik0yMCAyNS4wMjZMNS4wMTEgMjUgNS4wMTIgMzcuNzQ0IDIwIDM5LjgxOHpNMjIgMjUuMDNMMjIgNDAuMDk1IDQyLjk5NSA0MyA0MyAyNS4wNjZ6TTIwIDguMjU2TDUgMTAuMzggNS4wMTQgMjMgMjAgMjN6TTIyIDcuOTczTDIyIDIzIDQyLjk5NSAyMyA0Mi45OTUgNXoiLz48L3N2Zz4K0
- OS Family
- Windows server
diff --git a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osversion.xml b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osversion.xml
index 985986b9e..ec4351fd9 100755
--- a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osversion.xml
+++ b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osversion.xml
@@ -3,112 +3,70 @@
10
8
Windows
- Windows
- OS Version
- 10
11
8
Windows
- Windows
- OS Version
- 11
11.5
2
Debian
- Debian
- OS Version
- 11.5
18.04 LTS
6
Ubuntu server
- Ubuntu server
- OS Version
- 18.04 LTS
20.04 LTS
5
Ubuntu
- Ubuntu
- OS Version
- 20.04 LTS
20.04 LTS
6
Ubuntu server
- Ubuntu server
- OS Version
- 20.04 LTS
2019
9
Windows server
- Windows server
- OS Version
- 2019
2022
9
Windows server
- Windows server
- OS Version
- 2022
22.04 LTS
5
Ubuntu
- Ubuntu
- OS Version
- 22.04 LTS
22.04 LTS
6
Ubuntu server
- Ubuntu server
- OS Version
- 22.04 LTS
6.7
7
vCenter Server
- vCenter Server
- OS Version
- 6.7
9
4
Red Hat
- Red Hat
- OS Version
- 9
9.1
3
Oracle Linux
- Oracle Linux
- OS Version
- 9.1
Roling release
1
Arch
- Arch
- OS Version
- Roling release
\ No newline at end of file
diff --git a/datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml b/datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml
index 3347fc496..612064726 100644
--- a/datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml
+++ b/datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml
@@ -1480,19 +1480,19 @@
1
-
+
5
ContainerApplication
-
+
6
ContainerHost
-
+
7
ContainerCluster
-
+
8
ContainerImage
@@ -1507,11 +1507,11 @@
0
-
+
21
ContainerType
-
+
22
ContainerImageType
diff --git a/datamodels/2.x/itop-flow-map/data/en_us.data.itop-flow-map.xml b/datamodels/2.x/itop-flow-map/data/en_us.data.itop-flow-map.xml
index 32f326d09..5e4e2c076 100644
--- a/datamodels/2.x/itop-flow-map/data/en_us.data.itop-flow-map.xml
+++ b/datamodels/2.x/itop-flow-map/data/en_us.data.itop-flow-map.xml
@@ -1,16 +1,16 @@
- http
+ HTTP
- https
+ HTTPS
- ftp
+ FTP
- sftp
+ SFTP
AS2
@@ -18,4 +18,7 @@
X.400
+
+ FTPS
+
\ No newline at end of file
diff --git a/datamodels/2.x/itop-flow-map/datamodel.itop-flow-map.xml b/datamodels/2.x/itop-flow-map/datamodel.itop-flow-map.xml
index 01a2be920..d64732aec 100644
--- a/datamodels/2.x/itop-flow-map/datamodel.itop-flow-map.xml
+++ b/datamodels/2.x/itop-flow-map/datamodel.itop-flow-map.xml
@@ -2,7 +2,7 @@
- cmdbAbstractObject
+ FunctionalCI
bizmodel,searchable
false
@@ -14,6 +14,10 @@
+
+
+
+
@@ -32,23 +36,9 @@
-
- name
-
- false
-
-
- org_id
-
-
- false
- Organization
- DEL_MANUAL
- all
-
source_id
-
+
false
FunctionalCI
@@ -74,7 +64,7 @@
destination_id
-
+
false
FunctionalCI
@@ -107,12 +97,6 @@
DEL_MANUAL
all
-
- description
-
- true
- all
-
status
@@ -141,27 +125,6 @@
list
all
-
- rank
-
-
- high
- 10
-
-
- medium
- 20
-
-
- low
- 30
-
-
- business_criticity
- low
- false
- list
-
rank
@@ -199,24 +162,36 @@
false
list
-
- lnkContactToDataFlow
- dataflow_id
- 0
- 0
- contact_id
-
-
-
- lnkDocumentToDataFlow
- dataflow_id
- 0
- 0
- document_id
-
-
-
+
+
+ EVENT_DB_CHECK_TO_WRITE
+ 10
+ evtCheckSourceAndDestination
+
+
+
+
+ /**
+ * Ensure that the source and destination of a data flow are not DataFlow themselves
+ *
+ */
+ false
+ public
+ EventListener
+ Get('source_id'), false, true);
+ $oDestination = MetaModel::GetObject(FunctionalCI::class, $this->Get('destination_id'), false, true);
+ if ($oSource instanceof DataFlow) {
+ $this->AddCheckIssue(Dict::Format('Class:DataFlow/Error:CheckSource', $oSource->GetName()));
+ }
+ if ($oDestination instanceof DataFlow) {
+ $this->AddCheckIssue(Dict::Format('Class:DataFlow/Error:CheckDestination', $oDestination->GetName()));
+ }
+ } ]]>
+
+
@@ -257,7 +232,7 @@
-
-
-
+
-
-
10
@@ -302,14 +277,25 @@
-
-
-
+
-
-
-
+
-
10
10
+ -
+
+
-
+ 10
+
+ -
+ 20
+
+
+ 20
+
20
@@ -342,201 +328,46 @@
- -
+
-
10
- -
+
-
20
+ -
+ 30
+
+ -
+ 40
+
-
+
destination_impact = 'yes' AND id = :this->destination_id]]>
id]]>
both
-
+
contacts_list
down
+
+
+
+ destination_id]]>
+ id]]>
+ both
+
+
+
-
- cmdbAbstractObject
-
- 1
- bizmodel
- false
- autoincrement
- lnkdocumenttodataflow
- id
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- false
- true
-
-
-
-
-
- dataflow_id
- DataFlow
- false
- DEL_AUTO
-
-
- document_id
- Document
- false
- DEL_AUTO
-
-
-
-
-
-
- -
- 10
-
- -
- 20
-
-
-
-
-
- -
- 10
-
- -
- 20
-
-
-
-
-
- -
- 10
-
- -
- 20
-
-
-
-
-
-
- cmdbAbstractObject
-
- 1
- bizmodel
- false
- autoincrement
- lnkcontacttodataflow
- id
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- false
- true
-
-
-
-
-
- dataflow_id
- DataFlow
- false
- DEL_AUTO
-
-
- contact_id
- Contact
- false
- DEL_AUTO
-
-
-
-
-
-
- -
- 10
-
- -
- 20
-
-
-
-
-
- -
- 10
-
- -
- 20
-
-
-
-
-
- -
- 10
-
- -
- 20
-
-
-
-
-
Typology
@@ -554,6 +385,16 @@
+
+
+
+
+
+
+ false
+ true
+
+
@@ -629,6 +470,15 @@
+
+
+
+ id]]>
+ id]]>
+ both
+
+
+
@@ -636,7 +486,7 @@
-
- 25
+ 125
@@ -647,7 +497,7 @@
-
- 25
+ 115
@@ -658,7 +508,7 @@
-
- 25
+ 165
@@ -669,7 +519,7 @@
-
- 25
+ 165
@@ -680,7 +530,40 @@
-
- 25
+ 115
+
+
+
+
+
+
+
+
+
+ -
+ 105
+
+
+
+
+
+
+
+
+
+ -
+ 165
+
+
+
+
+
+
+
+
+
+ -
+ 75
@@ -691,7 +574,7 @@
-
- 25
+ 125
@@ -702,7 +585,7 @@
-
- 25
+ 165
@@ -713,7 +596,7 @@
-
- 25
+ 155
@@ -726,7 +609,7 @@
-
+
20
DataFlow
@@ -735,6 +618,21 @@
|
+
diff --git a/datamodels/2.x/itop-flow-map/dictionaries/en.dict.itop-flow-map.php b/datamodels/2.x/itop-flow-map/dictionaries/en.dict.itop-flow-map.php
index 415129609..e1d46dbb8 100644
--- a/datamodels/2.x/itop-flow-map/dictionaries/en.dict.itop-flow-map.php
+++ b/datamodels/2.x/itop-flow-map/dictionaries/en.dict.itop-flow-map.php
@@ -9,21 +9,25 @@
Dict::Add('EN US', 'English', 'English', [
+ 'Relation:dataflows/Description' => 'DataFlows between CIs',
+ 'Relation:dataflows/DownStream' => 'Outbound flows...',
+ 'Relation:dataflows/DownStream+' => 'Outbound flows map from',
+ 'Relation:dataflows/UpStream' => 'Inbound flows...',
+ 'Relation:dataflows/UpStream+' => 'Inbound flows map to',
+
'Class:FunctionalCI/Attribute:dataflows' => 'Data flows',
'Class:FunctionalCI/Attribute:dataflows+' => 'Data flows for which this object is the source or the destination',
'FunctionalCI:DataFlow:Title' => 'Data flows',
'FunctionalCI:DataFlow:Inbound' => 'Inbound flows',
'FunctionalCI:DataFlow:Outbound' => 'Outbound flows',
- 'DataFlow:baseinfo' => 'General information',
- 'DataFlow:otherinfo' => 'Other information',
'DataFlow:moreinfo' => 'Flow specifics',
'Class:DataFlow' => 'Flow',
'Class:DataFlow+' => 'For application flow for example',
- 'Class:DataFlow/Name' => '%1$s',
+ 'Class:DataFlow/ComplementaryName' => '%1$s - %2$s',
'Class:DataFlow/Attribute:name' => 'Name',
- 'Class:DataFlow/Attribute:name_id+' => 'Data that are transferred',
+ 'Class:DataFlow/Attribute:name+' => 'Identify the transferred data flow',
'Class:DataFlow/Attribute:source_id' => 'Source',
'Class:DataFlow/Attribute:source_id+' => 'Source Ci of the flow',
'Class:DataFlow/Attribute:source_impact' => 'Source impacts?',
@@ -42,22 +46,10 @@ Dict::Add('EN US', 'English', 'English', [
'Class:DataFlow/Attribute:destination_impact/Value:no+' => 'If the flow stops, the destination is not impacted',
'Class:DataFlow/Attribute:dataflowtype_id' => 'Flow type',
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Typology of Flow.',
- 'Class:DataFlow/Attribute:description' => 'Description',
- 'Class:DataFlow/Attribute:description+' => '',
'Class:DataFlow/Attribute:status' => 'Status',
'Class:DataFlow/Attribute:status+' => '',
'Class:DataFlow/Attribute:status/Value:active' => 'active',
'Class:DataFlow/Attribute:status/Value:inactive' => 'inactive',
- 'Class:DataFlow/Attribute:org_id' => 'Organization',
- 'Class:DataFlow/Attribute:org_id+' => '',
- 'Class:DataFlow/Attribute:business_criticity' => 'Business criticality',
- 'Class:DataFlow/Attribute:business_criticity+' => '',
- 'Class:DataFlow/Attribute:business_criticity/Value:high' => 'high',
- 'Class:DataFlow/Attribute:business_criticity/Value:high+' => '',
- 'Class:DataFlow/Attribute:business_criticity/Value:low' => 'low',
- 'Class:DataFlow/Attribute:business_criticity/Value:low+' => '',
- 'Class:DataFlow/Attribute:business_criticity/Value:medium' => 'medium',
- 'Class:DataFlow/Attribute:business_criticity/Value:medium+' => '',
'Class:DataFlow/Attribute:execution_frequency' => 'Execution frequency',
'Class:DataFlow/Attribute:execution_frequency+' => 'How often the data flow is executed',
'Class:DataFlow/Attribute:execution_frequency/Value:realtime' => 'real-time',
@@ -74,10 +66,13 @@ Dict::Add('EN US', 'English', 'English', [
'Class:DataFlow/Attribute:execution_frequency/Value:monthly+' => '',
'Class:DataFlow/Attribute:execution_frequency/Value:yearly' => 'yearly',
'Class:DataFlow/Attribute:execution_frequency/Value:yearly+' => '',
- 'Class:DataFlow/Attribute:documents_list' => 'Documents',
'Class:DataFlow/Attribute:documents_list+' => 'Eg: technical specifications, runbooks, etc.',
- 'Class:DataFlow/Attribute:contacts_list' => 'Contacts',
'Class:DataFlow/Attribute:contacts_list+' => 'Eg: flow owner, technical support, etc.',
+ 'Class:DataFlow/Error:CheckSource' => 'The source of a data flow cannot be a data flow itself. Choose another source CI than %1$s',
+ 'Class:DataFlow/Error:CheckDestination' => 'The destination of a data flow cannot be a data flow itself. Choose another destination CI than %1$s',
+
+ 'Class:DataFlowType' => 'Data Flow Type',
+ 'Class:DataFlowType+' => 'Typology of Data Flow',
/*
'Class:DataFlow/Attribute:source_id_friendlyname' => 'source_id_friendlyname',
diff --git a/datamodels/2.x/itop-flow-map/dictionaries/fr.dict.itop-flow-map.php b/datamodels/2.x/itop-flow-map/dictionaries/fr.dict.itop-flow-map.php
index ea4e4afca..c7fc8c19b 100644
--- a/datamodels/2.x/itop-flow-map/dictionaries/fr.dict.itop-flow-map.php
+++ b/datamodels/2.x/itop-flow-map/dictionaries/fr.dict.itop-flow-map.php
@@ -9,21 +9,25 @@
Dict::Add('FR FR', 'French', 'Français', [
+ 'Relation:dataflows/Description' => 'Flux de données entre CIs',
+ 'Relation:dataflows/DownStream' => 'Flux sortants...',
+ 'Relation:dataflows/DownStream+' => 'Carte des flux sortants depuis',
+ 'Relation:dataflows/UpStream' => 'Flux entrants...',
+ 'Relation:dataflows/UpStream+' => 'Carte des flux entrants vers',
+
'Class:FunctionalCI/Attribute:dataflows' => 'Flux de données',
'Class:FunctionalCI/Attribute:dataflows+' => 'Flux de données dont cet objet est la source ou la destination',
'FunctionalCI:DataFlow:Title' => 'Flux de données',
'FunctionalCI:DataFlow:Inbound' => 'Flux entrants',
'FunctionalCI:DataFlow:Outbound' => 'Flux sortants',
- 'DataFlow:baseinfo' => 'Informations générales',
- 'DataFlow:otherinfo' => 'Autres informations',
'DataFlow:moreinfo' => 'Spécificités du flux',
'Class:DataFlow' => 'Flux de Données',
- 'Class:DataFlow+' => 'Modélise les données transférées entre instances d\'application',
- 'Class:DataFlow/Name' => '%1$s',
+ 'Class:DataFlow+' => 'Modélise les données transférées entre instances d\'application ou plus généralement entre CIs.',
+ 'Class:DataFlow/ComplementaryName' => '%1$s - %2$s',
'Class:DataFlow/Attribute:name' => 'Nom',
- 'Class:DataFlow/Attribute:name_id+' => 'Type de données transferées',
+ 'Class:DataFlow/Attribute:name+' => 'Identifie le flux de données',
'Class:DataFlow/Attribute:source_id' => 'Source',
'Class:DataFlow/Attribute:source_id+' => 'Instance d\application à la source du flux de données',
'Class:DataFlow/Attribute:source_impact' => 'Source impactante ?',
@@ -42,22 +46,10 @@ Dict::Add('FR FR', 'French', 'Français', [
'Class:DataFlow/Attribute:destination_impact/Value:no+' => 'Si le flux s\'arrête, le destinataire n\'est pas impacté',
'Class:DataFlow/Attribute:dataflowtype_id' => 'Type de flux',
'Class:DataFlow/Attribute:dataflowtype_id+' => 'Typologie du flux',
- 'Class:DataFlow/Attribute:description' => 'Description',
- 'Class:DataFlow/Attribute:description+' => '',
'Class:DataFlow/Attribute:status' => 'Etat',
'Class:DataFlow/Attribute:status+' => '',
'Class:DataFlow/Attribute:status/Value:active' => 'actif',
'Class:DataFlow/Attribute:status/Value:inactive' => 'inactif',
- 'Class:DataFlow/Attribute:org_id' => 'Organisation',
- 'Class:DataFlow/Attribute:org_id+' => '',
- 'Class:DataFlow/Attribute:business_criticity' => 'Criticité',
- 'Class:DataFlow/Attribute:business_criticity+' => '',
- 'Class:DataFlow/Attribute:business_criticity/Value:high' => 'haute',
- 'Class:DataFlow/Attribute:business_criticity/Value:high+' => '',
- 'Class:DataFlow/Attribute:business_criticity/Value:low' => 'basse',
- 'Class:DataFlow/Attribute:business_criticity/Value:low+' => '',
- 'Class:DataFlow/Attribute:business_criticity/Value:medium' => 'moyenne',
- 'Class:DataFlow/Attribute:business_criticity/Value:medium+' => '',
'Class:DataFlow/Attribute:execution_frequency' => 'Fréquence d\'exécution',
'Class:DataFlow/Attribute:execution_frequency+' => 'À quelle fréquence le transfert de données est-il exécuté',
'Class:DataFlow/Attribute:execution_frequency/Value:realtime' => 'temps réel',
@@ -74,10 +66,13 @@ Dict::Add('FR FR', 'French', 'Français', [
'Class:DataFlow/Attribute:execution_frequency/Value:monthly+' => '',
'Class:DataFlow/Attribute:execution_frequency/Value:yearly' => 'annuelle',
'Class:DataFlow/Attribute:execution_frequency/Value:yearly+' => '',
- 'Class:DataFlow/Attribute:documents_list' => 'Documents',
'Class:DataFlow/Attribute:documents_list+' => 'Eg: technical specifications, runbooks, etc.',
- 'Class:DataFlow/Attribute:contacts_list' => 'Contacts',
'Class:DataFlow/Attribute:contacts_list+' => 'Eg: flow owner, technical support, etc.',
+ 'Class:DataFlow/Error:CheckSource' => 'La source d\'un flux de données ne peut pas être un flux de données elle-même. Choisissez un autre CI source que %1$s',
+ 'Class:DataFlow/Error:CheckDestination' => 'La destination d\'un flux de données ne peut pas être un flux de données elle-même. Choisissez un autre CI destination que %1$s',
+
+ 'Class:DataFlowType' => 'Type de flux',
+ 'Class:DataFlowType+' => 'Typologie des flux de données',
/*
'Class:DataFlow/Attribute:source_id_friendlyname' => 'source_id_friendlyname',
diff --git a/datamodels/2.x/itop-flow-map/module.itop-flow-map.php b/datamodels/2.x/itop-flow-map/module.itop-flow-map.php
index 2ff936a41..1b6915b54 100644
--- a/datamodels/2.x/itop-flow-map/module.itop-flow-map.php
+++ b/datamodels/2.x/itop-flow-map/module.itop-flow-map.php
@@ -17,6 +17,7 @@ SetupWebPage::AddModule(
//
'dependencies' => [
'itop-config-mgmt/3.2.0',
+ 'itop-structure/3.2.0||itop-virtualization/3.2.0||itop-container-mgmt/3.2.0',
],
'mandatory' => false,
'visible' => true,
diff --git a/datamodels/2.x/itop-service-mgmt-provider/data/en_us.data.itop-contracttype.xml b/datamodels/2.x/itop-service-mgmt-provider/data/en_us.data.itop-contracttype.xml
new file mode 100644
index 000000000..43b68701f
--- /dev/null
+++ b/datamodels/2.x/itop-service-mgmt-provider/data/en_us.data.itop-contracttype.xml
@@ -0,0 +1,15 @@
+
+
+
+ Hosting
+
+
+ IT outsourcing
+
+
+ Maintenance
+
+
+ Support
+
+
diff --git a/datamodels/2.x/itop-service-mgmt-provider/data/fr_fr.data.itop-contracttype.xml b/datamodels/2.x/itop-service-mgmt-provider/data/fr_fr.data.itop-contracttype.xml
new file mode 100644
index 000000000..8c1b6438a
--- /dev/null
+++ b/datamodels/2.x/itop-service-mgmt-provider/data/fr_fr.data.itop-contracttype.xml
@@ -0,0 +1,15 @@
+
+
+
+ Hébergement
+
+
+ Infogérance
+
+
+ Maintenance
+
+
+ Support
+
+
diff --git a/datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php b/datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php
index 7e92b5da2..6ffa45a73 100755
--- a/datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php
+++ b/datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php
@@ -87,6 +87,14 @@ if (!class_exists('ServiceMgmtProviderInstaller')) {
*/
public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion)
{
+ // Load localized structural data: contract types
+ static::LoadLocalizedData(
+ $oConfiguration,
+ $sPreviousVersion,
+ $sCurrentVersion,
+ '3.3.0',
+ __DIR__."/data/{{language_code}}.data.itop-contracttype.xml"
+ );
}
}
}
diff --git a/datamodels/2.x/itop-service-mgmt/data/en_us.data.itop-contracttype.xml b/datamodels/2.x/itop-service-mgmt/data/en_us.data.itop-contracttype.xml
new file mode 100644
index 000000000..43b68701f
--- /dev/null
+++ b/datamodels/2.x/itop-service-mgmt/data/en_us.data.itop-contracttype.xml
@@ -0,0 +1,15 @@
+
+
+
+ Hosting
+
+
+ IT outsourcing
+
+
+ Maintenance
+
+
+ Support
+
+
diff --git a/datamodels/2.x/itop-service-mgmt/data/fr_fr.data.itop-contracttype.xml b/datamodels/2.x/itop-service-mgmt/data/fr_fr.data.itop-contracttype.xml
new file mode 100644
index 000000000..8c1b6438a
--- /dev/null
+++ b/datamodels/2.x/itop-service-mgmt/data/fr_fr.data.itop-contracttype.xml
@@ -0,0 +1,15 @@
+
+
+
+ Hébergement
+
+
+ Infogérance
+
+
+ Maintenance
+
+
+ Support
+
+
diff --git a/datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php b/datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php
index 98103251e..ecb3b7d8c 100755
--- a/datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php
+++ b/datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php
@@ -84,6 +84,14 @@ if (!class_exists('ServiceMgmtInstaller')) {
*/
public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion)
{
+ // Load localized structural data: contact types and document types
+ static::LoadLocalizedData(
+ $oConfiguration,
+ $sPreviousVersion,
+ $sCurrentVersion,
+ '3.3.0',
+ __DIR__."/data/{{language_code}}.data.itop-contracttype.xml"
+ );
}
}
}
diff --git a/datamodels/2.x/itop-structure/data/en_us.data.itop-contacttype.xml b/datamodels/2.x/itop-structure/data/en_us.data.itop-contacttype.xml
new file mode 100644
index 000000000..ed74421f4
--- /dev/null
+++ b/datamodels/2.x/itop-structure/data/en_us.data.itop-contacttype.xml
@@ -0,0 +1,30 @@
+
+
+
+ Administrator
+
+
+ Buyer
+
+
+ Customer manager
+
+
+ Helpdesk
+
+
+ Manager
+
+
+ Sales
+
+
+ Support Agent
+
+
+ Support level1
+
+
+ Team leader
+
+
diff --git a/datamodels/2.x/itop-structure/data/en_us.data.itop-documenttype.xml b/datamodels/2.x/itop-structure/data/en_us.data.itop-documenttype.xml
new file mode 100644
index 000000000..1abb0fb23
--- /dev/null
+++ b/datamodels/2.x/itop-structure/data/en_us.data.itop-documenttype.xml
@@ -0,0 +1,15 @@
+
+
+
+ Architecture
+
+
+ Contract
+
+
+ Procedure
+
+
+ Process
+
+
diff --git a/datamodels/2.x/itop-structure/data/fr_fr.data.itop-contacttype.xml b/datamodels/2.x/itop-structure/data/fr_fr.data.itop-contacttype.xml
new file mode 100644
index 000000000..3d2e02b2c
--- /dev/null
+++ b/datamodels/2.x/itop-structure/data/fr_fr.data.itop-contacttype.xml
@@ -0,0 +1,30 @@
+
+
+
+ Administrateur
+
+
+ Acheteur
+
+
+ Responsable de la relation client
+
+
+ Helpdesk
+
+
+ Manager
+
+
+ Commercial
+
+
+ Agent de support
+
+
+ Support niveau 1
+
+
+ Chef d'équipe
+
+
diff --git a/datamodels/2.x/itop-structure/data/fr_fr.data.itop-documenttype.xml b/datamodels/2.x/itop-structure/data/fr_fr.data.itop-documenttype.xml
new file mode 100644
index 000000000..6caa62fb9
--- /dev/null
+++ b/datamodels/2.x/itop-structure/data/fr_fr.data.itop-documenttype.xml
@@ -0,0 +1,15 @@
+
+
+
+ Architecture
+
+
+ Contrat
+
+
+ Procédure
+
+
+ Processus
+
+
diff --git a/datamodels/2.x/itop-structure/module.itop-structure.php b/datamodels/2.x/itop-structure/module.itop-structure.php
index f1da9aeaf..775d383db 100644
--- a/datamodels/2.x/itop-structure/module.itop-structure.php
+++ b/datamodels/2.x/itop-structure/module.itop-structure.php
@@ -99,6 +99,22 @@ if (!class_exists('StructureInstaller')) {
*/
public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion)
{
+ // Load localized structural data: contact types and document types
+ static::LoadLocalizedData(
+ $oConfiguration,
+ $sPreviousVersion,
+ $sCurrentVersion,
+ '3.3.0',
+ __DIR__."/data/{{language_code}}.data.itop-contacttype.xml"
+ );
+ static::LoadLocalizedData(
+ $oConfiguration,
+ $sPreviousVersion,
+ $sCurrentVersion,
+ '3.3.0',
+ __DIR__."/data/{{language_code}}.data.itop-documenttype.xml"
+ );
+
// Default language will be used for actions
// Note: There is a issue when upgrading, default language cannot be retrieved from the passed configuration, we have to read it from the disk
if (utils::IsNullOrEmptyString($sPreviousVersion)) {
diff --git a/datamodels/2.x/itop-tickets/module.itop-tickets.php b/datamodels/2.x/itop-tickets/module.itop-tickets.php
index 92fc73019..17e8e8f24 100755
--- a/datamodels/2.x/itop-tickets/module.itop-tickets.php
+++ b/datamodels/2.x/itop-tickets/module.itop-tickets.php
@@ -60,42 +60,7 @@ class TicketsInstaller extends ModuleInstallerAPI
utils::EnrichRaisedException($oTrigger, $e);
}
}
- // It's not very clear if it make sense to test a particular version,
- // as the loading mechanism checks object existence using reconc_keys
- // and do not recreate them, nor update existing.
- // Without test, new entries added to the data files, would be automatically loaded
- if (($sPreviousVersion === '') ||
- (version_compare($sPreviousVersion, $sCurrentVersion, '<')
- && version_compare($sPreviousVersion, '3.0.0', '<'))) {
- $oDataLoader = new XMLDataLoader();
-
- CMDBObject::SetTrackInfo("Initialization TicketsInstaller");
- $oMyChange = CMDBObject::GetCurrentChange();
-
- $sLang = null;
- // - Try to get app. language from configuration fil (app. upgrade)
- $sConfigFileName = APPCONF.'production/'.ITOP_CONFIG_FILE;
- if (file_exists($sConfigFileName)) {
- $oFileConfig = new Config($sConfigFileName);
- if (is_object($oFileConfig)) {
- $sLang = str_replace(' ', '_', strtolower($oFileConfig->GetDefaultLanguage()));
- }
- }
-
- // - I still no language, get the default one
- if (null === $sLang) {
- $sLang = str_replace(' ', '_', strtolower($oConfiguration->GetDefaultLanguage()));
- }
-
- $sFileName = dirname(__FILE__)."/data/{$sLang}.data.itop-tickets.xml";
- SetupLog::Info("Searching file: $sFileName");
- if (!file_exists($sFileName)) {
- $sFileName = dirname(__FILE__)."/data/en_us.data.itop-tickets.xml";
- }
- SetupLog::Info("Loading file: $sFileName");
- $oDataLoader->StartSession($oMyChange);
- $oDataLoader->LoadFile($sFileName, false, true);
- $oDataLoader->EndSession();
- }
+ // Load localized structural data: predefined query phrases for notifications
+ static::LoadLocalizedData($oConfiguration, $sPreviousVersion, $sCurrentVersion, '3.0.0', __DIR__."/data/{{language_code}}.data.itop-tickets.xml");
}
}
diff --git a/setup/moduleinstaller.class.inc.php b/setup/moduleinstaller.class.inc.php
index cdfb8a8cb..aff6a1c1f 100644
--- a/setup/moduleinstaller.class.inc.php
+++ b/setup/moduleinstaller.class.inc.php
@@ -308,4 +308,120 @@ abstract class ModuleInstallerAPI
CMDBSource::CacheReset($sOrigTable);
}
+
+ /**
+ * @param \Config $oConfiguration
+ * @param string $sPreviousVersion The previous version of the module (empty string will force the loading)
+ * @param string $sCurrentVersion The current version of the module
+ * @param string $sFirstLoadingVersion The first module version for which the data loading should be performed (e.g. '3.0.0')
+ * @param string $sFilePattern The pattern of the file to load, with {{language_code}} as placeholder for the language code (e.g. 'data.sample.{{language_code}}.xml')
+ *
+ * @return void
+ * @throws \ConfigException
+ * @throws \CoreException
+ * @throws \CoreUnexpectedValue
+ */
+ public static function LoadLocalizedData(Config $oConfiguration, string $sPreviousVersion, string $sCurrentVersion, string $sFirstLoadingVersion, string $sFilePattern): void
+ {
+ self::AssertLoadLocalizedDataParametersAreValid($sPreviousVersion, $sCurrentVersion, $sFirstLoadingVersion, $sFilePattern);
+
+ // It's not very clear if it makes sense to test a particular version,
+ // as the loading mechanism checks object existence using reconc_keys
+ // and do not recreate them, nor update existing.
+ // Without test, new entries added to the data files, would be automatically loaded
+ if (($sPreviousVersion === '') ||
+ (version_compare($sPreviousVersion, $sCurrentVersion, '<')
+ && version_compare($sPreviousVersion, $sFirstLoadingVersion, '<'))) {
+
+ // Note: There is an issue when upgrading, default language cannot be retrieved from the passed configuration, we have to read it from the disk
+ if (utils::IsNullOrEmptyString($sPreviousVersion)) {
+ // Fresh install
+ $sDefaultLanguage = $oConfiguration->GetDefaultLanguage();
+ } else {
+ // Upgrade
+ $sDefaultLanguage = utils::GetConfig(true)->GetDefaultLanguage();
+ }
+
+ $sFileName = self::GetLocalizedFileName($sDefaultLanguage, $sFilePattern);
+ if ($sFileName !== '') {
+ self::XMLFileLoad($sFileName);
+ }
+ }
+ }
+
+ /**
+ * @throws \CoreUnexpectedValue
+ */
+ private static function AssertLoadLocalizedDataParametersAreValid(string $sPreviousVersion, string $sCurrentVersion, string $sFirstLoadingVersion, string $sFilePattern): void
+ {
+ if (($sPreviousVersion !== '') && !self::IsValidLocalizedDataVersion($sPreviousVersion)) {
+ throw new CoreUnexpectedValue("LoadLocalizedData expects sPreviousVersion to be empty or match x.y[.z][-name], got '{$sPreviousVersion}'");
+ }
+
+ if (!self::IsValidLocalizedDataVersion($sCurrentVersion)) {
+ throw new CoreUnexpectedValue("LoadLocalizedData expects sCurrentVersion to match x.y[.z][-name], got '{$sCurrentVersion}'");
+ }
+
+ if (!self::IsValidLocalizedDataVersion($sFirstLoadingVersion)) {
+ throw new CoreUnexpectedValue("LoadLocalizedData expects sFirstLoadingVersion to match x.y[.z][-name], got '{$sFirstLoadingVersion}'");
+ }
+
+ if (utils::IsNullOrEmptyString($sFilePattern)) {
+ throw new CoreUnexpectedValue('LoadLocalizedData expects sFilePattern to be a non-empty string');
+ }
+
+ if (substr_count($sFilePattern, '{{language_code}}') !== 1) {
+ throw new CoreUnexpectedValue("LoadLocalizedData expects sFilePattern to contain the exact placeholder '{{language_code}}' exactly once");
+ }
+ }
+
+ private static function IsValidLocalizedDataVersion(string $sVersion): bool
+ {
+ return (preg_match('/^\d+\.\d+(?:\.\d+)?(?:-[A-Za-z0-9]+)?$/', $sVersion) === 1);
+ }
+
+ /**
+ * @param array|string $sFileName
+ * @param \XMLDataLoader $oDataLoader
+ *
+ * @return void
+ * @throws \Exception
+ */
+ public static function XMLFileLoad(string $sFileName): void
+ {
+ if (!file_exists($sFileName)) {
+ throw new Exception("File $sFileName not found");
+ }
+ $oDataLoader = new XMLDataLoader();
+ CMDBObject::SetTrackInfo("Loading XML data from $sFileName");
+ $oMyChange = CMDBObject::GetCurrentChange();
+ SetupLog::Info("Loading objects in DB from file: $sFileName");
+ $oDataLoader->StartSession($oMyChange);
+ $oDataLoader->LoadFile($sFileName, false, true);
+ $oDataLoader->EndSession();
+ }
+
+ /**
+ * @param string $sLanguage The language code to use for localization (e.g. 'EN US')
+ * @param string $sFilePattern The full path+name of the file to localize, with {{language_code}} as placeholder for the language code (e.g. 'data.sample.{{language_code}}.xml')
+ *
+ * @return string The localized file name if found, or an empty string if not found
+ * @throws \ConfigException
+ * @throws \CoreException
+ */
+ public static function GetLocalizedFileName($sLanguage, string $sFilePattern): string
+ {
+ $sLang = str_replace(' ', '_', strtolower($sLanguage));
+ $sFileName = str_replace('{{language_code}}', $sLang, $sFilePattern);
+ if (!file_exists($sFileName)) {
+ $sLang = 'en_us';
+ $sFileName = str_replace('{{language_code}}', $sLang, $sFilePattern);
+ }
+ if (file_exists($sFileName)) {
+ return $sFileName;
+ } else {
+ SetupLog::Warning("No data file matching the pattern $sFilePattern and language_code $sLang was found.");
+ return '';
+ }
+ }
}
diff --git a/tests/php-unit-tests/unitary-tests/setup/ModuleInstallerAPITest.php b/tests/php-unit-tests/unitary-tests/setup/ModuleInstallerAPITest.php
index 7001c19fd..a201d0e08 100644
--- a/tests/php-unit-tests/unitary-tests/setup/ModuleInstallerAPITest.php
+++ b/tests/php-unit-tests/unitary-tests/setup/ModuleInstallerAPITest.php
@@ -4,11 +4,12 @@ namespace Combodo\iTop\Test\UnitTest\Setup;
use CMDBSource;
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
+use Config;
use MetaModel;
use ModuleInstallerAPI;
/**
- * Class ModuleInstallerAPITest
+ * Class ModuleInstallerAPI
*
* @covers ModuleInstallerAPI
*
@@ -282,4 +283,189 @@ SQL
$this->assertEquals($sOrigValue, $sDstValue, "Data was not moved as expected");
}
+
+ /**
+ * @covers \ModuleInstallerAPI::LoadLocalizedData
+ */
+ public function testLoadLocalizedData_LoadsOnFirstInstall(): void
+ {
+ // Given
+ [$oConfig, $sOrgName, $sTmpDir, $sPattern] = $this->GivenLocalizedDataTestContext('XML_Load_FirstInstall_', 'fr_fr');
+ $this->GivenLocalizedDataFile($sTmpDir, "en_us", $sOrgName);
+ $this->GivenLocalizedDataFile($sTmpDir, "fr_fr", $sOrgName);
+ // When no previous version, and current version higher than the first loading version
+ ModuleInstallerAPI::LoadLocalizedData($oConfig, '', '3.3.0', '3.0.0', $sPattern);
+ // Then data loaded
+ $this->AssertOrganizationCountByName($sOrgName, 'en_us', 0);
+ $this->AssertOrganizationCountByName($sOrgName, 'fr_fr', 1);
+ }
+
+ /**
+ * @covers \ModuleInstallerAPI::LoadLocalizedData
+ */
+ public function testLoadLocalizedData_DoesNotLoadWhenVersionConditionIsNotMet(): void
+ {
+ // Given
+ [$oConfig, $sOrgName, $sTmpDir, $sPattern] = $this->GivenLocalizedDataTestContext('XML_Load_NoLoad_', 'en_us');
+ $this->GivenLocalizedDataFile($sTmpDir, "en_us", $sOrgName);
+
+ // When a previous version that is lower than the first loading version, but higher or equal to the current version
+ ModuleInstallerAPI::LoadLocalizedData($oConfig, '3.0.0', '3.1.0', '3.0.0', $sPattern);
+ // Then no data loaded
+ $this->AssertOrganizationCountByName($sOrgName, 'en_us', 0);
+ }
+
+ /**
+ * @covers \ModuleInstallerAPI::LoadLocalizedData
+ */
+ public function testLoadLocalizedData_FallbacksToEnUsWhenLanguageFileIsMissing(): void
+ {
+ [$oConfig, $sOrgName, $sTmpDir, $sPattern] = $this->GivenLocalizedDataTestContext('XML_Load_Fallback_', 'fr_fr');
+ // Intentionally create ONLY en_us file
+ $this->GivenLocalizedDataFile($sTmpDir, 'en_us', $sOrgName);
+ // When loading localized data in fr_fr, but only en_us file exists
+ ModuleInstallerAPI::LoadLocalizedData($oConfig, '', '3.3.0', '3.0.0', $sPattern);
+
+ $this->AssertOrganizationCountByName($sOrgName, 'fr_fr', 0);
+ $this->AssertOrganizationCountByName($sOrgName, 'en_us', 1);
+ }
+
+ /**
+ * @covers \ModuleInstallerAPI::LoadLocalizedData
+ * @dataProvider LoadLocalizedData_ValidVersionFormatsProvider
+ */
+ public function testLoadLocalizedData_AcceptsSupportedVersionFormats(string $sCurrentVersion, string $sFirstLoadingVersion): void
+ {
+ [$oConfig, $sOrgName, $sTmpDir, $sPattern] = $this->GivenLocalizedDataTestContext('XML_Load_ValidVersion_', 'en_us');
+ $this->GivenLocalizedDataFile($sTmpDir, 'en_us', $sOrgName);
+
+ ModuleInstallerAPI::LoadLocalizedData($oConfig, '', $sCurrentVersion, $sFirstLoadingVersion, $sPattern);
+
+ $this->AssertOrganizationCountByName($sOrgName, 'en_us', 1);
+ }
+
+ public function LoadLocalizedData_ValidVersionFormatsProvider(): array
+ {
+ return [
+ 'Current version with suffix' => ['3.2-dev', '3.0.0'],
+ 'Current version x.y.z' => ['1.2.4', '1.0'],
+ 'Current version x.y.z-suffix' => ['2.3.3-beta', '2.0.0'],
+ 'Current version x.y.z-1' => ['1.2.4-1', '1.0.3-2'],
+ ];
+ }
+
+ /**
+ * @covers \ModuleInstallerAPI::LoadLocalizedData
+ * @dataProvider LoadLocalizedData_InvalidParametersProvider
+ */
+ public function testLoadLocalizedData_ThrowsOnInvalidParameters(string $sPreviousVersion, string $sCurrentVersion, string $sFirstLoadingVersion, string $sPattern, string $sExpectedMessage): void
+ {
+ $oConfig = MetaModel::GetConfig();
+ $this->assertNotNull($oConfig);
+
+ $this->expectException(\CoreUnexpectedValue::class);
+ $this->expectExceptionMessage($sExpectedMessage);
+
+ ModuleInstallerAPI::LoadLocalizedData($oConfig, $sPreviousVersion, $sCurrentVersion, $sFirstLoadingVersion, $sPattern);
+ }
+
+ public function LoadLocalizedData_InvalidParametersProvider(): array
+ {
+ $sTmpDir = static::CreateTmpdir();
+ $this->aFileToClean[] = $sTmpDir;
+
+ return [
+ 'Invalid previous version format' => [
+ 'previous' => 'v3.2',
+ 'current' => '3.2.0',
+ 'first' => '3.0.0',
+ 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml',
+ 'message' => 'sPreviousVersion',
+ ],
+ 'Invalid current version format' => [
+ 'previous' => '',
+ 'current' => '3',
+ 'first' => '3.0.0',
+ 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml',
+ 'message' => 'sCurrentVersion',
+ ],
+ 'Invalid first loading version format' => [
+ 'previous' => '',
+ 'current' => '3.2.0',
+ 'first' => '3.0.0-beta.1',
+ 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml',
+ 'message' => 'sFirstLoadingVersion',
+ ],
+ 'Missing strict placeholder' => [
+ 'previous' => '',
+ 'current' => '3.2.0',
+ 'first' => '3.0.0',
+ 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'data.{{LANGUAGE_CODE}}.xml',
+ 'message' => "{{language_code}}",
+ ],
+ 'Parent directory does not exist' => [
+ 'previous' => '',
+ 'current' => '3.2.0',
+ 'first' => '3.0.0',
+ 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'missing'.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml',
+ 'message' => 'parent directory',
+ ],
+ ];
+ }
+
+ /**
+ * Prepare common context for LoadLocalizedData tests.
+ *
+ * @return array{0: Config, 1: string, 2: string, 3: string, 4: string}
+ */
+ private function GivenLocalizedDataTestContext(string $sOrgNamePrefix, string $sLanguage): array
+ {
+ $oConfig = MetaModel::GetConfig();
+ $oConfig->SetDefaultLanguage($sLanguage);
+ $this->assertNotNull($oConfig);
+
+ $sOrgName = $sOrgNamePrefix.uniqid();
+
+ $sTmpDir = static::CreateTmpdir();
+ $this->aFileToClean[] = $sTmpDir;
+ $sPattern = $sTmpDir.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml';
+
+ return [$oConfig, $sOrgName, $sTmpDir, $sPattern];
+ }
+
+ private function GivenLocalizedDataFile(string $sDir, string $sLang, string $sOrgName): string
+ {
+ $sFilePath = $sDir.DIRECTORY_SEPARATOR.'data.'.$sLang.'.xml';
+ file_put_contents($sFilePath, $this->BuildOrganizationXml($sOrgName, $sLang));
+
+ return $sFilePath;
+ }
+
+ private function BuildOrganizationXml(string $sOrgName, string $sLang): string
+ {
+ $iId = random_int(100000, 999999);
+ $sOrgNameXml = htmlspecialchars($sOrgName, ENT_XML1);
+
+ return <<
+
+
+ {$sOrgNameXml}
+ {$sLang}
+ active
+
+
+XML;
+ }
+
+ private function AssertOrganizationCountByName(string $sOrgName, string $sLanguage, int $iExpectedCount): void
+ {
+ $oSet = new \DBObjectSet(
+ \DBSearch::FromOQL("SELECT Organization WHERE name = :org_name AND code = :language"),
+ [],
+ ['org_name' => $sOrgName, 'language' => $sLanguage]
+ );
+ $iCount = $oSet->Count();
+ $this->assertEquals($iExpectedCount, $iCount, "Found $iCount changes for objects with name '{$sOrgName}' and language '{$sLanguage}', expected {$iExpectedCount}");
+ }
}
| |