diff options
-rw-r--r-- | ipalib/frontend.py | 12 | ||||
-rw-r--r-- | ipalib/tests/test_frontend.py | 51 |
2 files changed, 63 insertions, 0 deletions
diff --git a/ipalib/frontend.py b/ipalib/frontend.py index 948b047dd..40220074e 100644 --- a/ipalib/frontend.py +++ b/ipalib/frontend.py @@ -514,10 +514,12 @@ class Object(plugable.Plugin): 'methods', 'properties', 'params' + 'primary_key', )) methods = None properties = None params = None + primary_key = None takes_params = tuple() def set_api(self, api): @@ -531,6 +533,16 @@ class Object(plugable.Plugin): self.params = plugable.NameSpace( self.__get_params(), sort=False ) + pkeys = filter(lambda p: p.primary_key, self.params()) + if len(pkeys) > 1: + raise ValueError( + '%s (Object) has multiple primary keys: %s' % ( + self.name, + ', '.join(p.name for p in pkeys), + ) + ) + if len(pkeys) == 1: + self.primary_key = pkeys[0] def __get_attrs(self, name): namespace = getattr(self.api, name) diff --git a/ipalib/tests/test_frontend.py b/ipalib/tests/test_frontend.py index e78aeeb26..38c35506b 100644 --- a/ipalib/tests/test_frontend.py +++ b/ipalib/tests/test_frontend.py @@ -858,6 +858,57 @@ class test_Object(ClassChecker): assert p.required is True assert p.multivalue is False + def test_primary_key(self): + """ + Test the `frontend.Object.primary_key` attribute. + """ + api = plugable.API( + frontend.Method, + frontend.Property, + ) + api.finalize() + + # Test with no primary keys: + class example1(self.cls): + takes_params = ( + 'one', + 'two', + ) + o = example1() + o.set_api(api) + assert o.primary_key is None + + # Test with 1 primary key: + class example2(self.cls): + takes_params = ( + 'one', + 'two', + frontend.Param('three', + primary_key=True, + ), + 'four', + ) + o = example2() + o.set_api(api) + pk = o.primary_key + assert isinstance(pk, frontend.Param) + assert pk.name == 'three' + assert pk.primary_key is True + assert o.params[2] is o.primary_key + + # Test with multiple primary_key: + class example3(self.cls): + takes_params = ( + frontend.Param('one', primary_key=True), + frontend.Param('two', primary_key=True), + 'three', + frontend.Param('four', primary_key=True), + ) + o = example3() + e = raises(ValueError, o.set_api, api) + assert str(e) == \ + 'example3 (Object) has multiple primary keys: one, two, four' + class test_Attribute(ClassChecker): """ |