Fixed metadata serialization of Numbers and DNs

There were following problems:
1. DNs and Decimals weren't properly serialized. Serialization output was object with empty __base64__ attribute. It was fixed by converting them to string.
2. numberical values equal to 0 were excluded from metadata. It broke many of minvalue checks in Web UI. Now excluding only None and False values as initally intended.

https://fedorahosted.org/freeipa/ticket/3052
This commit is contained in:
Petr Vobornik 2012-09-05 14:35:44 +02:00
parent 6a8d6d3fde
commit 07cae43484
3 changed files with 8 additions and 4 deletions

View File

@ -112,6 +112,7 @@ from errors import ConversionError, RequirementError, ValidationError
from errors import PasswordMismatch, Base64DecodeError from errors import PasswordMismatch, Base64DecodeError
from constants import NULLS, TYPE_ERROR, CALLABLE_ERROR from constants import NULLS, TYPE_ERROR, CALLABLE_ERROR
from text import Gettext, FixMe from text import Gettext, FixMe
from util import json_serialize
from ipapython.dn import DN from ipapython.dn import DN
class DefaultFrom(ReadOnly): class DefaultFrom(ReadOnly):
@ -978,11 +979,11 @@ class Param(ReadOnly):
json_dict[a] = [k for k in getattr(self, a, [])] json_dict[a] = [k for k in getattr(self, a, [])]
else: else:
val = getattr(self, a, '') val = getattr(self, a, '')
if val is None or not val: if val is None or val is False:
# ignore false and not set because lack of their presence is # ignore False and not set because lack of their presence is
# the information itself # the information itself
continue; continue;
json_dict[a] = val json_dict[a] = json_serialize(val)
json_dict['class'] = self.__class__.__name__ json_dict['class'] = self.__class__.__name__
json_dict['name'] = self.name json_dict['name'] = self.name
json_dict['type'] = self.type.__name__ json_dict['type'] = self.type.__name__

View File

@ -628,7 +628,7 @@ class LDAPObject(Object):
def __json__(self): def __json__(self):
ldap = self.backend ldap = self.backend
json_dict = dict( json_dict = dict(
(a, getattr(self, a)) for a in self.json_friendly_attributes (a, json_serialize(getattr(self, a))) for a in self.json_friendly_attributes
) )
if self.primary_key: if self.primary_key:
json_dict['primary_key'] = self.primary_key.name json_dict['primary_key'] = self.primary_key.name

View File

@ -26,6 +26,7 @@ import imp
import time import time
import socket import socket
import re import re
import decimal
from types import NoneType from types import NoneType
from weakref import WeakKeyDictionary from weakref import WeakKeyDictionary
from dns import resolver, rdatatype from dns import resolver, rdatatype
@ -46,6 +47,8 @@ def json_serialize(obj):
return obj return obj
if isinstance(obj, str): if isinstance(obj, str):
return obj.decode('utf-8') return obj.decode('utf-8')
if isinstance(obj, (decimal.Decimal, DN)):
return str(obj)
if not callable(getattr(obj, '__json__', None)): if not callable(getattr(obj, '__json__', None)):
# raise TypeError('%r is not JSON serializable') # raise TypeError('%r is not JSON serializable')
return '' return ''