Improve group search

* Add 'Search by group'
* Use member_list to display results
This commit is contained in:
David Bartley 2007-11-13 20:50:14 -05:00
parent d7dc1542c2
commit db037b5251
3 changed files with 61 additions and 15 deletions

View File

@ -193,6 +193,31 @@ def list_name(name):
return ldap_connection.member_search_name(name)
def list_group(group):
"""
Build a list of members in a group.
Parameters:
group - the group to match members against
Returns: a list of member dictionaries
Example: list_name('syscom'): -> {
'mspang': { 'cn': 'Michael Spang', ... },
...
]
"""
members = group_members(group)
if members:
ret = {}
for member in members:
ret[member] = get(member)
return ret
else:
return {}
def delete(userid):
"""
Erase all records of a member.
@ -306,10 +331,16 @@ def group_members(group):
"""
group = ldap_connection.group_lookup(group)
if not 'uniqueMember' in group:
return []
if group:
if 'uniqueMember' in group:
r = re.compile('^uid=([^,]*)')
return map(lambda x: r.match(x).group(1), group['uniqueMember'])
elif 'memberUid' in group:
return group['memberUid']
else:
return []
else:
return group['uniqueMember']
return []
### Tests ###

View File

@ -121,6 +121,7 @@ def search_members(data):
menu = [
("Members by term", search_term, None),
("Members by name", search_name, None),
("Members by group", search_group, None),
("Back", raise_back, None),
]
@ -133,6 +134,9 @@ def search_name(data):
def search_term(data):
push_wizard("By Term", [ search.TermPage ])
def search_group(data):
push_wizard("By Group", [ search.GroupPage ])
def group_members(data):
menu = [
("Add %s member" % data["name"].lower(), add_group_member, data),
@ -151,18 +155,9 @@ def remove_group_member(data):
pass
def list_group_members(data):
if not members.connected(): members.connect()
group_members = members.group_members(data["group"])
r = re.compile('^uid=([^,]*)')
menu = []
for group in group_members:
menu.append( (r.match(group).group(1), None, None) )
menu.append( ("--------", raise_back, None) )
menu.append( ("Back", raise_back, None) )
listbox = urwid.ListBox( menu_items( menu ) )
push_window(listbox, "Members")
mlist = members.list_group( data["group"] ).values()
search.member_list( mlist )
def run():
push_window( main_menu(), program_name() )

View File

@ -41,13 +41,33 @@ class NamePage(WizardPanel):
if not members.connected(): members.connect()
self.state['name'] = self.name.get_edit_text()
if not self.state['name']:
self.focus_widget( self.term )
self.focus_widget( self.name )
set_status( "Invalid name" )
return True
mlist = members.list_name( self.state['name'] ).values()
pop_window()
member_list( mlist )
class GroupPage(WizardPanel):
def init_widgets(self):
self.group = SingleEdit("Group: ")
self.widgets = [
urwid.Text( "Members by Group" ),
urwid.Divider(),
self.group,
]
def check(self):
if not members.connected(): members.connect()
self.state['group'] = self.group.get_edit_text()
if not self.state['group']:
self.focus_widget( self.group )
set_status( "Invalid group" )
return True
mlist = members.list_group( self.state['group'] ).values()
pop_window()
member_list( mlist )
def member_list(mlist):
mlist = list(mlist)
mlist.sort( lambda x, y: cmp(x['uid'], y['uid']) )