From a53322404c7585cd1ae58e7615e0ee786dbff1fe Mon Sep 17 00:00:00 2001 From: Rob Crittenden Date: Mar 20 2012 08:07:03 +0000 Subject: Use a consistent parameter name in errors, defaulting to cli_name. For general command-line errors we want to use the cli_name on output. The exception is when using *attr, we want to return that attribute name in the exception. https://fedorahosted.org/freeipa/ticket/1418 --- diff --git a/ipalib/parameters.py b/ipalib/parameters.py index 48155da..94f11d9 100644 --- a/ipalib/parameters.py +++ b/ipalib/parameters.py @@ -563,6 +563,18 @@ class Param(ReadOnly): self.validate(value, supplied=self.name in kw) return value + def get_param_name(self): + """ + Return the right name of an attribute depending on usage. + + Normally errors should use cli_name, our "friendly" name. When + using the API directly or *attr return the real name. + """ + name = self.cli_name + if not name: + name = self.name + return name + def kw(self): """ Iterate through ``(key,value)`` for all kwargs passed to constructor. @@ -861,11 +873,8 @@ class Param(ReadOnly): for rule in self.all_rules: error = rule(ugettext, value) if error is not None: - name = self.cli_name - if not name: - name = self.name raise ValidationError( - name=name, + name=self.get_param_name(), value=value, index=index, error=error, @@ -1175,7 +1184,7 @@ class Int(Number): return int(value) except ValueError: pass - raise ConversionError(name=self.name, index=index, + raise ConversionError(name=self.get_param_name(), index=index, error=ugettext(self.type_error), ) @@ -1218,11 +1227,8 @@ class Int(Number): for rule in self.all_rules: error = rule(ugettext, value) if error is not None: - name = self.cli_name - if not name: - name = self.name raise ValidationError( - name=name, + name=self.get_param_name(), value=value, index=index, error=error, @@ -1309,7 +1315,7 @@ class Decimal(Number): try: value = decimal.Decimal(value) except Exception, e: - raise ConversionError(name=self.name, index=index, + raise ConversionError(name=self.get_param_name(), index=index, error=unicode(e)) if isinstance(value, decimal.Decimal): @@ -1449,7 +1455,7 @@ class Bytes(Data): try: value = base64.b64decode(value) except TypeError: - raise ConversionError(name=self.name, index=index, error=self.type_error) + raise ConversionError(name=self.get_param_name(), index=index, error=self.type_error) return super(Bytes, self)._convert_scalar(value, index) @@ -1548,7 +1554,8 @@ class IA5Str(Str): if isinstance(value, basestring): for i in xrange(len(value)): if ord(value[i]) > 127: - raise ConversionError(name=self.name, index=index, + raise ConversionError(name=self.get_param_name(), + index=index, error=_('The character \'%(char)r\' is not allowed.') % dict(char=value[i],) ) @@ -1832,10 +1839,10 @@ class AccessTime(Str): try: self._check(value) except ValueError, e: - raise ValidationError(name=self.cli_name, error=e.args[0]) + raise ValidationError(name=self.get_param_name(), error=e.args[0]) except IndexError: raise ValidationError( - name=self.cli_name, error='incomplete time value' + name=self.get_param_name(), error='incomplete time value' ) return None diff --git a/ipalib/plugins/baseldap.py b/ipalib/plugins/baseldap.py index 92540d8..6b629dc 100644 --- a/ipalib/plugins/baseldap.py +++ b/ipalib/plugins/baseldap.py @@ -780,8 +780,9 @@ last, after all sets and adds."""), try: value = self.params[attr](value) except errors.ValidationError, err: - (name, error) = str(err.strerror).split(':') - raise errors.ValidationError(name=attr, error=error) + raise errors.ValidationError(name=attr, error=err.error) + except errors.ConversionError, err: + raise errors.ValidationError(name=attr, error=err.error) if self.api.env.in_server: value = self.params[attr].encode(value) if append and attr in newdict: