Restrict non-club modifications to syscom
This commit is contained in:
parent
ee2b189a91
commit
380e8283a0
2
bin/ceo
2
bin/ceo
|
@ -28,4 +28,4 @@ except OSError, e:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
import csc.apps.urwid.main
|
import csc.apps.urwid.main
|
||||||
csc.apps.urwid.main.start()
|
csc.apps.urwid.main.start(euid, egid)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import urwid
|
import urwid, pwd, grp
|
||||||
from csc.apps.urwid.widgets import *
|
from csc.apps.urwid.widgets import *
|
||||||
from csc.apps.urwid.window import *
|
from csc.apps.urwid.window import *
|
||||||
import csc.apps.urwid.search as search
|
import csc.apps.urwid.search as search
|
||||||
|
@ -11,8 +11,8 @@ def menu_items(items):
|
||||||
|
|
||||||
def change_group_member(data):
|
def change_group_member(data):
|
||||||
push_wizard("%s %s Member" % (data["type"], data["name"]), [
|
push_wizard("%s %s Member" % (data["type"], data["name"]), [
|
||||||
(groups.ChangeMember, data),
|
(ChangeMember, data),
|
||||||
groups.EndPage,
|
EndPage,
|
||||||
])
|
])
|
||||||
|
|
||||||
def list_group_members(data):
|
def list_group_members(data):
|
||||||
|
@ -20,6 +20,16 @@ def list_group_members(data):
|
||||||
search.member_list( mlist )
|
search.member_list( mlist )
|
||||||
|
|
||||||
def group_members(data):
|
def group_members(data):
|
||||||
|
data, euid = data
|
||||||
|
|
||||||
|
# only syscom may modify non-club groups
|
||||||
|
user = pwd.getpwuid(euid).pw_name
|
||||||
|
users = grp.getgrnam('syscom').gr_mem
|
||||||
|
if user not in users:
|
||||||
|
member = members.get(data['group'])
|
||||||
|
if member is None or 'objectClass' not in member or 'club' not in member['objectClass']:
|
||||||
|
return
|
||||||
|
|
||||||
add_data = data.copy()
|
add_data = data.copy()
|
||||||
add_data['type'] = 'Add'
|
add_data['type'] = 'Add'
|
||||||
remove_data = data.copy()
|
remove_data = data.copy()
|
||||||
|
@ -54,6 +64,9 @@ class IntroPage(WizardPanel):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
class InfoPage(WizardPanel):
|
class InfoPage(WizardPanel):
|
||||||
|
def __init__(self, state, euid):
|
||||||
|
state['euid'] = euid
|
||||||
|
WizardPanel.__init__(self, state)
|
||||||
def init_widgets(self):
|
def init_widgets(self):
|
||||||
self.group = WordEdit("Club or Group: ")
|
self.group = WordEdit("Club or Group: ")
|
||||||
self.widgets = [
|
self.widgets = [
|
||||||
|
@ -70,7 +83,7 @@ class InfoPage(WizardPanel):
|
||||||
"group" : group_name,
|
"group" : group_name,
|
||||||
"groups" : [group],
|
"groups" : [group],
|
||||||
}
|
}
|
||||||
group_members(data)
|
group_members((data, self.state['euid']))
|
||||||
|
|
||||||
class ChangeMember(WizardPanel):
|
class ChangeMember(WizardPanel):
|
||||||
def __init__(self, state, data):
|
def __init__(self, state, data):
|
||||||
|
|
|
@ -74,25 +74,16 @@ def main_menu():
|
||||||
("Search", search_members, None),
|
("Search", search_members, None),
|
||||||
("Manage Club or Group Members", manage_group, None),
|
("Manage Club or Group Members", manage_group, None),
|
||||||
("Manage Positions", manage_positions, None),
|
("Manage Positions", manage_positions, None),
|
||||||
("Manage Office Staff", group_members, office_data),
|
("Manage Office Staff", groups.group_members,
|
||||||
("Manage Systems Committee", group_members, syscom_data),
|
(office_data, ui.euid)),
|
||||||
|
("Manage Systems Committee", groups.group_members,
|
||||||
|
(syscom_data, ui.euid)),
|
||||||
("Exit", raise_abort, None),
|
("Exit", raise_abort, None),
|
||||||
]
|
]
|
||||||
|
|
||||||
listbox = urwid.ListBox( menu_items( menu ) )
|
listbox = urwid.ListBox( menu_items( menu ) )
|
||||||
return listbox
|
return listbox
|
||||||
|
|
||||||
def push_wizard(name, pages, dimensions=(50, 10)):
|
|
||||||
state = {}
|
|
||||||
wiz = Wizard()
|
|
||||||
for page in pages:
|
|
||||||
if type(page) != tuple:
|
|
||||||
page = (page, )
|
|
||||||
wiz.add_panel( page[0](state, *page[1:]) )
|
|
||||||
push_window( urwid.Filler( urwid.Padding(
|
|
||||||
urwid.LineBox(wiz), 'center', dimensions[0]),
|
|
||||||
'middle', dimensions[1] ), name )
|
|
||||||
|
|
||||||
def new_member(*args, **kwargs):
|
def new_member(*args, **kwargs):
|
||||||
push_wizard("New Member", [
|
push_wizard("New Member", [
|
||||||
newmember.IntroPage,
|
newmember.IntroPage,
|
||||||
|
@ -112,7 +103,7 @@ def new_club(*args, **kwargs):
|
||||||
def manage_group(*args, **kwargs):
|
def manage_group(*args, **kwargs):
|
||||||
push_wizard("Manage Club or Group Members", [
|
push_wizard("Manage Club or Group Members", [
|
||||||
groups.IntroPage,
|
groups.IntroPage,
|
||||||
groups.InfoPage,
|
(groups.InfoPage, ui.euid),
|
||||||
], (60, 15))
|
], (60, 15))
|
||||||
|
|
||||||
def renew_member(*args, **kwargs):
|
def renew_member(*args, **kwargs):
|
||||||
|
@ -157,24 +148,6 @@ def manage_positions(data):
|
||||||
positions.EndPage,
|
positions.EndPage,
|
||||||
], (50, 15))
|
], (50, 15))
|
||||||
|
|
||||||
def group_members(data):
|
|
||||||
add_data = data.copy()
|
|
||||||
add_data['type'] = 'Add'
|
|
||||||
remove_data = data.copy()
|
|
||||||
remove_data['type'] = 'Remove'
|
|
||||||
menu = [
|
|
||||||
("Add %s member" % data["name"].lower(),
|
|
||||||
groups.change_group_member, add_data),
|
|
||||||
("Remove %s member" % data["name"].lower(),
|
|
||||||
groups.change_group_member, remove_data),
|
|
||||||
("List %s members" % data["name"].lower(),
|
|
||||||
groups.list_group_members, data),
|
|
||||||
("Back", raise_back, None),
|
|
||||||
]
|
|
||||||
|
|
||||||
listbox = urwid.ListBox( menu_items( menu ) )
|
|
||||||
push_window(listbox, "Manage %s" % data["name"])
|
|
||||||
|
|
||||||
def run():
|
def run():
|
||||||
members.connect()
|
members.connect()
|
||||||
accounts.connect()
|
accounts.connect()
|
||||||
|
@ -182,7 +155,9 @@ def run():
|
||||||
push_window( main_menu(), program_name() )
|
push_window( main_menu(), program_name() )
|
||||||
event_loop( ui )
|
event_loop( ui )
|
||||||
|
|
||||||
def start():
|
def start(euid, egid):
|
||||||
|
ui.euid = euid
|
||||||
|
ui.egid = egid
|
||||||
ui.run_wrapper( run )
|
ui.run_wrapper( run )
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -1,6 +1,17 @@
|
||||||
import urwid
|
import urwid
|
||||||
from csc.apps.urwid.ldapfilter import *
|
from csc.apps.urwid.ldapfilter import *
|
||||||
from csc.apps.urwid.window import raise_back
|
from csc.apps.urwid.window import raise_back, push_window
|
||||||
|
|
||||||
|
def push_wizard(name, pages, dimensions=(50, 10)):
|
||||||
|
state = {}
|
||||||
|
wiz = Wizard()
|
||||||
|
for page in pages:
|
||||||
|
if type(page) != tuple:
|
||||||
|
page = (page, )
|
||||||
|
wiz.add_panel( page[0](state, *page[1:]) )
|
||||||
|
push_window( urwid.Filler( urwid.Padding(
|
||||||
|
urwid.LineBox(wiz), 'center', dimensions[0]),
|
||||||
|
'middle', dimensions[1] ), name )
|
||||||
|
|
||||||
class ButtonText(urwid.Text):
|
class ButtonText(urwid.Text):
|
||||||
def __init__(self, callback, data, *args, **kwargs):
|
def __init__(self, callback, data, *args, **kwargs):
|
||||||
|
|
Loading…
Reference in New Issue