some improvements
[tiramisu.git] / tiramisu / option / option.py
index e90fb77..1ec35e4 100644 (file)
@@ -36,8 +36,8 @@ class ChoiceOption(Option):
 
     The option can also have the value ``None``
     """
-    __slots__ = tuple('_init')
-    display_name = _('choice')
+    __slots__ = tuple()
+    _display_name = _('choice')
 
     def __init__(self, name, doc, values, default=None,
                  values_params=None, default_multi=None, requires=None,
@@ -56,9 +56,7 @@ class ChoiceOption(Option):
                 raise TypeError(_('values must be a tuple or a function for {0}'
                                   ).format(name))
         session = self.getsession()
-        #cannot add values and values_params in database before add option
-        #set in _init temporary
-        self._init = (values, values_params)
+        self.impl_set_choice_values_params(values, values_params, session)
         super(ChoiceOption, self).__init__(name, doc, default=default,
                                            default_multi=default_multi,
                                            callback=callback,
@@ -70,9 +68,7 @@ class ChoiceOption(Option):
                                            properties=properties,
                                            warnings_only=warnings_only,
                                            session=session)
-        self.impl_set_choice_values_params(values, values_params, session)
-        session.commit()
-        del(self._init)
+        self.commit(session)
 
     def impl_get_values(self, context, current_opt=undefined,
                         returns_raise=False):
@@ -80,10 +76,7 @@ class ChoiceOption(Option):
             current_opt = self
         params = undefined
         #FIXME cache? but in context...
-        if '_init' in dir(self):
-            values, params = self._init
-        else:
-            values = self._choice_values
+        values = self._choice_values
         if isinstance(values, FunctionType):
             if context is None:
                 values = []
@@ -122,7 +115,7 @@ class ChoiceOption(Option):
 class BoolOption(Option):
     "represents a choice between ``True`` and ``False``"
     __slots__ = tuple()
-    display_name = _('boolean')
+    _display_name = _('boolean')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -133,7 +126,7 @@ class BoolOption(Option):
 class IntOption(Option):
     "represents a choice of an integer"
     __slots__ = tuple()
-    display_name = _('integer')
+    _display_name = _('integer')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -144,7 +137,7 @@ class IntOption(Option):
 class FloatOption(Option):
     "represents a choice of a floating point number"
     __slots__ = tuple()
-    display_name = _('float')
+    _display_name = _('float')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -155,7 +148,7 @@ class FloatOption(Option):
 class StrOption(Option):
     "represents the choice of a string"
     __slots__ = tuple()
-    display_name = _('string')
+    _display_name = _('string')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -173,7 +166,7 @@ else:
         "represents the choice of a unicode string"
         __slots__ = tuple()
         _empty = u''
-        display_name = _('unicode string')
+        _display_name = _('unicode string')
 
         def _validate(self, value, context=undefined, current_opt=undefined,
                       returns_raise=False):
@@ -184,7 +177,7 @@ else:
 class PasswordOption(Option):
     "represents the choice of a password"
     __slots__ = tuple()
-    display_name = _('password')
+    _display_name = _('password')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -196,7 +189,7 @@ class PasswordOption(Option):
 class IPOption(Option):
     "represents the choice of an ip"
     __slots__ = tuple()
-    display_name = _('IP')
+    _display_name = _('IP')
 
     def __init__(self, name, doc, default=None, default_multi=None,
                  requires=None, multi=False, callback=None,
@@ -250,7 +243,7 @@ class IPOption(Option):
                 msg = _("must be in private class")
             return ValueError(msg)
 
-    def _cons_in_network(self, opts, vals, warnings_only):
+    def _cons_in_network(self, current_opt, opts, vals, warnings_only):
         if len(vals) != 3:
             raise ConfigError(_('invalid len for vals'))  # pragma: optional cover
         if None in vals:
@@ -264,7 +257,7 @@ class IPOption(Option):
             return ValueError(msg.format(network, netmask,
                               opts[1].impl_getname(), opts[2].impl_getname()))
         # test if ip is not network/broadcast IP
-        return opts[2]._cons_ip_netmask((opts[2], opts[0]), (netmask, ip), warnings_only)
+        return opts[2]._cons_ip_netmask(current_opt, (opts[2], opts[0]), (netmask, ip), warnings_only)
 
 
 class PortOption(Option):
@@ -279,7 +272,7 @@ class PortOption(Option):
     """
     __slots__ = tuple()
     port_re = re.compile(r"^[0-9]*$")
-    display_name = _('port')
+    _display_name = _('port')
 
     def __init__(self, name, doc, default=None, default_multi=None,
                  requires=None, multi=False, callback=None,
@@ -355,7 +348,7 @@ class PortOption(Option):
 class NetworkOption(Option):
     "represents the choice of a network"
     __slots__ = tuple()
-    display_name = _('network address')
+    _display_name = _('network address')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -385,7 +378,7 @@ class NetworkOption(Option):
 class NetmaskOption(Option):
     "represents the choice of a netmask"
     __slots__ = tuple()
-    display_name = _('netmask address')
+    _display_name = _('netmask address')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -402,13 +395,13 @@ class NetmaskOption(Option):
         except ValueError:  # pragma: optional cover
             return ValueError()
 
-    def _cons_network_netmask(self, opts, vals, warnings_only):
+    def _cons_network_netmask(self, current_opt, opts, vals, warnings_only):
         #opts must be (netmask, network) options
         if None in vals:
             return
         return self.__cons_netmask(opts, vals[0], vals[1], False, warnings_only)
 
-    def _cons_ip_netmask(self, opts, vals, warnings_only):
+    def _cons_ip_netmask(self, current_opt, opts, vals, warnings_only):
         #opts must be (netmask, ip) options
         if None in vals:
             return
@@ -439,7 +432,7 @@ class NetmaskOption(Option):
 
 class BroadcastOption(Option):
     __slots__ = tuple()
-    display_name = _('broadcast address')
+    _display_name = _('broadcast address')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -451,7 +444,7 @@ class BroadcastOption(Option):
         except ValueError:  # pragma: optional cover
             return ValueError()
 
-    def _cons_broadcast(self, opts, vals, warnings_only):
+    def _cons_broadcast(self, current_opt, opts, vals, warnings_only):
         if len(vals) != 3:
             raise ConfigError(_('invalid len for vals'))  # pragma: optional cover
         if None in vals:
@@ -470,7 +463,7 @@ class DomainnameOption(Option):
     fqdn: with tld, not supported yet
     """
     __slots__ = tuple()
-    display_name = _('domain name')
+    _display_name = _('domain name')
 
     def __init__(self, name, doc, default=None, default_multi=None,
                  requires=None, multi=False, callback=None,
@@ -569,7 +562,7 @@ class DomainnameOption(Option):
 class EmailOption(DomainnameOption):
     __slots__ = tuple()
     username_re = re.compile(r"^[\w!#$%&'*+\-/=?^`{|}~.]+$")
-    display_name = _('email address')
+    _display_name = _('email address')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -595,7 +588,7 @@ class URLOption(DomainnameOption):
     __slots__ = tuple()
     proto_re = re.compile(r'(http|https)://')
     path_re = re.compile(r"^[A-Za-z0-9\-\._~:/\?#\[\]@!%\$&\'\(\)\*\+,;=]+$")
-    display_name = _('URL')
+    _display_name = _('URL')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -643,7 +636,7 @@ class UsernameOption(Option):
     __slots__ = tuple()
     #regexp build with 'man 8 adduser' informations
     username_re = re.compile(r"^[a-z_][a-z0-9_-]{0,30}[$a-z0-9_-]{0,1}$")
-    display_name = _('username')
+    _display_name = _('username')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):
@@ -658,7 +651,7 @@ class UsernameOption(Option):
 class FilenameOption(Option):
     __slots__ = tuple()
     path_re = re.compile(r"^[a-zA-Z0-9\-\._~/+]+$")
-    display_name = _('file name')
+    _display_name = _('file name')
 
     def _validate(self, value, context=undefined, current_opt=undefined,
                   returns_raise=False):