summaryrefslogtreecommitdiffstats
path: root/ipaserver/plugins/schema.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipaserver/plugins/schema.py')
-rw-r--r--ipaserver/plugins/schema.py143
1 files changed, 92 insertions, 51 deletions
diff --git a/ipaserver/plugins/schema.py b/ipaserver/plugins/schema.py
index 96a822491..c7aa5f36c 100644
--- a/ipaserver/plugins/schema.py
+++ b/ipaserver/plugins/schema.py
@@ -48,7 +48,6 @@ class BaseMetaObject(Object):
Str(
'name',
label=_("Name"),
- primary_key=True,
normalizer=lambda name: name.replace(u'-', u'_'),
flags={'no_search'},
),
@@ -99,7 +98,8 @@ class BaseMetaObject(Object):
criteria in r.get('doc', u'').lower()))
if not kwargs.get('all', False) and kwargs.get('pkey_only', False):
- result = ({'name': r['name']} for r in result)
+ key = self.primary_key.name
+ result = ({key: r[key]} for r in result)
return result
@@ -136,6 +136,24 @@ class MetaObject(BaseMetaObject):
),
)
+ def get_params(self):
+ for param in super(MetaObject, self).get_params():
+ yield param
+
+ if param.name == 'name':
+ yield Str(
+ 'version',
+ label=_("Version"),
+ flags={'no_search'},
+ )
+ yield Str(
+ 'full_name',
+ label=_("Full name"),
+ primary_key=True,
+ normalizer=lambda name: name.replace(u'-', u'_'),
+ flags={'no_search'},
+ )
+
class MetaRetrieve(BaseMetaRetrieve):
pass
@@ -161,6 +179,8 @@ class metaobject(MetaObject):
def _get_obj(self, metaobj, all=False, **kwargs):
obj = dict()
obj['name'] = unicode(metaobj.name)
+ obj['version'] = unicode(metaobj.version)
+ obj['full_name'] = unicode(metaobj.full_name)
if all:
params = [unicode(p.name) for p in self._iter_params(metaobj)]
@@ -213,10 +233,10 @@ class command(metaobject):
except errors.NotFound:
pass
else:
- obj['topic_topic'] = topic['name']
+ obj['topic_topic'] = topic['full_name']
if isinstance(cmd, Method):
- obj['obj_class'] = unicode(cmd.obj_name)
+ obj['obj_class'] = unicode(cmd.obj_full_name)
obj['attr_name'] = unicode(cmd.attr_name)
if cmd.NO_CLI:
@@ -327,61 +347,76 @@ class topic_(MetaObject):
def __init__(self, api):
super(topic_, self).__init__(api)
self.__topics = None
+ self.__topics_by_key = None
- def __get_topics(self):
- if self.__topics is None:
- topics = {}
- object.__setattr__(self, '_topic___topics', topics)
-
- for command in self.api.Command():
- topic_value = command.topic
- if topic_value is None:
- continue
- topic_name = unicode(topic_value)
+ def __make_topics(self):
+ if self.__topics is not None and self.__topics_by_key is not None:
+ return
- while topic_name not in topics:
- topic = topics[topic_name] = {'name': topic_name}
-
- for package in self.api.packages:
- module_name = '.'.join((package.__name__, topic_name))
- try:
- module = sys.modules[module_name]
- except KeyError:
- try:
- module = importlib.import_module(module_name)
- except ImportError:
- continue
-
- if module.__doc__ is not None:
- topic['doc'] = unicode(module.__doc__).strip()
+ object.__setattr__(self, '_topic___topics', [])
+ topics = self.__topics
+ object.__setattr__(self, '_topic___topics_by_key', {})
+ topics_by_key = self.__topics_by_key
+ for command in self.api.Command():
+ topic_value = command.topic
+ if topic_value is None:
+ continue
+ topic_name = unicode(topic_value)
+
+ while topic_name not in topics_by_key:
+ topic_version = u'1'
+ topic_full_name = u'{}/{}'.format(topic_name,
+ topic_version)
+ topic = {
+ 'name': topic_name,
+ 'version': topic_version,
+ 'full_name': topic_full_name,
+ }
+ topics.append(topic)
+ topics_by_key[topic_name] = topic
+ topics_by_key[topic_full_name] = topic
+
+ for package in self.api.packages:
+ module_name = '.'.join((package.__name__, topic_name))
+ try:
+ module = sys.modules[module_name]
+ except KeyError:
try:
- topic_value = module.topic
- except AttributeError:
+ module = importlib.import_module(module_name)
+ except ImportError:
continue
- if topic_value is not None:
- topic_name = unicode(topic_value)
- topic['topic_topic'] = topic_name
- else:
- topic.pop('topic_topic', None)
- return self.__topics
+ if module.__doc__ is not None:
+ topic['doc'] = unicode(module.__doc__).strip()
+
+ try:
+ topic_value = module.topic
+ except AttributeError:
+ continue
+ if topic_value is not None:
+ topic_name = unicode(topic_value)
+ topic['topic_topic'] = topic_full_name
+ else:
+ topic.pop('topic_topic', None)
def _get_obj(self, topic, **kwargs):
return topic
- def _retrieve(self, name, **kwargs):
+ def _retrieve(self, full_name, **kwargs):
+ self.__make_topics()
try:
- return self.__get_topics()[name]
+ return self.__topics_by_key[full_name]
except KeyError:
raise errors.NotFound(
reason=_("%(pkey)s: %(oname)s not found") % {
- 'pkey': name, 'oname': self.name,
+ 'pkey': full_name, 'oname': self.name,
}
)
def _search(self, **kwargs):
- return self.__get_topics().values()
+ self.__make_topics()
+ return iter(self.__topics)
@register()
@@ -413,6 +448,12 @@ class BaseParam(BaseMetaObject):
),
)
+ def get_params(self):
+ for param in super(BaseParam, self).get_params():
+ if param.name == 'name':
+ param = param.clone(primary_key=True)
+ yield param
+
@property
def parent(self):
raise AttributeError('parent')
@@ -578,12 +619,12 @@ class param(BaseParam):
return obj
- def _retrieve(self, metaobjectname, name, **kwargs):
+ def _retrieve(self, metaobjectfull_name, name, **kwargs):
try:
- metaobj = self.api.Command[metaobjectname]
+ metaobj = self.api.Command[metaobjectfull_name]
plugin = self.api.Object['command']
except KeyError:
- metaobj = self.api.Object[metaobjectname]
+ metaobj = self.api.Object[metaobjectfull_name]
plugin = self.api.Object['class']
for param in plugin._iter_params(metaobj):
@@ -596,12 +637,12 @@ class param(BaseParam):
}
)
- def _search(self, metaobjectname, **kwargs):
+ def _search(self, metaobjectfull_name, **kwargs):
try:
- metaobj = self.api.Command[metaobjectname]
+ metaobj = self.api.Command[metaobjectfull_name]
plugin = self.api.Object['command']
except KeyError:
- metaobj = self.api.Object[metaobjectname]
+ metaobj = self.api.Object[metaobjectfull_name]
plugin = self.api.Object['class']
return ((metaobj, param) for param in plugin._iter_params(metaobj))
@@ -668,8 +709,8 @@ class output(BaseParam):
return obj
- def _retrieve(self, commandname, name, **kwargs):
- cmd = self.api.Command[commandname]
+ def _retrieve(self, commandfull_name, name, **kwargs):
+ cmd = self.api.Command[commandfull_name]
try:
return (cmd, cmd.output[name])
except KeyError:
@@ -679,8 +720,8 @@ class output(BaseParam):
}
)
- def _search(self, commandname, **kwargs):
- cmd = self.api.Command[commandname]
+ def _search(self, commandfull_name, **kwargs):
+ cmd = self.api.Command[commandfull_name]
return ((cmd, output) for output in cmd.output())