mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
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:
parent
6a8d6d3fde
commit
07cae43484
@ -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__
|
||||||
|
@ -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
|
||||||
|
@ -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 ''
|
||||||
|
Loading…
Reference in New Issue
Block a user