diff --git a/doc/src/api/index.md b/doc/src/api/index.md
index dc557119..1eeffbd4 100644
--- a/doc/src/api/index.md
+++ b/doc/src/api/index.md
@@ -398,6 +398,35 @@ HTTP 404 sera générée.
}
```
+- `/api/1.0/object/[object type]/[dn]/customAction/[customAction]`
+
+ Cette méthode permet d'exécuter une [action personnalisée](../conf/LSobject/customActions.md) sur
+ un objet dans l'annuaire. Le nom de l'action ainsi que le type de l'objet et son DN sont précisés
+ dans l'URL et doivent être encodés en conséquence.
+
+ **Exemple :**
+
+ ```
+ # curl -u username:secret 'https://ldapsaisie/api/1.0/object/LSpeople/uid=foo.bar,ou=people,o=ls/customAction/action?pretty'
+ {
+ "dn": "uid=foo.bar,ou=people,o=ls",
+ "type": "LSpeople",
+ "name": "Foo Bar",
+ "success": true,
+ "messages": [
+ "L'action personnalis\u00e9e action a \u00e9t\u00e9 correctement ex\u00e9cut\u00e9e sur Foo Bar.",
+ ]
+ }
+ ```
+
+ !!! note
+
+ Par défaut, une action personnalisée ne retourne qu'un booléen permettant de savoir si
+ l'action a correctement été exécutée ou non. En outre, dans un contexte d'appel via l'API, il
+ est possible de retourner des informations via un tableau associatif dont le contenu sera
+ fusionné avec les données retournées par la requête. Pour plus d'informations à ce sujet,
+ consultez la [documentation sur l'écriture d'une fonction implémentant une customAction](../conf/LSobject/customActions.md#ecriture-dune-fonction-implementant-une-customaction).
+
- `/api/1.0/object/[object type]/import`
Cette méthode permet d'importer des objets d'un type en particulier à partir de données d'import
@@ -634,7 +663,7 @@ HTTP 404 sera générée.
**Exemple :**
```
- # curl -u username:secret 'https://ldapsaisie/api/api/1.0/search?pattern=LdapSaisie&pretty'
+ # curl -u username:secret 'https://ldapsaisie/api/1.0/search?pattern=LdapSaisie&pretty'
{
"success": true,
"objects": {
diff --git a/doc/src/conf/LSobject/customActions.md b/doc/src/conf/LSobject/customActions.md
index 7834e69c..3f7bc7e2 100644
--- a/doc/src/conf/LSobject/customActions.md
+++ b/doc/src/conf/LSobject/customActions.md
@@ -17,6 +17,10 @@ $GLOBALS['LSobjects']['[nom du type d'LSobject]']['customActions'] = array (
'noConfirmation' => '[booléen]',
'redirectToObjectList' => '[booléen]',
'noRedirect' => '[booléen]',
+ 'accessMethods' => array(
+ 'web',
+ 'api',
+ ),
'rights' => array(
'LSprofile1',
'LSprofile2',
@@ -87,6 +91,13 @@ $GLOBALS['LSobjects']['[nom du type d'LSobject]']['customActions'] = array (
[LSprofiles](../global/ldap/LSprofile.md#profils-dutilisateurs) ayant le droit d'exécuter cette
action.
+- `accessMethods`
+
+ Tableau permetant de restreindre les moyens d'accès possibles à cette action. Par défaut, tous les
+ moyens d'accès possibles sont autorisés. Valeurs possibles : `web` pour les accès via l'interface
+ web et `api` pour les accès via l'API.
+
+
## Écriture d'une fonction implémentant une customAction
Une fonction implémentant une *customAction* se déclare de la manière suivante :
@@ -101,6 +112,9 @@ Une fonction implémentant une *customAction* se déclare de la manière suivant
* Valeurs retournées :
* - True : Tout s'est bien passé
* - False : Une erreur est survenue
+ * - Cas particulier pour une exécution via l'API : un tableau des données
+ * à retourner. Exemple :
+ * ["success" => true, "extra_info1" => "...", "extra_info2" => "..."]
*/
function maFonction ($object) {
@@ -114,6 +128,14 @@ Cette fonction doit prendre pour seul paramètre, le [LSobject](index.md#configu
lequel l'action personnalisée doit être exécutée et doit retourner soit `True` si tout s'est bien
passé, soit `False` en cas de problème.
+Une *customAction* pourra également être appelé via l'API. Dans ce cas, il est possible de
+retourner un tableau associatif et non un simple booléen. Le résultat retourné sera alors
+fusionné avec les données retournées par la requête. Ce tableau devra contenir à minima la clé
+`success` qui indiquera via un booléen si l'exécution est un succès ou non. Il est possible de
+détecter si la méthode est appelée via l'API en appelant la méthode
+`LSsession :: get('api_mode')`. Vous pouvez prendre exemple sur le code de la méthode
+`showTechInfo()` fournie par le LSaddon [showTechInfo](../LSaddon/LSaddon_showTechInfo.md).
+
!!! note
Ces fonctions sont le plus couramment définies au sein d'
diff --git a/src/includes/addons/LSaddons.showTechInfo.php b/src/includes/addons/LSaddons.showTechInfo.php
index 5361176a..144d16e9 100644
--- a/src/includes/addons/LSaddons.showTechInfo.php
+++ b/src/includes/addons/LSaddons.showTechInfo.php
@@ -110,6 +110,17 @@ function showTechInfo($object) {
// Sort other internal attributes by name
ksort($internal_attrs);
+ // Handle API mode
+ if (LSsession :: get('api_mode')) {
+ return [
+ "object_classes" => $object_classes,
+ "structural_object_class" => $structural_object_class,
+ "special_internal_attributes" => $special_internal_attributes,
+ "other_internal_attrs" => $internal_attrs,
+ "success" => true,
+ ];
+ }
+
LStemplate :: assign('pagetitle', getFData(_('%{name}: Technical information'), $object -> getDisplayName()));
$LSview_actions=array();
diff --git a/src/includes/class/class.LSsession.php b/src/includes/class/class.LSsession.php
index e29abfea..3ee2c1f1 100644
--- a/src/includes/class/class.LSsession.php
+++ b/src/includes/class/class.LSsession.php
@@ -3210,6 +3210,9 @@ class LSsession {
LSerror :: defineError('LSsession_27',
___("LSsession : You always seem to use %{old} in your custom code: Please upgrade it and use %{new}.
\nContext:\n%{context}
")
);
+ LSerror :: defineError('LSsession_28',
+ ___("LSsession : This custom action can not be executed by this way.")
+ );
}
/**
diff --git a/src/includes/routes.php b/src/includes/routes.php
index 2614197a..f6580405 100644
--- a/src/includes/routes.php
+++ b/src/includes/routes.php
@@ -1079,7 +1079,13 @@ function handle_LSobject_show($request) {
$customActionsConfig = LSconfig :: get('LSobjects.'.$LSobject.'.customActions');
if (is_array($customActionsConfig)) {
foreach($customActionsConfig as $name => $config) {
- if (LSsession :: canExecuteCustomAction($dn, $LSobject, $name)) {
+ if (
+ LSsession :: canExecuteCustomAction($dn, $LSobject, $name)
+ && (
+ ! LSconfig :: get('accessMethods', [], 'array', $config)
+ || in_array('web', LSconfig :: get('accessMethods', [], 'array', $config))
+ )
+ ) {
$LSview_actions[] = array (
'label' => ((isset($config['label']))?__($config['label']):__($name)),
'hideLabel' => ((isset($config['hideLabel']) && $config['hideLabel'])?$config['hideLabel']:False),
@@ -1373,6 +1379,15 @@ function handle_LSobject_customAction($request) {
$config = LSconfig :: get("LSobjects.$LSobject.customActions.$customAction");
$title = isset($config['label'])?__($config['label']):$customAction;
+ if (
+ LSconfig :: get('accessMethods', [], 'array', $config)
+ && !in_array('web', LSconfig :: get('accessMethods', [], 'array', $config))
+ ) {
+ LSerror :: addErrorCode('LSsession_28');
+ LSsession :: displayTemplate();
+ return;
+ }
+
// Check customAction function
$function = LSconfig :: get('function', null, null, $config);
if (!is_callable($function)) {
@@ -2191,6 +2206,94 @@ function handle_api_LSobject_remove($request) {
}
LSurl :: add_handler('#^api/1.0/object/(?P[^/]+)/(?P[^/]+)/remove/?$#', 'handle_api_LSobject_remove', true, false, true);
+/*
+ * Handle API LSobject custom action request
+ *
+ * @param LSurlRequest $request The request
+ *
+ * @return void
+**/
+function handle_api_LSobject_customAction($request) {
+ $object = get_LSobject_from_API_request($request);
+ if (!$object)
+ return;
+
+ $data = array(
+ 'dn' => $object -> getDn(),
+ 'type' => $object -> getType(),
+ 'name' => $object -> getDisplayName(),
+ 'success' => false,
+ );
+
+ $customAction = $request -> customAction;
+
+ if ( !LSsession :: canExecuteCustomAction($data["dn"], $data["type"], $customAction) ) {
+ LSerror :: addErrorCode('LSsession_11');
+ LSsession :: displayAjaxReturn($data);
+ return;
+ }
+
+ $config = LSconfig :: get("LSobjects.{$data["type"]}.customActions.$customAction");
+ $title = isset($config['label'])?__($config['label']):$customAction;
+ $objectname = $object -> getDisplayName();
+
+ if (
+ LSconfig :: get('accessMethods', [], 'array', $config)
+ && !in_array('api', LSconfig :: get('accessMethods', [], 'array', $config))
+ ) {
+ LSerror :: addErrorCode('LSsession_28');
+ LSsession :: displayAjaxReturn($data);
+ return;
+ }
+
+ // Check customAction function
+ $function = LSconfig :: get('function', null, null, $config);
+ if (!is_callable($function)) {
+ LSerror :: addErrorCode(
+ 'LSsession_13',
+ array(
+ 'customAction' => $title,
+ 'function' => ($function?format_callable($function):_('undefined'))
+ )
+ );
+ LSsession :: displayAjaxReturn($data);
+ return;
+ }
+
+ // Run customAction
+ $result = call_user_func_array($function, array(&$object));
+
+ // Handle result: if its an array, merge it with returned data
+ if (is_array($result))
+ $data = array_merge($data, $result);
+
+ if ($result && (!is_array($result) || $data["success"])) {
+ $data["success"] = true;
+ if (!LSconfig :: get('disableOnSuccessMsg', false, 'bool', $config)) {
+ $msg_format = LSconfig :: get('onSuccessMsgFormat', null, 'string', $config);
+ if ($msg_format) {
+ $msg = getFData(__($msg_format), $objectname);
+ } else {
+ $msg = getFData(
+ _('The custom action %{customAction} have been successfully execute on %{objectname}.'),
+ array('objectname' => $objectname, 'customAction' => $customAction)
+ );
+ }
+ LSsession :: addInfo($msg);
+ }
+ }
+ else {
+ LSerror :: addErrorCode(
+ 'LSldapObject_31',
+ array('objectname' => $objectname, 'customAction' => $customAction)
+ );
+ }
+ LSsession :: displayAjaxReturn($data);
+}
+LSurl :: add_handler(
+ '#^api/1.0/object/(?P[^/]+)/(?P[^/]+)/customAction/(?P[^/]+)/?$#',
+ 'handle_api_LSobject_customAction', true, false, true);
+
/*
* Handle API LSobject relation request
*
diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo
index b2d8080a..313ee993 100644
Binary files a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo and b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo differ
diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po
index d581ba06..08d7d951 100644
--- a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po
+++ b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: LdapSaisie\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2024-03-04 11:34+0100\n"
+"PO-Revision-Date: 2024-04-04 15:14+0200\n"
"Last-Translator: Benjamin Renard \n"
"Language-Team: LdapSaisie \n"
@@ -323,7 +323,7 @@ msgstr "Vos modifications ont été enregistrées."
#: includes/addons/LSaddons.mail.php:565
#: includes/addons/LSaddons.showSupportInfo.php:78
#: includes/addons/LSaddons.accesslog.php:248
-#: includes/addons/LSaddons.showTechInfo.php:117
+#: includes/addons/LSaddons.showTechInfo.php:128
msgid "Go back"
msgstr "Retour"
@@ -453,8 +453,8 @@ msgstr "Comparer"
#: includes/class/class.LSrelation.php:679 includes/class/class.LSform.php:346
#: includes/class/class.LSformElement_select_object.php:75
#: includes/class/class.LSformElement_select_object.php:91
-#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1075
-#: includes/routes.php:1219
+#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1072
+#: includes/routes.php:1222
msgid "Delete"
msgstr "Supprimer"
@@ -467,8 +467,8 @@ msgstr "Étendue"
#: includes/class/class.LSrelation.php:736
#: includes/class/class.LSformElement_select_object.php:74
#: includes/class/class.LSformElement_supannLabeledValue.php:90
-#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1059
-#: includes/routes.php:1227 includes/routes.php:1313 includes/routes.php:1460
+#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1056
+#: includes/routes.php:1230 includes/routes.php:1315 includes/routes.php:1470
msgid "Modify"
msgstr "Modifier"
@@ -476,7 +476,7 @@ msgstr "Modifier"
msgid "Modify RDN"
msgstr "Modifier le RDN"
-#: includes/addons/LSaddons.accesslog.php:35 includes/routes.php:521
+#: includes/addons/LSaddons.accesslog.php:35 includes/routes.php:518
#: templates/default/select.tpl:28 templates/default/global_search.tpl:6
msgid "Search"
msgstr "Rechercher"
@@ -504,7 +504,7 @@ msgstr "Voir les modifications d'LdapSaisie"
#: includes/addons/LSaddons.accesslog.php:243
#: includes/class/class.LSsession.php:1875 includes/routes.php:157
-#: includes/routes.php:478 templates/default/select.tpl:29
+#: includes/routes.php:475 templates/default/select.tpl:29
msgid "Refresh"
msgstr "Rafraîchir"
@@ -750,7 +750,7 @@ msgstr "Oui"
msgid "No"
msgstr "Non"
-#: includes/addons/LSaddons.showTechInfo.php:113
+#: includes/addons/LSaddons.showTechInfo.php:124
msgid "%{name}: Technical information"
msgstr "%{name} : Informations techniques"
@@ -962,7 +962,7 @@ msgstr "Confirmez-vous votre choix ?"
#: includes/class/class.LSconfirmBox.php:37
#: includes/class/class.LSsmoothbox.php:39 includes/class/class.LSform.php:175
-#: includes/routes.php:645 includes/routes.php:1300 includes/routes.php:1447
+#: includes/routes.php:642 includes/routes.php:1302 includes/routes.php:1457
#: templates/default/recoverpassword.tpl:21
msgid "Validate"
msgstr "Valider"
@@ -1833,6 +1833,11 @@ msgstr ""
"Context:\n"
"%{context}"
+#: includes/class/class.LSsession.php:3214
+msgid "LSsession : This custom action can not be executed by this way."
+msgstr ""
+"LSsession : Cette action personnalisée ne peut être exécutée par ce biais."
+
#: includes/class/class.LSformRule_mimetype.php:53
#: includes/class/class.LSformRule_mimetype.php:57
msgid "Invalid file type (%{type})."
@@ -2328,8 +2333,8 @@ msgstr "Attention"
msgid "No object."
msgstr "Aucun objet."
-#: includes/class/class.LSrelation.php:747 includes/routes.php:460
-#: includes/routes.php:1004
+#: includes/class/class.LSrelation.php:747 includes/routes.php:457
+#: includes/routes.php:1001
msgid "New"
msgstr "Nouveau"
@@ -2565,13 +2570,13 @@ msgstr ""
"Une erreur est survenue en soumettant ce formulaire. Merci de ré-essayer ou "
"de contacter le support."
-#: includes/class/class.LSform.php:327 includes/routes.php:641
+#: includes/class/class.LSform.php:327 includes/routes.php:638
msgid "Do you really want to execute custom action %{title} on this search ?"
msgstr ""
"Êtes-vous vraiment sûre de vouloir exécuter l'action personnalisée %{title} "
"sur cette recherche ?"
-#: includes/class/class.LSform.php:333 includes/routes.php:1441
+#: includes/class/class.LSform.php:333 includes/routes.php:1451
msgid ""
"Do you really want to execute custom action %{customAction} on "
"%{objectname} ?"
@@ -2779,8 +2784,8 @@ msgstr "Réinitialiser le choix."
msgid "Display RSS stack."
msgstr "Afficher la file RSS."
-#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:594
-#: includes/routes.php:1388
+#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:591
+#: includes/routes.php:1398 includes/routes.php:2256
msgid "undefined"
msgstr "non-définie"
@@ -2899,39 +2904,39 @@ msgstr "Étape"
msgid "Pedagogical element"
msgstr "Élement pédagogique"
-#: includes/class/class.LSsearch.php:1318
+#: includes/class/class.LSsearch.php:1321
msgid "Actions"
msgstr "Actions"
-#: includes/class/class.LSsearch.php:1321
+#: includes/class/class.LSsearch.php:1324
#: templates/default/global_search.tpl:16
msgid "This search didn't get any result."
msgstr "Cette recherche n'a retournée aucun résultat."
-#: includes/class/class.LSsearch.php:1963
+#: includes/class/class.LSsearch.php:1966
msgid "LSsearch : Invalid filter : %{filter}."
msgstr "LSsearch : Filtre invalide : %{filter}."
-#: includes/class/class.LSsearch.php:1966
+#: includes/class/class.LSsearch.php:1969
msgid "LSsearch : Invalid basedn (%{basedn})."
msgstr "LSsearch : Base DN invalide (%{basedn})."
-#: includes/class/class.LSsearch.php:1969
+#: includes/class/class.LSsearch.php:1972
msgid "LSsearch : Invalid value for %{param} parameter."
msgstr "LSsearch : La valeur du paramètre %{param} est incorrecte."
-#: includes/class/class.LSsearch.php:1972
+#: includes/class/class.LSsearch.php:1975
msgid ""
"LSsearch : Invalid size limit. Must be an integer greater or equal to 0."
msgstr ""
"LSsearch : Limite de taille de recherche invalide. Elle doit être un entier "
"supérieur ou égal à 0."
-#: includes/class/class.LSsearch.php:1975
+#: includes/class/class.LSsearch.php:1978
msgid "LSsearch : Invalid parameter %{param}. Must be an boolean."
msgstr "LSsearch : Paramètre %{param} invalide. Il doit être un booléen."
-#: includes/class/class.LSsearch.php:1978
+#: includes/class/class.LSsearch.php:1981
msgid ""
"LSsearch : Invalid parameter attributes. Must be an string or an array of "
"strings."
@@ -2939,13 +2944,13 @@ msgstr ""
"LSsearch : Paramètre 'attributes' invalide. Il doit être une chaîne de "
"caractères ou un tableau de chaînes de caractères."
-#: includes/class/class.LSsearch.php:1981
+#: includes/class/class.LSsearch.php:1984
msgid "LSsearch : Can't build attributes list for make filter."
msgstr ""
"LSsearch : Impossible de construire la liste des attributs pour faire le "
"filtre."
-#: includes/class/class.LSsearch.php:1984
+#: includes/class/class.LSsearch.php:1987
msgid ""
"LSsearch : Error building filter with attribute '%{attr}' and pattern "
"'%{pattern}'"
@@ -2953,34 +2958,34 @@ msgstr ""
"LSsearch : Problème en construisant le filtre avec l'attribut '%{attr}' et "
"le mot clé '%{pattern}'"
-#: includes/class/class.LSsearch.php:1987
+#: includes/class/class.LSsearch.php:1990
msgid "LSsearch : Error combining filters."
msgstr "LSsearch : Problème en combinant les filtres."
-#: includes/class/class.LSsearch.php:1990
+#: includes/class/class.LSsearch.php:1993
msgid "LSsearch : Invalid pattern."
msgstr "LSsearch : Mot clé invalide."
-#: includes/class/class.LSsearch.php:1993
+#: includes/class/class.LSsearch.php:1996
msgid "LSsearch : Invalid attribute %{attr} in parameters."
msgstr "LSsearch : Attribut %{attr} incorrect dans les paramètres."
-#: includes/class/class.LSsearch.php:1996
+#: includes/class/class.LSsearch.php:1999
msgid "LSsearch : Error during the search."
msgstr "LSsearch : Erreur pendant la recherche."
-#: includes/class/class.LSsearch.php:1999
+#: includes/class/class.LSsearch.php:2002
msgid "LSsearch : Error sorting the search."
msgstr "LSsearch : Erreur pendant le trie de la recherche."
-#: includes/class/class.LSsearch.php:2002
+#: includes/class/class.LSsearch.php:2005
msgid ""
"LSsearch : The function of the custum information %{name} is not callable."
msgstr ""
"LSsearch : La fonction de l'information personnalisée %{name} n'est pas "
"exécutable."
-#: includes/class/class.LSsearch.php:2005
+#: includes/class/class.LSsearch.php:2008
msgid ""
"LSsearch : Invalid predefinedFilter for LSobject type %{type} : %{label} "
"(filter : %{filter})."
@@ -2988,13 +2993,13 @@ msgstr ""
"LSsearch : PredefinedFilter invalide pour le type d'LSobject %{type} : "
"%{label} (filtre : %{filter})."
-#: includes/class/class.LSsearch.php:2008
+#: includes/class/class.LSsearch.php:2011
msgid "LSsearch : Error during execution of the custom action %{customAction}."
msgstr ""
"LSldapObject : Erreur durant l'exécution de l'action personnalisée "
"%{customAction}."
-#: includes/class/class.LSsearch.php:2011
+#: includes/class/class.LSsearch.php:2014
msgid "LSsearch : Invalid search pattern."
msgstr "LSsearch : Mot clé de recherche invalide."
@@ -3312,12 +3317,12 @@ msgstr ""
"LSformRule_gpg_pub_key : L'extension PHP GnuPG n'est pas installée, "
"impossible de valider la valeur."
-#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1211
-#: includes/routes.php:1305 includes/routes.php:1452
+#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1214
+#: includes/routes.php:1307 includes/routes.php:1462
msgid "View"
msgstr "Voir"
-#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1067
+#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1064
msgid "Copy"
msgstr "Copier"
@@ -3347,66 +3352,66 @@ msgstr "Accueil"
msgid "You must provide pattern for global search."
msgstr "Vous devez fournir un mot clé pour les recherches globales."
-#: includes/routes.php:466 includes/routes.php:825
+#: includes/routes.php:463 includes/routes.php:822
msgid "Import"
msgstr "Importer"
-#: includes/routes.php:471 includes/routes.php:891
+#: includes/routes.php:468 includes/routes.php:888
msgid "Export"
msgstr "Exporter"
-#: includes/routes.php:483
+#: includes/routes.php:480
msgid "Reset"
msgstr "Réinitialiser"
-#: includes/routes.php:522 templates/default/select.tpl:31
+#: includes/routes.php:519 templates/default/select.tpl:31
msgid "Approximative search"
msgstr "Recherche approximative"
-#: includes/routes.php:523 templates/default/select.tpl:32
+#: includes/routes.php:520 templates/default/select.tpl:32
msgid "Recursive search"
msgstr "Recherche récursive"
-#: includes/routes.php:615
+#: includes/routes.php:612
msgid ""
"The custom action %{title} have been successfully execute on this search."
msgstr ""
"L'action personnalisée %{title} a été correctement exécutée sur cette "
"recherche."
-#: includes/routes.php:963
+#: includes/routes.php:960
msgid "Data entry form"
msgstr "Masque de saisie"
-#: includes/routes.php:969 includes/routes.php:1746
+#: includes/routes.php:966 includes/routes.php:1984
msgid "Object has been added."
msgstr "L'objet a été ajouté."
-#: includes/routes.php:1106
+#: includes/routes.php:1109
msgid "My account"
msgstr "Mon compte"
-#: includes/routes.php:1169 includes/routes.php:1918
+#: includes/routes.php:1172 includes/routes.php:2156
msgid "The object has been partially modified."
msgstr "L'objet a été partiellement modifié."
-#: includes/routes.php:1172 includes/routes.php:1921
+#: includes/routes.php:1175 includes/routes.php:2159
msgid "The object has been modified successfully."
msgstr "L'objet a bien été modifié."
-#: includes/routes.php:1288 includes/routes.php:1961
+#: includes/routes.php:1290 includes/routes.php:2199
msgid "%{objectname} has been successfully deleted."
msgstr "%{objectname} a bien été supprimé."
-#: includes/routes.php:1297
+#: includes/routes.php:1299
msgid "Deleting : %{objectname}"
msgstr "Suppression : %{objectname}"
-#: includes/routes.php:1298
+#: includes/routes.php:1300
msgid "Do you really want to delete %{displayName} ?"
msgstr "Voulez-vous vraiment supprimer %{displayName} ?"
-#: includes/routes.php:1409
+#: includes/routes.php:1419 includes/routes.php:2278
msgid ""
"The custom action %{customAction} have been successfully execute on "
"%{objectname}."
diff --git a/src/lang/ldapsaisie.pot b/src/lang/ldapsaisie.pot
index 2d4be0aa..52ad4799 100644
--- a/src/lang/ldapsaisie.pot
+++ b/src/lang/ldapsaisie.pot
@@ -251,7 +251,7 @@ msgstr ""
#: includes/addons/LSaddons.mail.php:565
#: includes/addons/LSaddons.showSupportInfo.php:78
#: includes/addons/LSaddons.accesslog.php:248
-#: includes/addons/LSaddons.showTechInfo.php:117
+#: includes/addons/LSaddons.showTechInfo.php:128
msgid "Go back"
msgstr ""
@@ -366,8 +366,8 @@ msgstr ""
#: includes/class/class.LSrelation.php:679 includes/class/class.LSform.php:346
#: includes/class/class.LSformElement_select_object.php:75
#: includes/class/class.LSformElement_select_object.php:91
-#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1075
-#: includes/routes.php:1219
+#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1072
+#: includes/routes.php:1222
msgid "Delete"
msgstr ""
@@ -380,8 +380,8 @@ msgstr ""
#: includes/class/class.LSrelation.php:736
#: includes/class/class.LSformElement_select_object.php:74
#: includes/class/class.LSformElement_supannLabeledValue.php:90
-#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1059
-#: includes/routes.php:1227 includes/routes.php:1313 includes/routes.php:1460
+#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1056
+#: includes/routes.php:1230 includes/routes.php:1315 includes/routes.php:1470
msgid "Modify"
msgstr ""
@@ -389,7 +389,7 @@ msgstr ""
msgid "Modify RDN"
msgstr ""
-#: includes/addons/LSaddons.accesslog.php:35 includes/routes.php:521
+#: includes/addons/LSaddons.accesslog.php:35 includes/routes.php:518
#: templates/default/select.tpl:28 templates/default/global_search.tpl:6
msgid "Search"
msgstr ""
@@ -417,7 +417,7 @@ msgstr ""
#: includes/addons/LSaddons.accesslog.php:243
#: includes/class/class.LSsession.php:1875 includes/routes.php:157
-#: includes/routes.php:478 templates/default/select.tpl:29
+#: includes/routes.php:475 templates/default/select.tpl:29
msgid "Refresh"
msgstr ""
@@ -633,7 +633,7 @@ msgstr ""
msgid "No"
msgstr ""
-#: includes/addons/LSaddons.showTechInfo.php:113
+#: includes/addons/LSaddons.showTechInfo.php:124
msgid "%{name}: Technical information"
msgstr ""
@@ -819,7 +819,7 @@ msgstr ""
#: includes/class/class.LSconfirmBox.php:37
#: includes/class/class.LSsmoothbox.php:39 includes/class/class.LSform.php:175
-#: includes/routes.php:645 includes/routes.php:1300 includes/routes.php:1447
+#: includes/routes.php:642 includes/routes.php:1302 includes/routes.php:1457
#: templates/default/recoverpassword.tpl:21
msgid "Validate"
msgstr ""
@@ -1552,6 +1552,10 @@ msgid ""
"%{context}"
msgstr ""
+#: includes/class/class.LSsession.php:3214
+msgid "LSsession : This custom action can not be executed by this way."
+msgstr ""
+
#: includes/class/class.LSformRule_mimetype.php:53
#: includes/class/class.LSformRule_mimetype.php:57
msgid "Invalid file type (%{type})."
@@ -1968,8 +1972,8 @@ msgstr ""
msgid "No object."
msgstr ""
-#: includes/class/class.LSrelation.php:747 includes/routes.php:460
-#: includes/routes.php:1004
+#: includes/class/class.LSrelation.php:747 includes/routes.php:457
+#: includes/routes.php:1001
msgid "New"
msgstr ""
@@ -2166,11 +2170,11 @@ msgid ""
"support."
msgstr ""
-#: includes/class/class.LSform.php:327 includes/routes.php:641
+#: includes/class/class.LSform.php:327 includes/routes.php:638
msgid "Do you really want to execute custom action %{title} on this search ?"
msgstr ""
-#: includes/class/class.LSform.php:333 includes/routes.php:1441
+#: includes/class/class.LSform.php:333 includes/routes.php:1451
msgid ""
"Do you really want to execute custom action %{customAction} on "
"%{objectname} ?"
@@ -2360,8 +2364,8 @@ msgstr ""
msgid "Display RSS stack."
msgstr ""
-#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:594
-#: includes/routes.php:1388
+#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:591
+#: includes/routes.php:1398 includes/routes.php:2256
msgid "undefined"
msgstr ""
@@ -2469,88 +2473,88 @@ msgstr ""
msgid "Pedagogical element"
msgstr ""
-#: includes/class/class.LSsearch.php:1318
+#: includes/class/class.LSsearch.php:1321
msgid "Actions"
msgstr ""
-#: includes/class/class.LSsearch.php:1321
+#: includes/class/class.LSsearch.php:1324
#: templates/default/global_search.tpl:16
msgid "This search didn't get any result."
msgstr ""
-#: includes/class/class.LSsearch.php:1963
+#: includes/class/class.LSsearch.php:1966
msgid "LSsearch : Invalid filter : %{filter}."
msgstr ""
-#: includes/class/class.LSsearch.php:1966
+#: includes/class/class.LSsearch.php:1969
msgid "LSsearch : Invalid basedn (%{basedn})."
msgstr ""
-#: includes/class/class.LSsearch.php:1969
+#: includes/class/class.LSsearch.php:1972
msgid "LSsearch : Invalid value for %{param} parameter."
msgstr ""
-#: includes/class/class.LSsearch.php:1972
+#: includes/class/class.LSsearch.php:1975
msgid ""
"LSsearch : Invalid size limit. Must be an integer greater or equal to 0."
msgstr ""
-#: includes/class/class.LSsearch.php:1975
+#: includes/class/class.LSsearch.php:1978
msgid "LSsearch : Invalid parameter %{param}. Must be an boolean."
msgstr ""
-#: includes/class/class.LSsearch.php:1978
+#: includes/class/class.LSsearch.php:1981
msgid ""
"LSsearch : Invalid parameter attributes. Must be an string or an array of "
"strings."
msgstr ""
-#: includes/class/class.LSsearch.php:1981
+#: includes/class/class.LSsearch.php:1984
msgid "LSsearch : Can't build attributes list for make filter."
msgstr ""
-#: includes/class/class.LSsearch.php:1984
+#: includes/class/class.LSsearch.php:1987
msgid ""
"LSsearch : Error building filter with attribute '%{attr}' and pattern "
"'%{pattern}'"
msgstr ""
-#: includes/class/class.LSsearch.php:1987
+#: includes/class/class.LSsearch.php:1990
msgid "LSsearch : Error combining filters."
msgstr ""
-#: includes/class/class.LSsearch.php:1990
+#: includes/class/class.LSsearch.php:1993
msgid "LSsearch : Invalid pattern."
msgstr ""
-#: includes/class/class.LSsearch.php:1993
+#: includes/class/class.LSsearch.php:1996
msgid "LSsearch : Invalid attribute %{attr} in parameters."
msgstr ""
-#: includes/class/class.LSsearch.php:1996
+#: includes/class/class.LSsearch.php:1999
msgid "LSsearch : Error during the search."
msgstr ""
-#: includes/class/class.LSsearch.php:1999
+#: includes/class/class.LSsearch.php:2002
msgid "LSsearch : Error sorting the search."
msgstr ""
-#: includes/class/class.LSsearch.php:2002
+#: includes/class/class.LSsearch.php:2005
msgid ""
"LSsearch : The function of the custum information %{name} is not callable."
msgstr ""
-#: includes/class/class.LSsearch.php:2005
+#: includes/class/class.LSsearch.php:2008
msgid ""
"LSsearch : Invalid predefinedFilter for LSobject type %{type} : %{label} "
"(filter : %{filter})."
msgstr ""
-#: includes/class/class.LSsearch.php:2008
+#: includes/class/class.LSsearch.php:2011
msgid "LSsearch : Error during execution of the custom action %{customAction}."
msgstr ""
-#: includes/class/class.LSsearch.php:2011
+#: includes/class/class.LSsearch.php:2014
msgid "LSsearch : Invalid search pattern."
msgstr ""
@@ -2813,12 +2817,12 @@ msgid ""
"LSformRule_gpg_pub_key: PHP GnuPG extension is missing, can't validate value."
msgstr ""
-#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1211
-#: includes/routes.php:1305 includes/routes.php:1452
+#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1214
+#: includes/routes.php:1307 includes/routes.php:1462
msgid "View"
msgstr ""
-#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1067
+#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1064
msgid "Copy"
msgstr ""
@@ -2844,64 +2848,64 @@ msgstr ""
msgid "You must provide pattern for global search."
msgstr ""
-#: includes/routes.php:466 includes/routes.php:825
+#: includes/routes.php:463 includes/routes.php:822
msgid "Import"
msgstr ""
-#: includes/routes.php:471 includes/routes.php:891
+#: includes/routes.php:468 includes/routes.php:888
msgid "Export"
msgstr ""
-#: includes/routes.php:483
+#: includes/routes.php:480
msgid "Reset"
msgstr ""
-#: includes/routes.php:522 templates/default/select.tpl:31
+#: includes/routes.php:519 templates/default/select.tpl:31
msgid "Approximative search"
msgstr ""
-#: includes/routes.php:523 templates/default/select.tpl:32
+#: includes/routes.php:520 templates/default/select.tpl:32
msgid "Recursive search"
msgstr ""
-#: includes/routes.php:615
+#: includes/routes.php:612
msgid ""
"The custom action %{title} have been successfully execute on this search."
msgstr ""
-#: includes/routes.php:963
+#: includes/routes.php:960
msgid "Data entry form"
msgstr ""
-#: includes/routes.php:969 includes/routes.php:1746
+#: includes/routes.php:966 includes/routes.php:1984
msgid "Object has been added."
msgstr ""
-#: includes/routes.php:1106
+#: includes/routes.php:1109
msgid "My account"
msgstr ""
-#: includes/routes.php:1169 includes/routes.php:1918
+#: includes/routes.php:1172 includes/routes.php:2156
msgid "The object has been partially modified."
msgstr ""
-#: includes/routes.php:1172 includes/routes.php:1921
+#: includes/routes.php:1175 includes/routes.php:2159
msgid "The object has been modified successfully."
msgstr ""
-#: includes/routes.php:1288 includes/routes.php:1961
+#: includes/routes.php:1290 includes/routes.php:2199
msgid "%{objectname} has been successfully deleted."
msgstr ""
-#: includes/routes.php:1297
+#: includes/routes.php:1299
msgid "Deleting : %{objectname}"
msgstr ""
-#: includes/routes.php:1298
+#: includes/routes.php:1300
msgid "Do you really want to delete %{displayName} ?"
msgstr ""
-#: includes/routes.php:1409
+#: includes/routes.php:1419 includes/routes.php:2278
msgid ""
"The custom action %{customAction} have been successfully execute on "
"%{objectname}."