Change json serialization to serialize useful data

json_metadata command creates and sends metadata needed by Web UI. It uses __json__ method for serialization of commands, options, objects... . A lot of data sent was useless for Web UI and some usefull information were missing. We
 * mostly CLI specific option attribues are not send.
 * attributes evaluated to false or None are not send
 * options which are send are not got from takes_aptions attribute but by get_options() method. It finally sends usefull option collection for commands part of metadata.

In the end the raw amount of data send is aproximately the same.

This patch is needed for Web UI to determine which option it can use in which commands.

https://fedorahosted.org/freeipa/ticket/2760
This commit is contained in:
Petr Vobornik 2012-05-30 12:55:08 +02:00
parent e3d171126f
commit 88170087e1
3 changed files with 40 additions and 5 deletions

View File

@ -1003,13 +1003,32 @@ class Command(HasParam):
# list of attributes we want exported to JSON
json_friendly_attributes = (
'name', 'takes_args', 'takes_options',
'name', 'takes_args',
)
# list of options we want only to mention their presence and not to write
# their attributes
json_only_presence_options = (
'all', 'raw', 'attrs', 'addattr', 'delattr', 'setattr', 'version',
)
def get_json_options(self):
"""
Get only options we want exported to JSON
"""
for option in self.get_options():
if option.name not in self.json_only_presence_options:
yield option
else:
yield { 'name': option.name }
def __json__(self):
json_dict = dict(
(a, getattr(self, a)) for a in self.json_friendly_attributes
)
json_dict['takes_options'] = list(self.get_json_options())
return json_dict
class LocalOrRemote(Command):

View File

@ -961,15 +961,28 @@ class Param(ReadOnly):
pass
return self.default
json_exclude_attrs = (
'alwaysask', 'autofill', 'cli_name', 'cli_short_name', 'csv',
'csv_separator', 'csv_skipspace', 'sortorder', 'falsehoods', 'truths',
'version',
)
def __json__(self):
json_dict = {}
for (a, k, d) in self.kwargs:
if a in self.json_exclude_attrs:
continue
if k in (callable, DefaultFrom):
continue
elif isinstance(getattr(self, a), frozenset):
json_dict[a] = [k for k in getattr(self, a, [])]
else:
json_dict[a] = getattr(self, a, '')
val = getattr(self, a, '')
if val is None or not val:
# ignore false and not set because lack of their presence is
# the information itself
continue;
json_dict[a] = val
json_dict['class'] = self.__class__.__name__
json_dict['name'] = self.name
json_dict['type'] = self.type.__name__

View File

@ -1091,13 +1091,14 @@ class LDAPCreate(BaseLDAPCommand, crud.Create):
# list of attributes we want exported to JSON
json_friendly_attributes = (
'takes_args', 'takes_options',
'takes_args',
)
def __json__(self):
json_dict = dict(
(a, getattr(self, a)) for a in self.json_friendly_attributes
)
json_dict['takes_options'] = list(self.get_json_options())
return json_dict
class LDAPQuery(BaseLDAPCommand, crud.PKQuery):
@ -1115,13 +1116,14 @@ class LDAPQuery(BaseLDAPCommand, crud.PKQuery):
# list of attributes we want exported to JSON
json_friendly_attributes = (
'takes_args', 'takes_options',
'takes_args',
)
def __json__(self):
json_dict = dict(
(a, getattr(self, a)) for a in self.json_friendly_attributes
)
json_dict['takes_options'] = list(self.get_json_options())
return json_dict
class LDAPMultiQuery(LDAPQuery):
@ -1894,13 +1896,14 @@ class LDAPSearch(BaseLDAPCommand, crud.Search):
# list of attributes we want exported to JSON
json_friendly_attributes = (
'takes_options',
'takes_args',
)
def __json__(self):
json_dict = dict(
(a, getattr(self, a)) for a in self.json_friendly_attributes
)
json_dict['takes_options'] = list(self.get_json_options())
return json_dict
class LDAPModReverseMember(LDAPQuery):