From 88170087e1470fd91b8c8867004070cf883d3828 Mon Sep 17 00:00:00 2001 From: Petr Vobornik Date: Wed, 30 May 2012 12:55:08 +0200 Subject: 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 --- ipalib/frontend.py | 21 ++++++++++++++++++++- ipalib/parameters.py | 15 ++++++++++++++- ipalib/plugins/baseldap.py | 9 ++++++--- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/ipalib/frontend.py b/ipalib/frontend.py index e8a84eabe..10087ba24 100644 --- a/ipalib/frontend.py +++ b/ipalib/frontend.py @@ -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): diff --git a/ipalib/parameters.py b/ipalib/parameters.py index 529f15b37..cdc991f48 100644 --- a/ipalib/parameters.py +++ b/ipalib/parameters.py @@ -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__ diff --git a/ipalib/plugins/baseldap.py b/ipalib/plugins/baseldap.py index 93852a2dd..b8ef43d47 100644 --- a/ipalib/plugins/baseldap.py +++ b/ipalib/plugins/baseldap.py @@ -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): -- cgit