diff options
author | Martin Kosek <mkosek@redhat.com> | 2011-11-09 14:10:08 +0100 |
---|---|---|
committer | Martin Kosek <mkosek@redhat.com> | 2011-11-09 15:31:19 +0100 |
commit | b5c049ae2e62f24c6dfce618b94f567671e238ea (patch) | |
tree | 5aeefdd1be842c6c7a3909914e5b139c4ac9b747 /ipalib/parameters.py | |
parent | b68ce0313c9ff31354d2be621079522886f556e3 (diff) | |
download | freeipa-b5c049ae2e62f24c6dfce618b94f567671e238ea.tar.gz freeipa-b5c049ae2e62f24c6dfce618b94f567671e238ea.tar.xz freeipa-b5c049ae2e62f24c6dfce618b94f567671e238ea.zip |
Allow custom server backend encoding
Server framework does not support encoding of native Python type
values stored in Param classes and sub-classes. When backend (LDAP)
value encoding differs from Python type value representation user
has to has to hard-code the encoders in his processing.
This patch introduces a method Param.encode which is used in server
context to encode native Python Param values. The new encode method
is used for Bool parameter to convert native Python bool type value
(True, False) to LDAP value ("TRUE", "FALSE").
https://fedorahosted.org/freeipa/ticket/2039
Diffstat (limited to 'ipalib/parameters.py')
-rw-r--r-- | ipalib/parameters.py | 29 |
1 files changed, 29 insertions, 0 deletions
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. |