From 6ff53b412e686913e34a1a7beacab040a0fc012f Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Wed, 19 Jul 2023 12:08:38 +0200 Subject: [PATCH] ioFormat: add update_only mode --- doc/conf/LSobject/ioFormat.docbook | 26 +- .../LSobjects/config.LSobjects.LSpeople.php | 13 + src/includes/class/class.LSio.php | 222 +++++++++++------- src/includes/class/class.LSioFormat.php | 36 ++- src/includes/class/class.LSldapObject.php | 11 +- src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo | Bin 91801 -> 92290 bytes src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po | 175 +++++++------- src/lang/ldapsaisie.pot | 172 +++++++------- 8 files changed, 400 insertions(+), 255 deletions(-) diff --git a/doc/conf/LSobject/ioFormat.docbook b/doc/conf/LSobject/ioFormat.docbook index 8757a52f..9a62c1ee 100644 --- a/doc/conf/LSobject/ioFormat.docbook +++ b/doc/conf/LSobject/ioFormat.docbook @@ -10,7 +10,8 @@ Cette variable est un tableau associatif dont la clé est l'identifiant du forma dont la valeur associée est la configuration du format. Le moteur d'importation simule la validation d'un formulaire de -création du type d'&LSobject;. En conséquence : +création du type d'&LSobject; (ou de modification en cas d'activation du mode mise à jour +uniquement, voir ci-dessous). En conséquence : seul les attributs présent dans le formulaire de création peuvent être importés. @@ -31,6 +32,7 @@ création du type d'&LSobject;. En conséquence : 'label' => '[Label du type de fichier]', 'driver' => '[Pilote d'ioFormat utilisé]', 'driver_options' => array([Options du pilote d'ioFormat utilisé]), + 'update_only' => '[Booléen]', 'fields => array ( '[champ 1]' => '[attribut 1]', '[champ 2]' => '[attribut 2]', @@ -79,11 +81,28 @@ création du type d'&LSobject;. En conséquence : + + update_only + + Booléen permetant d'activer le mode mise à jour uniquement pour ce format. Dans ce + mode, les données de l'objet LDAP correspondant seront chargées depuis l'annuaire avant toutes + validations des données fournies dans le fichier d'import, et ce, dans un formulaire de + modifications et non pas un formulaire de création autrement. Pour que cela soit possible, il + est indispensable que le DN de l'objet puisse être déduit depuis les données fournies dans le + fichier d'import. Pour cela, vous pouvez le fournir via un champ du fichier d'import associé + à la clé dn ou à défaut il sera généré à partir du RDN dont la valeur devra + être fournie dans le fichier d'import. Vous pouvez également le générer via le paramètre + generated_fields (voir ci-dessous). + + + fields Tableau associatif permettant d'associer un champ du fichier source (la clé) - avec attribut de l'objet LDAP (la valeur). + avec attribut de l'objet LDAP (la valeur). Il est également possible d'associé un champ + avec la valeur dn pour fournir le DN de l'objet en mode mise à jour + uniquement (voir ci-dessus). @@ -92,7 +111,8 @@ création du type d'&LSobject;. En conséquence : Tableau associatif permettant de définir soit des &LSformats;, soit un callable (au sens PHP) pour générer les valeurs d'attributs automatiquement. - Ce tableau contient en clé, le nom de l'attribut à générer, et en valeur associée, un ou plusieurs + Ce tableau contient en clé, le nom de l'attribut à générer (ou dn pour la + génération du DN de l'objet en mode mise à jour uniquement), et en valeur associée, un ou plusieurs &LSformat; ou un callable à utiliser pour générer ses valeurs. En cas de &LSformat;, ils seront composés à l'aide des valeurs des autres attributs de l'objet. En cas d'un callable, il sera appeler avec en paramètre le tableau des valeurs des autres diff --git a/src/conf/LSobjects/config.LSobjects.LSpeople.php b/src/conf/LSobjects/config.LSobjects.LSpeople.php index 47c96867..8dc5c7e1 100644 --- a/src/conf/LSobjects/config.LSobjects.LSpeople.php +++ b/src/conf/LSobjects/config.LSobjects.LSpeople.php @@ -133,6 +133,19 @@ $GLOBALS['LSobjects']['LSpeople'] = array ( 'samba_password_cas_change' => 'sambaPwdCanChange', ), ), + 'enable_disable_shell' => array ( + 'label' => 'Enable/disable commands shell', + 'update_only' => true, + 'driver' => 'CSV', + 'driver_options' => array ( + 'delimiter' => ';', + 'enclosure' => '"', + ), + 'fields' => array ( + 'login' => 'uid', + 'shell' => 'loginShell', + ), + ), ), 'display_name_format' => '%{cn}', diff --git a/src/includes/class/class.LSio.php b/src/includes/class/class.LSio.php index cda8de4e..fd39a47e 100644 --- a/src/includes/class/class.LSio.php +++ b/src/includes/class/class.LSio.php @@ -216,6 +216,16 @@ class LSio extends LSlog_staticLoggerClass { return $return; } + // Check update_only vs updateIfExists + if ($ioFormat -> update_only) { + self :: log_debug("import(): enable update only mode"); + if (!$updateIfExists) { + self :: log_debug("import(): update only mode and updateIfExists not checked, stop"); + LSerror :: addErrorCode('LSio_11'); + return $return; + } + } + // Load data in LSioFormat object if (!$ioFormat -> loadFile($input_file)) { LSerror :: addErrorCode('LSio_05'); @@ -331,97 +341,140 @@ class LSio extends LSlog_staticLoggerClass { $globalErrors = array(); // Instanciate an LSobject $object = new $LSobject(); - // Instanciate a creation LSform (in API mode) - $form = $object -> getForm('create', null, true); - // Set form data from inputed data - if (!$form -> setPostData($objData, true)) { - self :: log_debug('import(): Failed to setPostData on: '.print_r($objData,True)); - $globalErrors[] = _('Failed to set post data on creation form.'); - } - // Validate form - else if (!$form -> validate(true)) { - self :: log_debug('import(): Failed to validate form on: '.print_r($objData,True)); - self :: log_debug('import(): Form errors: '.print_r($form->getErrors(),True)); - $globalErrors[] = _('Error validating creation form.'); - } - // Validate data (just check mode) - else if (!$object -> updateData('create', True)) { - self :: log_debug('import(): fail to validate object data: '.varDump($objData)); - $globalErrors[] = _('Failed to validate object data.'); - } - else { - self :: log_debug('import(): Data is correct, retrieve object DN'); - $dn = $object -> getDn(); - if (!$dn) { - self :: log_debug('import(): fail to generate for this object: '.varDump($objData)); - $globalErrors[] = _('Failed to generate DN for this object.'); + + // Load object data on update_only mode + if ($ioFormat -> update_only) { + // Retrieve/compute object DN + $dn = null; + if (array_key_exists('dn', $objData)) { + $dn = $objData['dn']?$objData['dn'][0]:null; + // Remove field in object data + unset($objData['dn']); + if ($dn) + self :: log_debug("import(): Object DN provided ($dn)"); + else + $globalErrors[] = _('Object DN is empty in provided data.'); } - else { - // Check if object already exists - if (!LSldap :: exists($dn)) { - // Creation mode - self :: log_debug('import(): New object, perform creation'); - if ($justTry || $object -> updateData('create')) { - self :: log_info('Object '.$object -> getDn().' imported'); - $return['imported'][$object -> getDn()] = array( - 'name' => $object -> getDisplayName(), - 'messages' => $_SESSION['LSsession_infos'], - 'errors' => LSerror :: getErrors(), - ); - $_SESSION['LSsession_infos'] = array(); - continue; - } - else { - self :: log_error('Failed to updateData on : '.print_r($objData, True)); - $globalErrors[]=_('Error creating object on LDAP server.'); - } - } - // This object already exist, check 'updateIfExists' mode - elseif (!$updateIfExists) { - self :: log_debug('import(): Object '.$dn.' already exist'); - $globalErrors[] = getFData(_('An object already exist on LDAP server with DN %{dn}.'),$dn); + // DN not provided, compute it + if (!$dn) { + $rdn_attr = $object->rdn_attr; + if (!$rdn_attr || !array_key_exists($rdn_attr, $objData) || !$objData[$rdn_attr]) { + self :: log_debug('import(): Failed to compute object DN from provided data (no RDN value): '.print_r($objData,True)); + $globalErrors[] = _('Failed to compute object DN from provided data (no RDN value).'); } else { - self :: log_info('Object '.$object -> getDn().' exist, perform update'); + $dn = sprintf("%s=%s,%s", $rdn_attr, $objData[$rdn_attr][0], $object -> getContainerDn()); + self :: log_debug("import(): Computed object DN is '$dn'"); + } + } + // Load object data from DN + if ($dn && !$object -> loadData($dn)) { + self :: log_debug('import(): Failed to load data of '.$dn); + $globalErrors[] = getFData( + _("Failed to load existing object %{dn} from LDAP server. Can't update object."), + $dn + ); + } + } - // Restart import in update mode - - // Instanciate a new LSobject and load data from it's DN - $object = new $LSobject(); - if (!$object -> loadData($dn)) { - self :: log_debug('import(): Failed to load data of '.$dn); - $globalErrors[] = getFData( - _("Failed to load existing object %{dn} from LDAP server. Can't update object."), - $dn); - } - else { - // Instanciate a modify form (in API mode) - $form = $object -> getForm('modify', null, true); - // Set form data from inputed data - if (!$form -> setPostData($objData, true)) { - self :: log_debug('import(): Failed to setPostData on update form : '.print_r($objData, True)); - $globalErrors[] = _('Failed to set post data on update form.'); - } - // Validate form - else if (!$form -> validate(true)) { - self :: log_debug('import(): Failed to validate update form on : '.print_r($objData, True)); - self :: log_debug('import(): Form errors : '.print_r($form->getErrors(), True)); - $globalErrors[] = _('Error validating update form.'); - } - // Update data on LDAP server - else if ($justTry || $object -> updateData('modify')) { - self :: log_info('Object '.$object -> getDn().' updated'); - $return['updated'][$object -> getDn()] = array( + if (!$globalErrors) { + // Instanciate a creation/modification LSform (based on update_only mode and force API mode) + $form_id = $ioFormat -> update_only ? 'modify' : 'create'; + $form = $object -> getForm($form_id, null, true); + // Set form data from inputed data + if (!$form -> setPostData($objData, true)) { + self :: log_debug('import(): Failed to setPostData on: '.print_r($objData,True)); + $globalErrors[] = _('Failed to set post data on creation form.'); + } + // Validate form + else if (!$form -> validate(true)) { + self :: log_debug('import(): Failed to validate form on: '.print_r($objData,True)); + self :: log_debug('import(): Form errors: '.print_r($form->getErrors(),True)); + $globalErrors[] = _('Error validating creation form.'); + } + // Validate data (just check mode) + else if (!$object -> updateData($form_id, True)) { + self :: log_debug('import(): fail to validate object data: '.varDump($objData)); + $globalErrors[] = _('Failed to validate object data.'); + } + else { + self :: log_debug('import(): Data is correct, retrieve object DN'); + $dn = $object -> getDn(); + if (!$dn) { + self :: log_debug('import(): fail to generate for this object: '.varDump($objData)); + $globalErrors[] = _('Failed to generate DN for this object.'); + } + else { + // Check if object already exists + if (!$ioFormat -> update_only && !LSldap :: exists($dn)) { + // Creation mode + self :: log_debug('import(): New object, perform creation'); + if ($justTry || $object -> updateData('create')) { + self :: log_info('Object '.$object -> getDn().' imported'); + $return['imported'][$object -> getDn()] = array( 'name' => $object -> getDisplayName(), - 'infos' => $_SESSION['LSsession_infos'], + 'messages' => $_SESSION['LSsession_infos'], 'errors' => LSerror :: getErrors(), ); $_SESSION['LSsession_infos'] = array(); continue; } else { - self :: log_error('Object '.$object -> getDn().': Failed to updateData (modify) on : '.print_r($objData, True)); - $globalErrors[] = _('Error updating object on LDAP server.'); + self :: log_error('Failed to updateData on : '.print_r($objData, True)); + $globalErrors[]=_('Error creating object on LDAP server.'); + } + } + // This object already exist, check 'updateIfExists' mode + elseif (!$updateIfExists) { + self :: log_debug('import(): Object '.$dn.' already exist'); + $globalErrors[] = getFData(_('An object already exist on LDAP server with DN %{dn}.'),$dn); + } + else { + self :: log_info('Object '.$object -> getDn().' exist, perform update'); + + // Restart import in update mode + + // Instanciate a new LSobject and load data from it's DN + // Note: expected in update_only mode, it's already done. + if (!$ioFormat -> update_only) { + $object = new $LSobject(); + if (!$object -> loadData($dn)) { + self :: log_debug('import(): Failed to load data of '.$dn); + $globalErrors[] = getFData( + _("Failed to load existing object %{dn} from LDAP server. Can't update object."), + $dn); + } + } + + if (!$globalErrors) { + // Instanciate a modify form (in API mode) + $form = $object -> getForm('modify', null, true); + // Set form data from inputed data + if (!$form -> setPostData($objData, true)) { + self :: log_debug('import(): Failed to setPostData on update form : '.print_r($objData, True)); + $globalErrors[] = _('Failed to set post data on update form.'); + } + // Validate form + else if (!$form -> validate(true)) { + self :: log_debug('import(): Failed to validate update form on : '.print_r($objData, True)); + self :: log_debug('import(): Form errors : '.print_r($form->getErrors(), True)); + $globalErrors[] = _('Error validating update form.'); + } + // Update data on LDAP server + else if ($justTry || $object -> updateData('modify')) { + self :: log_info('Object '.$object -> getDn().' updated'); + $return['updated'][$object -> getDn()] = array( + 'name' => $object -> getDisplayName(), + 'infos' => $_SESSION['LSsession_infos'], + 'errors' => LSerror :: getErrors(), + ); + $_SESSION['LSsession_infos'] = array(); + continue; + } + else { + self :: log_error('Object '.$object -> getDn().': Failed to updateData (modify) on : '.print_r($objData, True)); + $globalErrors[] = _('Error updating object on LDAP server.'); + } } } } @@ -432,11 +485,15 @@ class LSio extends LSlog_staticLoggerClass { 'data' => $objData, 'errors' => array ( 'globals' => $globalErrors, - 'attrs' => $form->getErrors(), + 'attrs' => isset($form)?$form->getErrors():array(), ), 'messages' => $_SESSION['LSsession_infos'], ); $_SESSION['LSsession_infos'] = array(); + + // Clean iteration objects + unset($object); + if (isset($form)) unset($form); } $return['errors'] = $objectsInError; $return['success'] = empty($objectsInError); @@ -856,6 +913,9 @@ ___("LSio: An error occured running after import hooks.") LSerror :: defineError('LSio_10', ___("LSio: Error occured loading objects's data from input file.") ); +LSerror :: defineError('LSio_11', +___("LSio: This input/output format only support update. You must check the 'Update objects if exists' box.") +); // Defined CLI commands functions only on CLI context if (php_sapi_name() != 'cli') diff --git a/src/includes/class/class.LSioFormat.php b/src/includes/class/class.LSioFormat.php index b64200a9..b619828b 100644 --- a/src/includes/class/class.LSioFormat.php +++ b/src/includes/class/class.LSioFormat.php @@ -25,6 +25,7 @@ LSsession :: loadLSclass('LSlog_staticLoggerClass'); /** * Manage IOformat of LSldapObject import/export * + * @property-read bool $update_only * @author Benjamin Renard */ class LSioFormat extends LSlog_staticLoggerClass { @@ -85,6 +86,22 @@ class LSioFormat extends LSlog_staticLoggerClass { } } + /** + * Access to infos of the ioFormat + * + * @param string $key The name of the value + * + * @return mixed The value + **/ + public function __get($key) { + switch($key) { + case 'update_only': + return $this -> getConfig('update_only', false, 'bool'); + } + // Unknown key, log warning + self :: log_warning("__get($key): invalid property requested\n".LSlog :: get_debug_backtrace_context()); + } + /** * Check if ioFormat driver is ready * @@ -162,17 +179,22 @@ class LSioFormat extends LSlog_staticLoggerClass { // Add attributes to export and put their values to data to export foreach($fields as $key => $attr_name) { $objects_data[$dn][$key] = null; - if (!isset($object -> attrs[$attr_name])) { + if ($attr_name == 'dn') { + $objects_data[$dn][$key] = $dn; + } + else if (!isset($object -> attrs[$attr_name])) { self :: log_warning("exportObjects($object): attribute '$attr_name' does not exist !"); continue; } - $object -> attrs[$attr_name] -> addToExport($export); - if (!isset($export -> elements[$attr_name])) { - // @phpstan-ignore-next-line - self :: log_debug("exportObjects($object): attribute '$attr_name' not added to export : may be user can't read it"); - continue; + else { + $object -> attrs[$attr_name] -> addToExport($export); + if (!isset($export -> elements[$attr_name])) { + // @phpstan-ignore-next-line + self :: log_debug("exportObjects($object): attribute '$attr_name' not added to export : may be user can't read it"); + continue; + } + $objects_data[$dn][$key] = $export -> elements[$attr_name] -> getApiValue(false); } - $objects_data[$dn][$key] = $export -> elements[$attr_name] -> getApiValue(false); } } self :: log_trace('exportObjects(): objects data = '.varDump($objects_data)); diff --git a/src/includes/class/class.LSldapObject.php b/src/includes/class/class.LSldapObject.php index 78995efe..0ad16203 100644 --- a/src/includes/class/class.LSldapObject.php +++ b/src/includes/class/class.LSldapObject.php @@ -30,6 +30,7 @@ LSsession :: loadLSclass('LSattribute'); * * @property-read string $subDnValue * @property-read string $subDnName + * @property-read string $rdn_attr * @property-read string $rdn * @property-read string $type * @author Benjamin Renard @@ -2003,13 +2004,15 @@ class LSldapObject extends LSlog_staticLoggerClass { $this -> cache['subDnName'] = self :: getSubDnName($this -> dn); return $this -> cache['subDnName']; } - elseif ($key=='rdn') { + elseif ($key=='rdn_attr') { $rdn_attr = $this -> getConfig('rdn'); - if ($rdn_attr && isset($this -> attrs[ $rdn_attr ])) { - return $this -> attrs[ $rdn_attr ] -> getValue(); - } + if ($rdn_attr && isset($this -> attrs[ $rdn_attr ])) + return $rdn_attr; return false; } + elseif ($key=='rdn') { + return $this -> rdn_attr?$this -> attrs[ $this -> rdn_attr ] -> getValue():false; + } elseif ($key=='type') { return $this -> getType(); } diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo index cc8000416ee7eeb0c049c12ff9c823f3c7dd8b29..e2d54d73ee6064675cc5c1ed0c1e63c13bfdaa73 100644 GIT binary patch delta 15371 zcmZ|W2Xs}%zQ^%>LV(aiFQJ??LIMOrXbA)Ygpz~~p?4A_Knf(G3R{pOARq=QB3-14 zKv0?rSngFU*iiJMaw$@5prC>Z@B2G5ymjwe>+SW1&-`a*?>&3UKIg>y)_qWX-p9q= zZz}me<8Zv{=Qy?Tud0r-tC-`QZ>Unoc`V*>f^ja^!EIO)Phk+gi}mpeHo~%P94DLe z<8UtV&UTLTC`Pq+oEo?Tb)S_mJqfGfS`5dRuo9ld#&`|6 zwo|PG7soUlhL53c@HN)Od#H}p>}c9|L3Mlq*5Urn7BW1va{{a2S?djqBYuF17}v>M zcqS@dgAMQ;s-vDH$DyfH1H0l-)b+NZI&=hM@hk>nsm_iQ&HbHPWYRGi`{6!JM87VM zGaNhNVBCVb@Sms)bRsB+{c$^vK@D+0H#0@SSb{hb1F$I;!#E7V1ayPRj3QGR=V3`) zjmfwXTi`X+l+>kAPn3d*I1<%?%~%olVJkd|z3~qmfypW60d`^{u^;oyAUK^;8UIpb zo}i!sK8>1+ z6T371>iH2OJ^5+WD*ptvcy3}@tkA>M*G9!*SQ=w&d0SM+l2F%6#&S3m)h-hoV!kck zjOB^!S@)Ew7Fb-0B!0oAe2s1Ec+jZ8W=!fB}U zp11X{q3-9Nv6(BVq4^UdutqPlT@sNZ$3@nq^C4;|t1!U<7>Nnk4AU_eS)a~X)ZEwZ zV;1Wy)Kol)I`3)Z!CYrO8STfdSO#Cma6E0jiS>x9^)*w|5;Y?Iu^bLXJ$WWp!l@XA zi;;Jba|qS`CaPnKjWS)JohJ>7#EkwX}Z=dnEoautn8 zZ`Ap#kxMvVA$@kD2beYV7;3w1LS5$#Y>qcDjQczF2Aa7^vJOX0#Z=Uj7oxUl5o)B) zVmrKr^|9$7^X43gk;L0jH~Ii|{v8a%s=P$>K=G&%>4dHpSqhmz?1hzZl#TPS8u5J8 z3G1;tZbd)*87t#2SOrTAG3|p;*J*~DqRv|ZKq#Rb9^7wvB;t30h*$oume`W6x0oeU{_4XWZa9I>feSk{wZYI4>Lo& z1cTJT`VM-DFI$WAK308wtc@M9CXPg|>C8Z8#W{;w6OGvdZE-T{0rsKh{#DdP7^Y3c^{4Re;r`A)$aKe{d1jUFL@lP9 zI1;<(o9_X8QBPc&`B4Yjqt=RxDY(me8~dq#Dq9Q-aS7fr3gR&QQS-%NBD`u?NN*OAPz(S z$4y5@quOmljqpY6i>dR?`(Y!h{co<#^jlztc0X$IeS@0ol!a!sx~Lm&!(^>UH1U2Le~Yoi!K=*TO2baXb5S>b8yjHxXUx#H!uG_|QB!gRbFs>5bDag4M|>2s zxWChQ4Oqb^);t;WT1#^MmXge|e%IzGFx0JWO;V`D7!tg#i=BhJ7yTwwhdPA868 zZysPbs>7e7n?U9PnE*_9&U}7%!9e2S$Q(J@SP~1dIIhPMxW$(5wDEpa2M%Lp`~t)A zdyK-08_a{W#dzYp4LqkZ`)tK^)Z+1OG*d7Ln-MR<7I+NVFwRX(!h%g^jU2PyMnB4< zH=7Q}pyoaf2jf^&hh9T}ytLUhAE(zSs7S#dn24pf@LI-H%*RSw%>@^sMrs9W1lD3{ z+=LOh8%yCQs1ZAl#qcufhSyN-f5bBQhfAg!8UJl&XoFBE1fw5@V{L4JVb~dUg9%s_ z^RW^xL0x!*t>1}di4UUI&IweXxKf$G>O)R0fW8n_B|;}@|TzJkg40IO)7C%<66`HaBgR7|(=92`Kr7B%-j zVFC(Kx_c3@mM`t70+Y>Zlt9q3Xj>7jBJu@-!@o<4{kWjcT_D)v@)cse2I_YUdN{Rn&QZp{pVH z-)k;d8g*h2>c)++1h&Mcn1KG6jT)Ied;)i3BaC^`I0Ch8m!h8hbsUO+qh3sd_nBAv zOZymqUD)p>^X7}i*2L2=0rz7Y{0WmWYQOm~$;VjYwWtfek6Ps+2h59QF!m;1h3d!^ z)LN=>&}{D<)PwCm$oMxPbC`k%ynyvFpvbK9Ca9t7f^~2x2H_0UqI(9ln4U*<_%dpa zLk^k6+!!@tu~;2jV=3&7nt~xN8O_lcTd@eW?^oJ*m95{1+V5{-D1M23@o&_~^nTgA z*`CFQ#3xZ5{=r)M71Qws7)5y!>Ve%HGQnilU@RWRD)=MTM8Cu4gxWZOxGVO-ji~c( z+WJaI%oHYIBIR?jBEEqk_?h*0j3KUd)Hl_x)18bK&jQryK4>bOGpG{-j+y=25ETzW z&E0HF!}+M8{0gh#MJ$JRu?ChrZeCDcEK3}Vnu0_O)c#K)qbV4QI^i*_fa@@qeYgvC zVyzR#2-L1=j@l*hHtvL4JISb_%|*@qS}cPbP#xWcHSquzbIH7C3(jCF@pWv1El!%b z%s?&Dl{P+xm59H?IJ}E$AA8Dt{EkHp{o`02pFusqi|B{PP#t^?T@Be4GV1wXsG$jc z!`z@T>P3`@|MakEP$O0LEwcz?P*0SGn!@3zHM9iV;_H~;&)<}AIdR;(yqxeItcAT# zGycJ3CZ0Aglx3))c?0|7dDIIe<~>uMi!F$kU}ZdsZSXT3f`RXw5t)cC@pjaMg@0fc zYj+GM&c

H}JN$y}yD@9N?o8pBY#pc7WbL8vFn#$?=sTC8`lBUUZ?Gxe!gLJz*t{|qVJh(@RC$w6%ulCP*q!(`s)HRq zHLvi2_!9AW)MBpjnVF&()S`_;O>ui$?k1Dbkn}+hMC;8d-+gj=Qk}zKYTKJ_c%){z*ndS@vJ% zMq#KC=z@Vb8QDe7Jk*UAq1vy+Al!wz@!Qr9QRjVu>fkl&ebkgxId7)854trem_nvD zK8dw(7iyKhh3d#9OvLhEo4M?T8N{z*5QcnXUb*csg}6J;#x*z|tA1;K@ytPu#4o53 z^1s0NmmyQ;f|cu#S_$oHU#P7`9Pr^vz^)8uqWZp&%wf|MK9h+FwQ023*DZYTs@e5mD_L})!-wbtw zXHeVi6eeNxb@QUhLoK@FsPY?F7TqQ{%!{EdmZYE~YMZ5?hH$ubGHQD*z!LZ@cEv5| zhu2YS;RnBx4Rzuw49AyHtNbjgV?SaIyo1`N z<$o|AtKq0M5rY9Z8MXRnqRv~2x^W?v#qF4i2eG^M|9xAK`lI>MxCTRLa1HBXnV(Dt zqfi~|iouv=%U571@m}=eN0@`Ra14(A*?eZag(<}4Z<_bOU~J3%olG)y@CDS3-$ISZ zRg6LZTW0QBS~E~Xz6v!GYcK})p{{cQ>*IaY6Nmr8FJEki%W*Z%SNX4ue0aKX?se7EZ;ccg^nFfofOv9{*Ve zmtz*z_>=J;PiEnt=5IPb;}GJWf0-A~F6>Ku1AAk_-{#|VIrbsGh+2fr@0%Z&k75_% zx3L$NePFiXFzi5l44dL#sPh^-uE#f*1$?BaVhu9t&O6u{k9s`LG<<-uIL*)F`{U6b zj3h2q%;Vd>vDk@t3MS(#*bE(ikMBmYIFWD`M&VT)?O~_6#XZg$3i3;MoVPHkq{lY` zr2;(8DB^U?#kVmJTbANP+>Pz9Y-x}0$x=}_T!sVjBx>Yplrc_3b>MYejZtMizQyUD zA~TqRuyP(}DbB%BSh~E&_w{-rYKl(b2#l)W@x6c+V;kbvQA2$Xb>oyk)1j?6kN7gi z;Ug72zQwr(HFYPDa@VO?$=om%HN<-{0WaW4tXtV!U=C_-kD#{E1B}O%DyAa~P>b{w zK7z4T&3WswF7a8^$lb<#98gWVe6u05jDp1KrpF(mR%@Rcremj39cft8>N-J<%#8-3p7=#v@pA4J$5Ai5>;NirRms0>wB0=d0;D#@7+HP)q#_!{ok^+$M=)X{eVmi z1@};^x>20R_xbz;YTK;97Pt@f>312+VCi_%t{Rpiu7mopiLf@uhQuAP3TC0EavnCq z-N<{ub-o~@MHtz}yclL%&!FZoxUK2HaO_50hbthQd?(YPAgo4tLrlevSPqw?JB`e9WYmEwNgih*da(iSK$U-ly3u)T ziPuq2>h0|DeI;v(Rf&@^1V>_NoQGOl%diHXK;8HpY8QRinfo5p6;TSxQd}ugzyPCNigc_kIQ5{@`fw;xS2eBUU3Dmy-7PXzLcQYU3y}P+)U+<$p zAD4fl-dMep&9>TtTAXE4O!-LE-0nv`@wccEx`XA>lWNvZASM!rVk1n)P+W<+{>!Kl zD&clFLs=2E=z>ufZjP)uCk3@wx}%=74_3y(7=~G>Ie!|}ksYWfE<#=BQ(J!>8xr3~ zjc8O4a~-z}8LiSGs3%BAy?XOdbM}<2-(@Yrwv@kynxcECDRFvweE(HD9yP>Yp|)@3 zUS?bNLe2R~)c1(baftSRi{2jJm%*nnk&64+1Kam8Z@6XHmG~pn1#0v)uhikF{ro&? zZqMNa4D4sV7tF$T#IK+}6Yiki55xMK7u`lo*8aaoMstyrW>#x2Y(hL2o8bY}++9Wu zUBCbnhoRnx-B8;$8++nHREN)^MzqdAGg6IE+qxO*I&tXR|7o_tC~Qo{IMj<}75d=@ zR0lU>2<}16?T4r}a2Xj&r_>E z6>Fk*i1{ptN6r0U)Q8S$%tB|Vxo|dWzpq5SIp4%&tUAn$&`7LLJPq}J**J{-pGfAP z6lj|T3^#K+4E6c`6smk5>O{X0ralt&gu_w$ei>%qvse-X0=zCG2-YZQ}Z^Bg6 zd1FSpX7%S#pdp=s>e&hm#v`b0`4!Ih=SQfGr=*(>EK z3_{hm+b*Q5ck2h4w zp`CD-w2Sl&Wj9C~nLVTuoI8NTVgC1@&)Jhc@RgZ=D$-zqY2+(dN}H0z-{C+kgJ=Gu zy|RCi9<}GZK;EUzPLhrXq+FYS)>p!R;${6g$2j2yTd~fbeA_mdN4ZvVD&={$%?k3> z$d4xJGegHeN$q_(o|yW5iXKe`;%?>HNH%vQKVPN z_qPoQeaA2x|AT0h%@^Tp;v1%k!wb^)0=tMCD4UH3kq4026qspUM2d?WHL|KrT= zl${{v6Uh0NHeE?Ck$xf#A|+F=V+*dL%^qAz{2Yc7>vQxE)NzD#iu4{SfwIwhq|F5E zL*G%rNgc@XOUCzmScPx-YWU>A_0;PqMg0~v=}5gkxAYNGn*3L!lBC0=p9?oMspqaHx1B5S`t}`u)>=4=)R?+Asd<$2 z4)JiDMA>+JjQ9$^jjv%EsUqnDNr&DgRj4Z@=?$o_V>-4HcOdoj(`T+d^hPVrg_n{% zRQ^VMlcY~O9m^@3Px{$}z8@r0Xscrb>WhSqOk4Io`5^M+Z2T4RA zQ|9o|?>qEGVms*!@jLh;4KMm?_^%(f&1K>|d*RO5m~uVJ)8yNbs*r9|c8Ro{ycb(z zTO2^USUih&wCBGe^B3wELrS5cj%V;i{Ejq*6igaJyW*tnr1G|1H_Gb}wI44x5OrIa^ZC$GVLbsR7eiXch_eePpPo&|G#1D^kWInb*S=z)u ztiXMRvzt|S8`{>bsGV%{ML5&8+^jsQ6LE+w%OS2$dY#mTR7CkOoX$1ckq(mIjGyB= zk`BIfsVhZ_C+4S_GlHZ;-^utc=R0=u?|rB6>DXEsel(3CJw?@4`~LlycoeCSx@So`BJoYiek4B18f3*tR)q+bBF|^R=j-KsJoWfH z4Vij0ctxf5Xhi%k@;wSWw5aUzOVIg^w3ei!yLC7|M?8!)lQSCFa<%zV|8Vp-`2G!~ zjgAz9Q-}CCX*KZ@TcmCG!59%olUtal!hyz2GfM zE7-Cy%HAL@Z)2VCCHWA_3-Ch~=pcTAH~`<(%T?cJBPa-_U=H~>e0Z!P|24rSQgian zX*a>v|M0L8K1EqK>S~hGZ2e%|LESaVbVT8MB$x8HO_6g|FV|?2KLsak;Zz#*rK}p3 zKplgv!PYL+wI~0Xje8U8$RZt~Y^^WiCj{l`pH!cCxveWh-tEIb$EetZIkut! zc^&cA)6_paGRU+c9&5|yVj}G-kk*h-Cgt1n*3kAt;$x`aMe`^xk2=PapP)aJyg;TI zjdVOuehK+Sq*(Gg!pQ4y5SvJ^lh%`hC>uikYTITFR--(Zbcpou7(lzlg)yx|-A^dm zK*XN--(x&+4Cx8ZK9AR^sZV-~{B=yC+}^Fa_n@W0x^eSa@NqLla zB3vI#n_zWC9NR+PMS_iAe|sRX)k!3Ys?_lkxwc| z{0XT#^)0X_W!*{VNM6eH|F_~hn(}W0(%&>1L&aE94dU9wI%*RCiX$=KmPL_YNIseJ z=W(kVa#SWYp-#t3lusf3PKqS%hto*iY<=xfHq*%0oJpiIiF_92yGd0^i%It>ze}o4 z>TKJFQvPq^U8JMrN0Z(s|A6!nsTlF&g)#A!Yc?fXL^O#rhhhdv$16p{#zd1IQzH*HmP^3>t*j*}wvH2L22jNAfFpOlg3P0z{BesdR@aXAH3 zvNOpv$Q?~_hMp;-V2U@Fa$4#!Bcq+df1eF1ntZiQgF&4#9zIukL}r$rsY%9k-=k$` zJbcOw@8p6E-)*uo^SJbzo4pgbT(oyUPJ!+*HDjiCYz|M(9Y%Y{j?T;QhO9X=+!O2x uIlQfcXMSwU?im_+dSklIL}V~lngJ#t`~P`_=)?6pd9wWuKi}DN$NN8%-m0Gf delta 14968 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%0AfuT49%W{8b9hqAA8EUaSv{t%fhCCHD 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 diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po index 6e0a15f5..4b68db06 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: 2023-07-03 12:30+0200\n" +"PO-Revision-Date: 2023-07-19 12:07+0200\n" "Last-Translator: Benjamin Renard \n" "Language-Team: LdapSaisie \n" @@ -633,10 +633,6 @@ msgstr "" "MAILDIR : Erreur durant la récupération du chemin distant du dossier des " "mails." -#: includes/addons/LSaddons.watermark.php:78 -msgid "PRE-PRODUCTION" -msgstr "PRÉ-PRODUCTION" - #: includes/addons/LSaddons.showTechInfo.php:63 #: templates/default/showTechInfo.tpl:16 msgid "Structural object class" @@ -752,101 +748,119 @@ msgstr "Valeur invalide" msgid "LSformRule_%{type}: Parameter %{param} is not found." msgstr "LSformRule_%{type} : Le paramètre %{param} n'est pas défini." -#: includes/class/class.LSio.php:339 -msgid "Failed to set post data on creation form." -msgstr "Impossible de définir les données dans le formulaire de création." +#: includes/class/class.LSio.php:356 +msgid "Object DN is empty in provided data." +msgstr "Le DN de l'object est vide dans les données fournies." -#: includes/class/class.LSio.php:345 -msgid "Error validating creation form." -msgstr "Une erreur est survenue en validant le formulaire de création." - -#: includes/class/class.LSio.php:350 -msgid "Failed to validate object data." -msgstr "Impossible de valider les données de l'objet." - -#: includes/class/class.LSio.php:357 -msgid "Failed to generate DN for this object." -msgstr "Impossible de générer le DN de cet objet." - -#: includes/class/class.LSio.php:376 -msgid "Error creating object on LDAP server." +#: includes/class/class.LSio.php:363 +msgid "Failed to compute object DN from provided data (no RDN value)." msgstr "" -"Une erreur est survenue durant la création de cet objet dans l'annuaire LDAP." +"Impossible de générer le DN de l'objet depuis les données fournies (pas de " +"valeur pour le RDN)." -#: includes/class/class.LSio.php:382 -msgid "An object already exist on LDAP server with DN %{dn}." -msgstr "Un objet existe déjà dans l'annuaire LDAP avec le DN %{dn}." - -#: includes/class/class.LSio.php:394 +#: includes/class/class.LSio.php:374 includes/class/class.LSio.php:444 msgid "" "Failed to load existing object %{dn} from LDAP server. Can't update object." msgstr "" "Impossible de charger l'objet existant %{dn} depuis l'annuaire LDAP. " "Impossible de mettre à jour cet objet." -#: includes/class/class.LSio.php:403 +#: includes/class/class.LSio.php:387 +msgid "Failed to set post data on creation form." +msgstr "Impossible de définir les données dans le formulaire de création." + +#: includes/class/class.LSio.php:393 +msgid "Error validating creation form." +msgstr "Une erreur est survenue en validant le formulaire de création." + +#: includes/class/class.LSio.php:398 +msgid "Failed to validate object data." +msgstr "Impossible de valider les données de l'objet." + +#: includes/class/class.LSio.php:405 +msgid "Failed to generate DN for this object." +msgstr "Impossible de générer le DN de cet objet." + +#: includes/class/class.LSio.php:424 +msgid "Error creating object on LDAP server." +msgstr "" +"Une erreur est survenue durant la création de cet objet dans l'annuaire LDAP." + +#: includes/class/class.LSio.php:430 +msgid "An object already exist on LDAP server with DN %{dn}." +msgstr "Un objet existe déjà dans l'annuaire LDAP avec le DN %{dn}." + +#: includes/class/class.LSio.php:455 msgid "Failed to set post data on update form." msgstr "Impossible de définir les données dans le formulaire de mise à jour." -#: includes/class/class.LSio.php:409 +#: includes/class/class.LSio.php:461 msgid "Error validating update form." msgstr "Une erreur est survenue en validant le formulaire de mise à jour." -#: includes/class/class.LSio.php:424 +#: includes/class/class.LSio.php:476 msgid "Error updating object on LDAP server." msgstr "" "Une erreur est survenue en mettant à jour cet objet dans l'annuaire LDAP." -#: includes/class/class.LSio.php:830 +#: includes/class/class.LSio.php:883 msgid "LSio: Post data not found or not completed." msgstr "LSio : les données transmises sont introuvables ou incomplètes." -#: includes/class/class.LSio.php:833 +#: includes/class/class.LSio.php:886 msgid "LSio: object type invalid." msgstr "LSio : type d'objet invalide." -#: includes/class/class.LSio.php:836 +#: includes/class/class.LSio.php:889 msgid "LSio: input/output format %{format} invalid." msgstr "LSio : Le format d'entrée/sortie %{format} est invalide." -#: includes/class/class.LSio.php:839 +#: includes/class/class.LSio.php:892 msgid "LSio: Fail to initialize input/output driver." msgstr "LSio : Impossible d'initialiser le pilote d'entrée/sortie." -#: includes/class/class.LSio.php:842 +#: includes/class/class.LSio.php:895 msgid "LSio: Fail to load objects's data from input file." msgstr "" "LSio: Impossible de charger les données des objets depuis le fichier " "d'import." -#: includes/class/class.LSio.php:845 +#: includes/class/class.LSio.php:898 msgid "LSio: Fail to load objects's data to export from LDAP directory." msgstr "" "LSio: Impossible de charger les données des objets à exporter depuis " "l'annuaire LDAP." -#: includes/class/class.LSio.php:848 +#: includes/class/class.LSio.php:901 msgid "LSio: Fail to export objects's data." msgstr "LSio: Impossible d'exporter les données des objets." -#: includes/class/class.LSio.php:851 +#: includes/class/class.LSio.php:904 msgid "LSio: An error occured running before import hooks. Stop the import." msgstr "" "LSio : Une erreur est survenue durant l'exécution des déclencheurs d'avant " "import. Arrêt de l'import." -#: includes/class/class.LSio.php:854 +#: includes/class/class.LSio.php:907 msgid "LSio: An error occured running after import hooks." msgstr "" "LSio : Une erreur est survenue durant l'exécution des déclencheurs d'après " "import." -#: includes/class/class.LSio.php:857 +#: includes/class/class.LSio.php:910 msgid "LSio: Error occured loading objects's data from input file." msgstr "" "LSio: Une erreur est survenue en chargeant les données des objets depuis le " "fichier d'import." +#: includes/class/class.LSio.php:913 +msgid "" +"LSio: This input/output format only support update. You must check the " +"'Update objects if exists' box." +msgstr "" +"LSio : Ce format d'import/export ne supporte que les mises à jour. Vous " +"devez cocher la case \"Mise à jour des objets existants\"." + #: includes/class/class.LSformElement_supannRessourceEtatDate.php:61 msgid "Start date" msgstr "Date de début" @@ -1738,25 +1752,25 @@ msgstr "" msgid "Invalid file type (%{type})." msgstr "Type de fichier invalide (%{type})." -#: includes/class/class.LSldapObject.php:584 +#: includes/class/class.LSldapObject.php:585 msgid "The attribute %{attr} is not valid." msgstr "L'attribut %{attr} n'est pas valide." -#: includes/class/class.LSldapObject.php:3157 +#: includes/class/class.LSldapObject.php:3160 msgid "LSldapObject : Object type unknown." msgstr "LSldapObject : Type d'objet inconnu." -#: includes/class/class.LSldapObject.php:3160 +#: includes/class/class.LSldapObject.php:3163 msgid "LSldapObject : Update form is not defined for the object %{obj}." msgstr "" "LSldapObject : Le formulaire de mise à jour n'est pas défini pour l'objet " "%{obj}." -#: includes/class/class.LSldapObject.php:3163 +#: includes/class/class.LSldapObject.php:3166 msgid "LSldapObject : No form exists for the object %{obj}." msgstr "LSldapObject : Aucun formulaire n'existe pour l'objet %{obj}" -#: includes/class/class.LSldapObject.php:3166 +#: includes/class/class.LSldapObject.php:3169 msgid "" "LSldapObject : The function %{func} to validate the attribute %{attr} the " "object %{obj} is unknow." @@ -1764,7 +1778,7 @@ msgstr "" "LSldapObject : La fonction %{func} pour valider l'attribut %{attr} de " "l'objet %{obj} est inconnue." -#: includes/class/class.LSldapObject.php:3169 +#: includes/class/class.LSldapObject.php:3172 msgid "" "LSldapObject : Configuration data are missing to validate the attribute " "%{attr} of the object %{obj}." @@ -1772,7 +1786,7 @@ msgstr "" "LSldapObject : Des données de configurations sont manquantes pour pouvoir " "valider l'attribut %{attr} de l'objet %{obj}." -#: includes/class/class.LSldapObject.php:3173 +#: includes/class/class.LSldapObject.php:3176 msgid "" "LSldapObject : The function %{func} to be executed on the object event " "%{event} doesn't exist." @@ -1780,14 +1794,14 @@ msgstr "" "LSldapObject : La fonction %{func} devant être exécutée lors de l'évènement " "%{event} de l'objet n'existe pas." -#: includes/class/class.LSldapObject.php:3176 +#: includes/class/class.LSldapObject.php:3179 msgid "" "LSldapObject : The %{func} execution on the object event %{event} failed." msgstr "" "LSldapObject : L'exécution de la fonction %{func} lors de l'évènement " "%{event} de l'objet a échouée." -#: includes/class/class.LSldapObject.php:3180 +#: includes/class/class.LSldapObject.php:3183 msgid "" "LSldapObject : Class %{class}, which method %{meth} to be executed on the " "object event %{event}, doesn't exist." @@ -1795,7 +1809,7 @@ msgstr "" "La classe %{class}, contenant la méthode %{meth} devant être exécutée lors " "de l'évènement %{event} de l'objet, n'existe pas." -#: includes/class/class.LSldapObject.php:3183 +#: includes/class/class.LSldapObject.php:3186 msgid "" "LSldapObject : Method %{meth} within %{class} class to be executed on object " "event %{event}, doesn't exist." @@ -1803,7 +1817,7 @@ msgstr "" "LSldapObject : La méthode %{meth} de la classe %{class} devant être exécutée " "lors de l'évènement %{event} de l'objet n'existe pas." -#: includes/class/class.LSldapObject.php:3186 +#: includes/class/class.LSldapObject.php:3189 msgid "" "LSldapObject : Error during execute %{meth} method within %{class} class, to " "be executed on object event %{event}." @@ -1811,7 +1825,7 @@ msgstr "" "LSldapObject : Erreur durant l'exécution de la méthode %{meth} de la classe " "%{class} devant être exécutée lors de l'évènement %{event} de l'objet." -#: includes/class/class.LSldapObject.php:3190 +#: includes/class/class.LSldapObject.php:3193 msgid "" "LSldapObject : Some configuration data of the object type %{obj} are missing " "to generate the DN of the new object." @@ -1819,7 +1833,7 @@ msgstr "" "LSldapObject : Des informations de configuration du type d'objet %{obj} sont " "manquantes pour la génération du DN du nouvel objet." -#: includes/class/class.LSldapObject.php:3193 +#: includes/class/class.LSldapObject.php:3196 msgid "" "LSldapObject : The attibute %{attr} of the object is not yet defined. Can't " "generate DN." @@ -1827,11 +1841,11 @@ msgstr "" "LSldapObject : L'attribut %{attr} de l'objet n'est pas encore défini. " "Impossible de générer le DN." -#: includes/class/class.LSldapObject.php:3196 +#: includes/class/class.LSldapObject.php:3199 msgid "LSldapObject : Without DN, the object could not be changed." msgstr "LSldapObject : Sans DN, l'objet ne peut pas être modifié." -#: includes/class/class.LSldapObject.php:3199 +#: includes/class/class.LSldapObject.php:3202 msgid "" "LSldapObject : The attribute %{attr_depend} depending on the attribute " "%{attr} doesn't exist." @@ -1839,39 +1853,39 @@ msgstr "" "LSldapObject : L'attritbut %{attr_depend} dépendant de l'attribut %{attr} " "n'existe pas." -#: includes/class/class.LSldapObject.php:3202 +#: includes/class/class.LSldapObject.php:3205 msgid "LSldapObject : Error during deleting the object %{objectname}." msgstr "LSldapObject : Erreur durant la suppression de l'objet %{objectname}" -#: includes/class/class.LSldapObject.php:3206 +#: includes/class/class.LSldapObject.php:3209 msgid "" "LSldapObject : Error during actions to be executed before renaming the objet." msgstr "" "LSldapObject : Erreur durant les actions devant être exécutée avant de " "renommer l'objet." -#: includes/class/class.LSldapObject.php:3209 +#: includes/class/class.LSldapObject.php:3212 msgid "" "LSldapObject : Error during actions to be executed after renaming the objet." msgstr "" "LSldapObject : Erreur durant les actions devant être exécutée après avoir " "renommé l'objet." -#: includes/class/class.LSldapObject.php:3213 +#: includes/class/class.LSldapObject.php:3216 msgid "" "LSldapObject : Error during actions to be executed before deleting the objet." msgstr "" "LSldapObject : Erreur durant les actions devant être exécutée avant de " "supprimer l'objet." -#: includes/class/class.LSldapObject.php:3216 +#: includes/class/class.LSldapObject.php:3219 msgid "" "LSldapObject : Error during actions to be executed after deleting the objet." msgstr "" "LSldapObject : Erreur durant les actions devant être exécutée après avoir " "supprimé l'objet." -#: includes/class/class.LSldapObject.php:3220 +#: includes/class/class.LSldapObject.php:3223 msgid "" "LSldapObject : Error during the actions to be executed before creating the " "object." @@ -1879,7 +1893,7 @@ msgstr "" "LSldapObject : Erreur durant les actions devant être exécutée avant de créer " "l'objet." -#: includes/class/class.LSldapObject.php:3223 +#: includes/class/class.LSldapObject.php:3226 msgid "" "LSldapObject : Error during the actions to be executed after creating the " "object. It was created anyway." @@ -1887,7 +1901,7 @@ msgstr "" "LSldapObject : Erreur durant les actions devant être exécutées après la " "création de l'objet. Il a tout de même été créé." -#: includes/class/class.LSldapObject.php:3227 +#: includes/class/class.LSldapObject.php:3230 msgid "" "LSldapObject : The function %{func} to be executed before creating the " "object doesn't exist." @@ -1895,7 +1909,7 @@ msgstr "" "LSldapObject : La fonction %{func} devant être exécutée avant la création de " "l'objet n'existe pas." -#: includes/class/class.LSldapObject.php:3230 +#: includes/class/class.LSldapObject.php:3233 msgid "" "LSldapObject : Error executing the function %{func} to be execute after " "deleting the object." @@ -1903,7 +1917,7 @@ msgstr "" "LSldapObject : Erreur durant l'exécution de la fonction %{func} devant être " "exécutée après la suppression de l'objet." -#: includes/class/class.LSldapObject.php:3233 +#: includes/class/class.LSldapObject.php:3236 msgid "" "LSldapObject : The function %{func} to be executed after deleting the object " "doesn't exist." @@ -1911,7 +1925,7 @@ msgstr "" "LSldapObject : La fonction %{func} devant être exécutée après la suppression " "de l'objet n'existe pas." -#: includes/class/class.LSldapObject.php:3236 +#: includes/class/class.LSldapObject.php:3239 msgid "" "LSldapObject : Error executing the function %{func} to be execute after " "creating the object." @@ -1919,7 +1933,7 @@ msgstr "" "LSldapObject : Erreur durant l'exécution de la fonction %{func} devant être " "exécutée après la création de l'objet." -#: includes/class/class.LSldapObject.php:3240 +#: includes/class/class.LSldapObject.php:3243 msgid "" "LSldapObject : %{func} function, to be executed on object event %{event}, " "doesn't exist." @@ -1927,7 +1941,7 @@ msgstr "" "LSldapObject : La fonction %{func}, devant être exécutée lors de l'évènement " "%{event} de l'objet, n'existe pas." -#: includes/class/class.LSldapObject.php:3243 +#: includes/class/class.LSldapObject.php:3246 msgid "" "LSldapObject : Error during the execution of %{func} function on object " "event %{event}." @@ -1935,7 +1949,7 @@ msgstr "" "LSldapObject : Erreur durant l'exécution de la fonction %{func} lors de " "l'évènement %{event} de l'objet." -#: includes/class/class.LSldapObject.php:3247 +#: includes/class/class.LSldapObject.php:3250 msgid "" "LSldapObject : %{meth} method, to be executed on object event %{event}, " "doesn't exist." @@ -1943,7 +1957,7 @@ msgstr "" "LSldapObject : La méthode %{meth}, devant être exécutée lors de l'évènement " "%{event} de l'objet, n'existe pas." -#: includes/class/class.LSldapObject.php:3250 +#: includes/class/class.LSldapObject.php:3253 msgid "" "LSldapObject : Error during execution of %{meth} method on object event " "%{event}." @@ -1951,13 +1965,13 @@ msgstr "" "LSldapObject : Erreur durant l'exécution de la méthode %{meth} lors de " "l'évènement %{event} de l'objet." -#: includes/class/class.LSldapObject.php:3253 +#: includes/class/class.LSldapObject.php:3256 msgid "LSldapObject : Error during generate LDAP filter for %{LSobject}." msgstr "" "LSldapObject : Erreur durant la génération du filtre LDAP de l'objet " "%{LSobject}." -#: includes/class/class.LSldapObject.php:3257 +#: includes/class/class.LSldapObject.php:3260 msgid "" "LSldapObject : Error during execution of the custom action %{customAction} " "on %{objectname}." @@ -1965,22 +1979,22 @@ msgstr "" "LSldapObject : Erreur durant l'exécution de l'action personnalisée " "%{customAction} sur l'objet %{objectname}." -#: includes/class/class.LSldapObject.php:3261 +#: includes/class/class.LSldapObject.php:3264 msgid "LSldapObject : Fail to retrieve container DN." msgstr "LSldapObject : Impossible de récupérer le DN parent." -#: includes/class/class.LSldapObject.php:3264 +#: includes/class/class.LSldapObject.php:3267 msgid "" "LSldapObject : The function %{func} to generate container DN is not callable." msgstr "" "LSldapObject : La fonction %{func} pour générer le DN parent n'est pas " "exécutable." -#: includes/class/class.LSldapObject.php:3267 +#: includes/class/class.LSldapObject.php:3270 msgid "LSldapObject : Error during generating container DN : %{error}" msgstr "LSldapObject : Erreur durant la génération du DN parent : %{error}." -#: includes/class/class.LSldapObject.php:3270 +#: includes/class/class.LSldapObject.php:3273 msgid "" "LSldapObject : An LDAP object with the same DN as generated for this new one " "already exists. Please verify your configuration." @@ -1988,7 +2002,7 @@ msgstr "" "LSldapObject : Un objet LDAP avec le même DN que celui généré pour ce nouvel " "objet existe déjà. Merci de vérifier votre configuration." -#: includes/class/class.LSldapObject.php:3275 +#: includes/class/class.LSldapObject.php:3278 msgid "" "LSrelation : Some parameters are missing in the call of methods to handle " "standard relations (Method : %{meth})." @@ -3203,7 +3217,7 @@ msgstr "" "LSsearchEntry : formaterFunction %{func} invalide utilisé pour " "l'extraDisplayedColumns %{column}." -#: includes/class/class.LSioFormat.php:224 +#: includes/class/class.LSioFormat.php:246 msgid "LSioFormat : IOformat driver %{driver} invalid or unavailable." msgstr "" "LSioFormat : Le pilote d'IOformat %{driver} est invalide ou n'est pas " @@ -3744,3 +3758,6 @@ msgstr "événement(s) trouvé(s) pour cet objet." #: templates/default/import.tpl:27 templates/default/import.tpl:33 msgid "no" msgstr "non" + +#~ msgid "PRE-PRODUCTION" +#~ msgstr "PRÉ-PRODUCTION" diff --git a/src/lang/ldapsaisie.pot b/src/lang/ldapsaisie.pot index f084e932..236b8c1b 100644 --- a/src/lang/ldapsaisie.pot +++ b/src/lang/ldapsaisie.pot @@ -527,10 +527,6 @@ msgstr "" msgid "MAILDIR : Error retrieving remote path of the maildir." msgstr "" -#: includes/addons/LSaddons.watermark.php:78 -msgid "PRE-PRODUCTION" -msgstr "" - #: includes/addons/LSaddons.showTechInfo.php:63 #: templates/default/showTechInfo.tpl:16 msgid "Structural object class" @@ -638,87 +634,101 @@ msgstr "" msgid "LSformRule_%{type}: Parameter %{param} is not found." msgstr "" -#: includes/class/class.LSio.php:339 -msgid "Failed to set post data on creation form." +#: includes/class/class.LSio.php:356 +msgid "Object DN is empty in provided data." msgstr "" -#: includes/class/class.LSio.php:345 -msgid "Error validating creation form." +#: includes/class/class.LSio.php:363 +msgid "Failed to compute object DN from provided data (no RDN value)." msgstr "" -#: includes/class/class.LSio.php:350 -msgid "Failed to validate object data." -msgstr "" - -#: includes/class/class.LSio.php:357 -msgid "Failed to generate DN for this object." -msgstr "" - -#: includes/class/class.LSio.php:376 -msgid "Error creating object on LDAP server." -msgstr "" - -#: includes/class/class.LSio.php:382 -msgid "An object already exist on LDAP server with DN %{dn}." -msgstr "" - -#: includes/class/class.LSio.php:394 +#: includes/class/class.LSio.php:374 includes/class/class.LSio.php:444 msgid "" "Failed to load existing object %{dn} from LDAP server. Can't update object." msgstr "" -#: includes/class/class.LSio.php:403 -msgid "Failed to set post data on update form." +#: includes/class/class.LSio.php:387 +msgid "Failed to set post data on creation form." msgstr "" -#: includes/class/class.LSio.php:409 -msgid "Error validating update form." +#: includes/class/class.LSio.php:393 +msgid "Error validating creation form." +msgstr "" + +#: includes/class/class.LSio.php:398 +msgid "Failed to validate object data." +msgstr "" + +#: includes/class/class.LSio.php:405 +msgid "Failed to generate DN for this object." msgstr "" #: includes/class/class.LSio.php:424 +msgid "Error creating object on LDAP server." +msgstr "" + +#: includes/class/class.LSio.php:430 +msgid "An object already exist on LDAP server with DN %{dn}." +msgstr "" + +#: includes/class/class.LSio.php:455 +msgid "Failed to set post data on update form." +msgstr "" + +#: includes/class/class.LSio.php:461 +msgid "Error validating update form." +msgstr "" + +#: includes/class/class.LSio.php:476 msgid "Error updating object on LDAP server." msgstr "" -#: includes/class/class.LSio.php:830 +#: includes/class/class.LSio.php:883 msgid "LSio: Post data not found or not completed." msgstr "" -#: includes/class/class.LSio.php:833 +#: includes/class/class.LSio.php:886 msgid "LSio: object type invalid." msgstr "" -#: includes/class/class.LSio.php:836 +#: includes/class/class.LSio.php:889 msgid "LSio: input/output format %{format} invalid." msgstr "" -#: includes/class/class.LSio.php:839 +#: includes/class/class.LSio.php:892 msgid "LSio: Fail to initialize input/output driver." msgstr "" -#: includes/class/class.LSio.php:842 +#: includes/class/class.LSio.php:895 msgid "LSio: Fail to load objects's data from input file." msgstr "" -#: includes/class/class.LSio.php:845 +#: includes/class/class.LSio.php:898 msgid "LSio: Fail to load objects's data to export from LDAP directory." msgstr "" -#: includes/class/class.LSio.php:848 +#: includes/class/class.LSio.php:901 msgid "LSio: Fail to export objects's data." msgstr "" -#: includes/class/class.LSio.php:851 +#: includes/class/class.LSio.php:904 msgid "LSio: An error occured running before import hooks. Stop the import." msgstr "" -#: includes/class/class.LSio.php:854 +#: includes/class/class.LSio.php:907 msgid "LSio: An error occured running after import hooks." msgstr "" -#: includes/class/class.LSio.php:857 +#: includes/class/class.LSio.php:910 msgid "LSio: Error occured loading objects's data from input file." msgstr "" +#: includes/class/class.LSio.php:913 +msgid "" +"LSio: This input/output format only support update. You must check the " +"'Update objects if exists' box." +msgstr "" + #: includes/class/class.LSformElement_supannRessourceEtatDate.php:61 msgid "Start date" msgstr "" @@ -1474,199 +1484,199 @@ msgstr "" msgid "Invalid file type (%{type})." msgstr "" -#: includes/class/class.LSldapObject.php:584 +#: includes/class/class.LSldapObject.php:585 msgid "The attribute %{attr} is not valid." msgstr "" -#: includes/class/class.LSldapObject.php:3157 +#: includes/class/class.LSldapObject.php:3160 msgid "LSldapObject : Object type unknown." msgstr "" -#: includes/class/class.LSldapObject.php:3160 +#: includes/class/class.LSldapObject.php:3163 msgid "LSldapObject : Update form is not defined for the object %{obj}." msgstr "" -#: includes/class/class.LSldapObject.php:3163 +#: includes/class/class.LSldapObject.php:3166 msgid "LSldapObject : No form exists for the object %{obj}." msgstr "" -#: includes/class/class.LSldapObject.php:3166 +#: includes/class/class.LSldapObject.php:3169 msgid "" "LSldapObject : The function %{func} to validate the attribute %{attr} the " "object %{obj} is unknow." msgstr "" -#: includes/class/class.LSldapObject.php:3169 +#: includes/class/class.LSldapObject.php:3172 msgid "" "LSldapObject : Configuration data are missing to validate the attribute " "%{attr} of the object %{obj}." msgstr "" -#: includes/class/class.LSldapObject.php:3173 +#: includes/class/class.LSldapObject.php:3176 msgid "" "LSldapObject : The function %{func} to be executed on the object event " "%{event} doesn't exist." msgstr "" -#: includes/class/class.LSldapObject.php:3176 +#: includes/class/class.LSldapObject.php:3179 msgid "" "LSldapObject : The %{func} execution on the object event %{event} failed." msgstr "" -#: includes/class/class.LSldapObject.php:3180 +#: includes/class/class.LSldapObject.php:3183 msgid "" "LSldapObject : Class %{class}, which method %{meth} to be executed on the " "object event %{event}, doesn't exist." msgstr "" -#: includes/class/class.LSldapObject.php:3183 +#: includes/class/class.LSldapObject.php:3186 msgid "" "LSldapObject : Method %{meth} within %{class} class to be executed on object " "event %{event}, doesn't exist." msgstr "" -#: includes/class/class.LSldapObject.php:3186 +#: includes/class/class.LSldapObject.php:3189 msgid "" "LSldapObject : Error during execute %{meth} method within %{class} class, to " "be executed on object event %{event}." msgstr "" -#: includes/class/class.LSldapObject.php:3190 +#: includes/class/class.LSldapObject.php:3193 msgid "" "LSldapObject : Some configuration data of the object type %{obj} are missing " "to generate the DN of the new object." msgstr "" -#: includes/class/class.LSldapObject.php:3193 +#: includes/class/class.LSldapObject.php:3196 msgid "" "LSldapObject : The attibute %{attr} of the object is not yet defined. Can't " "generate DN." msgstr "" -#: includes/class/class.LSldapObject.php:3196 +#: includes/class/class.LSldapObject.php:3199 msgid "LSldapObject : Without DN, the object could not be changed." msgstr "" -#: includes/class/class.LSldapObject.php:3199 +#: includes/class/class.LSldapObject.php:3202 msgid "" "LSldapObject : The attribute %{attr_depend} depending on the attribute " "%{attr} doesn't exist." msgstr "" -#: includes/class/class.LSldapObject.php:3202 +#: includes/class/class.LSldapObject.php:3205 msgid "LSldapObject : Error during deleting the object %{objectname}." msgstr "" -#: includes/class/class.LSldapObject.php:3206 -msgid "" -"LSldapObject : Error during actions to be executed before renaming the objet." -msgstr "" - #: includes/class/class.LSldapObject.php:3209 msgid "" -"LSldapObject : Error during actions to be executed after renaming the objet." +"LSldapObject : Error during actions to be executed before renaming the objet." msgstr "" -#: includes/class/class.LSldapObject.php:3213 +#: includes/class/class.LSldapObject.php:3212 msgid "" -"LSldapObject : Error during actions to be executed before deleting the objet." +"LSldapObject : Error during actions to be executed after renaming the objet." msgstr "" #: includes/class/class.LSldapObject.php:3216 msgid "" +"LSldapObject : Error during actions to be executed before deleting the objet." +msgstr "" + +#: includes/class/class.LSldapObject.php:3219 +msgid "" "LSldapObject : Error during actions to be executed after deleting the objet." msgstr "" -#: includes/class/class.LSldapObject.php:3220 +#: includes/class/class.LSldapObject.php:3223 msgid "" "LSldapObject : Error during the actions to be executed before creating the " "object." msgstr "" -#: includes/class/class.LSldapObject.php:3223 +#: includes/class/class.LSldapObject.php:3226 msgid "" "LSldapObject : Error during the actions to be executed after creating the " "object. It was created anyway." msgstr "" -#: includes/class/class.LSldapObject.php:3227 +#: includes/class/class.LSldapObject.php:3230 msgid "" "LSldapObject : The function %{func} to be executed before creating the " "object doesn't exist." msgstr "" -#: includes/class/class.LSldapObject.php:3230 +#: includes/class/class.LSldapObject.php:3233 msgid "" "LSldapObject : Error executing the function %{func} to be execute after " "deleting the object." msgstr "" -#: includes/class/class.LSldapObject.php:3233 +#: includes/class/class.LSldapObject.php:3236 msgid "" "LSldapObject : The function %{func} to be executed after deleting the object " "doesn't exist." msgstr "" -#: includes/class/class.LSldapObject.php:3236 +#: includes/class/class.LSldapObject.php:3239 msgid "" "LSldapObject : Error executing the function %{func} to be execute after " "creating the object." msgstr "" -#: includes/class/class.LSldapObject.php:3240 +#: includes/class/class.LSldapObject.php:3243 msgid "" "LSldapObject : %{func} function, to be executed on object event %{event}, " "doesn't exist." msgstr "" -#: includes/class/class.LSldapObject.php:3243 +#: includes/class/class.LSldapObject.php:3246 msgid "" "LSldapObject : Error during the execution of %{func} function on object " "event %{event}." msgstr "" -#: includes/class/class.LSldapObject.php:3247 +#: includes/class/class.LSldapObject.php:3250 msgid "" "LSldapObject : %{meth} method, to be executed on object event %{event}, " "doesn't exist." msgstr "" -#: includes/class/class.LSldapObject.php:3250 +#: includes/class/class.LSldapObject.php:3253 msgid "" "LSldapObject : Error during execution of %{meth} method on object event " "%{event}." msgstr "" -#: includes/class/class.LSldapObject.php:3253 +#: includes/class/class.LSldapObject.php:3256 msgid "LSldapObject : Error during generate LDAP filter for %{LSobject}." msgstr "" -#: includes/class/class.LSldapObject.php:3257 +#: includes/class/class.LSldapObject.php:3260 msgid "" "LSldapObject : Error during execution of the custom action %{customAction} " "on %{objectname}." msgstr "" -#: includes/class/class.LSldapObject.php:3261 +#: includes/class/class.LSldapObject.php:3264 msgid "LSldapObject : Fail to retrieve container DN." msgstr "" -#: includes/class/class.LSldapObject.php:3264 +#: includes/class/class.LSldapObject.php:3267 msgid "" "LSldapObject : The function %{func} to generate container DN is not callable." msgstr "" -#: includes/class/class.LSldapObject.php:3267 +#: includes/class/class.LSldapObject.php:3270 msgid "LSldapObject : Error during generating container DN : %{error}" msgstr "" -#: includes/class/class.LSldapObject.php:3270 +#: includes/class/class.LSldapObject.php:3273 msgid "" "LSldapObject : An LDAP object with the same DN as generated for this new one " "already exists. Please verify your configuration." msgstr "" -#: includes/class/class.LSldapObject.php:3275 +#: includes/class/class.LSldapObject.php:3278 msgid "" "LSrelation : Some parameters are missing in the call of methods to handle " "standard relations (Method : %{meth})." @@ -2724,7 +2734,7 @@ msgid "" "%{column}." msgstr "" -#: includes/class/class.LSioFormat.php:224 +#: includes/class/class.LSioFormat.php:246 msgid "LSioFormat : IOformat driver %{driver} invalid or unavailable." msgstr ""