pyceo/ceo/urwid/groups.py

130 lines
4.4 KiB
Python

import urwid
from ceo import members
from ceo.excep import InvalidArgument
from ceo.urwid import search
from ceo.urwid.widgets import *
from ceo.urwid.window import *
def menu_items(items):
return [ urwid.AttrWrap( ButtonText( cb, data, txt ), 'menu', 'selected') for (txt, cb, data) in items ]
def change_group_member(data):
push_wizard("%s %s Member" % (data["action"], data["name"]), [
(ChangeMember, data),
EndPage,
])
def list_group_members(data):
mlist = members.list_group( data["group"] ).values()
search.member_list( mlist )
def group_members(data):
add_data = data.copy()
add_data['action'] = 'Add'
remove_data = data.copy()
remove_data['action'] = 'Remove'
menu = [
("Add %s member" % data["name"].lower(),
change_group_member, add_data),
("Remove %s member" % data["name"].lower(),
change_group_member, remove_data),
("List %s members" % data["name"].lower(), list_group_members, data),
("Back", raise_back, None),
]
listbox = urwid.ListBox( menu_items( menu ) )
push_window(listbox, "Manage %s" % data["name"])
class IntroPage(WizardPanel):
def init_widgets(self):
self.widgets = [
urwid.Text( "Managing Club or Group" ),
urwid.Divider(),
urwid.Text( "Adding a member to a club will also grant them "
"access to the club's files and allow them to "
"become_club."
"\n\n"
"Do not manage office and syscom related groups using "
"this interface. Instead use the \"Manage Office "
"Staff\" and \"Manage Systems Committee\" entries "
"from the main menu." )
]
def focusable(self):
return False
class InfoPage(WizardPanel):
def init_widgets(self):
self.group = WordEdit("Club or Group: ")
self.widgets = [
urwid.Text( "Club or Group Information"),
urwid.Divider(),
self.group,
]
def check(self):
group = self.group.get_edit_text()
# TODO - check that group is valid
group_name = group # TODO
data = {
"name" : group,
"group" : group_name,
"groups" : [group],
}
group_members(data)
class ChangeMember(WizardPanel):
def __init__(self, state, data):
state['data'] = data
WizardPanel.__init__(self, state)
def init_widgets(self):
self.userid = WordEdit("Username: ")
data = self.state['data']
self.widgets = [
urwid.Text( "%s %s Member" % (data['action'], data['name']) ),
urwid.Divider(),
self.userid,
]
def check(self):
self.state['userid'] = self.userid.get_edit_text()
if self.state['userid']:
self.state['member'] = members.get(self.userid.get_edit_text())
if not self.state['member']:
set_status("Member not found")
self.focus_widget(self.userid)
return True
clear_status()
class EndPage(WizardPanel):
def init_widgets(self):
self.headtext = urwid.Text("")
self.midtext = urwid.Text("")
self.widgets = [
self.headtext,
urwid.Divider(),
self.midtext,
]
def focusable(self):
return False
def check(self):
pop_window()
def activate(self):
data = self.state['data']
action = data['action'].lower()
failed = []
for group in data['groups']:
try:
members.change_group_member(action, group, self.state['userid'])
except:
failed.append(group)
if len(failed) == 0:
self.headtext.set_text("%s succeeded" % data['action'])
self.midtext.set_text("Congratulations, the group modification "
"has succeeded.")
else:
self.headtext.set_text("%s partially succeeded" % data['action'])
self.midtext.set_text("Failed to %s member to %s for the "
"following groups: %s. This may indicate an attempt to add a "
"duplicate group member or to delete a non-present group "
"member." % (data['action'].lower(), data['name'],
', '.join(failed)))