summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/frontend.py10
-rw-r--r--ipalib/parameters.py29
2 files changed, 39 insertions, 0 deletions
diff --git a/ipalib/frontend.py b/ipalib/frontend.py
index 61e7f493..851de437 100644
--- a/ipalib/frontend.py
+++ b/ipalib/frontend.py
@@ -428,6 +428,8 @@ class Command(HasParam):
if not self.api.env.in_server and 'version' not in params:
params['version'] = API_VERSION
self.validate(**params)
+ if self.api.env.in_server:
+ params = self.encode(**params)
(args, options) = self.params_2_args_options(**params)
ret = self.run(*args, **options)
if (
@@ -648,6 +650,14 @@ class Command(HasParam):
(k, self.params[k].convert(v)) for (k, v) in kw.iteritems()
)
+ def encode(self, **kw):
+ """
+ Return a dictionary of encoded values.
+ """
+ return dict(
+ (k, self.params[k].encode(v)) for (k, v) in kw.iteritems()
+ )
+
def __convert_iter(self, kw):
for param in self.params():
if kw.get(param.name, None) is None:
diff --git a/ipalib/parameters.py b/ipalib/parameters.py
index f9e171b0..1f3fdfde 100644
--- a/ipalib/parameters.py
+++ b/ipalib/parameters.py
@@ -307,6 +307,7 @@ class Param(ReadOnly):
('multivalue', bool, False),
('primary_key', bool, False),
('normalizer', callable, None),
+ ('encoder', callable, None),
('default_from', DefaultFrom, None),
('create_default', callable, None),
('autofill', bool, False),
@@ -768,6 +769,34 @@ class Param(ReadOnly):
rule=rule,
)
+ def encode(self, value):
+ """
+ Encode Python native type value to chosen backend format. Encoding is
+ applied for parameters representing actual attributes (attribute=True).
+
+ The default encode method `Param._encode` can be overriden in a `Param`
+ instance with `encoder` attribute:
+
+ >>> s = Str('my_str', encoder=lambda x:encode(x))
+
+ Note that the default method of encoding values is defined in
+ `Param._encode()`.
+
+ :param value: Encoded value
+ """
+ if not self.attribute: #pylint: disable=E1101
+ return value
+ if self.encoder is not None: #pylint: disable=E1101
+ return self.encoder(value) #pylint: disable=E1101
+
+ return self._encode(value)
+
+ def _encode(self, value):
+ """
+ Encode a value to backend format.
+ """
+ return value
+
def get_default(self, **kw):
"""
Return the static default or construct and return a dynamic default.