API: allow to execute LSobject's custom actions

This commit is contained in:
Benjamin Renard 2024-04-04 16:11:06 +02:00
parent 2db4d0fbae
commit 118b784a5d
Signed by: bn8
GPG key ID: 3E2E1CE1907115BC
8 changed files with 284 additions and 107 deletions

View file

@ -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` - `/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 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 :** **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, "success": true,
"objects": { "objects": {

View file

@ -17,6 +17,10 @@ $GLOBALS['LSobjects']['[nom du type d'LSobject]']['customActions'] = array (
'noConfirmation' => '[booléen]', 'noConfirmation' => '[booléen]',
'redirectToObjectList' => '[booléen]', 'redirectToObjectList' => '[booléen]',
'noRedirect' => '[booléen]', 'noRedirect' => '[booléen]',
'accessMethods' => array(
'web',
'api',
),
'rights' => array( 'rights' => array(
'LSprofile1', 'LSprofile1',
'LSprofile2', '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 [LSprofiles](../global/ldap/LSprofile.md#profils-dutilisateurs) ayant le droit d'exécuter cette
action. 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 ## Écriture d'une fonction implémentant une customAction
Une fonction implémentant une *customAction* se déclare de la manière suivante : 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 : * Valeurs retournées :
* - True : Tout s'est bien passé * - True : Tout s'est bien passé
* - False : Une erreur est survenue * - 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) { 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 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. 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 !!! note
Ces fonctions sont le plus couramment définies au sein d' Ces fonctions sont le plus couramment définies au sein d'

View file

@ -110,6 +110,17 @@ function showTechInfo($object) {
// Sort other internal attributes by name // Sort other internal attributes by name
ksort($internal_attrs); 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())); LStemplate :: assign('pagetitle', getFData(_('%{name}: Technical information'), $object -> getDisplayName()));
$LSview_actions=array(); $LSview_actions=array();

View file

@ -3210,6 +3210,9 @@ class LSsession {
LSerror :: defineError('LSsession_27', LSerror :: defineError('LSsession_27',
___("LSsession : You always seem to use %{old} in your custom code: Please upgrade it and use %{new}.<pre>\nContext:\n%{context}</pre>") ___("LSsession : You always seem to use %{old} in your custom code: Please upgrade it and use %{new}.<pre>\nContext:\n%{context}</pre>")
); );
LSerror :: defineError('LSsession_28',
___("LSsession : This custom action can not be executed by this way.")
);
} }
/** /**

View file

@ -1079,7 +1079,13 @@ function handle_LSobject_show($request) {
$customActionsConfig = LSconfig :: get('LSobjects.'.$LSobject.'.customActions'); $customActionsConfig = LSconfig :: get('LSobjects.'.$LSobject.'.customActions');
if (is_array($customActionsConfig)) { if (is_array($customActionsConfig)) {
foreach($customActionsConfig as $name => $config) { 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 ( $LSview_actions[] = array (
'label' => ((isset($config['label']))?__($config['label']):__($name)), 'label' => ((isset($config['label']))?__($config['label']):__($name)),
'hideLabel' => ((isset($config['hideLabel']) && $config['hideLabel'])?$config['hideLabel']:False), '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"); $config = LSconfig :: get("LSobjects.$LSobject.customActions.$customAction");
$title = isset($config['label'])?__($config['label']):$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 // Check customAction function
$function = LSconfig :: get('function', null, null, $config); $function = LSconfig :: get('function', null, null, $config);
if (!is_callable($function)) { if (!is_callable($function)) {
@ -2191,6 +2206,94 @@ function handle_api_LSobject_remove($request) {
} }
LSurl :: add_handler('#^api/1.0/object/(?P<LSobject>[^/]+)/(?P<dn>[^/]+)/remove/?$#', 'handle_api_LSobject_remove', true, false, true); LSurl :: add_handler('#^api/1.0/object/(?P<LSobject>[^/]+)/(?P<dn>[^/]+)/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<LSobject>[^/]+)/(?P<dn>[^/]+)/customAction/(?P<customAction>[^/]+)/?$#',
'handle_api_LSobject_customAction', true, false, true);
/* /*
* Handle API LSobject relation request * Handle API LSobject relation request
* *

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: LdapSaisie\n" "Project-Id-Version: LdapSaisie\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \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 <brenard@easter-eggs.com>\n" "Last-Translator: Benjamin Renard <brenard@easter-eggs.com>\n"
"Language-Team: LdapSaisie <ldapsaisie-users@lists.labs.libre-entreprise." "Language-Team: LdapSaisie <ldapsaisie-users@lists.labs.libre-entreprise."
"org>\n" "org>\n"
@ -323,7 +323,7 @@ msgstr "Vos modifications ont été enregistrées."
#: includes/addons/LSaddons.mail.php:565 #: includes/addons/LSaddons.mail.php:565
#: includes/addons/LSaddons.showSupportInfo.php:78 #: includes/addons/LSaddons.showSupportInfo.php:78
#: includes/addons/LSaddons.accesslog.php:248 #: includes/addons/LSaddons.accesslog.php:248
#: includes/addons/LSaddons.showTechInfo.php:117 #: includes/addons/LSaddons.showTechInfo.php:128
msgid "Go back" msgid "Go back"
msgstr "Retour" msgstr "Retour"
@ -453,8 +453,8 @@ msgstr "Comparer"
#: includes/class/class.LSrelation.php:679 includes/class/class.LSform.php:346 #: 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:75
#: includes/class/class.LSformElement_select_object.php:91 #: includes/class/class.LSformElement_select_object.php:91
#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1075 #: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1072
#: includes/routes.php:1219 #: includes/routes.php:1222
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
@ -467,8 +467,8 @@ msgstr "Étendue"
#: includes/class/class.LSrelation.php:736 #: includes/class/class.LSrelation.php:736
#: includes/class/class.LSformElement_select_object.php:74 #: includes/class/class.LSformElement_select_object.php:74
#: includes/class/class.LSformElement_supannLabeledValue.php:90 #: includes/class/class.LSformElement_supannLabeledValue.php:90
#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1059 #: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1056
#: includes/routes.php:1227 includes/routes.php:1313 includes/routes.php:1460 #: includes/routes.php:1230 includes/routes.php:1315 includes/routes.php:1470
msgid "Modify" msgid "Modify"
msgstr "Modifier" msgstr "Modifier"
@ -476,7 +476,7 @@ msgstr "Modifier"
msgid "Modify RDN" msgid "Modify RDN"
msgstr "Modifier le 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 #: templates/default/select.tpl:28 templates/default/global_search.tpl:6
msgid "Search" msgid "Search"
msgstr "Rechercher" msgstr "Rechercher"
@ -504,7 +504,7 @@ msgstr "Voir les modifications d'LdapSaisie"
#: includes/addons/LSaddons.accesslog.php:243 #: includes/addons/LSaddons.accesslog.php:243
#: includes/class/class.LSsession.php:1875 includes/routes.php:157 #: 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" msgid "Refresh"
msgstr "Rafraîchir" msgstr "Rafraîchir"
@ -750,7 +750,7 @@ msgstr "Oui"
msgid "No" msgid "No"
msgstr "Non" msgstr "Non"
#: includes/addons/LSaddons.showTechInfo.php:113 #: includes/addons/LSaddons.showTechInfo.php:124
msgid "%{name}: Technical information" msgid "%{name}: Technical information"
msgstr "%{name} : Informations techniques" msgstr "%{name} : Informations techniques"
@ -962,7 +962,7 @@ msgstr "Confirmez-vous votre choix ?"
#: includes/class/class.LSconfirmBox.php:37 #: includes/class/class.LSconfirmBox.php:37
#: includes/class/class.LSsmoothbox.php:39 includes/class/class.LSform.php:175 #: 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 #: templates/default/recoverpassword.tpl:21
msgid "Validate" msgid "Validate"
msgstr "Valider" msgstr "Valider"
@ -1833,6 +1833,11 @@ msgstr ""
"Context:\n" "Context:\n"
"%{context}</pre>" "%{context}</pre>"
#: 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:53
#: includes/class/class.LSformRule_mimetype.php:57 #: includes/class/class.LSformRule_mimetype.php:57
msgid "Invalid file type (%{type})." msgid "Invalid file type (%{type})."
@ -2328,8 +2333,8 @@ msgstr "Attention"
msgid "No object." msgid "No object."
msgstr "Aucun objet." msgstr "Aucun objet."
#: includes/class/class.LSrelation.php:747 includes/routes.php:460 #: includes/class/class.LSrelation.php:747 includes/routes.php:457
#: includes/routes.php:1004 #: includes/routes.php:1001
msgid "New" msgid "New"
msgstr "Nouveau" msgstr "Nouveau"
@ -2565,13 +2570,13 @@ msgstr ""
"Une erreur est survenue en soumettant ce formulaire. Merci de ré-essayer ou " "Une erreur est survenue en soumettant ce formulaire. Merci de ré-essayer ou "
"de contacter le support." "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 ?" msgid "Do you really want to execute custom action %{title} on this search ?"
msgstr "" msgstr ""
"Êtes-vous vraiment sûre de vouloir exécuter l'action personnalisée %{title} " "Êtes-vous vraiment sûre de vouloir exécuter l'action personnalisée %{title} "
"sur cette recherche ?" "sur cette recherche ?"
#: includes/class/class.LSform.php:333 includes/routes.php:1441 #: includes/class/class.LSform.php:333 includes/routes.php:1451
msgid "" msgid ""
"Do you really want to execute custom action %{customAction} on " "Do you really want to execute custom action %{customAction} on "
"%{objectname} ?" "%{objectname} ?"
@ -2779,8 +2784,8 @@ msgstr "Réinitialiser le choix."
msgid "Display RSS stack." msgid "Display RSS stack."
msgstr "Afficher la file RSS." msgstr "Afficher la file RSS."
#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:594 #: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:591
#: includes/routes.php:1388 #: includes/routes.php:1398 includes/routes.php:2256
msgid "undefined" msgid "undefined"
msgstr "non-définie" msgstr "non-définie"
@ -2899,39 +2904,39 @@ msgstr "Étape"
msgid "Pedagogical element" msgid "Pedagogical element"
msgstr "Élement pédagogique" msgstr "Élement pédagogique"
#: includes/class/class.LSsearch.php:1318 #: includes/class/class.LSsearch.php:1321
msgid "Actions" msgid "Actions"
msgstr "Actions" msgstr "Actions"
#: includes/class/class.LSsearch.php:1321 #: includes/class/class.LSsearch.php:1324
#: templates/default/global_search.tpl:16 #: templates/default/global_search.tpl:16
msgid "This search didn't get any result." msgid "This search didn't get any result."
msgstr "Cette recherche n'a retournée aucun résultat." 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}." msgid "LSsearch : Invalid filter : %{filter}."
msgstr "LSsearch : Filtre invalide : %{filter}." msgstr "LSsearch : Filtre invalide : %{filter}."
#: includes/class/class.LSsearch.php:1966 #: includes/class/class.LSsearch.php:1969
msgid "LSsearch : Invalid basedn (%{basedn})." msgid "LSsearch : Invalid basedn (%{basedn})."
msgstr "LSsearch : Base DN invalide (%{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." msgid "LSsearch : Invalid value for %{param} parameter."
msgstr "LSsearch : La valeur du paramètre %{param} est incorrecte." msgstr "LSsearch : La valeur du paramètre %{param} est incorrecte."
#: includes/class/class.LSsearch.php:1972 #: includes/class/class.LSsearch.php:1975
msgid "" msgid ""
"LSsearch : Invalid size limit. Must be an integer greater or equal to 0." "LSsearch : Invalid size limit. Must be an integer greater or equal to 0."
msgstr "" msgstr ""
"LSsearch : Limite de taille de recherche invalide. Elle doit être un entier " "LSsearch : Limite de taille de recherche invalide. Elle doit être un entier "
"supérieur ou égal à 0." "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." msgid "LSsearch : Invalid parameter %{param}. Must be an boolean."
msgstr "LSsearch : Paramètre %{param} invalide. Il doit être un booléen." 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 "" msgid ""
"LSsearch : Invalid parameter attributes. Must be an string or an array of " "LSsearch : Invalid parameter attributes. Must be an string or an array of "
"strings." "strings."
@ -2939,13 +2944,13 @@ msgstr ""
"LSsearch : Paramètre 'attributes' invalide. Il doit être une chaîne de " "LSsearch : Paramètre 'attributes' invalide. Il doit être une chaîne de "
"caractères ou un tableau de chaînes de caractères." "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." msgid "LSsearch : Can't build attributes list for make filter."
msgstr "" msgstr ""
"LSsearch : Impossible de construire la liste des attributs pour faire le " "LSsearch : Impossible de construire la liste des attributs pour faire le "
"filtre." "filtre."
#: includes/class/class.LSsearch.php:1984 #: includes/class/class.LSsearch.php:1987
msgid "" msgid ""
"LSsearch : Error building filter with attribute '%{attr}' and pattern " "LSsearch : Error building filter with attribute '%{attr}' and pattern "
"'%{pattern}'" "'%{pattern}'"
@ -2953,34 +2958,34 @@ msgstr ""
"LSsearch : Problème en construisant le filtre avec l'attribut '%{attr}' et " "LSsearch : Problème en construisant le filtre avec l'attribut '%{attr}' et "
"le mot clé '%{pattern}'" "le mot clé '%{pattern}'"
#: includes/class/class.LSsearch.php:1987 #: includes/class/class.LSsearch.php:1990
msgid "LSsearch : Error combining filters." msgid "LSsearch : Error combining filters."
msgstr "LSsearch : Problème en combinant les filtres." msgstr "LSsearch : Problème en combinant les filtres."
#: includes/class/class.LSsearch.php:1990 #: includes/class/class.LSsearch.php:1993
msgid "LSsearch : Invalid pattern." msgid "LSsearch : Invalid pattern."
msgstr "LSsearch : Mot clé invalide." msgstr "LSsearch : Mot clé invalide."
#: includes/class/class.LSsearch.php:1993 #: includes/class/class.LSsearch.php:1996
msgid "LSsearch : Invalid attribute %{attr} in parameters." msgid "LSsearch : Invalid attribute %{attr} in parameters."
msgstr "LSsearch : Attribut %{attr} incorrect dans les paramètres." 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." msgid "LSsearch : Error during the search."
msgstr "LSsearch : Erreur pendant la recherche." msgstr "LSsearch : Erreur pendant la recherche."
#: includes/class/class.LSsearch.php:1999 #: includes/class/class.LSsearch.php:2002
msgid "LSsearch : Error sorting the search." msgid "LSsearch : Error sorting the search."
msgstr "LSsearch : Erreur pendant le trie de la recherche." msgstr "LSsearch : Erreur pendant le trie de la recherche."
#: includes/class/class.LSsearch.php:2002 #: includes/class/class.LSsearch.php:2005
msgid "" msgid ""
"LSsearch : The function of the custum information %{name} is not callable." "LSsearch : The function of the custum information %{name} is not callable."
msgstr "" msgstr ""
"LSsearch : La fonction de l'information personnalisée %{name} n'est pas " "LSsearch : La fonction de l'information personnalisée %{name} n'est pas "
"exécutable." "exécutable."
#: includes/class/class.LSsearch.php:2005 #: includes/class/class.LSsearch.php:2008
msgid "" msgid ""
"LSsearch : Invalid predefinedFilter for LSobject type %{type} : %{label} " "LSsearch : Invalid predefinedFilter for LSobject type %{type} : %{label} "
"(filter : %{filter})." "(filter : %{filter})."
@ -2988,13 +2993,13 @@ msgstr ""
"LSsearch : PredefinedFilter invalide pour le type d'LSobject %{type} : " "LSsearch : PredefinedFilter invalide pour le type d'LSobject %{type} : "
"%{label} (filtre : %{filter})." "%{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}." msgid "LSsearch : Error during execution of the custom action %{customAction}."
msgstr "" msgstr ""
"LSldapObject : Erreur durant l'exécution de l'action personnalisée " "LSldapObject : Erreur durant l'exécution de l'action personnalisée "
"%{customAction}." "%{customAction}."
#: includes/class/class.LSsearch.php:2011 #: includes/class/class.LSsearch.php:2014
msgid "LSsearch : Invalid search pattern." msgid "LSsearch : Invalid search pattern."
msgstr "LSsearch : Mot clé de recherche invalide." 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, " "LSformRule_gpg_pub_key : L'extension PHP GnuPG n'est pas installée, "
"impossible de valider la valeur." "impossible de valider la valeur."
#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1211 #: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1214
#: includes/routes.php:1305 includes/routes.php:1452 #: includes/routes.php:1307 includes/routes.php:1462
msgid "View" msgid "View"
msgstr "Voir" msgstr "Voir"
#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1067 #: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1064
msgid "Copy" msgid "Copy"
msgstr "Copier" msgstr "Copier"
@ -3347,66 +3352,66 @@ msgstr "Accueil"
msgid "You must provide pattern for global search." msgid "You must provide pattern for global search."
msgstr "Vous devez fournir un mot clé pour les recherches globales." 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" msgid "Import"
msgstr "Importer" msgstr "Importer"
#: includes/routes.php:471 includes/routes.php:891 #: includes/routes.php:468 includes/routes.php:888
msgid "Export" msgid "Export"
msgstr "Exporter" msgstr "Exporter"
#: includes/routes.php:483 #: includes/routes.php:480
msgid "Reset" msgid "Reset"
msgstr "Réinitialiser" msgstr "Réinitialiser"
#: includes/routes.php:522 templates/default/select.tpl:31 #: includes/routes.php:519 templates/default/select.tpl:31
msgid "Approximative search" msgid "Approximative search"
msgstr "Recherche approximative" msgstr "Recherche approximative"
#: includes/routes.php:523 templates/default/select.tpl:32 #: includes/routes.php:520 templates/default/select.tpl:32
msgid "Recursive search" msgid "Recursive search"
msgstr "Recherche récursive" msgstr "Recherche récursive"
#: includes/routes.php:615 #: includes/routes.php:612
msgid "" msgid ""
"The custom action %{title} have been successfully execute on this search." "The custom action %{title} have been successfully execute on this search."
msgstr "" msgstr ""
"L'action personnalisée %{title} a été correctement exécutée sur cette " "L'action personnalisée %{title} a été correctement exécutée sur cette "
"recherche." "recherche."
#: includes/routes.php:963 #: includes/routes.php:960
msgid "Data entry form" msgid "Data entry form"
msgstr "Masque de saisie" 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." msgid "Object has been added."
msgstr "L'objet a été ajouté." msgstr "L'objet a été ajouté."
#: includes/routes.php:1106 #: includes/routes.php:1109
msgid "My account" msgid "My account"
msgstr "Mon compte" 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." msgid "The object has been partially modified."
msgstr "L'objet a été partiellement modifié." 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." msgid "The object has been modified successfully."
msgstr "L'objet a bien été modifié." 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." msgid "%{objectname} has been successfully deleted."
msgstr "%{objectname} a bien été supprimé." msgstr "%{objectname} a bien été supprimé."
#: includes/routes.php:1297 #: includes/routes.php:1299
msgid "Deleting : %{objectname}" msgid "Deleting : %{objectname}"
msgstr "Suppression : %{objectname}" msgstr "Suppression : %{objectname}"
#: includes/routes.php:1298 #: includes/routes.php:1300
msgid "Do you really want to delete <strong>%{displayName}</strong> ?" msgid "Do you really want to delete <strong>%{displayName}</strong> ?"
msgstr "Voulez-vous vraiment supprimer <strong>%{displayName}</strong> ?" msgstr "Voulez-vous vraiment supprimer <strong>%{displayName}</strong> ?"
#: includes/routes.php:1409 #: includes/routes.php:1419 includes/routes.php:2278
msgid "" msgid ""
"The custom action %{customAction} have been successfully execute on " "The custom action %{customAction} have been successfully execute on "
"%{objectname}." "%{objectname}."

View file

@ -251,7 +251,7 @@ msgstr ""
#: includes/addons/LSaddons.mail.php:565 #: includes/addons/LSaddons.mail.php:565
#: includes/addons/LSaddons.showSupportInfo.php:78 #: includes/addons/LSaddons.showSupportInfo.php:78
#: includes/addons/LSaddons.accesslog.php:248 #: includes/addons/LSaddons.accesslog.php:248
#: includes/addons/LSaddons.showTechInfo.php:117 #: includes/addons/LSaddons.showTechInfo.php:128
msgid "Go back" msgid "Go back"
msgstr "" msgstr ""
@ -366,8 +366,8 @@ msgstr ""
#: includes/class/class.LSrelation.php:679 includes/class/class.LSform.php:346 #: 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:75
#: includes/class/class.LSformElement_select_object.php:91 #: includes/class/class.LSformElement_select_object.php:91
#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1075 #: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1072
#: includes/routes.php:1219 #: includes/routes.php:1222
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@ -380,8 +380,8 @@ msgstr ""
#: includes/class/class.LSrelation.php:736 #: includes/class/class.LSrelation.php:736
#: includes/class/class.LSformElement_select_object.php:74 #: includes/class/class.LSformElement_select_object.php:74
#: includes/class/class.LSformElement_supannLabeledValue.php:90 #: includes/class/class.LSformElement_supannLabeledValue.php:90
#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1059 #: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1056
#: includes/routes.php:1227 includes/routes.php:1313 includes/routes.php:1460 #: includes/routes.php:1230 includes/routes.php:1315 includes/routes.php:1470
msgid "Modify" msgid "Modify"
msgstr "" msgstr ""
@ -389,7 +389,7 @@ msgstr ""
msgid "Modify RDN" msgid "Modify RDN"
msgstr "" 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 #: templates/default/select.tpl:28 templates/default/global_search.tpl:6
msgid "Search" msgid "Search"
msgstr "" msgstr ""
@ -417,7 +417,7 @@ msgstr ""
#: includes/addons/LSaddons.accesslog.php:243 #: includes/addons/LSaddons.accesslog.php:243
#: includes/class/class.LSsession.php:1875 includes/routes.php:157 #: 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" msgid "Refresh"
msgstr "" msgstr ""
@ -633,7 +633,7 @@ msgstr ""
msgid "No" msgid "No"
msgstr "" msgstr ""
#: includes/addons/LSaddons.showTechInfo.php:113 #: includes/addons/LSaddons.showTechInfo.php:124
msgid "%{name}: Technical information" msgid "%{name}: Technical information"
msgstr "" msgstr ""
@ -819,7 +819,7 @@ msgstr ""
#: includes/class/class.LSconfirmBox.php:37 #: includes/class/class.LSconfirmBox.php:37
#: includes/class/class.LSsmoothbox.php:39 includes/class/class.LSform.php:175 #: 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 #: templates/default/recoverpassword.tpl:21
msgid "Validate" msgid "Validate"
msgstr "" msgstr ""
@ -1552,6 +1552,10 @@ msgid ""
"%{context}</pre>" "%{context}</pre>"
msgstr "" 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:53
#: includes/class/class.LSformRule_mimetype.php:57 #: includes/class/class.LSformRule_mimetype.php:57
msgid "Invalid file type (%{type})." msgid "Invalid file type (%{type})."
@ -1968,8 +1972,8 @@ msgstr ""
msgid "No object." msgid "No object."
msgstr "" msgstr ""
#: includes/class/class.LSrelation.php:747 includes/routes.php:460 #: includes/class/class.LSrelation.php:747 includes/routes.php:457
#: includes/routes.php:1004 #: includes/routes.php:1001
msgid "New" msgid "New"
msgstr "" msgstr ""
@ -2166,11 +2170,11 @@ msgid ""
"support." "support."
msgstr "" 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 ?" msgid "Do you really want to execute custom action %{title} on this search ?"
msgstr "" msgstr ""
#: includes/class/class.LSform.php:333 includes/routes.php:1441 #: includes/class/class.LSform.php:333 includes/routes.php:1451
msgid "" msgid ""
"Do you really want to execute custom action %{customAction} on " "Do you really want to execute custom action %{customAction} on "
"%{objectname} ?" "%{objectname} ?"
@ -2360,8 +2364,8 @@ msgstr ""
msgid "Display RSS stack." msgid "Display RSS stack."
msgstr "" msgstr ""
#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:594 #: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:591
#: includes/routes.php:1388 #: includes/routes.php:1398 includes/routes.php:2256
msgid "undefined" msgid "undefined"
msgstr "" msgstr ""
@ -2469,88 +2473,88 @@ msgstr ""
msgid "Pedagogical element" msgid "Pedagogical element"
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1318 #: includes/class/class.LSsearch.php:1321
msgid "Actions" msgid "Actions"
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1321 #: includes/class/class.LSsearch.php:1324
#: templates/default/global_search.tpl:16 #: templates/default/global_search.tpl:16
msgid "This search didn't get any result." msgid "This search didn't get any result."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1963 #: includes/class/class.LSsearch.php:1966
msgid "LSsearch : Invalid filter : %{filter}." msgid "LSsearch : Invalid filter : %{filter}."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1966 #: includes/class/class.LSsearch.php:1969
msgid "LSsearch : Invalid basedn (%{basedn})." msgid "LSsearch : Invalid basedn (%{basedn})."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1969 #: includes/class/class.LSsearch.php:1972
msgid "LSsearch : Invalid value for %{param} parameter." msgid "LSsearch : Invalid value for %{param} parameter."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1972 #: includes/class/class.LSsearch.php:1975
msgid "" msgid ""
"LSsearch : Invalid size limit. Must be an integer greater or equal to 0." "LSsearch : Invalid size limit. Must be an integer greater or equal to 0."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1975 #: includes/class/class.LSsearch.php:1978
msgid "LSsearch : Invalid parameter %{param}. Must be an boolean." msgid "LSsearch : Invalid parameter %{param}. Must be an boolean."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1978 #: includes/class/class.LSsearch.php:1981
msgid "" msgid ""
"LSsearch : Invalid parameter attributes. Must be an string or an array of " "LSsearch : Invalid parameter attributes. Must be an string or an array of "
"strings." "strings."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1981 #: includes/class/class.LSsearch.php:1984
msgid "LSsearch : Can't build attributes list for make filter." msgid "LSsearch : Can't build attributes list for make filter."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1984 #: includes/class/class.LSsearch.php:1987
msgid "" msgid ""
"LSsearch : Error building filter with attribute '%{attr}' and pattern " "LSsearch : Error building filter with attribute '%{attr}' and pattern "
"'%{pattern}'" "'%{pattern}'"
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1987 #: includes/class/class.LSsearch.php:1990
msgid "LSsearch : Error combining filters." msgid "LSsearch : Error combining filters."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1990 #: includes/class/class.LSsearch.php:1993
msgid "LSsearch : Invalid pattern." msgid "LSsearch : Invalid pattern."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1993 #: includes/class/class.LSsearch.php:1996
msgid "LSsearch : Invalid attribute %{attr} in parameters." msgid "LSsearch : Invalid attribute %{attr} in parameters."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1996 #: includes/class/class.LSsearch.php:1999
msgid "LSsearch : Error during the search." msgid "LSsearch : Error during the search."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:1999 #: includes/class/class.LSsearch.php:2002
msgid "LSsearch : Error sorting the search." msgid "LSsearch : Error sorting the search."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:2002 #: includes/class/class.LSsearch.php:2005
msgid "" msgid ""
"LSsearch : The function of the custum information %{name} is not callable." "LSsearch : The function of the custum information %{name} is not callable."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:2005 #: includes/class/class.LSsearch.php:2008
msgid "" msgid ""
"LSsearch : Invalid predefinedFilter for LSobject type %{type} : %{label} " "LSsearch : Invalid predefinedFilter for LSobject type %{type} : %{label} "
"(filter : %{filter})." "(filter : %{filter})."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:2008 #: includes/class/class.LSsearch.php:2011
msgid "LSsearch : Error during execution of the custom action %{customAction}." msgid "LSsearch : Error during execution of the custom action %{customAction}."
msgstr "" msgstr ""
#: includes/class/class.LSsearch.php:2011 #: includes/class/class.LSsearch.php:2014
msgid "LSsearch : Invalid search pattern." msgid "LSsearch : Invalid search pattern."
msgstr "" msgstr ""
@ -2813,12 +2817,12 @@ msgid ""
"LSformRule_gpg_pub_key: PHP GnuPG extension is missing, can't validate value." "LSformRule_gpg_pub_key: PHP GnuPG extension is missing, can't validate value."
msgstr "" msgstr ""
#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1211 #: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1214
#: includes/routes.php:1305 includes/routes.php:1452 #: includes/routes.php:1307 includes/routes.php:1462
msgid "View" msgid "View"
msgstr "" msgstr ""
#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1067 #: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1064
msgid "Copy" msgid "Copy"
msgstr "" msgstr ""
@ -2844,64 +2848,64 @@ msgstr ""
msgid "You must provide pattern for global search." msgid "You must provide pattern for global search."
msgstr "" msgstr ""
#: includes/routes.php:466 includes/routes.php:825 #: includes/routes.php:463 includes/routes.php:822
msgid "Import" msgid "Import"
msgstr "" msgstr ""
#: includes/routes.php:471 includes/routes.php:891 #: includes/routes.php:468 includes/routes.php:888
msgid "Export" msgid "Export"
msgstr "" msgstr ""
#: includes/routes.php:483 #: includes/routes.php:480
msgid "Reset" msgid "Reset"
msgstr "" msgstr ""
#: includes/routes.php:522 templates/default/select.tpl:31 #: includes/routes.php:519 templates/default/select.tpl:31
msgid "Approximative search" msgid "Approximative search"
msgstr "" msgstr ""
#: includes/routes.php:523 templates/default/select.tpl:32 #: includes/routes.php:520 templates/default/select.tpl:32
msgid "Recursive search" msgid "Recursive search"
msgstr "" msgstr ""
#: includes/routes.php:615 #: includes/routes.php:612
msgid "" msgid ""
"The custom action %{title} have been successfully execute on this search." "The custom action %{title} have been successfully execute on this search."
msgstr "" msgstr ""
#: includes/routes.php:963 #: includes/routes.php:960
msgid "Data entry form" msgid "Data entry form"
msgstr "" msgstr ""
#: includes/routes.php:969 includes/routes.php:1746 #: includes/routes.php:966 includes/routes.php:1984
msgid "Object has been added." msgid "Object has been added."
msgstr "" msgstr ""
#: includes/routes.php:1106 #: includes/routes.php:1109
msgid "My account" msgid "My account"
msgstr "" msgstr ""
#: includes/routes.php:1169 includes/routes.php:1918 #: includes/routes.php:1172 includes/routes.php:2156
msgid "The object has been partially modified." msgid "The object has been partially modified."
msgstr "" msgstr ""
#: includes/routes.php:1172 includes/routes.php:1921 #: includes/routes.php:1175 includes/routes.php:2159
msgid "The object has been modified successfully." msgid "The object has been modified successfully."
msgstr "" msgstr ""
#: includes/routes.php:1288 includes/routes.php:1961 #: includes/routes.php:1290 includes/routes.php:2199
msgid "%{objectname} has been successfully deleted." msgid "%{objectname} has been successfully deleted."
msgstr "" msgstr ""
#: includes/routes.php:1297 #: includes/routes.php:1299
msgid "Deleting : %{objectname}" msgid "Deleting : %{objectname}"
msgstr "" msgstr ""
#: includes/routes.php:1298 #: includes/routes.php:1300
msgid "Do you really want to delete <strong>%{displayName}</strong> ?" msgid "Do you really want to delete <strong>%{displayName}</strong> ?"
msgstr "" msgstr ""
#: includes/routes.php:1409 #: includes/routes.php:1419 includes/routes.php:2278
msgid "" msgid ""
"The custom action %{customAction} have been successfully execute on " "The custom action %{customAction} have been successfully execute on "
"%{objectname}." "%{objectname}."