mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2024-12-23 07:33:27 -06:00
8: Experimental work on more OO definition of what gets pluged into API.commands
This commit is contained in:
parent
26c9f4c881
commit
e76160b01d
@ -101,7 +101,7 @@ class NameSpace(object):
|
|||||||
|
|
||||||
__locked = False # Whether __setattr__ has been locked
|
__locked = False # Whether __setattr__ has been locked
|
||||||
|
|
||||||
def __init__(self, kw):
|
def __init__(self, kw, order=None):
|
||||||
"""
|
"""
|
||||||
The single constructor argument `kw` is a dict of the (key, value)
|
The single constructor argument `kw` is a dict of the (key, value)
|
||||||
pairs to be in this NameSpace instance.
|
pairs to be in this NameSpace instance.
|
||||||
@ -111,7 +111,11 @@ class NameSpace(object):
|
|||||||
for (key, value) in self.__kw.items():
|
for (key, value) in self.__kw.items():
|
||||||
assert not key.startswith('_')
|
assert not key.startswith('_')
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
self.__keys = sorted(self.__kw)
|
if order is None:
|
||||||
|
self.__keys = sorted(self.__kw)
|
||||||
|
else:
|
||||||
|
self.__keys = list(order)
|
||||||
|
assert set(self.__keys) == set(self.__kw)
|
||||||
self.__locked = True
|
self.__locked = True
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
|
83
ipalib/crud.py
Normal file
83
ipalib/crud.py
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
# Authors:
|
||||||
|
# Jason Gerard DeRose <jderose@redhat.com>
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Red Hat
|
||||||
|
# see file 'COPYING' for use and warranty information
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License as
|
||||||
|
# published by the Free Software Foundation; version 2 only
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from base import NameSpace
|
||||||
|
|
||||||
|
class Named(object):
|
||||||
|
def __get_name(self):
|
||||||
|
return self.__class__.__name__
|
||||||
|
name = property(__get_name)
|
||||||
|
|
||||||
|
class ObjectMember(Named):
|
||||||
|
def __init__(self, obj):
|
||||||
|
self.__obj = obj
|
||||||
|
|
||||||
|
def __get_obj(self):
|
||||||
|
return self.__obj
|
||||||
|
obj = property(__get_obj)
|
||||||
|
|
||||||
|
|
||||||
|
class Command(ObjectMember):
|
||||||
|
def __get_full_name(self):
|
||||||
|
return '%s_%s' % (self.name, self.obj.name)
|
||||||
|
full_name = property(__get_full_name)
|
||||||
|
|
||||||
|
class Attribute(ObjectMember):
|
||||||
|
def __get_full_name(self):
|
||||||
|
return '%s_%s' % (self.obj.name, self.name)
|
||||||
|
full_name = property(__get_full_name)
|
||||||
|
|
||||||
|
|
||||||
|
class Object(Named):
|
||||||
|
def __init__(self):
|
||||||
|
self.__commands = self.__build_ns(self.get_commands)
|
||||||
|
self.__attributes = self.__build_ns(self.get_attributes, True)
|
||||||
|
|
||||||
|
def __get_commands(self):
|
||||||
|
return self.__commands
|
||||||
|
commands = property(__get_commands)
|
||||||
|
|
||||||
|
def __get_attributes(self):
|
||||||
|
return self.__attributes
|
||||||
|
attributes = property(__get_attributes)
|
||||||
|
|
||||||
|
def __build_ns(self, callback, preserve=False):
|
||||||
|
d = {}
|
||||||
|
o = []
|
||||||
|
for cls in callback():
|
||||||
|
i = cls(self)
|
||||||
|
assert i.name not in d
|
||||||
|
d[i.name] = i
|
||||||
|
o.append(i.name)
|
||||||
|
if preserve:
|
||||||
|
return NameSpace(d, order=o)
|
||||||
|
return NameSpace(d)
|
||||||
|
|
||||||
|
def __get_commands(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
def get_commands(self):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def get_attributes(self):
|
||||||
|
raise NotImplementedError
|
54
ipalib/identity.py
Normal file
54
ipalib/identity.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
# hidden
|
||||||
|
# read only
|
||||||
|
# editable
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Title') # Enum?
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('First Name')
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Last Name')
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Full Name') # Autofill
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Display Name') # Autofill
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Initials') # generated/ro?
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Account Status') # Enum (active, inactive)
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Login')
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Password')
|
||||||
|
|
||||||
|
def get_label(self, _): # Same field as above, special interface
|
||||||
|
return _('Confirm Password')
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('UID') #ro
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('GID') #ro
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Home Directory') #ro
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('Login Shell')
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('GECOS')
|
||||||
|
|
||||||
|
def get_label(self, _):
|
||||||
|
return _('')
|
111
ipalib/tests/test_crud.py
Normal file
111
ipalib/tests/test_crud.py
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
# Authors:
|
||||||
|
# Jason Gerard DeRose <jderose@redhat.com>
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Red Hat
|
||||||
|
# see file 'COPYING' for use and warranty information
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License as
|
||||||
|
# published by the Free Software Foundation; version 2 only
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
"""
|
||||||
|
Unit tests for `ipalib.crud` module.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from ipalib import crud, base, exceptions
|
||||||
|
|
||||||
|
class create(crud.Command):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class retrieve(crud.Command):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class update(crud.Command):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class delete(crud.Command):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class givenName(crud.Attribute):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class sn(crud.Attribute):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class login(crud.Attribute):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class user(crud.Object):
|
||||||
|
def get_commands(self):
|
||||||
|
return [
|
||||||
|
create,
|
||||||
|
retrieve,
|
||||||
|
update,
|
||||||
|
delete,
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_attributes(self):
|
||||||
|
return [
|
||||||
|
givenName,
|
||||||
|
sn,
|
||||||
|
login,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_Named():
|
||||||
|
class named_class(crud.Named):
|
||||||
|
pass
|
||||||
|
|
||||||
|
n = named_class()
|
||||||
|
assert n.name == 'named_class'
|
||||||
|
|
||||||
|
|
||||||
|
def test_Command():
|
||||||
|
class user(object):
|
||||||
|
name = 'user'
|
||||||
|
class add(crud.Command):
|
||||||
|
pass
|
||||||
|
i = add(user())
|
||||||
|
assert i.name == 'add'
|
||||||
|
assert i.full_name == 'add_user'
|
||||||
|
|
||||||
|
|
||||||
|
def test_Object():
|
||||||
|
i = user()
|
||||||
|
assert i.name == 'user'
|
||||||
|
|
||||||
|
# Test commands:
|
||||||
|
commands = i.commands
|
||||||
|
assert isinstance(commands, base.NameSpace)
|
||||||
|
assert list(commands) == ['create', 'delete', 'retrieve', 'update']
|
||||||
|
assert len(commands) == 4
|
||||||
|
for name in commands:
|
||||||
|
cls = globals()[name]
|
||||||
|
cmd = commands[name]
|
||||||
|
assert type(cmd) is cls
|
||||||
|
assert getattr(commands, name) is cmd
|
||||||
|
assert cmd.name == name
|
||||||
|
assert cmd.full_name == ('%s_user' % name)
|
||||||
|
|
||||||
|
# Test attributes:
|
||||||
|
attributes = i.attributes
|
||||||
|
assert isinstance(attributes, base.NameSpace)
|
||||||
|
assert list(attributes) == ['givenName', 'sn', 'login']
|
||||||
|
assert len(attributes) == 3
|
||||||
|
for name in attributes:
|
||||||
|
cls = globals()[name]
|
||||||
|
attr = attributes[name]
|
||||||
|
assert type(attr) is cls
|
||||||
|
assert getattr(attributes, name) is attr
|
||||||
|
assert attr.name == name
|
||||||
|
assert attr.full_name == ('user_%s' % name)
|
Loading…
Reference in New Issue
Block a user