pyceo/ceo/urwid/shell.py

96 lines
3.0 KiB
Python

import urwid, ldap, pwd, os
from ceo import members, terms, ldapi
from ceo.urwid.widgets import *
from ceo.urwid.window import *
class IntroPage(WizardPanel):
def init_widgets(self):
self.widgets = [
urwid.Text( "Changing Login Shell" ),
urwid.Divider(),
urwid.Text( "You can change your shell here. Request more shells "
"by emailing systems-committee." )
]
def focusable(self):
return False
class YouPage(WizardPanel):
def init_widgets(self):
you = pwd.getpwuid(os.getuid()).pw_name
self.userid = LdapWordEdit(csclub_uri, csclub_base, 'uid',
"Username: ", you)
self.widgets = [
urwid.Text( "Member Information" ),
urwid.Divider(),
self.userid,
]
def check(self):
self.state['userid'] = self.userid.get_edit_text()
self.state['member'] = None
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
class ShellPage(WizardPanel):
def init_widgets(self):
self.midtext = urwid.Text("")
self.widgets = [
urwid.Text("Choose a Shell"),
urwid.Divider(),
]
def set_shell(radio_button, new_state, shell):
if new_state:
self.state['shell'] = shell
radio_group = []
self.shells = members.get_shells()
self.shellw = [ urwid.RadioButton(radio_group, shell,
on_state_change=set_shell, user_data=shell)
for shell in self.shells ]
self.widgets.extend(self.shellw)
def set_shell(self, shell):
i = self.shells.index(shell)
self.shellw[i].set_state(True)
def focusable(self):
return True
def activate(self):
self.set_shell(self.state['member']['loginShell'][0])
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 activate(self):
problem = None
try:
user, shell = self.state['userid'], self.state['shell']
members.set_shell(user, shell)
self.headtext.set_text("Login Shell Changed")
self.midtext.set_text("The shell for %s has been changed to %s."
% (user, shell))
except ldap.LDAPError, e:
problem = ldapi.format_ldaperror(e)
except members.MemberException, e:
problem = str(e)
if problem:
self.headtext.set_text("Failed to Change Shell")
self.midtext.set_text("Perhaps you don't have permission to change %s's shell? "
"The error was:\n\n%s" % (user, problem))
def check(self):
pop_window()