diff --git a/ipalib/cli.py b/ipalib/cli.py index 7d79775ef..667a7cdc4 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -375,9 +375,16 @@ class textui(backend.Backend): indent=indent+1 ) else: - self.print_attribute( - label, value, format, indent, one_value_per_line - ) + if isinstance(value, (list, tuple)) and \ + all(isinstance(val, dict) for val in value): + # this is a list of entries (dicts), not values + self.print_attribute(label, u'', format, indent) + self.print_entries(value, order, labels, flags, print_all, + format, indent+1) + else: + self.print_attribute( + label, value, format, indent, one_value_per_line + ) del entry[key] if print_all: for key in sorted(entry): @@ -1002,6 +1009,7 @@ class cli(backend.Executioner): parser = optparse.OptionParser( usage=' '.join(self.usage_iter(cmd)) ) + option_groups = {} for option in cmd.options(): kw = dict( dest=option.name, @@ -1025,7 +1033,18 @@ class cli(backend.Executioner): o = optparse.make_option('-%s' % option.cli_short_name, '--%s' % to_cli(option.cli_name), **kw) else: o = optparse.make_option('--%s' % to_cli(option.cli_name), **kw) - parser.add_option(o) + + if option.option_group is not None: + option_group = option_groups.get(option.option_group) + if option_group is None: + option_group = optparse.OptionGroup(parser, + option.option_group) + parser.add_option_group(option_group) + option_groups[option.option_group] = option_group + + option_group.add_option(o) + else: + parser.add_option(o) return parser def usage_iter(self, cmd): diff --git a/ipalib/parameters.py b/ipalib/parameters.py index 22144b7cb..be210864f 100644 --- a/ipalib/parameters.py +++ b/ipalib/parameters.py @@ -384,6 +384,7 @@ class Param(ReadOnly): ('csv', bool, False), ('csv_separator', str, ','), ('csv_skipspace', bool, True), + ('option_group', unicode, None), # The 'default' kwarg gets appended in Param.__init__(): # ('default', self.type, None),