test uppercase character before valid domain name for better error message
authorEmmanuel Garette <egarette@cadoles.com>
Sun, 7 Dec 2014 13:51:51 +0000 (14:51 +0100)
committerEmmanuel Garette <egarette@cadoles.com>
Sun, 7 Dec 2014 13:51:51 +0000 (14:51 +0100)
ChangeLog
test/test_config_domain.py
tiramisu/option/option.py
translations/fr/tiramisu.po
translations/tiramisu.pot

index bbb1a92..8217a81 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 Sun Dec  7 14:37:32 2014 +0200 Emmanuel Garette <egarette@cadoles.com>
        * mandatory master/slave's consistency with default value as slave
+       * test uppercase character before valid domain name for better error
+       message
 
 Mon Dec  1 22:58:13 2014 +0200 Emmanuel Garette <egarette@cadoles.com>
        * propertyerror are transitive in consistency, now it's possible to set
index 85f48b9..d31ebe5 100644 (file)
@@ -5,6 +5,7 @@ from py.test import raises
 from tiramisu.config import Config
 from tiramisu.option import DomainnameOption, EmailOption, URLOption, OptionDescription
 from tiramisu.error import ValueWarning
+from tiramisu.i18n import _
 
 
 def test_domainname():
@@ -36,6 +37,29 @@ def test_domainname():
     c.g = '192.168.1.29'
 
 
+def test_domainname_upper():
+    d = DomainnameOption('d', '')
+    od = OptionDescription('a', '', [d])
+    c = Config(od)
+    c.read_write()
+    c.d = 'toto.com'
+    msg = _('some characters are uppercase')
+    has_error = False
+    try:
+        c.d = 'TOTO.COM'
+    except ValueError, err:
+        assert msg in unicode(err)
+        has_error = True
+    assert has_error is True
+    has_error = False
+    try:
+        c.d = 'toTo.com'
+    except ValueError, err:
+        assert msg in unicode(err)
+        has_error = True
+    assert has_error is True
+
+
 def test_domainname_warning():
     d = DomainnameOption('d', '', warnings_only=True)
     f = DomainnameOption('f', '', allow_without_dot=True, warnings_only=True)
index 3974683..ccbee14 100644 (file)
@@ -409,6 +409,7 @@ class DomainnameOption(Option):
         extra['_allow_ip'] = allow_ip
         extra['_allow_without_dot'] = allow_without_dot
         extra['_domain_re'] = re.compile(r'^[a-z\d][a-z\d\-]*$')
+        extra['_has_upper'] = re.compile('[A-Z]')
 
         super(DomainnameOption, self).__init__(name, doc, default=default,
                                                default_multi=default_multi,
@@ -452,9 +453,11 @@ class DomainnameOption(Option):
 
     def _second_level_validation(self, value, warnings_only):
         def _valid_char(val):
+            if self._get_extra('_has_upper').search(val):
+                raise ValueError(_('some characters are uppercase'))
             if not self._get_extra('_domain_re').search(val):
                 if warnings_only:
-                    raise ValueError(_('same characters may cause problems'))
+                    raise ValueError(_('some characters may cause problems'))
                 else:
                     raise ValueError(_('invalid domainname'))
         #not for IP
index 660bee4..c330ceb 100644 (file)
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Tiramisu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-10-26 09:35+CET\n"
+"POT-Creation-Date: 2014-12-07 14:44+CET\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Emmanuel Garette <egarette@cadoles.com>\n"
 "Language-Team: Tiramisu's team <egarette@cadoles.com>\n"
@@ -21,73 +21,104 @@ msgstr ""
 "impossible d'effectuer le calcul, l'option {0} a les propriétés : {1} pour : "
 "{2}"
 
-#: tiramisu/config.py:58
+#: tiramisu/config.py:59
 msgid "descr must be an optiondescription, not {0}"
 msgstr "descr doit être une optiondescription pas un {0}"
 
-#: tiramisu/config.py:137
+#: tiramisu/config.py:139
 msgid "unknown group_type: {0}"
 msgstr "group_type inconnu: {0}"
 
-#: tiramisu/config.py:176 tiramisu/setting.py:321 tiramisu/value.py:54
-#: tiramisu/value.py:555
+#: tiramisu/config.py:178 tiramisu/setting.py:320 tiramisu/value.py:54
+#: tiramisu/value.py:605
 msgid "the context does not exist anymore"
 msgstr "le context n'existe plus"
 
-#: tiramisu/config.py:181
+#: tiramisu/config.py:183
 msgid "no option description found for this config (may be GroupConfig)"
 msgstr ""
 "pas d'option description trouvé pour cette config (peut être un GroupConfig)"
 
-#: tiramisu/config.py:209
+#: tiramisu/config.py:211
 msgid "can't assign to an OptionDescription"
 msgstr "ne peut pas attribuer une valeur à une OptionDescription"
 
-#: tiramisu/config.py:335
+#: tiramisu/config.py:340
 msgid "unknown type_ type {0}for _find"
 msgstr "type_ type {0} pour _find inconnu"
 
-#: tiramisu/config.py:370
+#: tiramisu/config.py:380
 msgid "no option found in config with these criteria"
 msgstr "aucune option trouvée dans la config avec ces critères"
 
-#: tiramisu/config.py:420
+#: tiramisu/config.py:430
 msgid "make_dict can't filtering with value without option"
 msgstr "make_dict ne peut filtrer sur une valeur mais sans option"
 
-#: tiramisu/config.py:439
+#: tiramisu/config.py:449
 msgid "unexpected path {0}, should start with {1}"
 msgstr "chemin imprévu {0}, devrait commencer par {1}"
 
-#: tiramisu/config.py:507
+#: tiramisu/config.py:519
 msgid "opt in getowner must be an option not {0}"
 msgstr "opt dans getowner doit être une option pas {0}"
 
-#: tiramisu/config.py:552
+#: tiramisu/config.py:564
 msgid "cannot serialize Config with MetaConfig"
 msgstr "impossible de sérialiser une Config avec une MetaConfig"
 
-#: tiramisu/config.py:566
+#: tiramisu/config.py:578
 msgid "this storage is not serialisable, could be a none persistent storage"
 msgstr "ce storage n'est sérialisable, devrait être une storage non persistant"
 
-#: tiramisu/config.py:629
-msgid "metaconfig's children must be a list"
-msgstr "enfants d'une metaconfig doit être une liste"
+#: tiramisu/config.py:631
+msgid "invalid name: {0} for config"
+msgstr "nom invalide : {0} pour la config"
+
+#: tiramisu/config.py:655
+msgid "groupconfig's children must be a list"
+msgstr "enfants d'une groupconfig doit être une liste"
+
+#: tiramisu/config.py:659
+msgid "groupconfig's children must be Config, MetaConfig or GroupConfig"
+msgstr ""
+"les enfants d'un groupconfig doivent être des Config, MetaConfig ou "
+"GroupConfig"
+
+#: tiramisu/config.py:662
+msgid "name must be set to config before creating groupconfig"
+msgstr "un nom doit être donné à la config avant de créer un groupconfig"
 
-#: tiramisu/config.py:723
+#: tiramisu/config.py:670
+msgid "config name must be uniq in groupconfig for {0}"
+msgstr "le nom de la config doit être unique dans un groupconfig pour {0}"
+
+#: tiramisu/config.py:785
 msgid "metaconfig's children should be config, not {0}"
 msgstr "enfants d'une metaconfig doit être une config, pas {0}"
 
-#: tiramisu/config.py:727
+#: tiramisu/config.py:789
 msgid "child has already a metaconfig's"
 msgstr "enfant a déjà une metaconfig"
 
-#: tiramisu/config.py:731
+#: tiramisu/config.py:793
 msgid "all config in metaconfig must have the same optiondescription"
 msgstr ""
 "toutes les configs d'une metaconfig doivent avoir la même optiondescription"
 
+#: tiramisu/config.py:805
+msgid ""
+"force_default, force_default_if_same or force_dont_change_value cannot be "
+"set with only_config"
+msgstr ""
+"force_default, force_default_if_same ou force_dont_change_value ne peuvent "
+"pas être spécifié avec only_config"
+
+#: tiramisu/config.py:811
+msgid "force_default and force_dont_change_value cannot be set together"
+msgstr ""
+"force_default et force_dont_change_value ne peuvent pas être mis ensemble"
+
 #: tiramisu/option/baseoption.py:56
 msgid "{0} must be a function"
 msgstr "{0} doit être une fonction"
@@ -141,7 +172,7 @@ msgstr ""
 msgid "invalid properties type {0} for {1}, must be a tuple"
 msgstr "type des properties invalide {0} pour {1}, doit être un tuple"
 
-#: tiramisu/option/baseoption.py:144
+#: tiramisu/option/baseoption.py:145
 msgid ""
 "params defined for a callback function but no callback defined yet for "
 "option {0}"
@@ -149,112 +180,115 @@ msgstr ""
 "params définis pour une fonction callback mais par de callback encore "
 "définis pour l'option {0}"
 
-#: tiramisu/option/baseoption.py:149
+#: tiramisu/option/baseoption.py:150
 msgid "a callback is already set for option {0}, cannot set another one's"
 msgstr ""
 "un callback est en lecture seul pour l'option {0}, ne peut en placer une "
 "autre"
 
-#: tiramisu/option/baseoption.py:276
+#: tiramisu/option/baseoption.py:277
 msgid "cannot serialize Option, only in OptionDescription"
 msgstr "ne peut serialiser une Option, seulement via une OptionDescription"
 
-#: tiramisu/option/baseoption.py:354
+#: tiramisu/option/baseoption.py:363
 msgid "'{0}' ({1}) object attribute '{2}' is read-only"
 msgstr "l'attribut {2} de l'objet '{0}' ({1}) est en lecture seule"
 
-#: tiramisu/option/baseoption.py:509 tiramisu/option/baseoption.py:552
+#: tiramisu/option/baseoption.py:528 tiramisu/option/baseoption.py:571
 msgid "invalid value for option {0}: {1}"
 msgstr "valeur invalide pour l'option {0} : {1}"
 
-#: tiramisu/option/baseoption.py:522
+#: tiramisu/option/baseoption.py:541
 msgid "do_validation for {0}: error in value"
 msgstr "do_validation for {0} : erreur dans un la valeur"
 
-#: tiramisu/option/baseoption.py:528
+#: tiramisu/option/baseoption.py:547
 msgid "do_validation for {0}: warning in value"
 msgstr "do_validation for {0} : warning dans un la valeur"
 
-#: tiramisu/option/baseoption.py:538
+#: tiramisu/option/baseoption.py:557
 msgid "do_validation for {0}: error in consistency"
 msgstr "do_validation for {0} : erreur dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:542
+#: tiramisu/option/baseoption.py:561
 msgid "do_validation for {0}: warning in consistency"
 msgstr "do_validation for {0} : warning dans un test de consistance"
 
-#: tiramisu/option/baseoption.py:546
+#: tiramisu/option/baseoption.py:565
 msgid "warning on the value of the option {0}: {1}"
 msgstr "avertissement sur la valeur de l'option {0} : {1}"
 
-#: tiramisu/option/baseoption.py:564 tiramisu/option/baseoption.py:573
+#: tiramisu/option/baseoption.py:583 tiramisu/option/baseoption.py:592
 msgid "invalid value {0} for option {1} which must be a list"
 msgstr "valeur invalide pour l'option {0} : {1} laquelle doit être une liste"
 
-#: tiramisu/option/baseoption.py:579
+#: tiramisu/option/baseoption.py:598
 msgid "invalid value {0} for option {1} which must be a list of list"
 msgstr ""
 "valeur invalide pour l'option {0} : {1} laquelle doit être une liste de liste"
 
-#: tiramisu/option/baseoption.py:632
-#, fuzzy
+#: tiramisu/option/baseoption.py:651
 msgid "'{0}' ({1}) cannot add consistency, option is read-only"
 msgstr ""
 "'{0}' ({1}) ne peut ajouter de consistency, l'option est en lecture seul"
 
-#: tiramisu/option/baseoption.py:643
+#: tiramisu/option/baseoption.py:663
+msgid "unknow parameter {0} in consistency"
+msgstr "paramètre inconnu {0} dans un test de consistance"
+
+#: tiramisu/option/baseoption.py:670
 msgid "consistency must be set with an option"
 msgstr "consistency doit être configuré avec une option"
 
-#: tiramisu/option/baseoption.py:646 tiramisu/option/baseoption.py:653
+#: tiramisu/option/baseoption.py:673 tiramisu/option/baseoption.py:680
 msgid ""
 "almost one option in consistency is in a dynoptiondescription but not all"
 msgstr ""
 "au moins une option dans le test de consistance est dans une "
 "dynoptiondescription mais pas toutes"
 
-#: tiramisu/option/baseoption.py:649
+#: tiramisu/option/baseoption.py:676
 msgid "option in consistency must be in same dynoptiondescription"
 msgstr ""
 "option dans une consistency doit être dans le même dynoptiondescription"
 
-#: tiramisu/option/baseoption.py:656
+#: tiramisu/option/baseoption.py:683
 msgid "cannot add consistency with itself"
 msgstr "ne peut ajouter une consistency avec lui même"
 
-#: tiramisu/option/baseoption.py:658
+#: tiramisu/option/baseoption.py:685
 msgid "every options in consistency must be multi or none"
 msgstr ""
 "toutes les options d'une consistency doivent être multi ou ne pas l'être"
 
-#: tiramisu/option/baseoption.py:662
+#: tiramisu/option/baseoption.py:689
 msgid "consistency {0} not available for this option"
 msgstr "consistency {0} non valable pour cette option"
 
-#: tiramisu/option/baseoption.py:689
+#: tiramisu/option/baseoption.py:717
 msgid "same value for {0} and {1}, should be different"
 msgstr "même valeur pour {0} et {1}, devrait être différent"
 
-#: tiramisu/option/baseoption.py:691
+#: tiramisu/option/baseoption.py:719
 msgid "same value for {0} and {1}, must be different"
 msgstr "même valeur pour {0} et {1}, doit être différent"
 
-#: tiramisu/option/baseoption.py:748
+#: tiramisu/option/baseoption.py:776
 msgid "default value not allowed if option: {0} is calculated"
 msgstr "la valeur par défaut n'est pas possible si l'option {0} est calculée"
 
-#: tiramisu/option/baseoption.py:770
+#: tiramisu/option/baseoption.py:798
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 "type requirements malformé pour l'option : {0}, doit être un dictionnaire"
 
-#: tiramisu/option/baseoption.py:776
+#: tiramisu/option/baseoption.py:804
 msgid "malformed requirements for option: {0} unknown keys {1}, must only {2}"
 msgstr ""
 "requirements mal formés pour l'option : {0} clefs inconnues {1}, doit "
 "seulement avoir {2}"
 
-#: tiramisu/option/baseoption.py:787
+#: tiramisu/option/baseoption.py:815
 msgid ""
 "malformed requirements for option: {0} require must have option, expected "
 "and action keys"
@@ -262,49 +296,49 @@ msgstr ""
 "requirements malformé pour l'option : {0} l'exigence doit avoir les clefs "
 "option, expected et action"
 
-#: tiramisu/option/baseoption.py:791
+#: tiramisu/option/baseoption.py:819
 msgid ""
 "malformed requirements for option: {0} action cannot be force_store_value"
 msgstr ""
 "requirements mal formés pour l'option : {0} action ne peut pas être "
 "force_store_value"
 
-#: tiramisu/option/baseoption.py:796
+#: tiramisu/option/baseoption.py:824
 msgid "malformed requirements for option: {0} inverse must be boolean"
 msgstr ""
 "requirements mal formés pour l'option : {0} inverse doit être un booléen"
 
-#: tiramisu/option/baseoption.py:800
+#: tiramisu/option/baseoption.py:828
 msgid "malformed requirements for option: {0} transitive must be boolean"
 msgstr ""
 "requirements mal formés pour l'option : {0} transitive doit être booléen"
 
-#: tiramisu/option/baseoption.py:804
+#: tiramisu/option/baseoption.py:832
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 "requirements mal formés pour l'option : {0} same_action doit être un booléen"
 
-#: tiramisu/option/baseoption.py:808
+#: tiramisu/option/baseoption.py:836
 msgid "malformed requirements must be an option in option {0}"
 msgstr "requirements mal formés doit être une option dans l'option {0}"
 
-#: tiramisu/option/baseoption.py:811
+#: tiramisu/option/baseoption.py:839
 msgid "malformed requirements option {0} must not be a multi for {1}"
 msgstr ""
 "requirements mal formés pour l'option {0} ne doit pas être une multi pour {1}"
 
-#: tiramisu/option/baseoption.py:818
+#: tiramisu/option/baseoption.py:846
 msgid ""
 "malformed requirements second argument must be valid for option {0}: {1}"
 msgstr ""
 "requirements mal formés deuxième argument doit être valide pour l'option "
 "{0} : {1}"
 
-#: tiramisu/option/baseoption.py:823
+#: tiramisu/option/baseoption.py:851
 msgid "inconsistency in action types for option: {0} action: {1}"
 msgstr "incohérence dans les types action pour l'option : {0} action {1}"
 
-#: tiramisu/option/baseoption.py:851
+#: tiramisu/option/baseoption.py:879
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr "symlinkoption mal formé, doit être une option pour symlink {0}"
 
@@ -332,7 +366,7 @@ msgstr ""
 "callback d'une variable maitre ne devrait pas référencer des variables "
 "esclaves"
 
-#: tiramisu/option/masterslave.py:198
+#: tiramisu/option/masterslave.py:258
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr "longueur invalide pour une esclave : {0} qui a {1} comme maître"
 
@@ -406,55 +440,59 @@ msgid "invalid IP {0} ({1}) not in network {2} ({3}) with netmask {4} ({5})"
 msgstr ""
 "IP invalide {0} ({1}) pas dans le réseau {2} ({3}) avec le masque {4} ({5})"
 
-#: tiramisu/option/option.py:254
+#: tiramisu/option/option.py:256
 msgid "inconsistency in allowed range"
 msgstr "inconsistence dans la plage autorisée"
 
-#: tiramisu/option/option.py:259
+#: tiramisu/option/option.py:261
 msgid "max value is empty"
 msgstr "la valeur maximum est vide"
 
-#: tiramisu/option/option.py:277
+#: tiramisu/option/option.py:279
 msgid "invalid port, range must have two values only"
 msgstr "port invalide, une plage doit avoir deux valeurs seulement"
 
-#: tiramisu/option/option.py:280
+#: tiramisu/option/option.py:282
 msgid "invalid port, first port in range must be smaller than the second one"
 msgstr ""
 "port invalide, le premier port d'une plage doit être plus petit que le second"
 
-#: tiramisu/option/option.py:289
+#: tiramisu/option/option.py:291
 msgid "invalid port"
 msgstr "port invalide"
 
-#: tiramisu/option/option.py:291
+#: tiramisu/option/option.py:293
 msgid "invalid port, must be an between {0} and {1}"
 msgstr "port invalide, port doit être entre {0} et {1}"
 
-#: tiramisu/option/option.py:304
+#: tiramisu/option/option.py:306
 msgid "invalid network address"
 msgstr "adresse réseau invalide"
 
-#: tiramisu/option/option.py:310
+#: tiramisu/option/option.py:312
 msgid "network address is in reserved class"
 msgstr "l'adresse réseau est pas dans une plage d'adresse réservée"
 
-#: tiramisu/option/option.py:312
+#: tiramisu/option/option.py:314
 msgid "invalid network address, mustn't be in reserved class"
 msgstr "adresse réseau invalide, ne doit pas être dans la classe réservée"
 
-#: tiramisu/option/option.py:324
+#: tiramisu/option/option.py:326
 msgid "invalid netmask address"
 msgstr "masque de sous-réseau invalide"
 
-#: tiramisu/option/option.py:341
+#: tiramisu/option/option.py:343
 msgid "invalid len for opts"
 msgstr "longueur invalide pour opts"
 
-#: tiramisu/option/option.py:355
+#: tiramisu/option/option.py:352
 msgid "invalid IP {0} ({1}) with netmask {2}, this IP is a network"
 msgstr "IP invalide {0} ({1}) avec masque {2}, cette IP est un réseau"
 
+#: tiramisu/option/option.py:355
+msgid "invalid IP {0} ({1}) with netmask {2}, this IP is a broadcast"
+msgstr "IP invalide {0} ({1}) avec masque {2}, cette IP est un broadcast"
+
 #: tiramisu/option/option.py:360
 msgid "invalid network {0} ({1}) with netmask {2}"
 msgstr "réseau invalide {0} ({1}) avec masque {2}"
@@ -481,55 +519,59 @@ msgstr "allow_ip doit être un booléen"
 msgid "allow_without_dot must be a boolean"
 msgstr "allow_without_dot doit être un booléen"
 
-#: tiramisu/option/option.py:428
+#: tiramisu/option/option.py:429
 msgid "invalid domainname's length (min 2)"
 msgstr "longueur du nom de domaine invalide (minimum 2)"
 
-#: tiramisu/option/option.py:430
+#: tiramisu/option/option.py:431
 msgid "invalid domainname's length (max {0})"
 msgstr "longueur du nom de domaine invalide (maximum {0})"
 
-#: tiramisu/option/option.py:445
+#: tiramisu/option/option.py:446
 msgid "invalid domainname, must have dot"
 msgstr "nom de domaine invalide, doit avoir un point"
 
-#: tiramisu/option/option.py:447
+#: tiramisu/option/option.py:448
 msgid "invalid domainname's length (max 255)"
 msgstr "longueur du nom de domaine invalide (maximum {1})"
 
 #: tiramisu/option/option.py:457
-msgid "same characters may cause problems"
+msgid "some characters are uppercase"
+msgstr "des caractères sont en majuscule"
+
+#: tiramisu/option/option.py:460
+msgid "some characters may cause problems"
 msgstr "des caractères peuvent poser problèmes"
 
-#: tiramisu/option/option.py:459
+#: tiramisu/option/option.py:462
 msgid "invalid domainname"
 msgstr "nom de domaine invalide"
 
-#: tiramisu/option/option.py:483
+#: tiramisu/option/option.py:486
 msgid "invalid email address, must contains one @"
 msgstr "adresse email invalide, doit contenir un @"
 
-#: tiramisu/option/option.py:486
+#: tiramisu/option/option.py:489
 msgid "invalid username in email address"
 msgstr "nom d'utilisateur invalide dans une adresse email"
 
-#: tiramisu/option/option.py:502
+#: tiramisu/option/option.py:505
 msgid "invalid url, must start with http:// or https://"
 msgstr "URL invalide, doit démarrer avec http:// ou https://"
 
-#: tiramisu/option/option.py:521
+#: tiramisu/option/option.py:524
 msgid "invalid url, port must be an between 0 and 65536"
 msgstr "URL invalide, port doit être entre 0 et 65536"
 
-#: tiramisu/option/option.py:528
+#: tiramisu/option/option.py:531
 msgid "invalid url, must ends with filename"
 msgstr "URL invalide, doit finir avec un nom de fichier"
 
-#: tiramisu/option/option.py:542
+#: tiramisu/option/option.py:545
 msgid "invalid username"
 msgstr "utilisateur invalide"
 
-#: tiramisu/option/option.py:552
+#: tiramisu/option/option.py:555
 msgid "invalid filename"
 msgstr "nom de fichier invalide"
 
@@ -545,36 +587,36 @@ msgstr "option ne doit pas commencé pareil qu'un dynoptiondescription"
 msgid "consistency with option {0} which is not in Config"
 msgstr "consistency avec l'option {0} qui n'est pas dans une Config"
 
-#: tiramisu/option/optiondescription.py:139
+#: tiramisu/option/optiondescription.py:145
 msgid "duplicate option: {0}"
 msgstr "option dupliquée : {0}"
 
-#: tiramisu/option/optiondescription.py:155
+#: tiramisu/option/optiondescription.py:156
 msgid "cannot change group_type if already set (old {0}, new {1})"
 msgstr "ne peut changer group_type si déjà spécifié (ancien {0}, nouveau {1})"
 
-#: tiramisu/option/optiondescription.py:163
+#: tiramisu/option/optiondescription.py:164
 msgid "group_type: {0} not allowed"
 msgstr "group_type : {0} non autorisé"
 
-#: tiramisu/option/optiondescription.py:260
+#: tiramisu/option/optiondescription.py:262
 msgid "DynOptionDescription callback return not uniq value"
 msgstr "callback d'une DynOptionDescription ne retourne pas une valeur unique"
 
-#: tiramisu/option/optiondescription.py:263
+#: tiramisu/option/optiondescription.py:265
 msgid "invalid suffix: {0} for option"
 msgstr "suffix invalide : {0} pour l'option"
 
-#: tiramisu/option/optiondescription.py:316
+#: tiramisu/option/optiondescription.py:318
 msgid "cannot set optiondescription in an dynoptiondescription"
 msgstr ""
 "impossible de mettre une optiondescription dans un dynoptiondescription"
 
-#: tiramisu/option/optiondescription.py:321
+#: tiramisu/option/optiondescription.py:323
 msgid "cannot set symlinkoption in an dynoptiondescription"
 msgstr "impossible de placer un symlinkoption dans un dynoptiondescription"
 
-#: tiramisu/option/optiondescription.py:329
+#: tiramisu/option/optiondescription.py:331
 msgid "callback is mandatory for dynoptiondescription"
 msgstr "callback est obligatoire pour un dynoptiondescription"
 
@@ -586,47 +628,47 @@ msgstr "ne peut redéfinir ({0})"
 msgid "can't unbind {0}"
 msgstr "ne peut supprimer ({0})"
 
-#: tiramisu/setting.py:255
+#: tiramisu/setting.py:254
 msgid "cannot append {0} property for option {1}: this property is calculated"
 msgstr ""
 "ne peut ajouter la propriété {0} dans l'option {1}: cette propriété est "
 "calculée"
 
-#: tiramisu/setting.py:341
+#: tiramisu/setting.py:343
 msgid "you should only append/remove properties"
 msgstr "pour pouvait seulement ajouter/supprimer des propriétés"
 
-#: tiramisu/setting.py:345
+#: tiramisu/setting.py:347
 msgid "opt and all_properties must not be set together in reset"
 msgstr "opt et all_properties ne doit pas être renseigné ensemble dans reset"
 
-#: tiramisu/setting.py:363
+#: tiramisu/setting.py:368
 msgid "if opt is not None, path should not be None in _getproperties"
 msgstr ""
 "si opt n'est pas None, path devrait ne pas être à None dans _getproperties"
 
-#: tiramisu/setting.py:407
+#: tiramisu/setting.py:412
 msgid "cannot add those properties: {0}"
 msgstr "ne peut pas ajouter ces propriétés : {0}"
 
-#: tiramisu/setting.py:469
+#: tiramisu/setting.py:477
 msgid "cannot change the value for option {0} this option is frozen"
 msgstr ""
 "ne peut modifier la valeur de l'option {0} cette option n'est pas modifiable"
 
-#: tiramisu/setting.py:475
+#: tiramisu/setting.py:483
 msgid "trying to access to an option named: {0} with properties {1}"
 msgstr "tentative d'accès à une option nommée : {0} avec les propriétés {1}"
 
-#: tiramisu/setting.py:493
+#: tiramisu/setting.py:501
 msgid "permissive must be a tuple"
 msgstr "permissive doit être un tuple"
 
-#: tiramisu/setting.py:500 tiramisu/value.py:379
+#: tiramisu/setting.py:508 tiramisu/value.py:426
 msgid "invalid generic owner {0}"
 msgstr "invalide owner générique {0}"
 
-#: tiramisu/setting.py:588
+#: tiramisu/setting.py:596
 msgid ""
 "malformed requirements imbrication detected for option: '{0}' with "
 "requirement on: '{1}'"
@@ -634,7 +676,7 @@ msgstr ""
 "imbrication de requirements mal formés detectée pour l'option : '{0}' avec "
 "requirement sur : '{1}'"
 
-#: tiramisu/setting.py:599
+#: tiramisu/setting.py:607
 msgid "option '{0}' has requirement's property error: {1} {2}"
 msgstr "l'option '{0}' a une erreur de propriété pour le requirement : {1} {2}"
 
@@ -650,108 +692,107 @@ msgstr "ne peut pas importer le stockage {0}"
 msgid "option {0} not already exists in storage {1}"
 msgstr "option {0} n'existe pas dans l'espace de stockage {1}"
 
-#: tiramisu/storage/dictionary/option.py:89
+#: tiramisu/storage/dictionary/option.py:99
 msgid "invalid default_multi value {0} for option {1}: {2}"
 msgstr "la valeur default_multi est invalide {0} pour l'option {1} : {2}"
 
-#: tiramisu/storage/dictionary/option.py:131 tiramisu/value.py:441
+#: tiramisu/storage/dictionary/option.py:141
+#: tiramisu/storage/sqlalchemy/option.py:434 tiramisu/value.py:490
 msgid "information's item not found: {0}"
 msgstr "aucune config spécifiée alors que c'est nécessaire"
 
-#: tiramisu/storage/dictionary/option.py:336
-#: tiramisu/storage/sqlalchemy/option.py:348
+#: tiramisu/storage/dictionary/option.py:362
+#: tiramisu/storage/sqlalchemy/option.py:478
 msgid "no option for path {0}"
 msgstr "pas d'option pour le chemin {0}"
 
-#: tiramisu/storage/dictionary/option.py:342
-#: tiramisu/storage/sqlalchemy/option.py:355
+#: tiramisu/storage/dictionary/option.py:368
+#: tiramisu/storage/sqlalchemy/option.py:485
 msgid "no option {0} found"
 msgstr "pas d'option {0} trouvée"
 
-#: tiramisu/storage/dictionary/option.py:390
+#: tiramisu/storage/dictionary/option.py:417
 msgid "cannot find dynpath"
 msgstr "ne peut trouver le dynpath"
 
-#: tiramisu/storage/dictionary/option.py:480
-#: tiramisu/storage/sqlalchemy/option.py:465
+#: tiramisu/storage/dictionary/option.py:507
+#: tiramisu/storage/sqlalchemy/option.py:630
 msgid "suffix and context needed if it's a dyn option"
 msgstr "suffix et context obligatoire si c'est une option dynamique"
 
-#: tiramisu/storage/dictionary/option.py:493
+#: tiramisu/storage/dictionary/option.py:520
 msgid "{0} instance has no attribute '_readonly'"
 msgstr "{0} instance n'a pas l'attribut '_readonly'"
 
-#: tiramisu/storage/dictionary/option.py:507
-#: tiramisu/storage/sqlalchemy/option.py:495
+#: tiramisu/storage/dictionary/option.py:534
+#: tiramisu/storage/sqlalchemy/option.py:660
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr "Option {0} inconnue pour l'OptionDescription {1}"
 
 #: tiramisu/storage/dictionary/storage.py:37
-#: tiramisu/storage/sqlalchemy/storage.py:37
 msgid "dictionary storage cannot delete session"
 msgstr ""
 "impossible de supprimer une session dans un espace de stockage dictionary"
 
 #: tiramisu/storage/dictionary/storage.py:48
-#: tiramisu/storage/sqlalchemy/storage.py:48
+#: tiramisu/storage/sqlalchemy/storage.py:66
 msgid "session already used"
 msgstr "session déjà utilisée"
 
 #: tiramisu/storage/dictionary/storage.py:50
-#: tiramisu/storage/sqlalchemy/storage.py:50
 msgid "a dictionary cannot be persistent"
 msgstr "un espace de stockage dictionary ne peut être persistant"
 
-#: tiramisu/value.py:64
+#: tiramisu/value.py:65
 msgid "optiondescription has no value"
 msgstr "une optiondescription n'a pas de valeur"
 
-#: tiramisu/value.py:303
+#: tiramisu/value.py:325
 msgid "you should only set value with config"
 msgstr "vous devez seul affecter une valeur avec un config"
 
-#: tiramisu/value.py:356
+#: tiramisu/value.py:395
 msgid "owner only avalaible for an option"
 msgstr "owner seulement possible pour une option"
 
-#: tiramisu/value.py:386
+#: tiramisu/value.py:433
 msgid "no value for {0} cannot change owner to {1}"
 msgstr "pas de valeur pour {0} ne peut changer d'utilisateur pour {1}"
 
-#: tiramisu/value.py:481
+#: tiramisu/value.py:531
 msgid "can force cache only if cache is actived in config"
 msgstr ""
 "peut force la mise en cache seulement si le cache est activé dans la config"
 
-#: tiramisu/value.py:520
+#: tiramisu/value.py:570
 msgid "{0} is already a Multi "
 msgstr "{0} est déjà une Multi"
 
-#: tiramisu/value.py:586
+#: tiramisu/value.py:636
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr "ne peut ajouter une valeur sur l'option multi {0} qui est une esclave"
 
-#: tiramisu/value.py:605
+#: tiramisu/value.py:655
 msgid "cannot sort multi option {0} if master or slave"
 msgstr "ne peut trier une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:609
+#: tiramisu/value.py:659
 msgid "cmp is not permitted in python v3 or greater"
 msgstr "cmp n'est pas permis en python v3 ou supérieure"
 
-#: tiramisu/value.py:618
+#: tiramisu/value.py:668
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr "ne peut inverser une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:626
+#: tiramisu/value.py:676
 msgid "cannot insert multi option {0} if master or slave"
 msgstr "ne peut insérer une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:634
+#: tiramisu/value.py:684
 msgid "cannot extend multi option {0} if master or slave"
 msgstr "ne peut étendre une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:662
+#: tiramisu/value.py:712
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr "ne peut supprimer une valeur dans l'option multi {0} qui est esclave"
 
index 57e07f7..5cc896f 100644 (file)
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2014-10-26 09:42+CET\n"
+"POT-Creation-Date: 2014-12-07 14:44+CET\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -19,71 +19,95 @@ msgstr ""
 msgid "unable to carry out a calculation, option {0} has properties: {1} for: {2}"
 msgstr ""
 
-#: tiramisu/config.py:58
+#: tiramisu/config.py:59
 msgid "descr must be an optiondescription, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:137
+#: tiramisu/config.py:139
 msgid "unknown group_type: {0}"
 msgstr ""
 
-#: tiramisu/config.py:176 tiramisu/setting.py:321 tiramisu/value.py:54
-#: tiramisu/value.py:555
+#: tiramisu/config.py:178 tiramisu/setting.py:320 tiramisu/value.py:54
+#: tiramisu/value.py:605
 msgid "the context does not exist anymore"
 msgstr ""
 
-#: tiramisu/config.py:181
+#: tiramisu/config.py:183
 msgid "no option description found for this config (may be GroupConfig)"
 msgstr ""
 
-#: tiramisu/config.py:209
+#: tiramisu/config.py:211
 msgid "can't assign to an OptionDescription"
 msgstr ""
 
-#: tiramisu/config.py:335
+#: tiramisu/config.py:340
 msgid "unknown type_ type {0}for _find"
 msgstr ""
 
-#: tiramisu/config.py:370
+#: tiramisu/config.py:380
 msgid "no option found in config with these criteria"
 msgstr ""
 
-#: tiramisu/config.py:420
+#: tiramisu/config.py:430
 msgid "make_dict can't filtering with value without option"
 msgstr ""
 
-#: tiramisu/config.py:439
+#: tiramisu/config.py:449
 msgid "unexpected path {0}, should start with {1}"
 msgstr ""
 
-#: tiramisu/config.py:507
+#: tiramisu/config.py:519
 msgid "opt in getowner must be an option not {0}"
 msgstr ""
 
-#: tiramisu/config.py:552
+#: tiramisu/config.py:564
 msgid "cannot serialize Config with MetaConfig"
 msgstr ""
 
-#: tiramisu/config.py:566
+#: tiramisu/config.py:578
 msgid "this storage is not serialisable, could be a none persistent storage"
 msgstr ""
 
-#: tiramisu/config.py:629
-msgid "metaconfig's children must be a list"
+#: tiramisu/config.py:631
+msgid "invalid name: {0} for config"
+msgstr ""
+
+#: tiramisu/config.py:655
+msgid "groupconfig's children must be a list"
+msgstr ""
+
+#: tiramisu/config.py:659
+msgid "groupconfig's children must be Config, MetaConfig or GroupConfig"
 msgstr ""
 
-#: tiramisu/config.py:723
+#: tiramisu/config.py:662
+msgid "name must be set to config before creating groupconfig"
+msgstr ""
+
+#: tiramisu/config.py:670
+msgid "config name must be uniq in groupconfig for {0}"
+msgstr ""
+
+#: tiramisu/config.py:785
 msgid "metaconfig's children should be config, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:727
+#: tiramisu/config.py:789
 msgid "child has already a metaconfig's"
 msgstr ""
 
-#: tiramisu/config.py:731
+#: tiramisu/config.py:793
 msgid "all config in metaconfig must have the same optiondescription"
 msgstr ""
 
+#: tiramisu/config.py:805
+msgid "force_default, force_default_if_same or force_dont_change_value cannot be set with only_config"
+msgstr ""
+
+#: tiramisu/config.py:811
+msgid "force_default and force_dont_change_value cannot be set together"
+msgstr ""
+
 #: tiramisu/option/baseoption.py:56
 msgid "{0} must be a function"
 msgstr ""
@@ -132,139 +156,143 @@ msgstr ""
 msgid "invalid properties type {0} for {1}, must be a tuple"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:144
+#: tiramisu/option/baseoption.py:145
 msgid "params defined for a callback function but no callback defined yet for option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:149
+#: tiramisu/option/baseoption.py:150
 msgid "a callback is already set for option {0}, cannot set another one's"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:276
+#: tiramisu/option/baseoption.py:277
 msgid "cannot serialize Option, only in OptionDescription"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:354
+#: tiramisu/option/baseoption.py:363
 msgid "'{0}' ({1}) object attribute '{2}' is read-only"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:509 tiramisu/option/baseoption.py:552
+#: tiramisu/option/baseoption.py:528 tiramisu/option/baseoption.py:571
 msgid "invalid value for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:522
+#: tiramisu/option/baseoption.py:541
 msgid "do_validation for {0}: error in value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:528
+#: tiramisu/option/baseoption.py:547
 msgid "do_validation for {0}: warning in value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:538
+#: tiramisu/option/baseoption.py:557
 msgid "do_validation for {0}: error in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:542
+#: tiramisu/option/baseoption.py:561
 msgid "do_validation for {0}: warning in consistency"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:546
+#: tiramisu/option/baseoption.py:565
 msgid "warning on the value of the option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:564 tiramisu/option/baseoption.py:573
+#: tiramisu/option/baseoption.py:583 tiramisu/option/baseoption.py:592
 msgid "invalid value {0} for option {1} which must be a list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:579
+#: tiramisu/option/baseoption.py:598
 msgid "invalid value {0} for option {1} which must be a list of list"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:632
+#: tiramisu/option/baseoption.py:651
 msgid "'{0}' ({1}) cannot add consistency, option is read-only"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:643
+#: tiramisu/option/baseoption.py:663
+msgid "unknow parameter {0} in consistency"
+msgstr ""
+
+#: tiramisu/option/baseoption.py:670
 msgid "consistency must be set with an option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:646 tiramisu/option/baseoption.py:653
+#: tiramisu/option/baseoption.py:673 tiramisu/option/baseoption.py:680
 msgid "almost one option in consistency is in a dynoptiondescription but not all"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:649
+#: tiramisu/option/baseoption.py:676
 msgid "option in consistency must be in same dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:656
+#: tiramisu/option/baseoption.py:683
 msgid "cannot add consistency with itself"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:658
+#: tiramisu/option/baseoption.py:685
 msgid "every options in consistency must be multi or none"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:662
+#: tiramisu/option/baseoption.py:689
 msgid "consistency {0} not available for this option"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:689
+#: tiramisu/option/baseoption.py:717
 msgid "same value for {0} and {1}, should be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:691
+#: tiramisu/option/baseoption.py:719
 msgid "same value for {0} and {1}, must be different"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:748
+#: tiramisu/option/baseoption.py:776
 msgid "default value not allowed if option: {0} is calculated"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:770
+#: tiramisu/option/baseoption.py:798
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:776
+#: tiramisu/option/baseoption.py:804
 msgid "malformed requirements for option: {0} unknown keys {1}, must only {2}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:787
+#: tiramisu/option/baseoption.py:815
 msgid "malformed requirements for option: {0} require must have option, expected and action keys"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:791
+#: tiramisu/option/baseoption.py:819
 msgid "malformed requirements for option: {0} action cannot be force_store_value"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:796
+#: tiramisu/option/baseoption.py:824
 msgid "malformed requirements for option: {0} inverse must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:800
+#: tiramisu/option/baseoption.py:828
 msgid "malformed requirements for option: {0} transitive must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:804
+#: tiramisu/option/baseoption.py:832
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:808
+#: tiramisu/option/baseoption.py:836
 msgid "malformed requirements must be an option in option {0}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:811
+#: tiramisu/option/baseoption.py:839
 msgid "malformed requirements option {0} must not be a multi for {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:818
+#: tiramisu/option/baseoption.py:846
 msgid "malformed requirements second argument must be valid for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:823
+#: tiramisu/option/baseoption.py:851
 msgid "inconsistency in action types for option: {0} action: {1}"
 msgstr ""
 
-#: tiramisu/option/baseoption.py:851
+#: tiramisu/option/baseoption.py:879
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr ""
 
@@ -288,7 +316,7 @@ msgstr ""
 msgid "callback of master's option shall not refered a slave's ones"
 msgstr ""
 
-#: tiramisu/option/masterslave.py:198
+#: tiramisu/option/masterslave.py:258
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr ""
 
@@ -361,54 +389,58 @@ msgstr ""
 msgid "invalid IP {0} ({1}) not in network {2} ({3}) with netmask {4} ({5})"
 msgstr ""
 
-#: tiramisu/option/option.py:254
+#: tiramisu/option/option.py:256
 msgid "inconsistency in allowed range"
 msgstr ""
 
-#: tiramisu/option/option.py:259
+#: tiramisu/option/option.py:261
 msgid "max value is empty"
 msgstr ""
 
-#: tiramisu/option/option.py:277
+#: tiramisu/option/option.py:279
 msgid "invalid port, range must have two values only"
 msgstr ""
 
-#: tiramisu/option/option.py:280
+#: tiramisu/option/option.py:282
 msgid "invalid port, first port in range must be smaller than the second one"
 msgstr ""
 
-#: tiramisu/option/option.py:289
+#: tiramisu/option/option.py:291
 msgid "invalid port"
 msgstr ""
 
-#: tiramisu/option/option.py:291
+#: tiramisu/option/option.py:293
 msgid "invalid port, must be an between {0} and {1}"
 msgstr ""
 
-#: tiramisu/option/option.py:304
+#: tiramisu/option/option.py:306
 msgid "invalid network address"
 msgstr ""
 
-#: tiramisu/option/option.py:310
+#: tiramisu/option/option.py:312
 msgid "network address is in reserved class"
 msgstr ""
 
-#: tiramisu/option/option.py:312
+#: tiramisu/option/option.py:314
 msgid "invalid network address, mustn't be in reserved class"
 msgstr ""
 
-#: tiramisu/option/option.py:324
+#: tiramisu/option/option.py:326
 msgid "invalid netmask address"
 msgstr ""
 
-#: tiramisu/option/option.py:341
+#: tiramisu/option/option.py:343
 msgid "invalid len for opts"
 msgstr ""
 
-#: tiramisu/option/option.py:355
+#: tiramisu/option/option.py:352
 msgid "invalid IP {0} ({1}) with netmask {2}, this IP is a network"
 msgstr ""
 
+#: tiramisu/option/option.py:355
+msgid "invalid IP {0} ({1}) with netmask {2}, this IP is a broadcast"
+msgstr ""
+
 #: tiramisu/option/option.py:360
 msgid "invalid network {0} ({1}) with netmask {2}"
 msgstr ""
@@ -433,55 +465,59 @@ msgstr ""
 msgid "allow_without_dot must be a boolean"
 msgstr ""
 
-#: tiramisu/option/option.py:428
+#: tiramisu/option/option.py:429
 msgid "invalid domainname's length (min 2)"
 msgstr ""
 
-#: tiramisu/option/option.py:430
+#: tiramisu/option/option.py:431
 msgid "invalid domainname's length (max {0})"
 msgstr ""
 
-#: tiramisu/option/option.py:445
+#: tiramisu/option/option.py:446
 msgid "invalid domainname, must have dot"
 msgstr ""
 
-#: tiramisu/option/option.py:447
+#: tiramisu/option/option.py:448
 msgid "invalid domainname's length (max 255)"
 msgstr ""
 
 #: tiramisu/option/option.py:457
-msgid "same characters may cause problems"
+msgid "some characters are uppercase"
 msgstr ""
 
-#: tiramisu/option/option.py:459
+#: tiramisu/option/option.py:460
+msgid "some characters may cause problems"
+msgstr ""
+
+#: tiramisu/option/option.py:462
 msgid "invalid domainname"
 msgstr ""
 
-#: tiramisu/option/option.py:483
+#: tiramisu/option/option.py:486
 msgid "invalid email address, must contains one @"
 msgstr ""
 
-#: tiramisu/option/option.py:486
+#: tiramisu/option/option.py:489
 msgid "invalid username in email address"
 msgstr ""
 
-#: tiramisu/option/option.py:502
+#: tiramisu/option/option.py:505
 msgid "invalid url, must start with http:// or https://"
 msgstr ""
 
-#: tiramisu/option/option.py:521
+#: tiramisu/option/option.py:524
 msgid "invalid url, port must be an between 0 and 65536"
 msgstr ""
 
-#: tiramisu/option/option.py:528
+#: tiramisu/option/option.py:531
 msgid "invalid url, must ends with filename"
 msgstr ""
 
-#: tiramisu/option/option.py:542
+#: tiramisu/option/option.py:545
 msgid "invalid username"
 msgstr ""
 
-#: tiramisu/option/option.py:552
+#: tiramisu/option/option.py:555
 msgid "invalid filename"
 msgstr ""
 
@@ -497,35 +533,35 @@ msgstr ""
 msgid "consistency with option {0} which is not in Config"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:139
+#: tiramisu/option/optiondescription.py:145
 msgid "duplicate option: {0}"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:155
+#: tiramisu/option/optiondescription.py:156
 msgid "cannot change group_type if already set (old {0}, new {1})"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:163
+#: tiramisu/option/optiondescription.py:164
 msgid "group_type: {0} not allowed"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:260
+#: tiramisu/option/optiondescription.py:262
 msgid "DynOptionDescription callback return not uniq value"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:263
+#: tiramisu/option/optiondescription.py:265
 msgid "invalid suffix: {0} for option"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:316
+#: tiramisu/option/optiondescription.py:318
 msgid "cannot set optiondescription in an dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:321
+#: tiramisu/option/optiondescription.py:323
 msgid "cannot set symlinkoption in an dynoptiondescription"
 msgstr ""
 
-#: tiramisu/option/optiondescription.py:329
+#: tiramisu/option/optiondescription.py:331
 msgid "callback is mandatory for dynoptiondescription"
 msgstr ""
 
@@ -537,47 +573,47 @@ msgstr ""
 msgid "can't unbind {0}"
 msgstr ""
 
-#: tiramisu/setting.py:255
+#: tiramisu/setting.py:254
 msgid "cannot append {0} property for option {1}: this property is calculated"
 msgstr ""
 
-#: tiramisu/setting.py:341
+#: tiramisu/setting.py:343
 msgid "you should only append/remove properties"
 msgstr ""
 
-#: tiramisu/setting.py:345
+#: tiramisu/setting.py:347
 msgid "opt and all_properties must not be set together in reset"
 msgstr ""
 
-#: tiramisu/setting.py:363
+#: tiramisu/setting.py:368
 msgid "if opt is not None, path should not be None in _getproperties"
 msgstr ""
 
-#: tiramisu/setting.py:407
+#: tiramisu/setting.py:412
 msgid "cannot add those properties: {0}"
 msgstr ""
 
-#: tiramisu/setting.py:469
+#: tiramisu/setting.py:477
 msgid "cannot change the value for option {0} this option is frozen"
 msgstr ""
 
-#: tiramisu/setting.py:475
+#: tiramisu/setting.py:483
 msgid "trying to access to an option named: {0} with properties {1}"
 msgstr ""
 
-#: tiramisu/setting.py:493
+#: tiramisu/setting.py:501
 msgid "permissive must be a tuple"
 msgstr ""
 
-#: tiramisu/setting.py:500 tiramisu/value.py:379
+#: tiramisu/setting.py:508 tiramisu/value.py:426
 msgid "invalid generic owner {0}"
 msgstr ""
 
-#: tiramisu/setting.py:588
+#: tiramisu/setting.py:596
 msgid "malformed requirements imbrication detected for option: '{0}' with requirement on: '{1}'"
 msgstr ""
 
-#: tiramisu/setting.py:599
+#: tiramisu/setting.py:607
 msgid "option '{0}' has requirement's property error: {1} {2}"
 msgstr ""
 
@@ -593,106 +629,105 @@ msgstr ""
 msgid "option {0} not already exists in storage {1}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:89
+#: tiramisu/storage/dictionary/option.py:99
 msgid "invalid default_multi value {0} for option {1}: {2}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:131 tiramisu/value.py:441
+#: tiramisu/storage/dictionary/option.py:141
+#: tiramisu/storage/sqlalchemy/option.py:434 tiramisu/value.py:490
 msgid "information's item not found: {0}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:336
-#: tiramisu/storage/sqlalchemy/option.py:348
+#: tiramisu/storage/dictionary/option.py:362
+#: tiramisu/storage/sqlalchemy/option.py:478
 msgid "no option for path {0}"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:342
-#: tiramisu/storage/sqlalchemy/option.py:355
+#: tiramisu/storage/dictionary/option.py:368
+#: tiramisu/storage/sqlalchemy/option.py:485
 msgid "no option {0} found"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:390
+#: tiramisu/storage/dictionary/option.py:417
 msgid "cannot find dynpath"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:480
-#: tiramisu/storage/sqlalchemy/option.py:465
+#: tiramisu/storage/dictionary/option.py:507
+#: tiramisu/storage/sqlalchemy/option.py:630
 msgid "suffix and context needed if it's a dyn option"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:493
+#: tiramisu/storage/dictionary/option.py:520
 msgid "{0} instance has no attribute '_readonly'"
 msgstr ""
 
-#: tiramisu/storage/dictionary/option.py:507
-#: tiramisu/storage/sqlalchemy/option.py:495
+#: tiramisu/storage/dictionary/option.py:534
+#: tiramisu/storage/sqlalchemy/option.py:660
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr ""
 
 #: tiramisu/storage/dictionary/storage.py:37
-#: tiramisu/storage/sqlalchemy/storage.py:37
 msgid "dictionary storage cannot delete session"
 msgstr ""
 
 #: tiramisu/storage/dictionary/storage.py:48
-#: tiramisu/storage/sqlalchemy/storage.py:48
+#: tiramisu/storage/sqlalchemy/storage.py:66
 msgid "session already used"
 msgstr ""
 
 #: tiramisu/storage/dictionary/storage.py:50
-#: tiramisu/storage/sqlalchemy/storage.py:50
 msgid "a dictionary cannot be persistent"
 msgstr ""
 
-#: tiramisu/value.py:64
+#: tiramisu/value.py:65
 msgid "optiondescription has no value"
 msgstr ""
 
-#: tiramisu/value.py:303
+#: tiramisu/value.py:325
 msgid "you should only set value with config"
 msgstr ""
 
-#: tiramisu/value.py:356
+#: tiramisu/value.py:395
 msgid "owner only avalaible for an option"
 msgstr ""
 
-#: tiramisu/value.py:386
+#: tiramisu/value.py:433
 msgid "no value for {0} cannot change owner to {1}"
 msgstr ""
 
-#: tiramisu/value.py:481
+#: tiramisu/value.py:531
 msgid "can force cache only if cache is actived in config"
 msgstr ""
 
-#: tiramisu/value.py:520
+#: tiramisu/value.py:570
 msgid "{0} is already a Multi "
 msgstr ""
 
-#: tiramisu/value.py:586
+#: tiramisu/value.py:636
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr ""
 
-#: tiramisu/value.py:605
+#: tiramisu/value.py:655
 msgid "cannot sort multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:609
+#: tiramisu/value.py:659
 msgid "cmp is not permitted in python v3 or greater"
 msgstr ""
 
-#: tiramisu/value.py:618
+#: tiramisu/value.py:668
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:626
+#: tiramisu/value.py:676
 msgid "cannot insert multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:634
+#: tiramisu/value.py:684
 msgid "cannot extend multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:662
+#: tiramisu/value.py:712
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr ""